summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Evans <grknight@gentoo.org>2021-07-19 15:20:22 -0400
committerBrian Evans <grknight@gentoo.org>2021-07-19 15:20:22 -0400
commit9f092345e6bbecfde8c19e6d1490a6031a35f61f (patch)
tree2abb2398cd0df686e8608e15097ddc58b8995615
parentOAuth: Update for fixes and security (diff)
downloadextensions-9f092345e6bbecfde8c19e6d1490a6031a35f61f.tar.gz
extensions-9f092345e6bbecfde8c19e6d1490a6031a35f61f.tar.bz2
extensions-9f092345e6bbecfde8c19e6d1490a6031a35f61f.zip
Update to MLEB 2021.06
Signed-off-by: Brian Evans <grknight@gentoo.org>
-rw-r--r--MLEB/Babel/.eslintrc.json8
-rw-r--r--MLEB/Babel/.phpcs.xml4
-rw-r--r--MLEB/Babel/Gruntfile.js1
-rw-r--r--MLEB/Babel/RELEASE-NOTES6
-rw-r--r--MLEB/Babel/babel.sql13
-rw-r--r--MLEB/Babel/composer.json11
-rw-r--r--MLEB/Babel/extension.json4
-rw-r--r--MLEB/Babel/i18n/ab.json9
-rw-r--r--MLEB/Babel/i18n/ace.json35
-rw-r--r--MLEB/Babel/i18n/api/el.json1
-rw-r--r--MLEB/Babel/i18n/api/fi.json11
-rw-r--r--MLEB/Babel/i18n/api/fr.json7
-rw-r--r--MLEB/Babel/i18n/api/jam.json11
-rw-r--r--MLEB/Babel/i18n/api/kcg.json12
-rw-r--r--MLEB/Babel/i18n/api/tl.json11
-rw-r--r--MLEB/Babel/i18n/api/vec.json11
-rw-r--r--MLEB/Babel/i18n/api/yue.json1
-rw-r--r--MLEB/Babel/i18n/ban.json29
-rw-r--r--MLEB/Babel/i18n/ce.json8
-rw-r--r--MLEB/Babel/i18n/crh.json2
-rw-r--r--MLEB/Babel/i18n/diq.json2
-rw-r--r--MLEB/Babel/i18n/es.json34
-rw-r--r--MLEB/Babel/i18n/fi.json8
-rw-r--r--MLEB/Babel/i18n/fit.json6
-rw-r--r--MLEB/Babel/i18n/fr.json1
-rw-r--r--MLEB/Babel/i18n/fy.json32
-rw-r--r--MLEB/Babel/i18n/gan.json2
-rw-r--r--MLEB/Babel/i18n/gom-latn.json1
-rw-r--r--MLEB/Babel/i18n/hif-latn.json1
-rw-r--r--MLEB/Babel/i18n/id.json26
-rw-r--r--MLEB/Babel/i18n/is.json1
-rw-r--r--MLEB/Babel/i18n/jam.json43
-rw-r--r--MLEB/Babel/i18n/kcg.json30
-rw-r--r--MLEB/Babel/i18n/koi.json23
-rw-r--r--MLEB/Babel/i18n/ku-latn.json3
-rw-r--r--MLEB/Babel/i18n/kv.json21
-rw-r--r--MLEB/Babel/i18n/kw.json31
-rw-r--r--MLEB/Babel/i18n/lmo.json43
-rw-r--r--MLEB/Babel/i18n/lo.json17
-rw-r--r--MLEB/Babel/i18n/mrh.json22
-rw-r--r--MLEB/Babel/i18n/nds.json4
-rw-r--r--MLEB/Babel/i18n/nia.json17
-rw-r--r--MLEB/Babel/i18n/nl-informal.json7
-rw-r--r--MLEB/Babel/i18n/nqo.json26
-rw-r--r--MLEB/Babel/i18n/pms.json3
-rw-r--r--MLEB/Babel/i18n/pnb.json18
-rw-r--r--MLEB/Babel/i18n/qqq.json5
-rw-r--r--MLEB/Babel/i18n/rue.json2
-rw-r--r--MLEB/Babel/i18n/sc.json13
-rw-r--r--MLEB/Babel/i18n/shi.json37
-rw-r--r--MLEB/Babel/i18n/shy.json14
-rw-r--r--MLEB/Babel/i18n/sl.json3
-rw-r--r--MLEB/Babel/i18n/smn.json16
-rw-r--r--MLEB/Babel/i18n/tg-cyrl.json5
-rw-r--r--MLEB/Babel/i18n/th.json5
-rw-r--r--MLEB/Babel/i18n/tl.json45
-rw-r--r--MLEB/Babel/i18n/tly.json10
-rw-r--r--MLEB/Babel/i18n/tt.json2
-rw-r--r--MLEB/Babel/i18n/udm.json16
-rw-r--r--MLEB/Babel/i18n/vec.json42
-rw-r--r--MLEB/Babel/i18n/zh-cn.json2
-rw-r--r--MLEB/Babel/i18n/zh-sg.json2
-rw-r--r--MLEB/Babel/i18n/zh-tw.json2
-rw-r--r--MLEB/Babel/i18n/zh.json2
-rw-r--r--MLEB/Babel/includes/BabelLanguageCodes.php4
-rw-r--r--MLEB/Babel/includes/BabelStatic.php25
-rw-r--r--MLEB/Babel/package-lock.json3086
-rw-r--r--MLEB/Babel/package.json8
-rw-r--r--MLEB/Babel/sql/postgres/tables-generated.sql12
-rw-r--r--MLEB/Babel/sql/sqlite/babel-babel_lang-length.sql (renamed from MLEB/Babel/sql/babel-babel_lang-length.sqlite.sql)0
-rw-r--r--MLEB/Babel/sql/sqlite/tables-generated.sql12
-rw-r--r--MLEB/Babel/sql/tables-generated.sql11
-rw-r--r--MLEB/Babel/sql/tables.json34
-rw-r--r--MLEB/Babel/tests/phpunit/unit/BabelStaticTest.php (renamed from MLEB/Babel/tests/phpunit/BabelStaticTest.php)10
-rw-r--r--MLEB/CleanChanges/.eslintrc.json9
-rw-r--r--MLEB/CleanChanges/.phpcs.xml2
-rw-r--r--MLEB/CleanChanges/Gruntfile.js14
-rw-r--r--MLEB/CleanChanges/RELEASE-NOTES6
-rw-r--r--MLEB/CleanChanges/composer.json9
-rw-r--r--MLEB/CleanChanges/extension.json12
-rw-r--r--MLEB/CleanChanges/i18n/af.json4
-rw-r--r--MLEB/CleanChanges/i18n/ar.json4
-rw-r--r--MLEB/CleanChanges/i18n/arc.json3
-rw-r--r--MLEB/CleanChanges/i18n/arz.json4
-rw-r--r--MLEB/CleanChanges/i18n/ast.json4
-rw-r--r--MLEB/CleanChanges/i18n/ba.json4
-rw-r--r--MLEB/CleanChanges/i18n/bcl.json4
-rw-r--r--MLEB/CleanChanges/i18n/be-tarask.json4
-rw-r--r--MLEB/CleanChanges/i18n/bg.json4
-rw-r--r--MLEB/CleanChanges/i18n/bn.json4
-rw-r--r--MLEB/CleanChanges/i18n/br.json4
-rw-r--r--MLEB/CleanChanges/i18n/bs.json4
-rw-r--r--MLEB/CleanChanges/i18n/ca.json4
-rw-r--r--MLEB/CleanChanges/i18n/ce.json4
-rw-r--r--MLEB/CleanChanges/i18n/cs.json4
-rw-r--r--MLEB/CleanChanges/i18n/cy.json4
-rw-r--r--MLEB/CleanChanges/i18n/da.json4
-rw-r--r--MLEB/CleanChanges/i18n/de.json4
-rw-r--r--MLEB/CleanChanges/i18n/diq.json4
-rw-r--r--MLEB/CleanChanges/i18n/dsb.json4
-rw-r--r--MLEB/CleanChanges/i18n/ee.json1
-rw-r--r--MLEB/CleanChanges/i18n/el.json4
-rw-r--r--MLEB/CleanChanges/i18n/en.json8
-rw-r--r--MLEB/CleanChanges/i18n/eo.json4
-rw-r--r--MLEB/CleanChanges/i18n/es.json4
-rw-r--r--MLEB/CleanChanges/i18n/et.json4
-rw-r--r--MLEB/CleanChanges/i18n/eu.json4
-rw-r--r--MLEB/CleanChanges/i18n/fa.json6
-rw-r--r--MLEB/CleanChanges/i18n/fi.json4
-rw-r--r--MLEB/CleanChanges/i18n/fr.json6
-rw-r--r--MLEB/CleanChanges/i18n/frp.json4
-rw-r--r--MLEB/CleanChanges/i18n/fy.json4
-rw-r--r--MLEB/CleanChanges/i18n/gl.json4
-rw-r--r--MLEB/CleanChanges/i18n/grc.json4
-rw-r--r--MLEB/CleanChanges/i18n/gsw.json4
-rw-r--r--MLEB/CleanChanges/i18n/haw.json4
-rw-r--r--MLEB/CleanChanges/i18n/he.json4
-rw-r--r--MLEB/CleanChanges/i18n/hi.json4
-rw-r--r--MLEB/CleanChanges/i18n/hr.json4
-rw-r--r--MLEB/CleanChanges/i18n/hsb.json4
-rw-r--r--MLEB/CleanChanges/i18n/hu.json4
-rw-r--r--MLEB/CleanChanges/i18n/ia.json4
-rw-r--r--MLEB/CleanChanges/i18n/id.json4
-rw-r--r--MLEB/CleanChanges/i18n/ig.json4
-rw-r--r--MLEB/CleanChanges/i18n/it.json4
-rw-r--r--MLEB/CleanChanges/i18n/ja.json6
-rw-r--r--MLEB/CleanChanges/i18n/ka.json5
-rw-r--r--MLEB/CleanChanges/i18n/kk-cyrl.json4
-rw-r--r--MLEB/CleanChanges/i18n/km.json4
-rw-r--r--MLEB/CleanChanges/i18n/ko.json4
-rw-r--r--MLEB/CleanChanges/i18n/ksh.json4
-rw-r--r--MLEB/CleanChanges/i18n/ku-latn.json4
-rw-r--r--MLEB/CleanChanges/i18n/lb.json4
-rw-r--r--MLEB/CleanChanges/i18n/li.json4
-rw-r--r--MLEB/CleanChanges/i18n/lij.json4
-rw-r--r--MLEB/CleanChanges/i18n/lki.json4
-rw-r--r--MLEB/CleanChanges/i18n/lt.json4
-rw-r--r--MLEB/CleanChanges/i18n/mk.json4
-rw-r--r--MLEB/CleanChanges/i18n/ml.json4
-rw-r--r--MLEB/CleanChanges/i18n/mr.json4
-rw-r--r--MLEB/CleanChanges/i18n/ms.json4
-rw-r--r--MLEB/CleanChanges/i18n/mt.json4
-rw-r--r--MLEB/CleanChanges/i18n/my.json4
-rw-r--r--MLEB/CleanChanges/i18n/nah.json4
-rw-r--r--MLEB/CleanChanges/i18n/nb.json4
-rw-r--r--MLEB/CleanChanges/i18n/nl.json4
-rw-r--r--MLEB/CleanChanges/i18n/nn.json4
-rw-r--r--MLEB/CleanChanges/i18n/oc.json4
-rw-r--r--MLEB/CleanChanges/i18n/or.json3
-rw-r--r--MLEB/CleanChanges/i18n/pl.json4
-rw-r--r--MLEB/CleanChanges/i18n/pms.json4
-rw-r--r--MLEB/CleanChanges/i18n/pnb.json8
-rw-r--r--MLEB/CleanChanges/i18n/ps.json5
-rw-r--r--MLEB/CleanChanges/i18n/pt-br.json4
-rw-r--r--MLEB/CleanChanges/i18n/pt.json4
-rw-r--r--MLEB/CleanChanges/i18n/qqq.json6
-rw-r--r--MLEB/CleanChanges/i18n/ro.json4
-rw-r--r--MLEB/CleanChanges/i18n/roa-tara.json4
-rw-r--r--MLEB/CleanChanges/i18n/ru.json4
-rw-r--r--MLEB/CleanChanges/i18n/rue.json4
-rw-r--r--MLEB/CleanChanges/i18n/sah.json4
-rw-r--r--MLEB/CleanChanges/i18n/sh.json4
-rw-r--r--MLEB/CleanChanges/i18n/shn.json8
-rw-r--r--MLEB/CleanChanges/i18n/si.json4
-rw-r--r--MLEB/CleanChanges/i18n/sk.json4
-rw-r--r--MLEB/CleanChanges/i18n/sl.json9
-rw-r--r--MLEB/CleanChanges/i18n/smn.json8
-rw-r--r--MLEB/CleanChanges/i18n/sr-ec.json4
-rw-r--r--MLEB/CleanChanges/i18n/sr-el.json4
-rw-r--r--MLEB/CleanChanges/i18n/stq.json4
-rw-r--r--MLEB/CleanChanges/i18n/su.json4
-rw-r--r--MLEB/CleanChanges/i18n/sv.json4
-rw-r--r--MLEB/CleanChanges/i18n/ta.json4
-rw-r--r--MLEB/CleanChanges/i18n/te.json4
-rw-r--r--MLEB/CleanChanges/i18n/tg-cyrl.json1
-rw-r--r--MLEB/CleanChanges/i18n/tg-latn.json1
-rw-r--r--MLEB/CleanChanges/i18n/th.json4
-rw-r--r--MLEB/CleanChanges/i18n/ti.json9
-rw-r--r--MLEB/CleanChanges/i18n/tl.json4
-rw-r--r--MLEB/CleanChanges/i18n/tly.json8
-rw-r--r--MLEB/CleanChanges/i18n/tr.json9
-rw-r--r--MLEB/CleanChanges/i18n/tt-cyrl.json4
-rw-r--r--MLEB/CleanChanges/i18n/uk.json4
-rw-r--r--MLEB/CleanChanges/i18n/ur.json4
-rw-r--r--MLEB/CleanChanges/i18n/vec.json4
-rw-r--r--MLEB/CleanChanges/i18n/vi.json4
-rw-r--r--MLEB/CleanChanges/i18n/vo.json4
-rw-r--r--MLEB/CleanChanges/i18n/wa.json4
-rw-r--r--MLEB/CleanChanges/i18n/zh-hans.json4
-rw-r--r--MLEB/CleanChanges/i18n/zh-hant.json4
-rw-r--r--MLEB/CleanChanges/images/Arr_.pngbin82 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/images/Arr_d.pngbin190 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/images/Arr_l.pngbin205 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/images/Arr_r.pngbin204 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/images/Arr_u.pngbin195 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/images/showuserlinks.pngbin148 -> 0 bytes
-rw-r--r--MLEB/CleanChanges/includes/CCFilters.php13
-rw-r--r--MLEB/CleanChanges/includes/NCL.php756
-rw-r--r--MLEB/CleanChanges/package-lock.json3148
-rw-r--r--MLEB/CleanChanges/package.json9
-rw-r--r--MLEB/CleanChanges/resources/cleanchanges.js62
-rw-r--r--MLEB/LocalisationUpdate/.eslintrc.json5
-rw-r--r--MLEB/LocalisationUpdate/.phan/config.php11
-rw-r--r--MLEB/LocalisationUpdate/.phpcs.xml3
-rw-r--r--MLEB/LocalisationUpdate/Gruntfile.js1
-rw-r--r--MLEB/LocalisationUpdate/RELEASE-NOTES6
-rw-r--r--MLEB/LocalisationUpdate/composer.json9
-rw-r--r--MLEB/LocalisationUpdate/extension.json2
-rw-r--r--MLEB/LocalisationUpdate/i18n/en.json2
-rw-r--r--MLEB/LocalisationUpdate/i18n/fr.json4
-rw-r--r--MLEB/LocalisationUpdate/includes/Fetcher/FetcherFactory.php4
-rw-r--r--MLEB/LocalisationUpdate/includes/Reader/JSONReader.php9
-rw-r--r--MLEB/LocalisationUpdate/includes/Updater.php20
-rw-r--r--MLEB/LocalisationUpdate/package-lock.json1082
-rw-r--r--MLEB/LocalisationUpdate/package.json4
-rw-r--r--MLEB/LocalisationUpdate/tests/phpunit/UpdaterTest.php26
-rw-r--r--MLEB/LocalisationUpdate/update.php30
-rw-r--r--MLEB/Translate/.eslintrc.json8
-rw-r--r--MLEB/Translate/.mailmap5
-rw-r--r--MLEB/Translate/.phan/config.php3
-rw-r--r--MLEB/Translate/.phan/stubs/languagedetector.php4
-rw-r--r--MLEB/Translate/.phan/stubs/metayaml.php8
-rw-r--r--MLEB/Translate/.phan/stubs/phplot.php114
-rw-r--r--MLEB/Translate/.phpcs.xml50
-rw-r--r--MLEB/Translate/Gruntfile.js3
-rw-r--r--MLEB/Translate/HISTORY4
-rw-r--r--MLEB/Translate/Message.php10
-rw-r--r--MLEB/Translate/MessageCollection.php239
-rw-r--r--MLEB/Translate/MessageGroupConfigurationParser.php3
-rw-r--r--MLEB/Translate/MessageGroups.php56
-rw-r--r--MLEB/Translate/README20
-rw-r--r--MLEB/Translate/RELEASE-NOTES17
-rw-r--r--MLEB/Translate/Translate.alias.php2
-rw-r--r--MLEB/Translate/TranslateEditAddons.php60
-rw-r--r--MLEB/Translate/TranslateHooks.php118
-rw-r--r--MLEB/Translate/TranslateUtils.php142
-rw-r--r--MLEB/Translate/api/ApiAggregateGroups.php14
-rw-r--r--MLEB/Translate/api/ApiGroupReview.php2
-rw-r--r--MLEB/Translate/api/ApiManageMessageGroups.php10
-rw-r--r--MLEB/Translate/api/ApiQueryLanguageStats.php2
-rw-r--r--MLEB/Translate/api/ApiQueryManageMessageGroups.php6
-rw-r--r--MLEB/Translate/api/ApiQueryMessageCollection.php10
-rw-r--r--MLEB/Translate/api/ApiQueryMessageGroupStats.php2
-rw-r--r--MLEB/Translate/api/ApiQueryMessageGroups.php8
-rw-r--r--MLEB/Translate/api/ApiQueryMessageTranslations.php2
-rw-r--r--MLEB/Translate/api/ApiSearchTranslations.php3
-rw-r--r--MLEB/Translate/api/ApiStatsQuery.php9
-rw-r--r--MLEB/Translate/api/ApiTTMServer.php2
-rw-r--r--MLEB/Translate/api/ApiTranslateSandbox.php28
-rw-r--r--MLEB/Translate/api/ApiTranslationAids.php3
-rw-r--r--MLEB/Translate/api/ApiTranslationCheck.php2
-rw-r--r--MLEB/Translate/api/ApiTranslationReview.php2
-rw-r--r--MLEB/Translate/api/ApiTranslationStash.php5
-rw-r--r--MLEB/Translate/composer.json10
-rw-r--r--MLEB/Translate/data/group-yaml-schema.yaml52
-rw-r--r--MLEB/Translate/extension.json213
-rw-r--r--MLEB/Translate/ffs/AndroidXmlFFS.php28
-rw-r--r--MLEB/Translate/ffs/AppleFFS.php4
-rw-r--r--MLEB/Translate/ffs/AppleInfoPlistFfs.php1
-rw-r--r--MLEB/Translate/ffs/DtdFFS.php4
-rw-r--r--MLEB/Translate/ffs/FlatPhpFFS.php8
-rw-r--r--MLEB/Translate/ffs/GettextFFS.php29
-rw-r--r--MLEB/Translate/ffs/GettextParseException.php12
-rw-r--r--MLEB/Translate/ffs/IniFFS.php15
-rw-r--r--MLEB/Translate/ffs/JavaFFS.php8
-rw-r--r--MLEB/Translate/ffs/JavaScriptFFS.php4
-rw-r--r--MLEB/Translate/ffs/JsonFFS.php8
-rw-r--r--MLEB/Translate/ffs/PremadeMediawikiExtensionGroups.php10
-rw-r--r--MLEB/Translate/ffs/SimpleFFS.php32
-rw-r--r--MLEB/Translate/ffs/YamlFFS.php9
-rw-r--r--MLEB/Translate/i18n/api/ar.json2
-rw-r--r--MLEB/Translate/i18n/api/ast.json2
-rw-r--r--MLEB/Translate/i18n/api/ban.json9
-rw-r--r--MLEB/Translate/i18n/api/bg.json17
-rw-r--r--MLEB/Translate/i18n/api/bs.json2
-rw-r--r--MLEB/Translate/i18n/api/de.json1
-rw-r--r--MLEB/Translate/i18n/api/en.json22
-rw-r--r--MLEB/Translate/i18n/api/fi.json4
-rw-r--r--MLEB/Translate/i18n/api/fr.json24
-rw-r--r--MLEB/Translate/i18n/api/fy.json9
-rw-r--r--MLEB/Translate/i18n/api/gl.json5
-rw-r--r--MLEB/Translate/i18n/api/he.json28
-rw-r--r--MLEB/Translate/i18n/api/hi.json2
-rw-r--r--MLEB/Translate/i18n/api/hu.json4
-rw-r--r--MLEB/Translate/i18n/api/hyw.json8
-rw-r--r--MLEB/Translate/i18n/api/ia.json1
-rw-r--r--MLEB/Translate/i18n/api/id.json102
-rw-r--r--MLEB/Translate/i18n/api/io.json3
-rw-r--r--MLEB/Translate/i18n/api/ksh.json2
-rw-r--r--MLEB/Translate/i18n/api/lb.json1
-rw-r--r--MLEB/Translate/i18n/api/lv.json1
-rw-r--r--MLEB/Translate/i18n/api/mk.json22
-rw-r--r--MLEB/Translate/i18n/api/nb.json14
-rw-r--r--MLEB/Translate/i18n/api/pnb.json11
-rw-r--r--MLEB/Translate/i18n/api/pt-br.json18
-rw-r--r--MLEB/Translate/i18n/api/pt.json2
-rw-r--r--MLEB/Translate/i18n/api/qqq.json28
-rw-r--r--MLEB/Translate/i18n/api/ro.json12
-rw-r--r--MLEB/Translate/i18n/api/roa-tara.json2
-rw-r--r--MLEB/Translate/i18n/api/ru.json1
-rw-r--r--MLEB/Translate/i18n/api/sr-ec.json18
-rw-r--r--MLEB/Translate/i18n/api/sv.json3
-rw-r--r--MLEB/Translate/i18n/api/sw.json17
-rw-r--r--MLEB/Translate/i18n/api/tly.json9
-rw-r--r--MLEB/Translate/i18n/api/tr.json24
-rw-r--r--MLEB/Translate/i18n/api/uk.json14
-rw-r--r--MLEB/Translate/i18n/api/zh-hans.json2
-rw-r--r--MLEB/Translate/i18n/api/zh-hant.json12
-rw-r--r--MLEB/Translate/i18n/core/ace.json2
-rw-r--r--MLEB/Translate/i18n/core/af.json10
-rw-r--r--MLEB/Translate/i18n/core/aln.json1
-rw-r--r--MLEB/Translate/i18n/core/alt.json9
-rw-r--r--MLEB/Translate/i18n/core/am.json1
-rw-r--r--MLEB/Translate/i18n/core/an.json5
-rw-r--r--MLEB/Translate/i18n/core/ang.json5
-rw-r--r--MLEB/Translate/i18n/core/ann.json8
-rw-r--r--MLEB/Translate/i18n/core/ar.json12
-rw-r--r--MLEB/Translate/i18n/core/arc.json9
-rw-r--r--MLEB/Translate/i18n/core/arz.json3
-rw-r--r--MLEB/Translate/i18n/core/as.json10
-rw-r--r--MLEB/Translate/i18n/core/ast.json10
-rw-r--r--MLEB/Translate/i18n/core/atj.json1
-rw-r--r--MLEB/Translate/i18n/core/awa.json3
-rw-r--r--MLEB/Translate/i18n/core/az.json9
-rw-r--r--MLEB/Translate/i18n/core/azb.json10
-rw-r--r--MLEB/Translate/i18n/core/ba.json8
-rw-r--r--MLEB/Translate/i18n/core/ban.json4
-rw-r--r--MLEB/Translate/i18n/core/bar.json3
-rw-r--r--MLEB/Translate/i18n/core/bci.json8
-rw-r--r--MLEB/Translate/i18n/core/be-tarask.json10
-rw-r--r--MLEB/Translate/i18n/core/be.json8
-rw-r--r--MLEB/Translate/i18n/core/bg.json11
-rw-r--r--MLEB/Translate/i18n/core/bgn.json1
-rw-r--r--MLEB/Translate/i18n/core/bho.json2
-rw-r--r--MLEB/Translate/i18n/core/bn.json25
-rw-r--r--MLEB/Translate/i18n/core/br.json10
-rw-r--r--MLEB/Translate/i18n/core/bs.json10
-rw-r--r--MLEB/Translate/i18n/core/ca.json23
-rw-r--r--MLEB/Translate/i18n/core/ce.json42
-rw-r--r--MLEB/Translate/i18n/core/ckb.json9
-rw-r--r--MLEB/Translate/i18n/core/cs.json12
-rw-r--r--MLEB/Translate/i18n/core/csb.json1
-rw-r--r--MLEB/Translate/i18n/core/cy.json9
-rw-r--r--MLEB/Translate/i18n/core/da.json16
-rw-r--r--MLEB/Translate/i18n/core/dag.json27
-rw-r--r--MLEB/Translate/i18n/core/de.json50
-rw-r--r--MLEB/Translate/i18n/core/diq.json45
-rw-r--r--MLEB/Translate/i18n/core/dsb.json10
-rw-r--r--MLEB/Translate/i18n/core/dty.json1
-rw-r--r--MLEB/Translate/i18n/core/ee.json2
-rw-r--r--MLEB/Translate/i18n/core/el.json11
-rw-r--r--MLEB/Translate/i18n/core/en-gb.json3
-rw-r--r--MLEB/Translate/i18n/core/en.json40
-rw-r--r--MLEB/Translate/i18n/core/eo.json10
-rw-r--r--MLEB/Translate/i18n/core/es.json20
-rw-r--r--MLEB/Translate/i18n/core/et.json17
-rw-r--r--MLEB/Translate/i18n/core/eu.json9
-rw-r--r--MLEB/Translate/i18n/core/fa.json10
-rw-r--r--MLEB/Translate/i18n/core/ff.json3
-rw-r--r--MLEB/Translate/i18n/core/fi.json52
-rw-r--r--MLEB/Translate/i18n/core/fit.json9
-rw-r--r--MLEB/Translate/i18n/core/fo.json10
-rw-r--r--MLEB/Translate/i18n/core/fr.json43
-rw-r--r--MLEB/Translate/i18n/core/frp.json10
-rw-r--r--MLEB/Translate/i18n/core/frr.json1
-rw-r--r--MLEB/Translate/i18n/core/fur.json9
-rw-r--r--MLEB/Translate/i18n/core/fy.json297
-rw-r--r--MLEB/Translate/i18n/core/ga.json5
-rw-r--r--MLEB/Translate/i18n/core/gcr.json1
-rw-r--r--MLEB/Translate/i18n/core/gl.json23
-rw-r--r--MLEB/Translate/i18n/core/gld.json11
-rw-r--r--MLEB/Translate/i18n/core/grc.json2
-rw-r--r--MLEB/Translate/i18n/core/gsw.json10
-rw-r--r--MLEB/Translate/i18n/core/gu.json7
-rw-r--r--MLEB/Translate/i18n/core/guc.json8
-rw-r--r--MLEB/Translate/i18n/core/guw.json8
-rw-r--r--MLEB/Translate/i18n/core/gv.json3
-rw-r--r--MLEB/Translate/i18n/core/he.json57
-rw-r--r--MLEB/Translate/i18n/core/hi.json17
-rw-r--r--MLEB/Translate/i18n/core/hr.json11
-rw-r--r--MLEB/Translate/i18n/core/hrx.json8
-rw-r--r--MLEB/Translate/i18n/core/hsb.json10
-rw-r--r--MLEB/Translate/i18n/core/ht.json5
-rw-r--r--MLEB/Translate/i18n/core/hu.json51
-rw-r--r--MLEB/Translate/i18n/core/hy.json27
-rw-r--r--MLEB/Translate/i18n/core/hyw.json8
-rw-r--r--MLEB/Translate/i18n/core/ia.json28
-rw-r--r--MLEB/Translate/i18n/core/id.json69
-rw-r--r--MLEB/Translate/i18n/core/ie.json8
-rw-r--r--MLEB/Translate/i18n/core/ig.json2
-rw-r--r--MLEB/Translate/i18n/core/ilo.json10
-rw-r--r--MLEB/Translate/i18n/core/inh.json1
-rw-r--r--MLEB/Translate/i18n/core/io.json20
-rw-r--r--MLEB/Translate/i18n/core/is.json10
-rw-r--r--MLEB/Translate/i18n/core/it.json27
-rw-r--r--MLEB/Translate/i18n/core/ja.json33
-rw-r--r--MLEB/Translate/i18n/core/jam.json4
-rw-r--r--MLEB/Translate/i18n/core/jbo.json4
-rw-r--r--MLEB/Translate/i18n/core/jv.json38
-rw-r--r--MLEB/Translate/i18n/core/ka.json19
-rw-r--r--MLEB/Translate/i18n/core/kaa.json1
-rw-r--r--MLEB/Translate/i18n/core/kab.json13
-rw-r--r--MLEB/Translate/i18n/core/kcg.json9
-rw-r--r--MLEB/Translate/i18n/core/kjp.json3
-rw-r--r--MLEB/Translate/i18n/core/kk-arab.json1
-rw-r--r--MLEB/Translate/i18n/core/kk-cyrl.json10
-rw-r--r--MLEB/Translate/i18n/core/kk-latn.json1
-rw-r--r--MLEB/Translate/i18n/core/km.json10
-rw-r--r--MLEB/Translate/i18n/core/kn.json11
-rw-r--r--MLEB/Translate/i18n/core/ko.json31
-rw-r--r--MLEB/Translate/i18n/core/ksh.json10
-rw-r--r--MLEB/Translate/i18n/core/ku-latn.json25
-rw-r--r--MLEB/Translate/i18n/core/ky.json2
-rw-r--r--MLEB/Translate/i18n/core/lb.json29
-rw-r--r--MLEB/Translate/i18n/core/lez.json8
-rw-r--r--MLEB/Translate/i18n/core/li.json2
-rw-r--r--MLEB/Translate/i18n/core/lij.json3
-rw-r--r--MLEB/Translate/i18n/core/lki.json5
-rw-r--r--MLEB/Translate/i18n/core/lmo.json42
-rw-r--r--MLEB/Translate/i18n/core/lrc.json4
-rw-r--r--MLEB/Translate/i18n/core/lt.json10
-rw-r--r--MLEB/Translate/i18n/core/ltg.json1
-rw-r--r--MLEB/Translate/i18n/core/lus.json10
-rw-r--r--MLEB/Translate/i18n/core/lv.json10
-rw-r--r--MLEB/Translate/i18n/core/lzh.json6
-rw-r--r--MLEB/Translate/i18n/core/mad.json8
-rw-r--r--MLEB/Translate/i18n/core/map-bms.json2
-rw-r--r--MLEB/Translate/i18n/core/min.json1
-rw-r--r--MLEB/Translate/i18n/core/mk.json40
-rw-r--r--MLEB/Translate/i18n/core/ml.json9
-rw-r--r--MLEB/Translate/i18n/core/mnc.json15
-rw-r--r--MLEB/Translate/i18n/core/mni.json7
-rw-r--r--MLEB/Translate/i18n/core/mo.json3
-rw-r--r--MLEB/Translate/i18n/core/mr.json10
-rw-r--r--MLEB/Translate/i18n/core/mrh.json4
-rw-r--r--MLEB/Translate/i18n/core/ms.json15
-rw-r--r--MLEB/Translate/i18n/core/mt.json7
-rw-r--r--MLEB/Translate/i18n/core/mwl.json1
-rw-r--r--MLEB/Translate/i18n/core/my.json12
-rw-r--r--MLEB/Translate/i18n/core/myv.json1
-rw-r--r--MLEB/Translate/i18n/core/nah.json2
-rw-r--r--MLEB/Translate/i18n/core/nb.json15
-rw-r--r--MLEB/Translate/i18n/core/nds-nl.json4
-rw-r--r--MLEB/Translate/i18n/core/nds.json2
-rw-r--r--MLEB/Translate/i18n/core/ne.json12
-rw-r--r--MLEB/Translate/i18n/core/nia.json8
-rw-r--r--MLEB/Translate/i18n/core/nl.json10
-rw-r--r--MLEB/Translate/i18n/core/nn.json10
-rw-r--r--MLEB/Translate/i18n/core/nqo.json4
-rw-r--r--MLEB/Translate/i18n/core/nso.json4
-rw-r--r--MLEB/Translate/i18n/core/oc.json10
-rw-r--r--MLEB/Translate/i18n/core/ojb.json12
-rw-r--r--MLEB/Translate/i18n/core/om.json18
-rw-r--r--MLEB/Translate/i18n/core/or.json7
-rw-r--r--MLEB/Translate/i18n/core/os.json4
-rw-r--r--MLEB/Translate/i18n/core/pa.json9
-rw-r--r--MLEB/Translate/i18n/core/pam.json3
-rw-r--r--MLEB/Translate/i18n/core/pap.json8
-rw-r--r--MLEB/Translate/i18n/core/pdc.json4
-rw-r--r--MLEB/Translate/i18n/core/pfl.json10
-rw-r--r--MLEB/Translate/i18n/core/pl.json26
-rw-r--r--MLEB/Translate/i18n/core/pms.json10
-rw-r--r--MLEB/Translate/i18n/core/pnb.json39
-rw-r--r--MLEB/Translate/i18n/core/ps.json8
-rw-r--r--MLEB/Translate/i18n/core/pt-br.json43
-rw-r--r--MLEB/Translate/i18n/core/pt.json11
-rw-r--r--MLEB/Translate/i18n/core/qqq.json50
-rw-r--r--MLEB/Translate/i18n/core/qu.json10
-rw-r--r--MLEB/Translate/i18n/core/rm.json1
-rw-r--r--MLEB/Translate/i18n/core/ro.json47
-rw-r--r--MLEB/Translate/i18n/core/roa-tara.json41
-rw-r--r--MLEB/Translate/i18n/core/ru.json32
-rw-r--r--MLEB/Translate/i18n/core/rue.json7
-rw-r--r--MLEB/Translate/i18n/core/sa.json4
-rw-r--r--MLEB/Translate/i18n/core/sah.json4
-rw-r--r--MLEB/Translate/i18n/core/scn.json3
-rw-r--r--MLEB/Translate/i18n/core/sco.json10
-rw-r--r--MLEB/Translate/i18n/core/sd.json6
-rw-r--r--MLEB/Translate/i18n/core/sdc.json3
-rw-r--r--MLEB/Translate/i18n/core/se.json13
-rw-r--r--MLEB/Translate/i18n/core/sgs.json1
-rw-r--r--MLEB/Translate/i18n/core/shi.json8
-rw-r--r--MLEB/Translate/i18n/core/si.json10
-rw-r--r--MLEB/Translate/i18n/core/sk.json15
-rw-r--r--MLEB/Translate/i18n/core/skr-arab.json8
-rw-r--r--MLEB/Translate/i18n/core/sl.json64
-rw-r--r--MLEB/Translate/i18n/core/sli.json8
-rw-r--r--MLEB/Translate/i18n/core/smn.json12
-rw-r--r--MLEB/Translate/i18n/core/sms.json12
-rw-r--r--MLEB/Translate/i18n/core/sq.json1
-rw-r--r--MLEB/Translate/i18n/core/sr-ec.json75
-rw-r--r--MLEB/Translate/i18n/core/sr-el.json11
-rw-r--r--MLEB/Translate/i18n/core/stq.json1
-rw-r--r--MLEB/Translate/i18n/core/su.json2
-rw-r--r--MLEB/Translate/i18n/core/sv.json41
-rw-r--r--MLEB/Translate/i18n/core/sw.json11
-rw-r--r--MLEB/Translate/i18n/core/szy.json1
-rw-r--r--MLEB/Translate/i18n/core/ta.json10
-rw-r--r--MLEB/Translate/i18n/core/tcy.json2
-rw-r--r--MLEB/Translate/i18n/core/te.json24
-rw-r--r--MLEB/Translate/i18n/core/tet.json2
-rw-r--r--MLEB/Translate/i18n/core/tg-cyrl.json8
-rw-r--r--MLEB/Translate/i18n/core/th.json36
-rw-r--r--MLEB/Translate/i18n/core/ti.json118
-rw-r--r--MLEB/Translate/i18n/core/tk.json4
-rw-r--r--MLEB/Translate/i18n/core/tl.json10
-rw-r--r--MLEB/Translate/i18n/core/tly.json25
-rw-r--r--MLEB/Translate/i18n/core/tr.json49
-rw-r--r--MLEB/Translate/i18n/core/tt-cyrl.json9
-rw-r--r--MLEB/Translate/i18n/core/tzm.json1
-rw-r--r--MLEB/Translate/i18n/core/ug-arab.json12
-rw-r--r--MLEB/Translate/i18n/core/uk.json28
-rw-r--r--MLEB/Translate/i18n/core/ur.json7
-rw-r--r--MLEB/Translate/i18n/core/uz.json33
-rw-r--r--MLEB/Translate/i18n/core/vec.json8
-rw-r--r--MLEB/Translate/i18n/core/vep.json5
-rw-r--r--MLEB/Translate/i18n/core/vi.json12
-rw-r--r--MLEB/Translate/i18n/core/vo.json1
-rw-r--r--MLEB/Translate/i18n/core/wa.json60
-rw-r--r--MLEB/Translate/i18n/core/xal.json2
-rw-r--r--MLEB/Translate/i18n/core/xmf.json2
-rw-r--r--MLEB/Translate/i18n/core/yi.json10
-rw-r--r--MLEB/Translate/i18n/core/yue.json5
-rw-r--r--MLEB/Translate/i18n/core/zgh.json4
-rw-r--r--MLEB/Translate/i18n/core/zh-hans.json25
-rw-r--r--MLEB/Translate/i18n/core/zh-hant.json40
-rw-r--r--MLEB/Translate/i18n/pagetranslation/af.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/alt.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/an.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ann.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ar.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/as.json7
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ast.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/az.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/azb.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ban.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bbc-latn.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bci.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bcl.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/be-tarask.json23
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bg.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bn.json9
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bo.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/br.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/bs.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ca.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ceb.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/cs.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/cy.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/da.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/dag.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/de-formal.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/de.json21
-rw-r--r--MLEB/Translate/i18n/pagetranslation/diq.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/dsb.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/el.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/en.json12
-rw-r--r--MLEB/Translate/i18n/pagetranslation/eo.json13
-rw-r--r--MLEB/Translate/i18n/pagetranslation/es.json13
-rw-r--r--MLEB/Translate/i18n/pagetranslation/et.json33
-rw-r--r--MLEB/Translate/i18n/pagetranslation/eu.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/fa.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ff.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/fi.json19
-rw-r--r--MLEB/Translate/i18n/pagetranslation/fr.json118
-rw-r--r--MLEB/Translate/i18n/pagetranslation/frp.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/fur.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/fy.json204
-rw-r--r--MLEB/Translate/i18n/pagetranslation/gl.json16
-rw-r--r--MLEB/Translate/i18n/pagetranslation/gom-latn.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/grc.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/gsw.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/gu.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/guc.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ha.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/he.json48
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hi.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hr.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hrx.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hsb.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hu.json17
-rw-r--r--MLEB/Translate/i18n/pagetranslation/hy.json6
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ia.json12
-rw-r--r--MLEB/Translate/i18n/pagetranslation/id.json189
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ie.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/io.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/is.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/it.json7
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ja.json14
-rw-r--r--MLEB/Translate/i18n/pagetranslation/jv.json26
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ka.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/kab.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/kcg.json9
-rw-r--r--MLEB/Translate/i18n/pagetranslation/kk-cyrl.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/kn.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ko.json6
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ksh.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ku-latn.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ky.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/lb.json6
-rw-r--r--MLEB/Translate/i18n/pagetranslation/lmo.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/lt.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/lv.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/mad.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/mk.json14
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ml.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/mnc.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/mr.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/mrh.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ms.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/my.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/nb.json10
-rw-r--r--MLEB/Translate/i18n/pagetranslation/nia.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/nl.json11
-rw-r--r--MLEB/Translate/i18n/pagetranslation/nn.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ojb.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/om.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pap.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pfl.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pl.json9
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pms.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pnb.json11
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ps.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pt-br.json14
-rw-r--r--MLEB/Translate/i18n/pagetranslation/pt.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/qqq.json18
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ro.json13
-rw-r--r--MLEB/Translate/i18n/pagetranslation/roa-tara.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ru.json16
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sa.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sco.json2
-rw-r--r--MLEB/Translate/i18n/pagetranslation/se.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/shi.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/si.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sl.json34
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sli.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/smn.json9
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sms.json8
-rw-r--r--MLEB/Translate/i18n/pagetranslation/so.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sq.json7
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sr-ec.json26
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sr-el.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/su.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sv.json22
-rw-r--r--MLEB/Translate/i18n/pagetranslation/sw.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ta.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tcy.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ti.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tk.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tl.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tly.json4
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tr.json24
-rw-r--r--MLEB/Translate/i18n/pagetranslation/tt-cyrl.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ug-arab.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/uk.json10
-rw-r--r--MLEB/Translate/i18n/pagetranslation/ur.json1
-rw-r--r--MLEB/Translate/i18n/pagetranslation/vi.json5
-rw-r--r--MLEB/Translate/i18n/pagetranslation/yi.json3
-rw-r--r--MLEB/Translate/i18n/pagetranslation/zgh.json6
-rw-r--r--MLEB/Translate/i18n/pagetranslation/zh-hans.json25
-rw-r--r--MLEB/Translate/i18n/pagetranslation/zh-hant.json18
-rw-r--r--MLEB/Translate/i18n/sandbox/ce.json2
-rw-r--r--MLEB/Translate/i18n/sandbox/de.json5
-rw-r--r--MLEB/Translate/i18n/sandbox/diq.json5
-rw-r--r--MLEB/Translate/i18n/sandbox/fi.json2
-rw-r--r--MLEB/Translate/i18n/sandbox/fy.json44
-rw-r--r--MLEB/Translate/i18n/sandbox/he.json2
-rw-r--r--MLEB/Translate/i18n/sandbox/hu.json2
-rw-r--r--MLEB/Translate/i18n/sandbox/hy.json8
-rw-r--r--MLEB/Translate/i18n/sandbox/hyw.json8
-rw-r--r--MLEB/Translate/i18n/sandbox/id.json52
-rw-r--r--MLEB/Translate/i18n/sandbox/kab.json27
-rw-r--r--MLEB/Translate/i18n/sandbox/ku-latn.json2
-rw-r--r--MLEB/Translate/i18n/sandbox/pnb.json8
-rw-r--r--MLEB/Translate/i18n/sandbox/pt-br.json1
-rw-r--r--MLEB/Translate/i18n/sandbox/ro.json8
-rw-r--r--MLEB/Translate/i18n/sandbox/sr-ec.json8
-rw-r--r--MLEB/Translate/i18n/sandbox/sv.json3
-rw-r--r--MLEB/Translate/i18n/sandbox/th.json19
-rw-r--r--MLEB/Translate/i18n/search/az.json10
-rw-r--r--MLEB/Translate/i18n/search/fy.json25
-rw-r--r--MLEB/Translate/i18n/search/id.json32
-rw-r--r--MLEB/Translate/i18n/search/io.json7
-rw-r--r--MLEB/Translate/i18n/search/ksh.json7
-rw-r--r--MLEB/Translate/i18n/search/pnb.json9
-rw-r--r--MLEB/Translate/i18n/search/pt-br.json1
-rw-r--r--MLEB/Translate/i18n/search/sl.json5
-rw-r--r--MLEB/Translate/i18n/search/sv.json2
-rw-r--r--MLEB/Translate/i18n/search/th.json20
-rw-r--r--MLEB/Translate/i18n/search/ti.json8
-rw-r--r--MLEB/Translate/i18n/search/yue.json8
-rw-r--r--MLEB/Translate/i18n/search/zgh.json19
-rw-r--r--MLEB/Translate/insertables/CombinedInsertablesSuggester.php29
-rw-r--r--MLEB/Translate/insertables/InsertablesSuggester.php22
-rw-r--r--MLEB/Translate/messagegroups/AggregateMessageGroup.php36
-rw-r--r--MLEB/Translate/messagegroups/FileBasedMessageGroup.php12
-rw-r--r--MLEB/Translate/messagegroups/MessageGroup.php15
-rw-r--r--MLEB/Translate/messagegroups/MessageGroupBase.php134
-rw-r--r--MLEB/Translate/messagegroups/MessageGroupOld.php88
-rw-r--r--MLEB/Translate/messagegroups/RecentAdditionsMessageGroup.php12
-rw-r--r--MLEB/Translate/messagegroups/RecentMessageGroup.php12
-rw-r--r--MLEB/Translate/messagegroups/SandboxMessageGroup.php5
-rw-r--r--MLEB/Translate/messagegroups/WikiMessageGroup.php2
-rw-r--r--MLEB/Translate/messagegroups/WikiPageMessageGroup.php28
-rw-r--r--MLEB/Translate/messagegroups/WorkflowStatesMessageGroup.php10
-rw-r--r--MLEB/Translate/messagegroups/loaders/AggregateMessageGroupLoader.php12
-rw-r--r--MLEB/Translate/messagegroups/loaders/FileBasedMessageGroupLoader.php7
-rw-r--r--MLEB/Translate/messagegroups/loaders/TranslatablePageMessageGroupStore.php14
-rw-r--r--MLEB/Translate/package-lock.json2569
-rw-r--r--MLEB/Translate/package.json8
-rw-r--r--MLEB/Translate/resources/css/ext.translate.groupselector.less9
-rw-r--r--MLEB/Translate/resources/css/ext.translate.quickedit.css64
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.managegroups.css69
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.pagemigration.css10
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.pagepreparation.css4
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.pagetranslation.css9
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.searchtranslations.css2
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.supportedlanguages.css4
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.translate.css18
-rw-r--r--MLEB/Translate/resources/css/ext.translate.special.translations.css36
-rw-r--r--MLEB/Translate/resources/css/ext.translate.statstable.less7
-rw-r--r--MLEB/Translate/resources/css/ext.translate.tabgroup.css5
-rw-r--r--MLEB/Translate/resources/css/ext.translate.translationstats.graphbuilder.less91
-rw-r--r--MLEB/Translate/resources/images/search.svg7
-rw-r--r--MLEB/Translate/resources/js/LanguagesMultiselectWidget.js123
-rw-r--r--MLEB/Translate/resources/js/ext.translate.base.js7
-rw-r--r--MLEB/Translate/resources/js/ext.translate.editor.helpers.js10
-rw-r--r--MLEB/Translate/resources/js/ext.translate.editor.js18
-rw-r--r--MLEB/Translate/resources/js/ext.translate.groupselector.js20
-rw-r--r--MLEB/Translate/resources/js/ext.translate.messagetable.js16
-rw-r--r--MLEB/Translate/resources/js/ext.translate.multiselectautocomplete.js96
-rw-r--r--MLEB/Translate/resources/js/ext.translate.pagetranslation.uls.js9
-rw-r--r--MLEB/Translate/resources/js/ext.translate.parsers.js4
-rw-r--r--MLEB/Translate/resources/js/ext.translate.proofread.js4
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.aggregategroups.js21
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.languagestats.js163
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.managegroups.js139
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.managetranslatorsandbox.js8
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.pagemigration.js38
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.pagepreparation.js36
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.pagetranslation.js69
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.searchtranslations.js36
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.translate.js73
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.translationstash.js9
-rw-r--r--MLEB/Translate/resources/js/ext.translate.special.translationstats.js137
-rw-r--r--MLEB/Translate/resources/js/ext.translate.statsbar.js2
-rw-r--r--MLEB/Translate/resources/js/ext.translate.translationstats.embedded.js86
-rw-r--r--MLEB/Translate/resources/js/ext.translate.translationstats.graphbuilder.js346
-rw-r--r--MLEB/Translate/resources/js/ext.translate.workflowselector.js12
-rw-r--r--MLEB/Translate/resources/lib/Chart.js/Chart.css47
-rw-r--r--MLEB/Translate/resources/lib/Chart.js/Chart.js16151
-rw-r--r--MLEB/Translate/scripts/__bootstrap.php19
-rw-r--r--MLEB/Translate/scripts/characterEditStats.php19
-rw-r--r--MLEB/Translate/scripts/cleanupTranslationProgressStats.php6
-rw-r--r--MLEB/Translate/scripts/clearGroupSyncCache.php6
-rw-r--r--MLEB/Translate/scripts/completeExternalTranslation.php10
-rw-r--r--MLEB/Translate/scripts/createCheckIndex.php2
-rw-r--r--MLEB/Translate/scripts/deleteEqualTranslations.php6
-rw-r--r--MLEB/Translate/scripts/export.php389
-rw-r--r--MLEB/Translate/scripts/exportTtmServerDump.php6
-rw-r--r--MLEB/Translate/scripts/fallbacks-graph.php8
-rw-r--r--MLEB/Translate/scripts/findUnsynchronizedDefinitions.php6
-rw-r--r--MLEB/Translate/scripts/fuzzy.php34
-rw-r--r--MLEB/Translate/scripts/groupStatistics.php6
-rw-r--r--MLEB/Translate/scripts/languageeditstats.php2
-rw-r--r--MLEB/Translate/scripts/moveTranslatablePage.php6
-rw-r--r--MLEB/Translate/scripts/poimport.php33
-rw-r--r--MLEB/Translate/scripts/populateFuzzy.php5
-rw-r--r--MLEB/Translate/scripts/processMessageChanges.php11
-rw-r--r--MLEB/Translate/scripts/queryGroupSyncCache.php6
-rw-r--r--MLEB/Translate/scripts/sync-group.php8
-rw-r--r--MLEB/Translate/scripts/translator-stats.php5
-rw-r--r--MLEB/Translate/scripts/ttmserver-export.php33
-rw-r--r--MLEB/Translate/scripts/updateTranslatorActivity.php10
-rw-r--r--MLEB/Translate/sonar-project.properties2
-rw-r--r--MLEB/Translate/specials/SpecialAggregateGroups.php15
-rw-r--r--MLEB/Translate/specials/SpecialExportTranslations.php67
-rw-r--r--MLEB/Translate/specials/SpecialImportTranslations.php26
-rw-r--r--MLEB/Translate/specials/SpecialLanguageStats.php87
-rw-r--r--MLEB/Translate/specials/SpecialManageGroups.php531
-rw-r--r--MLEB/Translate/specials/SpecialManageTranslatorSandbox.php335
-rw-r--r--MLEB/Translate/specials/SpecialMessageGroupStats.php5
-rw-r--r--MLEB/Translate/specials/SpecialSearchTranslations.php8
-rw-r--r--MLEB/Translate/specials/SpecialTranslate.php28
-rw-r--r--MLEB/Translate/specials/SpecialTranslationStats.php961
-rw-r--r--MLEB/Translate/specials/SpecialTranslations.php13
-rw-r--r--MLEB/Translate/sql/translate_cache.sql13
-rw-r--r--MLEB/Translate/src/Cache/PersistentCache.php31
-rw-r--r--MLEB/Translate/src/Cache/PersistentCacheEntry.php78
-rw-r--r--MLEB/Translate/src/Cache/PersistentDatabaseCache.php186
-rw-r--r--MLEB/Translate/src/Diagnostics/DeleteEqualTranslationsMaintenanceScript.php154
-rw-r--r--MLEB/Translate/src/Diagnostics/FindUnsynchronizedDefinitionsMaintenanceScript.php116
-rw-r--r--MLEB/Translate/src/Jobs/GenericTranslateJob.php19
-rw-r--r--MLEB/Translate/src/MessageSync/MessageSourceChange.php22
-rw-r--r--MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php265
-rw-r--r--MLEB/Translate/src/PageTranslation/ParserOutput.php100
-rw-r--r--MLEB/Translate/src/PageTranslation/ParsingFailure.php31
-rw-r--r--MLEB/Translate/src/PageTranslation/Section.php36
-rw-r--r--MLEB/Translate/src/PageTranslation/TestingParsingPlaceholderFactory.php24
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslatablePageInsertablesSuggester.php (renamed from MLEB/Translate/insertables/TranslatablePageInsertablesSuggester.php)20
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslatablePageMover.php447
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslatablePageParser.php225
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslationPage.php104
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslationUnit.php212
-rw-r--r--MLEB/Translate/src/PageTranslation/TranslationVariable.php38
-rw-r--r--MLEB/Translate/src/ServiceWiring.php87
-rw-r--r--MLEB/Translate/src/Services.php67
-rw-r--r--MLEB/Translate/src/Statistics/ActiveLanguagesSpecialPage.php (renamed from MLEB/Translate/specials/SpecialSupportedLanguages.php)146
-rw-r--r--MLEB/Translate/src/Statistics/CleanupTranslationProgressStatsMaintenanceScript.php84
-rw-r--r--MLEB/Translate/src/Statistics/QueryTranslationStatsActionApi.php84
-rw-r--r--MLEB/Translate/src/Statistics/ReviewPerLanguageStats.php115
-rw-r--r--MLEB/Translate/src/Statistics/StatisticsUnavailable.php8
-rw-r--r--MLEB/Translate/src/Statistics/TranslatePerLanguageStats.php195
-rw-r--r--MLEB/Translate/src/Statistics/TranslateRegistrationStats.php27
-rw-r--r--MLEB/Translate/src/Statistics/TranslationStatsBase.php77
-rw-r--r--MLEB/Translate/src/Statistics/TranslationStatsDataProvider.php233
-rw-r--r--MLEB/Translate/src/Statistics/TranslationStatsGraphOptions.php112
-rw-r--r--MLEB/Translate/src/Statistics/TranslationStatsInterface.php68
-rw-r--r--MLEB/Translate/src/Statistics/TranslatorActivity.php39
-rw-r--r--MLEB/Translate/src/Statistics/TranslatorActivityQuery.php41
-rw-r--r--MLEB/Translate/src/Statistics/UpdateTranslatorActivityJob.php12
-rw-r--r--MLEB/Translate/src/Statistics/UpdateTranslatorActivityMaintenanceScript.php13
-rw-r--r--MLEB/Translate/src/Synchronization/ClearGroupSyncCacheMaintenanceScript.php83
-rw-r--r--MLEB/Translate/src/Synchronization/CompleteExternalTranslationMaintenanceScript.php34
-rw-r--r--MLEB/Translate/src/Synchronization/DisplayGroupSynchronizationInfo.php261
-rw-r--r--MLEB/Translate/src/Synchronization/ExportTranslationsMaintenanceScript.php391
-rw-r--r--MLEB/Translate/src/Synchronization/GroupSynchronizationCache.php461
-rw-r--r--MLEB/Translate/src/Synchronization/GroupSynchronizationResponse.php38
-rw-r--r--MLEB/Translate/src/Synchronization/ManageGroupSynchronizationCacheActionApi.php114
-rw-r--r--MLEB/Translate/src/Synchronization/MessageUpdateParameter.php34
-rw-r--r--MLEB/Translate/src/Synchronization/QueryGroupSyncCacheMaintenanceScript.php97
-rw-r--r--MLEB/Translate/src/SystemUsers/FuzzyBot.php4
-rw-r--r--MLEB/Translate/src/SystemUsers/TranslateUserManager.php12
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/CombinedInsertablesSuggester.php33
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/HtmlTagInsertablesSuggester.php (renamed from MLEB/Translate/insertables/HtmlTagInsertablesSuggester.php)18
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/Insertable.php (renamed from MLEB/Translate/insertables/Insertable.php)24
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/InsertableFactory.php50
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/InsertablesSuggester.php21
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/MediaWikiInsertablesSuggester.php (renamed from MLEB/Translate/insertables/MediaWikiInsertablesSuggester.php)16
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggester.php (renamed from MLEB/Translate/insertables/NumericalParameterInsertablesSuggester.php)15
-rw-r--r--MLEB/Translate/src/TranslatorInterface/Insertable/RegexInsertablesSuggester.php (renamed from MLEB/Translate/insertables/RegexInsertablesSuggester.php)31
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/ManageTranslatorSandboxSpecialPage.php224
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/StashedTranslation.php (renamed from MLEB/Translate/stash/StashedTranslation.php)49
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/TranslationStashReader.php22
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/TranslationStashSpecialPage.php (renamed from MLEB/Translate/specials/SpecialTranslationStash.php)129
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/TranslationStashStorage.php (renamed from MLEB/Translate/stash/TranslationStashStorage.php)80
-rw-r--r--MLEB/Translate/src/TranslatorSandbox/TranslationStashWriter.php19
-rw-r--r--MLEB/Translate/src/TtmServer/ExportTtmServerDumpMaintenanceScript.php198
-rw-r--r--MLEB/Translate/src/TtmServer/ServiceCreationFailure.php14
-rw-r--r--MLEB/Translate/src/TtmServer/TtmServerFactory.php83
-rw-r--r--MLEB/Translate/src/Utilities/BaseMaintenanceScript.php21
-rw-r--r--MLEB/Translate/src/Utilities/GettextPlural.php8
-rw-r--r--MLEB/Translate/src/Utilities/Json/JsonCodec.php89
-rw-r--r--MLEB/Translate/src/Utilities/Json/JsonUnserializable.php19
-rw-r--r--MLEB/Translate/src/Utilities/Json/JsonUnserializableTrait.php37
-rw-r--r--MLEB/Translate/src/Utilities/LanguagesMultiselectWidget.php35
-rw-r--r--MLEB/Translate/src/Utilities/ParallelExecutor.php56
-rw-r--r--MLEB/Translate/src/Utilities/ParsingPlaceholderFactory.php4
-rw-r--r--MLEB/Translate/src/Utilities/SmartFormatPlural.php6
-rw-r--r--MLEB/Translate/src/Utilities/StringComparators/SimpleStringComparator.php8
-rw-r--r--MLEB/Translate/src/Utilities/StringComparators/StringComparator.php4
-rw-r--r--MLEB/Translate/src/Utilities/TranslateReplaceTitle.php17
-rw-r--r--MLEB/Translate/src/Utilities/UnicodePlural.php8
-rw-r--r--MLEB/Translate/src/Validation/LegacyValidatorAdapter.php9
-rw-r--r--MLEB/Translate/src/Validation/MessageValidator.php4
-rw-r--r--MLEB/Translate/src/Validation/ValidationIssue.php4
-rw-r--r--MLEB/Translate/src/Validation/ValidationIssues.php4
-rw-r--r--MLEB/Translate/src/Validation/ValidationResult.php (renamed from MLEB/Translate/src/MessageValidator/ValidationResult.php)7
-rw-r--r--MLEB/Translate/src/Validation/ValidationRunner.php (renamed from MLEB/Translate/MessageValidator.php)118
-rw-r--r--MLEB/Translate/src/Validation/Validator.php (renamed from MLEB/Translate/src/MessageValidator/Validator.php)4
-rw-r--r--MLEB/Translate/src/Validation/ValidatorFactory.php (renamed from MLEB/Translate/src/MessageValidator/ValidatorFactory.php)46
-rw-r--r--MLEB/Translate/src/Validation/Validators/BraceBalanceValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/BraceBalanceValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/EscapeCharacterValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/EscapeCharacterValidator.php)16
-rw-r--r--MLEB/Translate/src/Validation/Validators/GettextNewlineValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/GettextNewlineValidator.php)6
-rw-r--r--MLEB/Translate/src/Validation/Validators/GettextPluralValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/GettextPluralValidator.php)12
-rw-r--r--MLEB/Translate/src/Validation/Validators/InsertableRegexValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/InsertableRegexValidator.php)12
-rw-r--r--MLEB/Translate/src/Validation/Validators/InsertableRubyVariableValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/InsertableRubyVariableValidator.php)7
-rw-r--r--MLEB/Translate/src/Validation/Validators/IosVariableValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/IosVariableValidator.php)4
-rw-r--r--MLEB/Translate/src/Validation/Validators/MatchSetValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MatchSetValidator.php)12
-rw-r--r--MLEB/Translate/src/Validation/Validators/MediaWikiLinkValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MediaWikiLinkValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/MediaWikiPageNameValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MediaWikiPageNameValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/MediaWikiParameterValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MediaWikiParameterValidator.php)4
-rw-r--r--MLEB/Translate/src/Validation/Validators/MediaWikiPluralValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MediaWikiPluralValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/MediaWikiTimeListValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/MediaWikiTimeListValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/NewlineValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/NewlineValidator.php)12
-rw-r--r--MLEB/Translate/src/Validation/Validators/NumericalParameterValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/NumericalParameterValidator.php)4
-rw-r--r--MLEB/Translate/src/Validation/Validators/PrintfValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/PrintfValidator.php)4
-rw-r--r--MLEB/Translate/src/Validation/Validators/PythonInterpolationValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/PythonInterpolationValidator.php)4
-rw-r--r--MLEB/Translate/src/Validation/Validators/ReplacementValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/ReplacementValidator.php)10
-rw-r--r--MLEB/Translate/src/Validation/Validators/SmartFormatPluralValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/SmartFormatPluralValidator.php)22
-rw-r--r--MLEB/Translate/src/Validation/Validators/UnicodePluralValidator.php (renamed from MLEB/Translate/src/MessageValidator/Validators/UnicodePluralValidator.php)12
-rw-r--r--MLEB/Translate/stringmangler/StringMangler.php2
-rw-r--r--MLEB/Translate/stringmangler/StringMatcher.php6
-rw-r--r--MLEB/Translate/tag/PageTranslationHooks.php250
-rw-r--r--MLEB/Translate/tag/SpecialPageMigration.php8
-rw-r--r--MLEB/Translate/tag/SpecialPagePreparation.php6
-rw-r--r--MLEB/Translate/tag/SpecialPageTranslation.php133
-rw-r--r--MLEB/Translate/tag/SpecialPageTranslationDeletePage.php45
-rw-r--r--MLEB/Translate/tag/SpecialPageTranslationMovePage.php461
-rw-r--r--MLEB/Translate/tag/TPException.php14
-rw-r--r--MLEB/Translate/tag/TPParse.php99
-rw-r--r--MLEB/Translate/tag/TPSection.php194
-rw-r--r--MLEB/Translate/tag/TranslatablePage.php335
-rw-r--r--MLEB/Translate/tag/TranslatablePageMoveJob.php155
-rw-r--r--MLEB/Translate/tag/TranslateDeleteJob.php21
-rw-r--r--MLEB/Translate/tag/TranslateRenderJob.php51
-rw-r--r--MLEB/Translate/tag/TranslationsUpdateJob.php38
-rw-r--r--MLEB/Translate/tests/generateRandomSandboxData.php3
-rw-r--r--MLEB/Translate/tests/phpunit/Cache/PersistentDatabaseCacheTest.php339
-rw-r--r--MLEB/Translate/tests/phpunit/ElasticSearchTTMServerTest.php37
-rw-r--r--MLEB/Translate/tests/phpunit/ExclusionInclusionListTest.php (renamed from MLEB/Translate/tests/phpunit/BlackListTest.php)21
-rw-r--r--MLEB/Translate/tests/phpunit/FakeTTMServerTest.php26
-rw-r--r--MLEB/Translate/tests/phpunit/HookDocTest.php2
-rw-r--r--MLEB/Translate/tests/phpunit/Makefile2
-rw-r--r--MLEB/Translate/tests/phpunit/MessageCollectionTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/MessageGroupBaseTest.php94
-rw-r--r--MLEB/Translate/tests/phpunit/MessageGroupStatesUpdaterJobTest.php22
-rw-r--r--MLEB/Translate/tests/phpunit/MessageGroupsTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/MessageIndexRebuildJobTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/MessageIndexTest.php16
-rw-r--r--MLEB/Translate/tests/phpunit/PageTranslation/TranslationPageTest.php152
-rw-r--r--MLEB/Translate/tests/phpunit/ServicesTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/StringMatcherTest.php12
-rw-r--r--MLEB/Translate/tests/phpunit/Synchronization/GroupSynchronizationCacheTest.php305
-rw-r--r--MLEB/Translate/tests/phpunit/TTMServerMessageUpdateJobTest.php12
-rw-r--r--MLEB/Translate/tests/phpunit/TTMServerTest.php99
-rw-r--r--MLEB/Translate/tests/phpunit/TranslateHooksTest.php10
-rw-r--r--MLEB/Translate/tests/phpunit/TranslateSandboxTest.php38
-rw-r--r--MLEB/Translate/tests/phpunit/TranslateUtilsTest.php1
-rw-r--r--MLEB/Translate/tests/phpunit/TranslateYamlTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/TranslationFuzzyUpdaterTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/TranslatorSandbox/TranslationStashStorageTest.php (renamed from MLEB/Translate/tests/phpunit/TranslationStashStorageTest.php)13
-rw-r--r--MLEB/Translate/tests/phpunit/Validation/ValidationRunnerTest.php (renamed from MLEB/Translate/tests/phpunit/MessageValidatorTest.php)22
-rw-r--r--MLEB/Translate/tests/phpunit/Validation/Validators/MediaWikiPluralValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/MessageValidator/Validators/MediaWikiPluralValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/WikiPageMessageGroupTest.php12
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiGroupReviewTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiManageMessageGroupsTest.php23
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiQueryManageMessageGroupsTest.php21
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiQueryMessageCollectionTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiQueryMessageGroupsTest.php32
-rw-r--r--MLEB/Translate/tests/phpunit/api/ApiTranslationReviewTest.php7
-rw-r--r--MLEB/Translate/tests/phpunit/data/Example-result.i18n.php29
-rw-r--r--MLEB/Translate/tests/phpunit/data/Example.i18n.php25
-rw-r--r--MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf2.yaml2
-rw-r--r--MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf3.yaml2
-rw-r--r--MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf4.yaml2
-rw-r--r--MLEB/Translate/tests/phpunit/data/check-blacklist.php6
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/AmdFFSTest.php18
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/AndroidXmlFFSTest.php48
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/AppleFFSTest.php8
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/AppleInfoPlistFfsTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/DtdFFSTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/GettextFFSTest.php14
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/IniFFSTest.php11
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/JavaFFSTest.php8
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/JsonFFSTest.php18
-rw-r--r--MLEB/Translate/tests/phpunit/ffs/MediaWikiExtensionsTest.php9
-rw-r--r--MLEB/Translate/tests/phpunit/helpers/TranslatablePageTestTrait.php2
-rw-r--r--MLEB/Translate/tests/phpunit/messagegroups/AggregateMessageGroupLoaderTest.php9
-rw-r--r--MLEB/Translate/tests/phpunit/messagegroups/FileBasedMessageGroupLoaderTest.php6
-rw-r--r--MLEB/Translate/tests/phpunit/messagegroups/MessageGroupLoaderTest.php3
-rw-r--r--MLEB/Translate/tests/phpunit/messagegroups/TranslatablePageMessageGroupStoreTest.php11
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/MockCacheMessageGroupLoader.php1
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/MockCustomInsertableSuggester.php10
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/MockValidators.php6
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/MockWikiMessageGroup.php5
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSubClass.php42
-rw-r--r--MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSuperClass.php42
-rw-r--r--MLEB/Translate/tests/phpunit/tag/PageTranslationHooksTest.php19
-rw-r--r--MLEB/Translate/tests/phpunit/tag/PageTranslationParserTest.php85
-rw-r--r--MLEB/Translate/tests/phpunit/tag/PageTranslationTaggingTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/tag/TranslatablePageIntegrationTest.php2
-rw-r--r--MLEB/Translate/tests/phpunit/tag/pagetranslation/NowikiOnly.pttest4
-rw-r--r--MLEB/Translate/tests/phpunit/translationaids/TranslationAidDataProviderTest.php2
-rw-r--r--MLEB/Translate/tests/phpunit/unit/PageTranslation/ParserOutputTest.php98
-rw-r--r--MLEB/Translate/tests/phpunit/unit/PageTranslation/SectionTest.php23
-rw-r--r--MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/insertables/TranslatablePageInsertablesSuggesterTest.php)12
-rw-r--r--MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageParserTest.php349
-rw-r--r--MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslationUnitTest.php295
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php43
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Synchronization/GroupSynchronizationCacheTest.php193
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Synchronization/MessageUpdateParameterTest.php17
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/CombinedInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/insertables/CombinedInsertablesSuggesterTest.php)16
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/HtmlTagInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/unit/insertables/HtmlTagInsertablesSuggesterTest.php)12
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/InsertableFactoryTest.php56
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/MediaWikiInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/insertables/MediaWikiInsertablesSuggesterTest.php)10
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/insertables/NumericalParameterInsertablesSuggesterTest.php)14
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/RegexInsertablesSuggesterTest.php (renamed from MLEB/Translate/tests/phpunit/insertables/RegexInsertablesSuggesterTest.php)11
-rw-r--r--MLEB/Translate/tests/phpunit/unit/TtmServer/TtmServerFactoryTest.php59
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Utilities/GettextPluralTest.php10
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Utilities/JsonCodecTest.php129
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Utilities/ParsingPlaceholderFactoryTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Utilities/SmartFormatPluralTest.php10
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Utilities/UnicodePluralTest.php10
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/BaseValidatorTestCase.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BaseValidatorTestCase.php)7
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/BraceBalanceValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BraceBalanceValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/EscapeCharacterValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/EscapeCharacterValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextNewlineValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextNewlineValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextPluralValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextPluralValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRegexValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRegexValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRubyVariableValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRubyVariableValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/IosVariableValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/IosVariableValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/MatchSetValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MatchSetValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiLinkValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiLinkValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiPageNameValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiPageNameValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiParameterValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiParameterValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiTimeListValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiTimeListValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/NewlineValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NewlineValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/NumericalParameterValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NumericalParameterValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/PrintfValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PrintfValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/PythonInterpolationValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PythonInterpolationValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/ReplacementValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/ReplacementValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/SmartFormatPluralValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/SmartFormatPluralValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/Validation/Validators/UnicodePluralValidatorTest.php (renamed from MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/UnicodePluralValidatorTest.php)4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/tag/TPParseTest.php194
-rw-r--r--MLEB/Translate/tests/phpunit/unit/tag/TPSectionTest.php114
-rw-r--r--MLEB/Translate/tests/phpunit/unit/tag/TranslatablePageTest.php152
-rw-r--r--MLEB/Translate/tests/phpunit/unit/utils/ArrayFlattenerTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/unit/utils/MessageSourceChangeTest.php12
-rw-r--r--MLEB/Translate/tests/phpunit/utils/MessageGroupCacheTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/utils/MessageGroupStatsTest.php4
-rw-r--r--MLEB/Translate/tests/phpunit/utils/MessageGroupWANCacheTest.php3
-rw-r--r--MLEB/Translate/tests/phpunit/utils/MessageWebImporterTest.php10
-rw-r--r--MLEB/Translate/translationaids/SupportAid.php46
-rw-r--r--MLEB/Translate/translationaids/TranslationAid.php19
-rw-r--r--MLEB/Translate/translationaids/TranslationAidDataProvider.php52
-rw-r--r--MLEB/Translate/ttmserver/CrossLanguageTranslationSearchQuery.php9
-rw-r--r--MLEB/Translate/ttmserver/ElasticSearchTTMServer.php133
-rw-r--r--MLEB/Translate/ttmserver/FuzzyLikeThis.php10
-rw-r--r--MLEB/Translate/ttmserver/TTMServer.php51
-rw-r--r--MLEB/Translate/ttmserver/TTMServerMessageUpdateJob.php4
-rw-r--r--MLEB/Translate/utils/ArrayFlattener.php1
-rw-r--r--MLEB/Translate/utils/ExternalMessageSourceStateComparator.php21
-rw-r--r--MLEB/Translate/utils/ExternalMessageSourceStateImporter.php145
-rw-r--r--MLEB/Translate/utils/FCFontFinder.php138
-rw-r--r--MLEB/Translate/utils/HTMLJsSelectToInputField.php4
-rw-r--r--MLEB/Translate/utils/JsSelectToInput.php23
-rw-r--r--MLEB/Translate/utils/MemProfile.php63
-rw-r--r--MLEB/Translate/utils/MessageChangeStorage.php6
-rw-r--r--MLEB/Translate/utils/MessageGroupCache.php24
-rw-r--r--MLEB/Translate/utils/MessageGroupStatesUpdaterJob.php11
-rw-r--r--MLEB/Translate/utils/MessageGroupStats.php28
-rw-r--r--MLEB/Translate/utils/MessageGroupStatsRebuildJob.php10
-rw-r--r--MLEB/Translate/utils/MessageGroupWANCache.php11
-rw-r--r--MLEB/Translate/utils/MessageHandle.php26
-rw-r--r--MLEB/Translate/utils/MessageIndex.php58
-rw-r--r--MLEB/Translate/utils/MessageIndexException.php4
-rw-r--r--MLEB/Translate/utils/MessageIndexRebuildJob.php6
-rw-r--r--MLEB/Translate/utils/MessageUpdateJob.php101
-rw-r--r--MLEB/Translate/utils/MessageWebImporter.php73
-rw-r--r--MLEB/Translate/utils/StatsBar.php10
-rw-r--r--MLEB/Translate/utils/StatsTable.php67
-rw-r--r--MLEB/Translate/utils/TranslateLogFormatter.php7
-rw-r--r--MLEB/Translate/utils/TranslateMetadata.php12
-rw-r--r--MLEB/Translate/utils/TranslateSandbox.php65
-rw-r--r--MLEB/Translate/utils/TranslateSandboxEmailJob.php13
-rw-r--r--MLEB/Translate/utils/TranslateToolbox.php2
-rw-r--r--MLEB/Translate/utils/TranslationHelpers.php196
-rw-r--r--MLEB/Translate/webservices/GoogleTranslateWebService.php14
-rw-r--r--MLEB/Translate/webservices/MicrosoftWebService.php2
-rw-r--r--MLEB/Translate/webservices/TranslationQuery.php5
-rw-r--r--MLEB/Translate/webservices/TranslationQueryResponse.php5
-rw-r--r--MLEB/Translate/webservices/TranslationWebService.php61
-rw-r--r--MLEB/UniversalLanguageSelector/.eslintrc.json6
-rw-r--r--MLEB/UniversalLanguageSelector/.phpcs.xml1
-rw-r--r--MLEB/UniversalLanguageSelector/Gruntfile.js5
-rw-r--r--MLEB/UniversalLanguageSelector/RELEASE-NOTES9
-rw-r--r--MLEB/UniversalLanguageSelector/composer.json9
-rw-r--r--MLEB/UniversalLanguageSelector/composer.lock1574
-rw-r--r--MLEB/UniversalLanguageSelector/data/LanguageNameIndexer.php14
-rw-r--r--MLEB/UniversalLanguageSelector/data/LanguageNameSearchData.php60
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.ttfbin0 -> 27812 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.woff2bin0 -> 11988 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/font.ini6
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.ttfbin0 -> 62372 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woffbin0 -> 61064 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff2bin0 -> 31300 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/font.ini10
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.ttfbin164848 -> 263044 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woffbin86076 -> 134488 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff2bin65600 -> 101892 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.ttfbin129280 -> 201012 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woffbin77216 -> 111616 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff2bin60852 -> 87416 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.ttfbin381036 -> 719420 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woffbin185744 -> 370340 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff2bin129492 -> 259904 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.ttfbin551436 -> 841688 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woffbin268148 -> 408208 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff2bin194028 -> 300600 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/font.ini2
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.ttfbin152436 -> 154176 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woffbin40140 -> 40256 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff2bin27060 -> 27204 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/font.ini2
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.ttfbin157900 -> 159584 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woffbin41804 -> 41904 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff2bin29056 -> 29100 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/font.ini2
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/README2
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.ttfbin150380 -> 152024 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woffbin40928 -> 41028 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff2bin28400 -> 28344 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/font.ini2
-rw-r--r--MLEB/UniversalLanguageSelector/data/langsamples.json240
-rw-r--r--MLEB/UniversalLanguageSelector/extension.json97
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/alt.json6
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/an.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ang.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/api/bn.json13
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/api/lv.json13
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/api/pt-br.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/api/ro.json23
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/arz.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/as.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ban.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bbc-latn.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bci.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bcl.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bdr.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bjn.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bn.json10
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/bpy.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ce.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/da.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/dag.json9
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/diq.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/el.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/en.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/eo.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/frp.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/gld.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/gor.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/guc.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/he.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/hif-latn.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/hrx.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ie.json6
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ja.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/kcg.json71
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ku-latn.json9
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/kw.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/lez.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/lld.json10
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/lmo.json65
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/luz.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/lv.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/mad.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/mnc.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/mni.json30
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/mnw.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ms.json5
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/nds-nl.json6
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/nia.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/nqo.json19
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ojb.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/om.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/or.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/pap.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/pms.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/pnb.json24
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/pt-br.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/qqq.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/rmc.json13
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ro.json14
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/roa-tara.json9
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ru.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/rue.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sah.json3
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/se.json5
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/shi.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/skr-arab.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sl.json14
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sli.json6
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/smn.json12
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sms.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/so.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sr-ec.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/su.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/sv.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/syl.json8
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/tay.json2
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/th.json11
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/ti.json16
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/tl.json62
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/tly.json6
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/trv.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/udm.json64
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/vec.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/vro.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/wa.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/xmf.json4
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/yi.json1
-rw-r--r--MLEB/UniversalLanguageSelector/i18n/zgh.json3
-rw-r--r--MLEB/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php71
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js265
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js30
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js31
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js41
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js46
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js24
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js26
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js22
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js28
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js2
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css15
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json5
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json5
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json21
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json1
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json5
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json18
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json15
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json22
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json2
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json6
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json12
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json21
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json5
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json8
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json7
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json5
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json21
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json1
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json2
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json8
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json28
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json3
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json19
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json6
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/images/close.pngbin258 -> 0 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/images/language.pngbin447 -> 0 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.pngbin364 -> 0 bytes
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.svg2
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js11
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js246
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js2
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js4
-rw-r--r--MLEB/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js9
-rw-r--r--MLEB/UniversalLanguageSelector/package-lock.json11343
-rw-r--r--MLEB/UniversalLanguageSelector/package.json8
-rw-r--r--MLEB/UniversalLanguageSelector/resources/css/ext.uls.compactlinks.less20
-rw-r--r--MLEB/UniversalLanguageSelector/resources/css/ext.uls.interface.less4
-rw-r--r--MLEB/UniversalLanguageSelector/resources/css/ext.uls.pt.less5
-rw-r--r--MLEB/UniversalLanguageSelector/resources/images/compact-links-trigger.svg4
-rw-r--r--MLEB/UniversalLanguageSelector/resources/images/language-base20.svg7
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.common.js130
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.compactlinks.js211
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.displaysettings.js102
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.eventlogger.js228
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.i18n.js2
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.ime.js23
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.inputsettings.js4
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.interface.js207
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.languagesettings.js32
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.launch.js175
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.preferences.js89
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.setlang.js2
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.js11
-rw-r--r--MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.repository.js47
-rw-r--r--MLEB/UniversalLanguageSelector/tests/qunit/ext.uls.tests.js2
-rw-r--r--MLEB/cldr/.eslintrc.json5
-rw-r--r--MLEB/cldr/.phpcs.xml9
-rw-r--r--MLEB/cldr/CldrCurrencies.php6
-rw-r--r--MLEB/cldr/CldrCurrency/Symbols.php397
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesAf.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesAm.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesBe.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesBg.php34
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesBn.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesBr.php5
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesBs.php18
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesCa.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesCeb.php10
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesCkb.php1
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesCs.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesCy.php210
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesDa.php188
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesDe.php34
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesDe_ch.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEl.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEn_ca.php8
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEn_gb.php10
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEs.php14
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEs_419.php5
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEt.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesEu.php14
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesFa.php22
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesFi.php18
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesFo.php16
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesFr.php30
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesGa.php45
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesGd.php124
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesGl.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesHa.php301
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesHe.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesHi.php14
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesHsb.php1
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesHu.php8
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesId.php38
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesIg.php329
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesIs.php12
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesIt.php21
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesJa.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesJv.php14
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKa.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKab.php108
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKk_cyrl.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKm.php57
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKn.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKo.php13
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesKy.php13
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesLo.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesLt.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesLv.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMi.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMk.php26
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMl.php7
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMni.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMr.php19
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMs.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesMy.php10
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesNb.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesNe.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesNl.php8
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesNn.php46
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesPa.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesPl.php44
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesPs.php26
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesPt.php15
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesPt_br.php18
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesQu.php25
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesRm.php263
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesRo.php42
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSa.php82
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSd.php68
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSi.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSk.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSl.php17
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSo.php23
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSr_ec.php1
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSu.php6
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSv.php28
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesSw.php94
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTe.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTg_cyrl.php93
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTh.php8
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTi.php183
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTk.php10
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTo.php7
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTr.php2
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesTt.php94
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesUk.php146
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesUr.php8
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesVi.php7
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesWo.php107
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesYo.php589
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesZh_hans.php4
-rw-r--r--MLEB/cldr/CldrNames/CldrNamesZu.php10
-rw-r--r--MLEB/cldr/Gruntfile.js14
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesDe.php139
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesEn.php197
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesFa.php32
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesFr.php4
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesHe.php7
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesJa.php16
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesNds.php422
-rw-r--r--MLEB/cldr/LocalNames/LocalNamesYo.php11
-rw-r--r--MLEB/cldr/Makefile2
-rw-r--r--MLEB/cldr/RELEASE-NOTES6
-rw-r--r--MLEB/cldr/composer.json9
-rw-r--r--MLEB/cldr/extension.json4
-rw-r--r--MLEB/cldr/i18n/en.json2
-rw-r--r--MLEB/cldr/i18n/ug.json2
-rw-r--r--MLEB/cldr/includes/CldrNames.php8
-rw-r--r--MLEB/cldr/includes/CountryNames.php13
-rw-r--r--MLEB/cldr/includes/CurrencyNames.php13
-rw-r--r--MLEB/cldr/includes/LanguageNames.php41
-rw-r--r--MLEB/cldr/includes/TimeUnits.php10
-rw-r--r--MLEB/cldr/package-lock.json1165
-rw-r--r--MLEB/cldr/package.json7
-rw-r--r--MLEB/cldr/rebuild.php68
-rw-r--r--MLEB/cldr/tests/phpunit/TimeUnitsTest.php17
1389 files changed, 51513 insertions, 26151 deletions
diff --git a/MLEB/Babel/.eslintrc.json b/MLEB/Babel/.eslintrc.json
index c6ad99e8..12ed7e1e 100644
--- a/MLEB/Babel/.eslintrc.json
+++ b/MLEB/Babel/.eslintrc.json
@@ -1,11 +1,17 @@
{
"root": true,
- "extends": "wikimedia",
+ "extends": [
+ "wikimedia",
+ "wikimedia/mediawiki"
+ ],
"env": {
"browser": true,
"jquery": true
},
"globals": {
"mediaWiki": false
+ },
+ "rules": {
+ "compat/compat": "warn"
}
}
diff --git a/MLEB/Babel/.phpcs.xml b/MLEB/Babel/.phpcs.xml
index f6235947..ccff96da 100644
--- a/MLEB/Babel/.phpcs.xml
+++ b/MLEB/Babel/.phpcs.xml
@@ -3,11 +3,11 @@
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate" />
<exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
</rule>
<file>.</file>
- <arg name="extensions" value="php,php5,inc"/>
+ <arg name="extensions" value="php"/>
<arg name="encoding" value="UTF-8"/>
- <exclude-pattern type="relative">extensions</exclude-pattern>
</ruleset>
diff --git a/MLEB/Babel/Gruntfile.js b/MLEB/Babel/Gruntfile.js
index 4f629505..dda24ba4 100644
--- a/MLEB/Babel/Gruntfile.js
+++ b/MLEB/Babel/Gruntfile.js
@@ -30,7 +30,6 @@ module.exports = function ( grunt ) {
},
eslint: {
options: {
- extensions: [ '.js', '.json' ],
cache: true
},
all: [
diff --git a/MLEB/Babel/RELEASE-NOTES b/MLEB/Babel/RELEASE-NOTES
index 352dd154..ee27b4be 100644
--- a/MLEB/Babel/RELEASE-NOTES
+++ b/MLEB/Babel/RELEASE-NOTES
@@ -1,5 +1,5 @@
-== Babel 2020.07 ==
-Released at 2020-07-24.
+== Babel 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* Localisation and maintenance updates.
+* No updates.
diff --git a/MLEB/Babel/babel.sql b/MLEB/Babel/babel.sql
deleted file mode 100644
index 49ff6db4..00000000
--- a/MLEB/Babel/babel.sql
+++ /dev/null
@@ -1,13 +0,0 @@
-CREATE TABLE /*_*/babel (
- -- user id
- babel_user int UNSIGNED NOT NULL,
- -- language code
- babel_lang varbinary(35) NOT NULL,
- -- level (1-5, N)
- babel_level varbinary(2) NOT NULL,
-
- PRIMARY KEY ( babel_user, babel_lang )
-) /*$wgDBTableOptions*/;
-
--- Query all users who know a language at a specific level
-CREATE INDEX /*i*/babel_lang_level ON /*_*/babel (babel_lang, babel_level);
diff --git a/MLEB/Babel/composer.json b/MLEB/Babel/composer.json
index 670bb2d2..c0582c35 100644
--- a/MLEB/Babel/composer.json
+++ b/MLEB/Babel/composer.json
@@ -23,9 +23,9 @@
"composer/installers": ">=1.0.1"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
"php-parallel-lint/php-parallel-lint": "1.2.0"
},
@@ -35,9 +35,10 @@
"phpcbf"
],
"test": [
- "parallel-lint . --exclude vendor --exclude node_modules --exclude extensions",
+ "parallel-lint . --exclude vendor --exclude node_modules",
"phpcs -p -s",
"minus-x check ."
- ]
+ ],
+ "phan": "phan -d . --long-progress-bar"
}
}
diff --git a/MLEB/Babel/extension.json b/MLEB/Babel/extension.json
index ba1e936b..93c180bf 100644
--- a/MLEB/Babel/extension.json
+++ b/MLEB/Babel/extension.json
@@ -1,6 +1,6 @@
{
"name": "Babel",
- "version": "1.12.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "1.12.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"author": [
"Robert Leverington",
"Thiemo Kreuz",
@@ -14,7 +14,7 @@
"license-name": "GPL-2.0-or-later",
"type": "parserhook",
"requires": {
- "MediaWiki": ">= 1.31.0"
+ "MediaWiki": ">= 1.34.0"
},
"MessagesDirs": {
"Babel": [
diff --git a/MLEB/Babel/i18n/ab.json b/MLEB/Babel/i18n/ab.json
index 6e6380cb..844f9396 100644
--- a/MLEB/Babel/i18n/ab.json
+++ b/MLEB/Babel/i18n/ab.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Pupsik-ipa",
"Purodha",
"Surprizi"
]
@@ -10,12 +11,12 @@
"babel-1": "Ари алахәҩы [[$2|$3]] [[$1|хәҷык]] и(л)дыроит.",
"babel-2": "Ари алахәҩы [[$1|абжьаратәи аҳракыра]] [[$2|$3]] дцәажәоит.",
"babel-3": "Ари алахәҩы [[$2|$3]] [[$1|ибзианы]] и(л)дыроит.",
- "babel-4": "Ари алахәҩы идыруеит [[$2|$3]] [[$1|ахатәы бызшәа еиҧш]].",
+ "babel-4": "Ари алахәҩы идыруеит [[$2|$3]] [[$1|ахатәы бызшәа еиԥш]].",
"babel-N": "Ари алахәҩы и(л)зы [[$2|$3]] [[$1|и(л)хатәы бызшәас]] иамоуп.",
- "babel-0-n": "Ари алахәҩы еилыикааӡом [[$1|ма аарла]] еилыикааоит [[$2|аҧсуа бызшәа]].",
+ "babel-0-n": "Ари алахәҩы еилыикааӡом [[$1|ма аарла]] еилыикааоит [[$2|аԥсуа бызшәа]].",
"babel-1-n": "Ари алахәҩы [[$2|аԥсшәа]] [[$1|хәҷык]] и(л)дыроит.",
- "babel-2-n": "Ари алахәҩы [[$1|абжьаратәи аҳракыра]] [[$2|аҧсышәала]] дцәажәоит.",
+ "babel-2-n": "Ари алахәҩы [[$1|абжьаратәи аҳракыра]] [[$2|аԥсышәала]] дцәажәоит.",
"babel-3-n": "Ари алахәҩы [[$2|аԥсшәа]] [[$1|ибзианы]] и(л)дыроит.",
- "babel-4-n": "Ари алахәҩы идыруеит [[$2|аҧсуа]] [[$1|ахатәы бызшәа еиҧш]].",
+ "babel-4-n": "Ари алахәҩы идыруеит [[$2|аԥсуа]] [[$1|ахатәы бызшәа еиԥш]].",
"babel-N-n": "Ари алахәҩы и(л)зы [[$2|аԥсшәа]] [[$1|и(л)хатәы бызшәас]] иамоуп."
}
diff --git a/MLEB/Babel/i18n/ace.json b/MLEB/Babel/i18n/ace.json
index abda0d75..8bed640f 100644
--- a/MLEB/Babel/i18n/ace.json
+++ b/MLEB/Babel/i18n/ace.json
@@ -2,27 +2,28 @@
"@metadata": {
"authors": [
"Iwan Novirion",
+ "Rachmat04",
"Si Gam Acèh"
]
},
- "babel": "Keutrangan ureuëng ngui Babel",
+ "babel": "Keutrangan ureueng ngui Babel",
"babel-url": "Project:Babel",
- "babel-footer-url": ":Category:Babel - Ureuëng ngui meunurôt bahsa",
+ "babel-footer-url": ":Category:Babel - Ureueng ngui meunurôt basa",
"babel-autocreate-user": "Babel AutoCreate",
- "babel-0": "Ureuëng nyoë [[$1|hana]] muphôm [[$2|$3]] (atawa payah that muphôm).",
- "babel-1": "Ureuëng nyoë jeuët [[$1|bacut]] [[$2|$3]].",
- "babel-2": "Ureuëng nyoë muphôm [[$1|le bacut]] [[$2|$3]].",
- "babel-3": "Ureuëng nyoë [[$1|le muphôm]] [[$2|$3]].",
- "babel-4": "Ureuëng nyoë [[$1|muphôm]] [[$2|$3]] lagèë ureuëng Acèh aseuli",
- "babel-5": "Ureuëng nyoë [[$1|utôih]] lam [[$2|$3]].",
- "babel-N": "Ureuëng nyoë [[$1|geumarit]] lam [[$2|$3]].",
- "babel-0-n": "Ureuëng nyoë [[$1|hana muphôm]] [[$2|bahsa Acèh]] (atawa muphôm bacut that).",
- "babel-1-n": "Ureuëng ngui nyoë muphôm [[$1|bacut]] [[$2|bahsa Acèh]].",
- "babel-2-n": "Ureuëng nyoë muphôm [[$1|le bacut]] [[$2|bahsa Acèh]].",
- "babel-3-n": "Ureuëng nyoë [[$1|le muphôm]] [[$2|bahsa Acèh]].",
- "babel-4-n": "Ureuëng nyoë jeuët [[$2|bahsa Acèh]] karap lagèë [[$1|ureuëng Acèh aseuli]]",
- "babel-5-n": "Ureuëng nyoë [[$1|utôih]] lam [[$2|bahsa Acèh]].",
- "babel-N-n": "Ureuëng nyoë [[$1|geumarit]] lam [[$2|bahsa Aceh]].",
+ "babel-0": "Ureueng nyoe [[$1|hana]] meuphôm [[$2|$3]] (atawa meuphôm bacut that).",
+ "babel-1": "Ureueng nyoe jeuet [[$1|bacut]] [[$2|$3]].",
+ "babel-2": "Ureueng nyoe meuphôm [[$1|le bacut]] [[$2|$3]].",
+ "babel-3": "Ureueng nyoe [[$1|le meuphôm]] [[$2|$3]].",
+ "babel-4": "Ureueng nyoe [[$1|meuphôm]] [[$2|$3]] lagèe ureueng Acèh aseuli",
+ "babel-5": "Ureueng nyoe [[$1|utôih]] lam [[$2|$3]].",
+ "babel-N": "Ureueng nyoe [[$1|geumarit]] lam [[$2|$3]].",
+ "babel-0-n": "Ureueng nyoe [[$1|hana meuphôm]] [[$2|basa Acèh]] (atawa meuphôm bacut that).",
+ "babel-1-n": "Ureueng ngui nyoe meuphôm [[$1|bacut]] [[$2|basa Acèh]].",
+ "babel-2-n": "Ureueng nyoe meuphôm [[$1|le bacut]] [[$2|basa Acèh]].",
+ "babel-3-n": "Ureueng nyoe [[$1|le meuphôm]] [[$2|basa Acèh]].",
+ "babel-4-n": "Ureueng nyoe jeuet [[$2|basa Acèh]] karap lagèe [[$1|ureueng Acèh aseuli]]",
+ "babel-5-n": "Ureueng nyoe [[$1|utôih]] lam [[$2|basa Acèh]].",
+ "babel-N-n": "Ureueng nyoe [[$1|geumarit]] lam [[$2|basa Acèh]].",
"babel-template": "Template:User $1",
- "babel-footer": "Ureuëng meunurôt bahsa"
+ "babel-footer": "Ureueng ngui meunurôt basa"
}
diff --git a/MLEB/Babel/i18n/api/el.json b/MLEB/Babel/i18n/api/el.json
index 749b58e0..4673cc47 100644
--- a/MLEB/Babel/i18n/api/el.json
+++ b/MLEB/Babel/i18n/api/el.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "NikosLikomitros",
"Nikosgranturismogt"
]
},
diff --git a/MLEB/Babel/i18n/api/fi.json b/MLEB/Babel/i18n/api/fi.json
new file mode 100644
index 00000000..ebf0536f
--- /dev/null
+++ b/MLEB/Babel/i18n/api/fi.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "MITO",
+ "Pyscowicz"
+ ]
+ },
+ "apihelp-query+babel-description": "Hanki tietoa siitä, mitä kieliä käyttäjä osaa",
+ "apihelp-query+babel-summary": "Hanki tietoa siitä, mitä kieliä käyttäjä osaa",
+ "apihelp-query+babel-example-1": "Saa Babel-tietoja käyttäjästä <kbd>Example</kbd>"
+}
diff --git a/MLEB/Babel/i18n/api/fr.json b/MLEB/Babel/i18n/api/fr.json
index 9b8e82e0..2f213f75 100644
--- a/MLEB/Babel/i18n/api/fr.json
+++ b/MLEB/Babel/i18n/api/fr.json
@@ -2,11 +2,12 @@
"@metadata": {
"authors": [
"Gomoko",
- "Urhixidur"
+ "Urhixidur",
+ "Verdy p"
]
},
- "apihelp-query+babel-description": "Obtenir des informations sur les langues connues de l’utilisateur",
- "apihelp-query+babel-summary": "Obtenir des informations sur les langues que connaît l’utilisateur",
+ "apihelp-query+babel-description": "Obtenir des informations sur quelles langues connaît l’utilisateur",
+ "apihelp-query+babel-summary": "Obtenir des informations sur quelles langues connaît l’utilisateur",
"apihelp-query+babel-param-user": "Utilisateur à propos duquel obtenir des informations",
"apihelp-query+babel-example-1": "Obtenir les informations de Babel pour l’utilisateur <kbd>Example</kbd>"
}
diff --git a/MLEB/Babel/i18n/api/jam.json b/MLEB/Babel/i18n/api/jam.json
new file mode 100644
index 00000000..73a8fb0d
--- /dev/null
+++ b/MLEB/Babel/i18n/api/jam.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dentonius"
+ ]
+ },
+ "apihelp-query+babel-description": "Fin' out which language di user know",
+ "apihelp-query+babel-summary": "Fin' out which language di user know",
+ "apihelp-query+babel-param-user": "Who fi get information pon",
+ "apihelp-query+babel-example-1": "Pull up di Babel information fi di user <kbd>Example</kbd>"
+}
diff --git a/MLEB/Babel/i18n/api/kcg.json b/MLEB/Babel/i18n/api/kcg.json
new file mode 100644
index 00000000..2ce6d502
--- /dev/null
+++ b/MLEB/Babel/i18n/api/kcg.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "apihelp-query+babel-description": "Shyia̱ nkhang tazwa zang tanka̱i lilyem hwa a̱tyuta̱m wu lyen",
+ "apihelp-query+babel-summary": "Shyia̱ nkhang tazwa zang tangka̱i lilyem hwa a̱tyuta̱m wu lyen",
+ "apihelp-query+babel-param-user": "A̱tyuta̱m a̱ shyia̱ nkhang tazwa",
+ "apihelp-query+babel-example-1": "Shyia̱ nkhang Babila mat a̱tyuta̱m hu <kbd>Example</kbd>"
+}
diff --git a/MLEB/Babel/i18n/api/tl.json b/MLEB/Babel/i18n/api/tl.json
new file mode 100644
index 00000000..0c2b2bc8
--- /dev/null
+++ b/MLEB/Babel/i18n/api/tl.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "GinawaSaHapon"
+ ]
+ },
+ "apihelp-query+babel-description": "Kumuha ng impormasyon tungkol sa kung anong mga wika ang alam ng tagagamit",
+ "apihelp-query+babel-summary": "Kumuha ng impormasyon tungkol sa kung anong mga wika ang alam ng tagagamit",
+ "apihelp-query+babel-param-user": "Tagagamit na kukuhanan ng impormasyon",
+ "apihelp-query+babel-example-1": "Kunin ang impormasyon ng Babel ni <kbd>Example</kbd>"
+}
diff --git a/MLEB/Babel/i18n/api/vec.json b/MLEB/Babel/i18n/api/vec.json
new file mode 100644
index 00000000..f845bf4c
--- /dev/null
+++ b/MLEB/Babel/i18n/api/vec.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fierodelveneto"
+ ]
+ },
+ "apihelp-query+babel-description": "Conosi informasion so cuałi łéngue l'utensa ła conose",
+ "apihelp-query+babel-summary": "Conosi informasion so cuałi łéngue l'utensa ła conose",
+ "apihelp-query+babel-param-user": "Utensa so ła cuała conósar informasion",
+ "apihelp-query+babel-example-1": "Conosi informasion Babel par l'utensa <kbd>Ezénpio</kbd>"
+}
diff --git a/MLEB/Babel/i18n/api/yue.json b/MLEB/Babel/i18n/api/yue.json
index 195690a9..6d357eab 100644
--- a/MLEB/Babel/i18n/api/yue.json
+++ b/MLEB/Babel/i18n/api/yue.json
@@ -5,6 +5,7 @@
]
},
"apihelp-query+babel-description": "攞用戶識咩嘢語言嘅資訊",
+ "apihelp-query+babel-summary": "攞用戶識咩嘢語言嘅資訊",
"apihelp-query+babel-param-user": "要攞相關資訊嘅用戶",
"apihelp-query+babel-example-1": "攞用戶 <kbd>Example</kbd> 嘅 Babel 資訊"
}
diff --git a/MLEB/Babel/i18n/ban.json b/MLEB/Babel/i18n/ban.json
new file mode 100644
index 00000000..444ec05c
--- /dev/null
+++ b/MLEB/Babel/i18n/ban.json
@@ -0,0 +1,29 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chinamoonroll",
+ "Joseagush"
+ ]
+ },
+ "babel": "Inpormasi anganggé Babel",
+ "babel-url": "Project:Babel",
+ "babel-footer-url": ":Category:Babel - Sang anganggé mawit basa",
+ "babel-autocreate-reason": "Otomatis ngardi kaca kategori [[$1|Babel]].",
+ "babel-autocreate-text-levels": "Sang anganggé ring kategori puniki nandayang pinaka dané medué kawikanan $1 antuk basa $2.",
+ "babel-autocreate-text-main": "Sang anganggé ring kategori puniki nandayang punika dané medué kawikanan mabasa $1.",
+ "babel-0": "Sang angaggé puniki [[$1|nénten medué]] kawikanan [[$2|$3]] (utawi sanget méweh nguningayang).",
+ "babel-1": "Sang anganggé puniki madué kawikanan [[$1|dasar]] [[$2|$3]].",
+ "babel-2": "Sang anganggé puniki medué kawikanan [[$1|nengahin]] [[$2|$3]].",
+ "babel-3": "Sang anganggé puniki medué kawikanan [[$1|tingkat lantur]] [[$2|$3]].",
+ "babel-4": "Sang anganggé puniki medué kawikanan [[$1|sekadi panutur sujati]] [[$2|$3]].",
+ "babel-5": "Sang anganggé puniki medué kawikanan [[$1|propésional]] [[$2|$3]].",
+ "babel-N": "Sang anganggé puniki pinaka [[$1|panutur ibu]] [[$2|$3]].",
+ "babel-0-n": "Sang anganggé puniki [[$1|nénten madué]] kawikanan [[$2|basa Bali]] (utawi méweh nguningayang).",
+ "babel-1-n": "Sang anganggé puniki medué kawikanan [[$1|dasar]] [[$2|basa Bali]].",
+ "babel-2-n": "Sang anganggé puniki medué kawikanan [[$1|nengahin]] [[$2|basa Bali]].",
+ "babel-3-n": "Sang anganggé puniki medué kawikanan [[$1|tingkat lantue]] [[$2|basa Bali]].",
+ "babel-4-n": "Sang anganggé puniki medué kawikanan [[$1|sekadi panutur sujati]] [[$2|basa Bali]].",
+ "babel-5-n": "Sang anganggé puniki medué kawikanan [[$1|propésional]] [[$2|basa Bali]].",
+ "babel-N-n": "Sang anganggé puniki pinaka [[$1|panutur ibu]] [[$2|basa Bali]].",
+ "babel-footer": "Sang anganggé mawit basa"
+}
diff --git a/MLEB/Babel/i18n/ce.json b/MLEB/Babel/i18n/ce.json
index e89100d1..b92dc26d 100644
--- a/MLEB/Babel/i18n/ce.json
+++ b/MLEB/Babel/i18n/ce.json
@@ -12,12 +12,12 @@
"babel-url": "Project:Вавилон",
"babel-footer-url": ":Category:{{ns:Project}}:Декъашхой метташца",
"babel-autocreate-text-main": "ХӀокху категори чура декъашхошна хууш бу «$1» мотт.",
- "babel-0-n": "Хlокху декъашхочуна [[$2|Нохчйин мотт]] [[$1|хууш бац]].",
- "babel-1-n": "ХӀокху декъашхочо [[$1|кӀеззиг]] буьйцу хьан [[$2|Нохчийн мотт]].",
- "babel-2-n": "Хlокху декъашхочо [[$1|къамеляхь]] буьйцу хьан [[$2|Нохчийн мотт]].",
+ "babel-0-n": "ХӀокху декъашхочунна [[$2|нохчийн мотт]] [[$1|ца хаьа]].",
+ "babel-1-n": "ХӀокху декъашхочунна [[$1|кӀеззиг]] бийца хаьа [[$2|нохчийн мотт]].",
+ "babel-2-n": "ХӀокху декъашхочунна [[$1|къамел дан хаьа]] [[$2|нохчийн маттахь]].",
"babel-3-n": "{{GENDER:$4|ХӀокху декъашхочо}} [[$1|шера]] буьйцу [[$2|нохчийн мотт]].",
"babel-4-n": "ХӀокху декъашхочо [[$2|нохчийн мотт]] шен [[$1|ненан]] мотт санна буьйцу.",
"babel-5-n": "{{GENDER:$4|ХIокху декъашхочо}} [[$1|чIогIа говза]] буьйцу [[$2|нохчийн мотт]].",
- "babel-N-n": "[[$2|Нохчийн мотт]] {{GENDER:$4|хIокху декъашхочуьнан}} [[$1|ненан мотт]] бу.",
+ "babel-N-n": "[[$2|Нохчийн мотт]] {{GENDER:$4|хӀокху декъашхочуьнан}} [[$1|ненан мотт]] бу.",
"babel-footer": "Декъашхой метташца"
}
diff --git a/MLEB/Babel/i18n/crh.json b/MLEB/Babel/i18n/crh.json
index 0e1df8db..9379c89d 100644
--- a/MLEB/Babel/i18n/crh.json
+++ b/MLEB/Babel/i18n/crh.json
@@ -11,4 +11,4 @@
"babel-4": "Bu qullanıcı [[$2|Qırımtatar tili]]ni [[$1|ana tili kibi]] bile.",
"babel-5": "Bu qullanıcı [[$2|Qırımtatar tili]]ni [[$1|ihtisasiy seviyede]] bile.",
"babel-N": "Bu qullanıcınıñ [[$1|ana tili]] [[$2|Qırımtatar tili]]dir."
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/diq.json b/MLEB/Babel/i18n/diq.json
index 96716951..4ada992b 100644
--- a/MLEB/Babel/i18n/diq.json
+++ b/MLEB/Babel/i18n/diq.json
@@ -16,7 +16,7 @@
"babel-desc": "Menıne de otomatik désé karberi vırazşten da şablonan ré, fonksiyona <code>#babil</code>i kena de",
"babel-url": "Project:Babil",
"babel-footer-url": ":Kategori:Babil - Hetê zıwanan ra karberi",
- "babel-autocreate-reason": "Kategoriya [[$1|Babil]]i otomaik vırazéna.",
+ "babel-autocreate-reason": "Pela kategoriya [[$1|Babil]]i otomatik vıraziyena.",
"babel-autocreate-text-levels": "Karberé ke na kategori de yé, $1 sewiye dê zıwané $2 zané.",
"babel-autocreate-text-main": "Karberé ke na kategori de yê vané ma zıwané $1 zam.",
"babel-autocreate-user": "Babil OtomatikVıraştış",
diff --git a/MLEB/Babel/i18n/es.json b/MLEB/Babel/i18n/es.json
index 502fff0b..ef6695d9 100644
--- a/MLEB/Babel/i18n/es.json
+++ b/MLEB/Babel/i18n/es.json
@@ -1,14 +1,18 @@
{
"@metadata": {
"authors": [
+ "ArenaL5",
"Bengoa",
"Crazymadlover",
"Fitoschido",
"Fluence",
"GerardM",
+ "LaMagiaaa",
"Macofe",
"Sanbec",
- "Vivaelcelta"
+ "Suchichi02",
+ "Vivaelcelta",
+ "WikiiiTranslator"
]
},
"babel": "Información de idiomas {{GENDER:$1|del usuario|de la usuaria}}",
@@ -18,19 +22,19 @@
"babel-autocreate-reason": "Creando automáticamente la página de categoría [[$1|Babel]].",
"babel-autocreate-text-levels": "Los usuarios de esta categoría indican que tienen un nivel de dominio $1 del idioma $2.",
"babel-autocreate-text-main": "Los usuarios en esta categoría indican su conocimiento del idioma $1.",
- "babel-0": "{{GENDER:$4|Este usuario|Esta usuaria}} [[$1|no]] tiene ningún conocimiento del [[$2|$3]] (o lo entiende con mucha dificultad).",
- "babel-1": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|básico]] del [[$2|$3]].",
- "babel-2": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|intermedio]] del [[$2|$3]].",
- "babel-3": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|avanzado]] del [[$2|$3]].",
- "babel-4": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|casi nativo]] del [[$2|$3]].",
- "babel-5": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|profesional]] del [[$2|$3]]",
- "babel-N": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene una comprensión [[$1|nativa]] del [[$2|$3]].",
- "babel-0-n": "{{GENDER:$4|Este usuario|Esta usuaria}} [[$1|no]] tiene ningún conocimiento del [[$2|español]] (o lo entiende con mucha dificultad).",
- "babel-1-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|básico]] del [[$2|español]].",
- "babel-2-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|intermedio]] del [[$2|español]].",
- "babel-3-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|avanzado]] del [[$2|español]].",
- "babel-4-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|casi nativo]] del [[$2|español]].",
- "babel-5-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene un conocimiento [[$1|profesional]] del [[$2|español]].",
- "babel-N-n": "{{GENDER:$4|Este usuario|Esta usuaria}} tiene una comprensión [[$1|nativa]] del [[$2|español]].",
+ "babel-0": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} [[$1|no]] tiene ningún conocimiento del [[$2|$3]] (o lo entiende con mucha dificultad).",
+ "babel-1": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|básico]] del [[$2|$3]].",
+ "babel-2": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|intermedio]] del [[$2|$3]].",
+ "babel-3": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|avanzado]] del [[$2|$3]].",
+ "babel-4": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|casi nativo]] del [[$2|$3]].",
+ "babel-5": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|profesional]] del [[$2|$3]].",
+ "babel-N": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene una comprensión [[$1|nativa]] del [[$2|$3]].",
+ "babel-0-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} [[$1|no]] tiene ningún conocimiento del [[$2|español]] (o lo entiende con mucha dificultad).",
+ "babel-1-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|básico]] del [[$2|español]].",
+ "babel-2-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|intermedio]] del [[$2|español]].",
+ "babel-3-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|avanzado]] del [[$2|español]].",
+ "babel-4-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|casi nativo]] del [[$2|español]].",
+ "babel-5-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene un conocimiento [[$1|profesional]] del [[$2|español]].",
+ "babel-N-n": "{{GENDER:$4|Este usuario|Esta usuaria|Esta persona}} tiene una comprensión [[$1|nativa]] del [[$2|español]].",
"babel-footer": "Usuarios por idioma"
}
diff --git a/MLEB/Babel/i18n/fi.json b/MLEB/Babel/i18n/fi.json
index ede34124..e3ab4447 100644
--- a/MLEB/Babel/i18n/fi.json
+++ b/MLEB/Babel/i18n/fi.json
@@ -8,7 +8,8 @@
"Linnea",
"Nedergard",
"Nike",
- "Pxos"
+ "Pxos",
+ "Pyscowicz"
]
},
"babel": "Käyttäjän kielitaito",
@@ -26,11 +27,12 @@
"babel-5": "Tämä käyttäjä osaa käyttää kieltä [[$2|$3]] [[$1|ammattimaisesti]].",
"babel-N": "Tämän käyttäjän [[$1|äidinkieli]] on [[$2|$3]].",
"babel-0-n": "Tämä käyttäjä osaa [[$1|hyvin vähän tai ei lainkaan]] [[$2|suomea]].",
- "babel-1-n": "Tämä käyttäjä puhuu [[$2|suomea]] [[$1|vähän]].",
+ "babel-1-n": "Tämä käyttäjä osaa [[$2|suomea]] [[$1|vähän]].",
"babel-2-n": "Tämä käyttäjä osaa [[$2|suomea]] [[$1|kohtalaisesti]].",
"babel-3-n": "Tämä käyttäjä osaa [[$2|suomea]] [[$1|erinomaisesti]].",
"babel-4-n": "Tämä käyttäjä osaa [[$2|suomea]] [[$1|melkein äidinkielen tavoin]].",
- "babel-5-n": "Tämä käyttäjä käyttää [[$2|suomea]] [[$1|ammattimaisesti]].",
+ "babel-5-n": "Tämä käyttäjä osaa [[$2|suomea]] [[$1|ammattimaisesti]].",
"babel-N-n": "Tämän käyttäjän [[$1|äidinkieli]] on [[$2|suomi]].",
+ "babel-template": "Template:Käyttäjä $1",
"babel-footer": "Käyttäjät kielittäin"
}
diff --git a/MLEB/Babel/i18n/fit.json b/MLEB/Babel/i18n/fit.json
index 93565c3e..c911c4a4 100644
--- a/MLEB/Babel/i18n/fit.json
+++ b/MLEB/Babel/i18n/fit.json
@@ -6,7 +6,7 @@
]
},
"babel-url": "Project:Kielitaito",
- "babel-autocreate-reason": "[[$1|Kielitaidon]] katekuurisivun automaattinen luonti.",
+ "babel-autocreate-reason": "[[$1|Kielitaidon]] katekuurisivun auttomaattinen luonti.",
"babel-autocreate-text-levels": "Käyttäjät tässä katekuurissa ovat ilmottaneet ossaavansa kieltä $2 tasolla $1.",
"babel-autocreate-text-main": "Käyttäjät tässä katekuurissa ovat ilmottaneet ymmärtävänsä kieltä $1.",
"babel-0": "Tämä käyttäjä ossaa [[$1|hyvin vähän tai ei lainkhaan]] kieltä [[$2|$3]].",
@@ -17,11 +17,11 @@
"babel-5": "Tämä käyttäjä ossaa käyttää kieltä [[$2|$3]] [[$1|ammattimaisesti]].",
"babel-N": "Tämän käyttäjän [[$1|äitinkieli]] oon [[$2|$3]].",
"babel-0-n": "Tämä käyttäjä ossaa [[$1|hyvin vähän tai ei lainkhaan]] [[$2|meänkieltä]].",
- "babel-1-n": "Tämä käyttäjä puhhuu [[$2|meänkieltä]] [[$1|vähän]].",
+ "babel-1-n": "Tämä käyttäjä ossaa [[$2|meänkieltä]] [[$1|vähän]].",
"babel-2-n": "Tämä käyttäjä ossaa [[$2|meänkieltä]] [[$1|kohtalaisesti]].",
"babel-3-n": "Tämä käyttäjä ossaa [[$2|meänkieltä]] [[$1|erinomaisesti]].",
"babel-4-n": "Tämä käyttäjä ossaa [[$2|meänkieltä]] [[$1|melkein äidinkielen tavoin]].",
- "babel-5-n": "Tämä käyttäjä käyttää [[$2|meänkieltä]] [[$1|ammattimaisesti]].",
+ "babel-5-n": "Tämä käyttäjä ossaa [[$2|meänkieltä]] [[$1|ammattimaisesti]].",
"babel-N-n": "Tämän käyttäjän [[$1|äitinkieli]] oon [[$2|meänkieli]].",
"babel-footer": "Käyttäjät kielitten mukhaan"
}
diff --git a/MLEB/Babel/i18n/fr.json b/MLEB/Babel/i18n/fr.json
index cca9216e..013fb323 100644
--- a/MLEB/Babel/i18n/fr.json
+++ b/MLEB/Babel/i18n/fr.json
@@ -27,6 +27,7 @@
"babel-autocreate-reason": "Création automatique de la page de catégorie [[$1|Babel]].",
"babel-autocreate-text-levels": "Les utilisateurs dans cette catégorie ont indiqué qu’ils ont le niveau $1 pour la langue $2.",
"babel-autocreate-text-main": "Les utilisateurs dans cette catégorie ont indiqué leur connaissance de la langue $1.",
+ "babel-autocreate-user": "Babel AutoCreate",
"babel-0": "{{GENDER:$4|Cet utilisateur|Cette utilisatrice}} n’a [[$1|aucune]] connaissance en [[$2|$3]] (ou le comprend avec de grandes difficultés).",
"babel-1": "{{GENDER:$4|Cet utilisateur|Cette utilisatrice}} dispose de connaissances [[$1|de base]] en [[$2|$3]].",
"babel-2": "{{GENDER:$4|Cet utilisateur|Cette utilisatrice}} dispose de connaissances [[$1|intermédiaires]] en [[$2|$3]].",
diff --git a/MLEB/Babel/i18n/fy.json b/MLEB/Babel/i18n/fy.json
index e76d6b44..3ee0c8fa 100644
--- a/MLEB/Babel/i18n/fy.json
+++ b/MLEB/Babel/i18n/fy.json
@@ -8,25 +8,25 @@
]
},
"babel": "Meidoggerynfo Babel",
- "babel-desc": "Foeget de <code>#babel</code> automatyske opdielerfunksje ta om it automatysk meitsjen fan in Babel meidoggerskolom ta stean mei de mooglikheid om eigen berjochten ta te foegjen.",
+ "babel-desc": "Foeget de <code>#babel</code>-ferwurkingsfunksje ta om Babel-meidoggerboksen automatysk oanmeitsje te litten, mei de mooglikheid om eigen berjochten ta te foegjen.",
"babel-url": "Project:Babel",
"babel-footer-url": ":Category:Babel - Meidoggers op taal",
- "babel-autocreate-reason": "Makket automatysk in [[$1|Babel]]-kategory oan.",
+ "babel-autocreate-reason": "Automatysk oanmeitsjen fan [[$1|Babel]]-kategory.",
"babel-autocreate-text-levels": "Meidoggers yn dizze kategory jouwe oan dat harren taalkennis foar $2 $1 is.",
"babel-autocreate-text-main": "Meidoggers yn dizze kategory jouwe oan dat hja kennis fan $1 hawwe.",
- "babel-0": "Dizze meidogger hat [[$1|gjin]] kennis fan [[$2|$3]] (of ferstiet it allinnich mei in soad tûkelteammen).",
- "babel-1": "It [[$2|$3]] fan dizze meidogger is [[$1|minimaal]].",
- "babel-2": "It [[$2|$3]] fan dizze meidogger is [[$1|ridlik]].",
- "babel-3": "It [[$2|$3]] fan dizze meidogger is [[$1|treflik]].",
- "babel-4": "It [[$2|$3]] is benei de [[$1|memmetaal]] fan dizze meidogger.",
- "babel-5": "It [[$2|$3]] fan dizze meidogger is [[$1|professional]].",
- "babel-N": "It [[$2|$3]] is de [[$1|memmetaal]] fan dizze meidogger.",
- "babel-0-n": "Dizze meidogger hat [[$1|gjin]] kennis fan it [[$2|Frysk]] (of ferstiet it allinnich mei in soad tûkelteammen).",
- "babel-1-n": "It [[$2|Frysk]] fan dizze meidogger is [[$1|minimaal]].",
- "babel-2-n": "It [[$2|Frysk]] fan dizze meidogger is [[$1|ridlik]].",
- "babel-3-n": "It [[$2|Frysk]] fan dizze meidogger is [[$1|treflik]].",
- "babel-4-n": "It [[$2|Frysk]] is benei de [[$1|memmetaal]] fan dizze meidogger.",
- "babel-5-n": "De kennis fan it [[$2|Frysk]] fan dizze meidogger is [[$1|beropsmatich]].",
- "babel-N-n": "It [[$2|Frysk]] is de [[$1|memmetaal]] fan dizze meidogger.",
+ "babel-0": "Dizze {{GENDER:$4|meidogger|meidochster}} hat [[$1|gjin]] kennis fan it [[$2|$3]] (of ferstiet it allinnich mei in soad tûkelteammen).",
+ "babel-1": "It [[$2|$3]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|minimaal]].",
+ "babel-2": "It [[$2|$3]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|ridlik]].",
+ "babel-3": "It [[$2|$3]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|treflik]].",
+ "babel-4": "It [[$2|$3]] is benei de [[$1|memmetaal]] fan dizze {{GENDER:$4|meidogger|meidochster}}.",
+ "babel-5": "It [[$2|$3]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|beropsmjittich]].",
+ "babel-N": "It [[$2|$3]] is de [[$1|memmetaal]] fan dizze {{GENDER:$4|meidogger|meidochster}}.",
+ "babel-0-n": "Dizze {{GENDER:$4|meidogger|meidochster}} hat [[$1|gjin]] kennis fan it [[$2|Frysk]] (of ferstiet it allinnich mei in soad tûkelteammen).",
+ "babel-1-n": "It [[$2|Frysk]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|minimaal]].",
+ "babel-2-n": "It [[$2|Frysk]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|ridlik]].",
+ "babel-3-n": "It [[$2|Frysk]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|treflik]].",
+ "babel-4-n": "It [[$2|Frysk]] is benei de [[$1|memmetaal]] fan dizze {{GENDER:$4|meidogger|meidochster}}.",
+ "babel-5-n": "It [[$2|Frysk]] fan dizze {{GENDER:$4|meidogger|meidochster}} is [[$1|beropsmjittich]].",
+ "babel-N-n": "It [[$2|Frysk]] is de [[$1|memmetaal]] fan dizze {{GENDER:$4|meidogger|meidochster}}.",
"babel-footer": "Meidoggers op taal"
}
diff --git a/MLEB/Babel/i18n/gan.json b/MLEB/Babel/i18n/gan.json
index 1b83d0bc..fd5832eb 100644
--- a/MLEB/Babel/i18n/gan.json
+++ b/MLEB/Babel/i18n/gan.json
@@ -25,4 +25,4 @@
"babel-4-n": "箇隻用戶有[[$1|好喫價]]嗰[[$2|贛語]]水平。",
"babel-5-n": "箇隻用戶有[[$1|專業]]嗰[[$2|贛語]]能力。",
"babel-N-n": "箇隻用戶曉得[[$2|贛語]]嗰[[$1|母語]]。"
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/gom-latn.json b/MLEB/Babel/i18n/gom-latn.json
index 02ee51f9..d30b0deb 100644
--- a/MLEB/Babel/i18n/gom-latn.json
+++ b/MLEB/Babel/i18n/gom-latn.json
@@ -7,6 +7,7 @@
"babel": "Babel vapurpi mahiti",
"babel-url": "Project:Babel",
"babel-footer-url": ":Category:Babel - Bhase pormonnem vapurpi",
+ "babel-autocreate-reason": "Apoap rochlolem [[$1|Babel]] vorg pan.",
"babel-autocreate-text-levels": "Hea vorgacheo vapurpeanim khunnaila ki $2 bhasen kushaltaiche $1 pavlar asat",
"babel-autocreate-text-main": "Hea vorgacheo vapurpeanim tenka $1 bhas kitli kollta ti khunnaila.",
"babel-0": "Hea vangddiak [[$2|$3]] [[$1|kollna]]",
diff --git a/MLEB/Babel/i18n/hif-latn.json b/MLEB/Babel/i18n/hif-latn.json
index fb688368..72b91294 100644
--- a/MLEB/Babel/i18n/hif-latn.json
+++ b/MLEB/Babel/i18n/hif-latn.json
@@ -7,7 +7,6 @@
},
"babel": "Babel sadasya ke jaankari",
"babel-desc": "Ii <code>#babel</code> parser function ke jorre hae jisse babel ke sadasya box ke column apne se ban jaawe hae, aue isse custom template banawa jaae sake hae",
- "babel-url": "Project:Babel",
"babel-footer-url": ":Category:Babel - Bhasa ke aadhar pe sadasya",
"babel-autocreate-reason": "Apne se [[$1|Babel]] vibhag ke banawa jaae hae",
"babel-autocreate-text-levels": "Ii vibhag ke sadasya ke lage $2 bhasa ke khaatir $1 ke baraabar ke jaankari hae.",
diff --git a/MLEB/Babel/i18n/id.json b/MLEB/Babel/i18n/id.json
index 85a05799..a071683c 100644
--- a/MLEB/Babel/i18n/id.json
+++ b/MLEB/Babel/i18n/id.json
@@ -16,23 +16,23 @@
"babel-url": "Project:Babel",
"babel-footer-url": ":Category:Babel - Pengguna menurut bahasa",
"babel-autocreate-reason": "Otomatis membuat halaman kategori [[$1|Babel]].",
- "babel-autocreate-text-levels": "Pengguna di kategori ini menandakan mereka memiliki kemampuan $1 untuk bahasa $2.",
- "babel-autocreate-text-main": "Pengguna dalam kategori ini menandakan mereka memiliki kemampuan berbahasa $1.",
+ "babel-autocreate-text-levels": "Pengguna dalam kategori ini menandakan bahwa mereka memiliki kemampuan $1 untuk bahasa $2.",
+ "babel-autocreate-text-main": "Pengguna dalam kategori ini menandakan bahwa mereka memiliki kemampuan berbahasa $1.",
"babel-autocreate-user": "Babel AutoCreate",
- "babel-0": "Pengguna ini [[$1|tidak]] mengerti [[$2|$3]] (atau hanya dengan sangat sulit).",
- "babel-1": "Pengguna ini mampu bersumbangsih dengan [[$2|$3]] tingkat [[$1|dasar]].",
- "babel-2": "Pengguna ini mampu bersumbangsih dengan [[$2|$3]] tingkat [[$1|menengah]].",
- "babel-3": "Pengguna ini mampu bersumbangsih dengan [[$2|$3]] tingkat [[$1|mahir]].",
- "babel-4": "Pengguna ini mampu bersumbangsih dengan [[$2|$3]] [[$1|mendekati penutur ibu]].",
+ "babel-0": "Pengguna ini [[$1|tidak memiliki]] pengetahuan [[$2|$3]] (atau memahaminya dengan sangat sulit).",
+ "babel-1": "Pengguna ini memiliki pengetahuan [[$1|dasar]] [[$2|$3]].",
+ "babel-2": "Pengguna ini memiliki pengetahuan [[$1|menengah]] [[$2|$3]].",
+ "babel-3": "Pengguna ini memiliki pengetahuan [[$1|tingkat lanjut]] [[$2|$3]].",
+ "babel-4": "Pengguna ini memiliki pengetahuan [[$1|mendekati penutur asli]] [[$2|$3]].",
"babel-5": "Pengguna ini memiliki pengetahuan [[$1|profesional]] [[$2|$3]].",
"babel-N": "Pengguna ini adalah [[$1|penutur ibu]] [[$2|$3]].",
- "babel-0-n": "Pengguna ini [[$1|tidak]] mengerti [[$2|bahasa Indonesia]] (atau hanya dengan sangat sulit).",
- "babel-1-n": "Pengguna ini mampu bersumbangsih dengan [[$2|bahasa Indonesia]] tingkat [[$1|dasar]].",
- "babel-2-n": "Pengguna ini mampu bersumbangsih dengan [[$2|bahasa Indonesia]] tingkat [[$1|menengah]].",
- "babel-3-n": "Pengguna ini mampu bersumbangsih dengan [[$2|bahasa Indonesia]] tingkat [[$1|mahir]].",
- "babel-4-n": "Pengguna ini mampu bersumbangsih dengan [[$2|bahasa Indonesia]] [[$1|mendekati penutur ibu]].",
+ "babel-0-n": "Pengguna ini [[$1|tidak memiliki]] pengetahuan [[$2|bahasa Indonesia]] (atau memahaminya dengan sangat sulit).",
+ "babel-1-n": "Pengguna ini memiliki pengetahuan [[$1|dasar]] [[$2|bahasa Indonesia]].",
+ "babel-2-n": "Pengguna ini memiliki pengetahuan [[$1|menengah]] [[$2|bahasa Indonesia]].",
+ "babel-3-n": "Pengguna ini memiliki pengetahuan [[$1|tingkat lanjut]] [[$2|bahasa Indonesia]].",
+ "babel-4-n": "Pengguna ini memiliki pengetahuan [[$1|mendekati penutur asli]] [[$2|bahasa Indonesia]].",
"babel-5-n": "Pengguna ini memiliki pengetahuan [[$1|profesional]] [[$2|bahasa Indonesia]].",
- "babel-N-n": "Pengguna ini adalah [[$1|penutur ibu]] [[$2|bahasa Indonesia]].",
+ "babel-N-n": "Pengguna ini merupakan [[$1|penutur asli]] [[$2|bahasa Indonesia]].",
"babel-template": "Template:User $1",
"babel-footer": "Pengguna berdasarkan bahasa"
}
diff --git a/MLEB/Babel/i18n/is.json b/MLEB/Babel/i18n/is.json
index c9a6f8c6..f7b2a89f 100644
--- a/MLEB/Babel/i18n/is.json
+++ b/MLEB/Babel/i18n/is.json
@@ -7,6 +7,7 @@
]
},
"babel": "Málkassi",
+ "babel-desc": "Bætir við <code>#babel</code> þáttunar aðgerðinni til að leyfa að skapa sjálfvirkt babel notendabox með möguleikanum að innifela sérstök snið",
"babel-url": "Project:Málkassi",
"babel-footer-url": ":Category:Notendur eftir tungumáli",
"babel-autocreate-reason": "Bý sjálfkrafa til [[$1|Málkassa]] flokk.",
diff --git a/MLEB/Babel/i18n/jam.json b/MLEB/Babel/i18n/jam.json
index a45021d3..709cf275 100644
--- a/MLEB/Babel/i18n/jam.json
+++ b/MLEB/Babel/i18n/jam.json
@@ -1,28 +1,31 @@
{
"@metadata": {
"authors": [
+ "Dentonius",
"StevenJ81",
"Yocahuna"
]
},
- "babel": "Biebl yuuza infamieshan",
- "babel-desc": "Ad di <code>#babel</code> paaza fongshan fi lou aatamietid jinarieshan a biebl yuuzabax kalom wid di abiliti fi inkluud kostom templit",
- "babel-url": "Project:Biebl",
- "babel-autocreate-reason": "Aatamatikali a kriet [[$1|Babel]] kiatigari piej.",
- "babel-autocreate-text-levels": "Yuuza ina dis kiatigeri indikiet se dehn ab skil lebl $1 fi langwij $2.",
- "babel-autocreate-text-main": "Yuuza ina dis kiatigeri indikiet se dehn ab nalij a langwij $1.",
- "babel-0": "Dis yuuza ab [[$1|no]] nalij a [[$2|$3]] (ar andastani wid kansidarobl difikolti).",
- "babel-1": "Di yuuza ab [[$1|biesik]] nalij a [[$2|$3]].",
- "babel-2": "Di yuuza ab [[$1|intamidiet]] nalij a [[$2|$3]].",
- "babel-3": "Di yuuza ab [[$1|advans]] nalij a [[$2|$3]].",
- "babel-4": "Di yuuza ab [[$1|nier nietib]] nalij a [[$2|$3]].",
- "babel-5": "Di yuuza ab [[$1|profeshanal]] nalij a [[$2|$3]].",
- "babel-N": "Di yuuza ab a [[$1|nietib]] andastanin a [[$2|Jumiekan]].",
- "babel-0-n": "Dis yuuza ab [[$1|no]] nalij a [[$2|Jumiekan]] (ar andastani wid kansidarobl difikolti).",
- "babel-1-n": "Di yuuza ab [[$1|biesik]] nalij a [[$2|Jumiekan]].",
- "babel-2-n": "Di yuuza ab [[$1|intamidiet]] nalij a [[$2|Jumiekan]].",
- "babel-3-n": "Di yuuza ab [[$1|advans]] nalij a [[$2|Jumiekan]].",
- "babel-4-n": "Di yuuza ab [[$1|nier nietib]] nalij a [[$2|Jumiekan]].",
- "babel-5-n": "Di yuuza ab [[$1|profeshanal]] nalij a [[$2|Jumiekan]].",
- "babel-N-n": "Di yuuza ab a [[$1|nietib]] andastanin a [[$2|Jumiekan]]."
+ "babel": "Babel user information",
+ "babel-desc": "Add een di <code>#babel</code> parser function weh put een a babel userbox column fi yuh. Any custom template weh yuh have can use wid it.",
+ "babel-url": "Project:Babel",
+ "babel-footer-url": ":Category:Babel - People sort by language weh dem talk",
+ "babel-autocreate-reason": "Category page fi [[$1|Babel]] a generate.",
+ "babel-autocreate-text-levels": "People dem inna dis category seh dem $2 $1.",
+ "babel-autocreate-text-main": "People dem inna dis category can chat $1.",
+ "babel-0": "Dis ya (oo)man [[$2|$3]] [[$1|soft]].",
+ "babel-1": "Dis ya (oo)man know [[$1|likkle]] [[$2|$3]].",
+ "babel-2": "Dis ya (oo)man [[$2|$3]] [[$1|can gwaan]].",
+ "babel-3": "Dis ya (oo)man [[$2|$3]] [[$1|good fi true]].",
+ "babel-4": "Dis ya (oo)man chat [[$2|$3]] [[$1|good good]].",
+ "babel-5": "Dis ya (oo)man chat [[$2|$3]] [[$1|good good an' 'im wuk wid it]].",
+ "babel-N": "Dis ya (oo)man a chat [[$2|$3]] [[$1|from 'im bawn]].",
+ "babel-0-n": "Dis ya (oo)man [[$2|Patwa]] [[$1|soft]].",
+ "babel-1-n": "Dis ya (oo)man know [[$1|likkle]] [[$2|Patwa]].",
+ "babel-2-n": "Dis ya (oo)man [[$2|Patwa]] [[$1|can gwaan]].",
+ "babel-3-n": "Dis ya (oo)man [[$2|Patwa]] [[$1|good fi true]].",
+ "babel-4-n": "Dis ya (oo)man chat [[$2|Patwa]] [[$1|good good]].",
+ "babel-5-n": "Dis ya (oo)man chat [[$2|Patwa]] [[$1|good good an' 'im wuk wid it]].",
+ "babel-N-n": "Dis ya (oo)man a chat [[$2|Patwa]] [[$1|from 'im bawn]].",
+ "babel-footer": "People sort by language weh dem talk"
}
diff --git a/MLEB/Babel/i18n/kcg.json b/MLEB/Babel/i18n/kcg.json
new file mode 100644
index 00000000..2927cab1
--- /dev/null
+++ b/MLEB/Babel/i18n/kcg.json
@@ -0,0 +1,30 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "babel": "Nkhang a̱tyuta̱m Babila",
+ "babel-desc": "Á̱ mbeang <code>#babel</code> kyangta̱m wa̱i hu mat khwuk ta̱lyen ghwut tsuung a̱kwati-a̱tyuta̱m babila ji di̱ mi̱n tyimbwak zang ja byia̱ cet mbeang a̱yaatemplet jhyi a̱gwam",
+ "babel-url": "Project:Babila",
+ "babel-footer-url": ":Category:Babel - Á̱nienta̱m di̱n vak a̱lyem",
+ "babel-autocreate-reason": "Á̱ shyia̱ di̱ khwuk peji sa [[$1|Babila]] hu di̱ mi̱n tyimbwak.",
+ "babel-autocreate-text-levels": "Á̱nienta̱m mi̱ sot jini vwuot nyia̱ ba̱ byia̱ lyenta̱m shi $1 mat a̱lyem $2.",
+ "babel-autocreate-text-main": "Á̱nienta̱m mi̱ sot jini vwuot lyen kyang mba hu da̱ a̱lyem $1.",
+ "babel-0": "A̱tyuta̱m wuni [[$1|nwai]] byia̱ lyen [[$2|$3]] (ke a̱ kwan di̱n fi̱k nji a̱wot ma̱ng vwan a̱khwu ma̱ a̱da̱dei).",
+ "babel-1": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱tsan]] hwa si̱ [[$2|$3]] ji.",
+ "babel-2": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱tyia̱ka̱u]] hwa si̱ [[$2|$3]] ji.",
+ "babel-3": "A̱tyuta̱m wuni byia̱ lyen [[$1|á̱zanson]] hwa si̱ [[$2|$3]] ji.",
+ "babel-4": "A̱tyuta̱m wuni byia̱ lyen [[$1|kpa̱mkpaan a̱tyulyiat byina̱byin]] hwa si̱ [[$2|$3]] ji.",
+ "babel-5": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱gwak]] hwa si̱ [[$2|$3]] ji.",
+ "babel-N": "A̱tyuta̱m wuni byia̱ fi̱k [[$1|byina̱byin]] ja si̱ [[$2|$3]].",
+ "babel-0-n": "A̱tyuta̱m wuni [[$1|nwai]] byia̱ lyen [[$2|Tyap]] (ke a̱ kwan di̱n fi̱k nji a̱wot ma̱ng vwan a̱khwu ma̱ a̱da̱dei).",
+ "babel-1-n": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱tsan]] hwa si̱ [[$2|Tyap]] ji.",
+ "babel-2-n": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱tyia̱ka̱u]] hwa si̱ [[$2|Tyap]] ji.",
+ "babel-3-n": "A̱tyuta̱m wuni byia̱ lyen [[$1|á̱zanson]] hwa si̱ [[$2|Tyap]] ji.",
+ "babel-4-n": "A̱tyuta̱m wuni byia̱ lyen [[$1|kpa̱mkpaan a̱tyulyiat byina̱byin]] hwa si̱ [[$2|Tyap]] ji.",
+ "babel-5-n": "A̱tyuta̱m wuni byia̱ lyen [[$1|a̱gwak]] hwa si̱ [[$2|Tyap]] ji.",
+ "babel-N-n": "A̱tyuta̱m wuni byia̱ fi̱k [[$1|byina̱byin]] ja si̱ [[$2|Tyap]] ji.",
+ "babel-footer": "Á̱nienta̱m di̱n vak a̱lyem"
+}
diff --git a/MLEB/Babel/i18n/koi.json b/MLEB/Babel/i18n/koi.json
index 88914d65..e2a1ae2d 100644
--- a/MLEB/Babel/i18n/koi.json
+++ b/MLEB/Babel/i18n/koi.json
@@ -1,19 +1,20 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"Purodha"
]
},
- "babel-0": "Этiя уджкерисьыс [[$1|оз куж]] [[$2|$3]]<nowiki />öн.",
- "babel-1": "Этiя уджкерисьыс [[$1|кужыштö]] [[$2|$3]]<nowiki />öн.",
- "babel-2": "Этiя уджкерисьыс [[$1|мымдакö]] кужö [[$2|$3]]<nowiki />öн.",
- "babel-3": "Этiя уджкерисьыс [[$1|буракодь]] кужö [[$2|$3]]<nowiki />öн.",
- "babel-4": "Этiя уджкерисьыс [[$1|öддьöн бура]] кужö [[$2|$3]]<nowiki />öн.",
- "babel-N": "Этiя уджкерисьыслö [[$2|$3]]<nowiki />ыт - [[$1|мам кыв]].",
- "babel-0-n": "Этiя уджкерисьыс [[$1|оз куж]] [[$2|перем коми]]<nowiki />öн.",
- "babel-1-n": "Этiя уджкерисьыс [[$1|кужыштö]] [[$2|перем коми]]<nowiki />öн.",
- "babel-2-n": "Этiя уджкерисьыс [[$1|мымдакö]] кужö [[$2|перем коми]]<nowiki />öн.",
- "babel-3-n": "Этiя уджкерисьыс [[$1|буракодь]] кужö [[$2|перем коми]]<nowiki />öн.",
- "babel-4-n": "Этiя уджкерисьыс [[$1|öддьöн бура]] кужö [[$2|перем коми]]<nowiki />öн.",
+ "babel-0": "Этiя уджкерисьыс [[$1|оз куж]] [[$2|$3öн]].",
+ "babel-1": "Этiя уджкерисьыс [[$1|кужыштö]] [[$2|$3öн]].",
+ "babel-2": "Этiя уджкерисьыс [[$1|мымдакö]] кужö [[$2|$3öн]].",
+ "babel-3": "Этiя уджкерисьыс [[$1|буракодь]] кужö [[$2|$3öн]].",
+ "babel-4": "Этiя уджкерисьыс [[$1|öддьöн бура]] кужö [[$2|$3öн]].",
+ "babel-N": "Этiя уджкерисьыслö [[$2|$3ыт]] - [[$1|мам кыв]].",
+ "babel-0-n": "Этiя уджкерисьыс [[$1|оз куж]] [[$2|перем комиöн]].",
+ "babel-1-n": "Этiя уджкерисьыс [[$1|кужыштö]] [[$2|перем комиöн]].",
+ "babel-2-n": "Этiя уджкерисьыс [[$1|мымдакö]] кужö [[$2|перем комиöн]].",
+ "babel-3-n": "Этiя уджкерисьыс [[$1|буракодь]] кужö [[$2|перем комиöн]].",
+ "babel-4-n": "Этiя уджкерисьыс [[$1|öддьöн бура]] кужö [[$2|перем комиöн]].",
"babel-N-n": "Этiя уджкерисьыслö [[$2|перем комиыт]] - [[$1|мам кыв]]."
}
diff --git a/MLEB/Babel/i18n/ku-latn.json b/MLEB/Babel/i18n/ku-latn.json
index ac7d9524..757c34b6 100644
--- a/MLEB/Babel/i18n/ku-latn.json
+++ b/MLEB/Babel/i18n/ku-latn.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Balyozxane",
"Bikarhêner",
"George Animal",
"Ghybu"
@@ -10,6 +11,6 @@
"babel-url": "Project:Babîl",
"babel-footer-url": ":Kategorî:Babîl - Bikarhênerên li gorî zimanê",
"babel-N": "Zimanê [[$1|zikmakî]] yê {{GENDER:{{BASEPAGENAME}}|vî bikarhênerî|vê bikarhênerê|vî/vê bikarhênerî/ê}} [[$2|$3]] ye.",
- "babel-template": "Template:$1",
+ "babel-template": "Şablon:Bikarhêner $1",
"babel-footer": "Bikarhêner li gorî zimanê"
}
diff --git a/MLEB/Babel/i18n/kv.json b/MLEB/Babel/i18n/kv.json
index 333b5cd0..848b01a7 100644
--- a/MLEB/Babel/i18n/kv.json
+++ b/MLEB/Babel/i18n/kv.json
@@ -1,23 +1,24 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"Purodha"
]
},
"babel": "Вавилон",
"babel-url": "Project:Вавилон",
"babel-footer-url": ":Category:Участники по языкам",
- "babel-0": "Тайӧ вӧлысь [[$1|оз гӧгӧрво]] [[$2|$3]]<nowiki />ӧн (либӧ муртса гӧгӧрвоыштӧ).",
- "babel-1": "Тайö пырысьыс [[$2|$3]]<nowiki/>ӧ [[$1|неуна]] тӧдӧ.",
- "babel-2": "Тайö пырысьыс [[$2|$3]]<nowiki/>ӧ [[$1|буракодь]] тӧдӧ.",
- "babel-3": "Тайö пырысьыс [[$2|$3]]<nowiki/>ӧ [[$1|бура]] тӧдӧ.",
- "babel-4": "Тайö пырысьыс [[$2|$3]]<nowiki/>ӧ [[$1|зэв бура]] тӧдӧ.",
+ "babel-0": "Тайӧ вӧлысь [[$1|оз гӧгӧрво]] [[$2|$3ӧн]] (либӧ муртса гӧгӧрвоыштӧ).",
+ "babel-1": "Тайö пырысьыс [[$2|$3ӧ]] [[$1|неуна]] тӧдӧ.",
+ "babel-2": "Тайö пырысьыс [[$2|$3ӧ]] [[$1|буракодь]] тӧдӧ.",
+ "babel-3": "Тайö пырысьыс [[$2|$3ӧ]] [[$1|бура]] тӧдӧ.",
+ "babel-4": "Тайö пырысьыс [[$2|$3ӧ]] [[$1|зэв бура]] тӧдӧ.",
"babel-N": "Тайӧ пырысьлы [[$2|$3]] - [[$1|чужан кыв]]",
- "babel-0-n": "Тайӧ вӧлысь [[$1|оз гӧгӧрво]] [[$2|коми]]<nowiki />ӧн (либӧ муртса гӧгӧрвоыштӧ).",
- "babel-1-n": "Тайö пырысьыс [[$2|коми кывс]]<nowiki/>ӧ [[$1|неуна]] тӧдӧ.",
- "babel-2-n": "Тайö пырысьыс [[$2|коми кывс]]<nowiki/>ӧ [[$1|буракодь]] тӧдӧ.",
- "babel-3-n": "Тайö пырысьыс [[$2|коми кывс]]<nowiki/>ӧ [[$1|бура]] тӧдӧ.",
- "babel-4-n": "Тайö пырысьыс [[$2|коми кывс]]<nowiki/>ӧ [[$1|зэв бура]] тӧдӧ.",
+ "babel-0-n": "Тайӧ вӧлысь [[$1|оз гӧгӧрво]] [[$2|комиӧн]] (либӧ муртса гӧгӧрвоыштӧ).",
+ "babel-1-n": "Тайö пырысьыс [[$2|коми кывсӧ]] [[$1|неуна]] тӧдӧ.",
+ "babel-2-n": "Тайö пырысьыс [[$2|коми кывсӧ]] [[$1|буракодь]] тӧдӧ.",
+ "babel-3-n": "Тайö пырысьыс [[$2|коми кывсӧ]] [[$1|бура]] тӧдӧ.",
+ "babel-4-n": "Тайö пырысьыс [[$2|коми кывсӧ]] [[$1|зэв бура]] тӧдӧ.",
"babel-N-n": "Тайӧ пырысьлы [[$2|коми]] - [[$1|чужан кыв]]",
"babel-footer": "Участники по языкам"
}
diff --git a/MLEB/Babel/i18n/kw.json b/MLEB/Babel/i18n/kw.json
index c3073ed6..cef37632 100644
--- a/MLEB/Babel/i18n/kw.json
+++ b/MLEB/Babel/i18n/kw.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "GwikorFrank",
"Kernoweger",
"Kw-Moon",
"Nicky.ker",
@@ -12,21 +13,21 @@
"babel-url": "Project:Babel",
"babel-footer-url": ":Category:Babel - Devnydhyoryon herwydh yeth",
"babel-autocreate-reason": "Ow kwruthyl yn awtomatek folen an klass [[$1|Babel]].",
- "babel-autocreate-text-levels": "Devnydhyoryon y'n klass-ma a dheklar y's teves niver $1 rag $2.",
+ "babel-autocreate-text-levels": "Devnydhyoryon y'n klass ma a dheklar y's teves niver $1 rag $2.",
"babel-autocreate-text-main": "Devnydhyoryon y'n klass-ma a dheklar y's teves godhvos a $1.",
- "babel-0": "[[$1|Ny wor]] an devnydhyer-ma konvedhes [[$2|$3]] (po a'n gor gans kaletter dres ehen).",
- "babel-1": "An devnydhyer-ma a wor skrifa [[$2|$3]] orth nivel [[$1|sempel]].",
- "babel-2": "An devnydhyer-ma a wor skrifa [[$2|$3]] orth nivel [[$1|kres]].",
- "babel-3": "An devnydhyer-ma a wor skrifa [[$2|$3]] orth nivel [[$1|avonsys]].",
- "babel-4": "An devnydhyer-ma a wor skrifa [[$2|$3]] [[$1|kepar ha mammyeth]].",
- "babel-5": "An devnydhyer-ma a wor scrifa [[$2|$3]] orth nivel [[$1|galwansek]].",
- "babel-N": "[[$2|$3]] yw [[$1|mammyeth]] an devnydhyer-ma.",
- "babel-0-n": "[[$1|Ny wor]] an devnydhyer-ma konvedhes [[$2|Kernewek]].",
- "babel-1-n": "An devnydhyer-ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|sempel]].",
- "babel-2-n": "An devnydhyer-ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|kres]].",
- "babel-3-n": "An devnydhyer-ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|avonsys]].",
- "babel-4-n": "An devnydhyer-ma a wor skrifa [[$2|Kernewek]] [[$1|kepar ha mammyeth]].",
- "babel-5-n": "An devnydhyer-ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|galwansek]].",
- "babel-N-n": "[[$2|Kernewek]] yw [[$1|mammyeth]] an devnydhyer-ma.",
+ "babel-0": "[[$1|Ny wor]] an devnydhyer ma konvedhes [[$2|$3]] (po a'n gor gans kaletter dres eghen).",
+ "babel-1": "An devnydhyer ma a wor skrifa [[$2|$3]] orth nivel [[$1|sempel]].",
+ "babel-2": "An devnydhyer ma a wor skrifa [[$2|$3]] orth nivel [[$1|kres]].",
+ "babel-3": "An devnydhyer ma a wor skrifa [[$2|$3]] orth nivel [[$1|avonsys]].",
+ "babel-4": "An devnydhyer ma a wor skrifa [[$2|$3]] [[$1|kepar ha mammyeth]].",
+ "babel-5": "An devnydhyer ma a wor skrifa [[$2|$3]] orth nivel [[$1|galwesik]].",
+ "babel-N": "[[$2|$3]] yw [[$1|mammyeth]] an devnydhyer ma.",
+ "babel-0-n": "[[$1|Ny wor]] an devnydhyer ma konvedhes [[$2|Kernewek]] (po y gonvedhes gans kaletter dres eghen).",
+ "babel-1-n": "An devnydhyer ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|sempel]].",
+ "babel-2-n": "An devnydhyer ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|kres]].",
+ "babel-3-n": "An devnydhyer ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|avonsys]].",
+ "babel-4-n": "An devnydhyer ma a wor skrifa [[$2|Kernewek]] [[$1|kepar ha mammyeth]].",
+ "babel-5-n": "An devnydhyer ma a wor skrifa [[$2|Kernewek]] orth nivel [[$1|galwesik]].",
+ "babel-N-n": "[[$2|Kernewek]] yw [[$1|mammyeth]] an devnydhyer ma.",
"babel-footer": "Devnydhyoryon herwydh yeth"
}
diff --git a/MLEB/Babel/i18n/lmo.json b/MLEB/Babel/i18n/lmo.json
index c0f062e9..9a6e65c0 100644
--- a/MLEB/Babel/i18n/lmo.json
+++ b/MLEB/Babel/i18n/lmo.json
@@ -3,29 +3,30 @@
"authors": [
"Dakrismeno",
"Gloria sah",
+ "Salvemm el lombard",
"Sprüngli"
]
},
- "babel": "Infurmazion Babel del druvat",
- "babel-desc": "Gionta la 'parser function' <code>#babel</code> per permet la generazion utumatega d'un quader \"druvat Babel\" cun la pussibilità da metegh denter 'l templat persunalizaa",
+ "babel": "Informazzion Babel de l'utent",
+ "babel-desc": "El sgionta la 'parser function' <code>#babel</code> per permet la generazzion autumatega d'un quader \"utent Babel\" con la possibilità da metegh denter el model personalizad",
"babel-url": "Project:Babel",
- "babel-footer-url": ":Catégorja:Babel - Druvat per lingua",
- "babel-autocreate-reason": "Creazion utumatega de la pagina de la categurìa [[$1|Babel]].",
- "babel-autocreate-text-levels": "I druvat in quela categuria chì i mustren d'avegh un nivel de cunuscenza $1 de la lengua $2.",
- "babel-autocreate-text-main": "I druvat in quela categuria chì i mustren ch'i cugnussen la lengua $1.",
- "babel-0": "Quel dupradur chì 'l gh'ha [[$1|mía]] de cunuscenza de [[$2|$3]] (o 'l le cumprend cun di gran dificultaa)",
- "babel-1": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|basilara]] de [[$2|$3]].",
- "babel-2": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|intermedia]] de [[$2|$3]].",
- "babel-3": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|avanzada]] de [[$2|$3]].",
- "babel-4": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|asquas madrelengua]] de [[$2|$3]].",
- "babel-5": "Chestu dovratt al gh'a una cognossenza [[$1|professionala]] de [[$2|$3]].",
- "babel-N": "Quel druvat chì l'è un parlant [[$1|madrelengua]] de [[$2|$3]].",
- "babel-0-n": "Quel dupradur chì 'l cugnuss [[$1|mía]] 'l [[$2|Lumbard]] (o 'l le cumprend cun di gran dificultaa).",
- "babel-1-n": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|basilar]] del [[$2|Lumbard]].",
- "babel-2-n": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|intermedia]] del [[$2|Lumbard]].",
- "babel-3-n": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|avanzada]] del [[$2|Lumbard]].",
- "babel-4-n": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|asquas maderlengua]] del [[$2|Lumbard]]",
- "babel-5-n": "Quel druvat chì 'l gh'ha una cunuscenza [[$1|prufessiunal]] del [[$2|Lumbard]].",
- "babel-N-n": "Quel druvat chì l'è de [[$1|maderlengua]] [[$2|Lumbarda]].",
- "babel-footer": "Druvat per lingua"
+ "babel-footer-url": ":Catégorja:Babel - Utent per lengua",
+ "babel-autocreate-reason": "Creazzion autumatega de la pagina de la categoria [[$1|Babel]].",
+ "babel-autocreate-text-levels": "I utent in 'sta categoria chì i gh'hann un nivell de conoscenza $1 de la lengua $2.",
+ "babel-autocreate-text-main": "Gli utent in questa categoria chì indichen el so nivell de conoscenza de la lengua come $1.",
+ "babel-0": "Quell utent chì el gh'ha [[$1|minga]] de conoscenza de [[$2|$3]] (o 'l le comprend con di gran dificoltà)",
+ "babel-1": "Quell utent chì 'l gh'ha una conoscenza [[$1|fondamental]] de [[$2|$3]].",
+ "babel-2": "Quell utent chì 'l gh'ha una conoscenza [[$1|intermedia]] de [[$2|$3]].",
+ "babel-3": "Quell utent chì 'l gh'ha una conoscenza [[$1|elevada]] de [[$2|$3]].",
+ "babel-4": "Quell utent chì 'l gh'ha una conoscenza [[$1|asquas madrelengua]] de [[$2|$3]].",
+ "babel-5": "Quell utent chì el gh'ha 'na conoscenza [[$1|professional]] de [[$2|$3]].",
+ "babel-N": "Quell utent chì el gh'hà 'na conoscenza [[$1|madrelengua]] de [[$2|$3]].",
+ "babel-0-n": "Quell utent chì 'l conoss [[$1|minga]] el [[$2|Lombard]] (o 'l le comprend con di gran dificoltà).",
+ "babel-1-n": "Quell utent chì el gh'ha una conoscenza [[$1|fondamental]] del [[$2|Lombard]].",
+ "babel-2-n": "Quell utent chì el gh'ha una conoscenza [[$1|intermedia]] del [[$2|Lombard]].",
+ "babel-3-n": "Quell utent chì el gh'ha una conoscenza [[$1|vanzada]] del [[$2|Lombard]].",
+ "babel-4-n": "Quell utent chì el gh'ha una conoscenza [[$1|asquas madrelengua]] del [[$2|Lombard]]",
+ "babel-5-n": "Quell utent chì el gh'ha una conoscenza [[$1|professional]] del [[$2|Lombard]].",
+ "babel-N-n": "Quell utent chì el gh'hà 'na conoscenza [[$1|madrelengua]] del [[$2|Lombard]].",
+ "babel-footer": "Utent per lingua"
}
diff --git a/MLEB/Babel/i18n/lo.json b/MLEB/Babel/i18n/lo.json
index 3bdf834c..39bbeb80 100644
--- a/MLEB/Babel/i18n/lo.json
+++ b/MLEB/Babel/i18n/lo.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Iberia2011"
+ "Iberia2011",
+ "Nkrctp"
]
},
"babel": "ຂໍ້ມູນຜູ້ໃຊ້ Babel",
@@ -18,12 +19,12 @@
"babel-4": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້ ຂອງ [[$2|$3]] [[$1|ເກືອບເທົ່າພາສາກຳເນີດ]].",
"babel-5": "ຜູ້ໃຊ້ນີ້ມີ ຄວາມຮູ້ ຂອງ [[$2|$3]] [[$1|ລະດັບມືອາຊີບ]].",
"babel-N": "ຜູ້ຊົມໃຊ້ນີ້ມີ [[$1|ພາສາແມ່]] ເຂົ້າໃຈ [[$2|$3]]",
- "babel-0-n": "ຜູ້ໃຊ້ນີ້ມີ[[$1|ບໍ່]]ຄວາມຮູ້ຂອງ [[$2|ພາສາອັງກິດ]] (or ອາດພິຈາລະນາວ່າເຂົ້າໃຈຍາກ)",
- "babel-1-n": "ຜູ້ໃຊ້ນີ້ມີ [[$1|ພື້ນຖານ]] ຄວາມຮູ້ຂອງ [[$2|ອັງກິດ]].",
- "babel-2-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາອັງກິດ]][[$1|ລະດັບກາງ]] .",
- "babel-3-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາອັງກິດ]] [[$1|ລະດັບສູງ]].",
- "babel-4-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາອັງກິດ]] [[$1|ເກືອບເທົ່າພາສາແມ່]] .",
- "babel-5-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາອັງກິດ]] [[$1|ລະດັບມືອາຊີບ]] .",
- "babel-N-n": "ຜູ້ຊົມໃຊ້ນີ້ມີເຂົ້າໃຈ ຂອງ [[$2|ພາສາອັງກິດ]] [[$1|ເທົ່າກັບພາສາແມ່]] .",
+ "babel-0-n": "ຜູ້ໃຊ້ນີ້[[$1|ບໍ່ມີ]]ຄວາມຮູ້[[$2|ພາສາລາວ]] (ຫລືອາດພິຈາລະນາວ່າເຂົ້າໃຈຍາກ).",
+ "babel-1-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ລະດັບພື້ນຖານ]].",
+ "babel-2-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ລະດັບກາງ]].",
+ "babel-3-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ລະດັບສູງ]].",
+ "babel-4-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ເກືອບເທົ່າພາສາແມ່]].",
+ "babel-5-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ລະດັບມືອາຊີບ]].",
+ "babel-N-n": "ຜູ້ໃຊ້ນີ້ມີຄວາມຮູ້[[$2|ພາສາລາວ]][[$1|ເທົ່າກັບພາສາແມ່]].",
"babel-footer": "ຜູ້ໃຊ້ຕາມພາສາ"
}
diff --git a/MLEB/Babel/i18n/mrh.json b/MLEB/Babel/i18n/mrh.json
index 5511496a..a6488927 100644
--- a/MLEB/Babel/i18n/mrh.json
+++ b/MLEB/Babel/i18n/mrh.json
@@ -1,29 +1,33 @@
{
"@metadata": {
"authors": [
+ "Kiathy",
+ "Reihpaleituh",
"Teitei Para"
]
},
"babel": "Babel hmâhtuhpa chhichâna",
- "babel-desc": "Adds the <code>#babel</code> parser function to allow automated generation of a babel userbox column with the ability to include custom templates",
+ "babel-desc": "Khodâh templatezy khô theina tha nata babel hmâhtuhpa byh column sâkha kha anotata taona pasai thei n'awpa ta <code>#babel</code> parser taohriana kha khô teih",
"babel-url": "Project:Babel",
"babel-footer-url": ":Pho:Babel - Reihchâ ta hmâhtuhpazy",
"babel-autocreate-reason": "Anotata taopa [[$1|Babel]] pho châhmia.",
"babel-autocreate-text-levels": "He pho liata hmâhtuhpazy cha âmo reih $2 châta thaina chhâh $1 ama hneipa a palâsa.",
"babel-autocreate-text-main": "He pho liata hmâhtuhpazy cha reihchâ $1 liata ama pahnona a palâsa.",
+ "babel-autocreate-user": "Babel AnotataTao",
"babel-0": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta pahnona hnei [[$1|vei]] (acv thapi ta ru keipa ta ano âvâh).",
"babel-1": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta [[$1|âhnai chaipa]] pahnona a hnei.",
- "babel-2": "He hmâhtuhpa he cha [[$2|$3] nata azaopa ta pahnona [[$1|âdaihpa]] a hnei.",
+ "babel-2": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta pahnona [[$1|âdaihpa]] a hnei.",
"babel-3": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta [[$1|âsâh kawpa]] pahnona a hnei.",
"babel-4": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta [[$1|pikhei reih tlu ta]] pahnona a hnei.",
"babel-5": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta [[$1|asâhchaipa]] pahnona a hnei.",
"babel-N": "He hmâhtuhpa he cha [[$2|$3]] nata azaopa ta [[$1|a pikhei reih hawhta]] pahnona a hnei.",
- "babel-0-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta pahnona hnei [[$1|vei]] (acv thapi ta ru keipa ta ano âvâh).",
- "babel-1-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta [[$1|âhnai chaipa]] pahnona a hnei.",
- "babel-2-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta pahnona [[$1|âdaihpa]] a hnei.",
- "babel-3-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta [[$1|âsâh kawpa]] pahnona a hnei.",
- "babel-4-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta [[$1|pikhei reih tlu ta]] pahnona a hnei.",
- "babel-5-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta [[$1|asâhchaipa]] pahnona a hnei.",
- "babel-N-n": "He hmâhtuhpa he cha [[$2|Mongyuh reih]] nata azaopa ta [[$1|a pikhei reih hawhta]] pahnona a hnei.",
+ "babel-0-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta pahnona hnei [[$1|vei]] (acv thapi ta ru khei kawpa ta ano âvâh).",
+ "babel-1-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta [[$1|âhnai chaipa]] pahnona a hnei.",
+ "babel-2-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta pahnona [[$1|âdaihpa]] a hnei.",
+ "babel-3-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta [[$1|âsâh kawpa]] pahnona a hnei.",
+ "babel-4-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta [[$1|pikhei reih tlu ta]] pahnona a hnei.",
+ "babel-5-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta [[$1|asâhchaipa]] pahnona a hnei.",
+ "babel-N-n": "He hmâhtuhpa he cha [[$2|Mara reih]] nata azaopa ta [[$1|a pikhei reih hawhta]] pahnona a hnei.",
+ "babel-template": "Template:Hmâhtuhpa $1",
"babel-footer": "Reihchâ ta hmâhtuhpazy"
}
diff --git a/MLEB/Babel/i18n/nds.json b/MLEB/Babel/i18n/nds.json
index 244a53ad..07b23c62 100644
--- a/MLEB/Babel/i18n/nds.json
+++ b/MLEB/Babel/i18n/nds.json
@@ -8,7 +8,7 @@
"babel": "Babel-Bruker-Infos",
"babel-desc": "Föögt de <code>#babel</code>-Parserfunkschoon för dat automaatsche Opstellen vun Babel-Brukerboxen to. Verlöövt ok dat Inbinnen vun egene Vörlagen.",
"babel-url": "Project:Babel",
- "babel-footer-url": ":Kategorie:Babel - Bruker noh Spraak",
+ "babel-footer-url": ":Kategorie:Babel - Brukers na Spraak",
"babel-autocreate-reason": "Automaatsch opstellt [[$1|Babel]]-Kategorie.",
"babel-autocreate-text-levels": "Brukers in disse Kategorie köönt de Spraak $2 op Niveau $1 snacken.",
"babel-autocreate-text-main": "Brukers in disse Kategorie kennt vun de Spraak $1 wat af.",
@@ -26,5 +26,5 @@
"babel-4-n": "Disse Bruker versteiht wat vun [[$2|Plattdüütsch]] as wenn dat sien [[$1|Moderspraak]] weer.",
"babel-5-n": "Disse Bruker versteiht temlich wat vun [[$2|Plattdüütsch]], dat maakt he vun [[$1|Beroop]] ut.",
"babel-N-n": "Disse Bruker hett [[$2|Plattdüütsch]] as [[$1|Moderspraak]].",
- "babel-footer": "Bruker noh Spraak"
+ "babel-footer": "Brukers na Spraak"
}
diff --git a/MLEB/Babel/i18n/nia.json b/MLEB/Babel/i18n/nia.json
index a1b8a2df..cb19f984 100644
--- a/MLEB/Babel/i18n/nia.json
+++ b/MLEB/Babel/i18n/nia.json
@@ -1,14 +1,15 @@
{
"@metadata": {
"authors": [
- "Anugrahgori"
+ "Anugrahgori",
+ "Slaia"
]
},
- "babel": "Turia Mbabeli sanura",
+ "babel": "Turia Mbabeli zangoguna",
"babel-desc": "Nönö <code>#babel</code> parser function ena'ö tola tefazökhi a babel userbox column with the ability to include custom templates",
"babel-url": "Project:Mbabeli",
- "babel-footer-url": ":Fanete:Mbabeli - Sanura molo'ö Li ni'ila nia",
- "babel-autocreate-reason": "Fazökhi otomatis [[$1|Babel]] nga'örö fanete.",
+ "babel-footer-url": ":Kategori:Babel - Sanura molo'ö li",
+ "babel-autocreate-reason": "Fazökhi otomatis [[$1|Babel]] nga'örö kategori.",
"babel-autocreate-text-levels": "Tetandra wa sanura ba wanete da'a fa'atola nia fa Li $2 ya'ia da'ö $1",
"babel-autocreate-text-main": "Tetandra wa sanura ba wanete andre fa'atola nia ba Li $1",
"babel-0": "[[$1|Lö]] i'ila ma fagamböambö sibai sanura andre ba wohede ba Li [[$2|$3]]",
@@ -17,13 +18,13 @@
"babel-3": "[[$1|Oya]] i'ila wehede ba Li [[$2|$3]] sanura andre.",
"babel-4": "[[$1|Onekhe]] fa Li [[$2|$3]] sanura andre.",
"babel-5": "[[$1|Tola]] fahuhuo sanura andre föna zato ba Li [[$2|$3]] .",
- "babel-N": "I'oguna'ö [[$2|$3]] sanura andre [[$1|i'otarai me ideide]].",
- "babel-0-n": "[[$1|Lö i'ila]] mato ma'ifu fa [[$2|Li Hagöri]] sanura andre (ma abua si'ai khö nia wangi'ila).",
- "babel-1-n": "I'ila [[$1|ma'ifu]] wehede ba Li [[$2|$3]] sanura andre.",
+ "babel-N": "I'oguna'ö [[$2|$3]] zangoguna andre [[$1|i'otarai me ide-ide]].",
+ "babel-0-n": "[[$1|Lö i'ila]] mato ma'ifu fa-[[$2|Li Niha]] zangoguna andre (ma abua si'ai khönia wangila).",
+ "babel-1-n": "I'ila [[$1|ma'ifu si'ai]] fa-Li [[$2|$3]] zangoguna andre.",
"babel-2-n": "I'ila [[$1|ma'ifu]] wehede ba Li [[$2|Niha]] sanura andre.",
"babel-3-n": "[[$1|Oya]] i'ila wehede ba Li [[$2|Niha]] sanura andre.",
"babel-4-n": "[[$1|Onekhe]] fa Li [[$2|Niha]] sanura andre.",
"babel-5-n": "[[$1|Tola]] fahuhuo sanura andre föna zato ba Li [[$2|Hagöri]] .",
- "babel-N-n": "I'oguna'ö [[$2|Li Niha]] sanura andre [[$1|i'otarai me ideide]].",
+ "babel-N-n": "I'oguna'ö [[$2|Li Hagöri]] zangoguna andre [[$1|i'otarai me ide-ide]].",
"babel-footer": "Sanura molo'ö Li ni'oguna'ö nia"
}
diff --git a/MLEB/Babel/i18n/nl-informal.json b/MLEB/Babel/i18n/nl-informal.json
deleted file mode 100644
index d2b6736d..00000000
--- a/MLEB/Babel/i18n/nl-informal.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "@metadata": {
- "authors": [
- "Siebrand"
- ]
- }
-}
diff --git a/MLEB/Babel/i18n/nqo.json b/MLEB/Babel/i18n/nqo.json
new file mode 100644
index 00000000..70a116ab
--- /dev/null
+++ b/MLEB/Babel/i18n/nqo.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lancine.kounfantoh.fofana"
+ ]
+ },
+ "babel": "ߓߊߓߍߟ ߟߊߓߊ߯ߙߟߊ ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ",
+ "babel-url": "Project:ߓߊߓߍߟ",
+ "babel-footer-url": ":ߦߌߟߡߊ:ߓߊߓߍߟ - ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߊ߲ ߡߊ߬",
+ "babel-autocreate-reason": " [[$1|babel]] ߞߍߒߖߘߍߦߋ߫ ߛߌ߲ߘߟߌ ߦߌߟߡߊ߫ ߞߐߜߍ.",
+ "babel-autocreate-text-main": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߞߙߎ ߣߌ߲߬ ߘߐ߫ ߏ߬ ߟߎ߬ ߓߘߴߊ߬ߟߎ߬ ߟߐ߲ߕߊ ߘߊ߲߬ߠߊߕߍ߰ ߞߊ߲ $1 ߘߐ߫.",
+ "babel-0": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߡߊ߫ [[$1|no]] ߟߐ߲ߣߌ߲߫ ߞߍ߫ [[$2|$3]] ߟߊ߫ (ߥߟߴߊ߬ ߦߴߊ߬ \nߝߊ߰ߡߎ߲߬ ߠߊ߫ ߜߟߍ߬ߦߊ߫߫ ߞߏߟߌߞߏߟߌ ߟߋ߬ ߞߊ߲߬).",
+ "babel-1": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߓߊߖߎ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|$3]] ߟߊ߫.",
+ "babel-2": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߕߍߡߊߞߊ߲ߞߋ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|$3]] ߟߊ߫",
+ "babel-3": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ [[$1|ߖߊ߲߬ߝߊ߬ߣߍ߲߬ ߦߋ߫]] ߟߐ߲ߠߌ߲ ߘߐ߫ [[$2|$3]] ߘߐ߫",
+ "babel-4": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ [[$1|ߛߘߎ߬ߡߊ߲߬ ߦߋ߫ ߛߌ߲ߡߌ߲ߞߊ߲ ߝߐߓߊ߮]] ߟߐ߲ߠߌ߲ ߠߊ߫ [[$2|$3]] ߘߐ߫.",
+ "babel-5": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߓߟߏߡߞߊ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|$3]] ߘߐ߫.",
+ "babel-N": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߛߌ߲ߡߌ߲ߞߊ߲]] ߝߊ߰ߡߎ߲߬ߠߌ߲ ߞߍ߫ [[$2|$3]] ߘߐ߫.",
+ "babel-0-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ [[$1|no]] ߡߊ߫ [[$2|English]] ߟߐ߲߫ (ߥߟߴߊ߬ ߦߵߊ߬ ߝߊ߰ߡߎ߲߬ ߠߊ߫ ߜߟߍ߬ߦߊ߫ ߞߏߟߌߞߏߟߌ ߟߋ߬ ߞߊ߲߬).",
+ "babel-1-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߓߊߖߎ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|English]] ߘߐ߫.",
+ "babel-2-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߕߍߡߊߞߊ߲ߞߋ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|English]] ߘߐ߫.",
+ "babel-3-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ [[$1|ߖߊ߲߬ߝߊ߬ߣߍ߲߬]] ߦߋ߫ [[$2|English]] ߘߐ߫.",
+ "babel-4-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ [[$1|ߛߘߎ߬ߡߊ߲߬ ߦߋ߫ ߛߌ߲ߡߌ߲ߞߊ߲ ߝߐߓߊ߮]] ߟߊ߫ [[$2|English]] ߘߐ߫.",
+ "babel-5-n": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߞߊ߬ [[$1|ߓߟߏߡߞߊ]] ߟߐ߲ߠߌ߲ ߞߍ߫ [[$2|English]] ߘߐ߫.",
+ "babel-footer": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߊ߬ ߓߍ߲߬ ߞߊ߲ ߡߊ߬"
+}
diff --git a/MLEB/Babel/i18n/pms.json b/MLEB/Babel/i18n/pms.json
index 8dc2970d..e8f6453b 100644
--- a/MLEB/Babel/i18n/pms.json
+++ b/MLEB/Babel/i18n/pms.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Borichèt",
"Dragonòt",
"GerardM"
]
@@ -11,7 +12,7 @@
"babel-footer-url": ":Category:Babel - Utent për lenga",
"babel-autocreate-reason": "Creassion automàtica dla pàgina dla categorìa [[$1|Babel]].",
"babel-autocreate-text-levels": "J'utent an sta categorìa-sì a mosto che a l'han un livel ëd conossensa $1 dla lenga $2.",
- "babel-autocreate-text-main": "J'utent an sta categorìa-sì a mosto che a conosso la lenga $1.",
+ "babel-autocreate-text-main": "J'utent an sta categorìa a smon-o soa conossensa dla lenga $1.",
"babel-0": "St'utent-sì a l'ha [[$1|gnun-e]] conossense dël [[$2|$3]] (o a lo capiss con motobin ëd dificoltà).",
"babel-1": "St'utent-sì a l'ha na conossensa [[$1|limità]] dël [[$2|$3]].",
"babel-2": "St'utent-sì a l'ha na conossensa [[$1|antërmedia]] dël [[$2|$3]].",
diff --git a/MLEB/Babel/i18n/pnb.json b/MLEB/Babel/i18n/pnb.json
index 8b8f8460..115b0576 100644
--- a/MLEB/Babel/i18n/pnb.json
+++ b/MLEB/Babel/i18n/pnb.json
@@ -11,21 +11,21 @@
"babel-url": "ویونت: بابل",
"babel-footer-url": "گٹھ: بابل - بولی نال ورتن والے",
"babel-autocreate-reason": "اپنے آپ ای [[$1|بابل]] گٹھ صفحہ بنایا جاریا اے۔",
- "babel-autocreate-text-levels": "اس گٹھ چ مجود ورتن آلے $2 بولی دے بارے چ $1 بوتا جاندے نیں۔",
- "babel-autocreate-text-main": "اس گٹھ چ مجود ورتن آلے $1 بولی دے بارے چ جاندے نیں۔",
- "babel-0": "اے ورتن آلا [[$2|$3]] نوں [[$1|نئیں]] جاندا (یا اینوں مشکل نال سمجدا اے)۔",
- "babel-1": "اے ورتنوالا [[$2|$3]] دے بارے وچ [[$1|بنیادی]] جانکاری رکھدا اے۔",
+ "babel-autocreate-text-levels": "اس گٹھ وچ موجود ورتن آلے $2 بولی دے بارے وچ $1 بوہتا جاندے نیں۔",
+ "babel-autocreate-text-main": "اس گٹھ وچ موجود ورتن آلے $1 بولی دے بارے وچ جاندے نیں۔",
+ "babel-0": "ایہ ورتن آلا [[$2|$3]] نوں [[$1|نئیں]] جاندا (یا اینوں مشکل نال سمجھدا اے)۔",
+ "babel-1": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|بنیادی]] جانکاری رکھدا اے۔",
"babel-2": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|درمیانی]] جانکاری رکھدا اے۔",
"babel-3": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|چوکھی]] جانکاری رکھدا اے۔",
"babel-4": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|چنگی بھلی]] جانکاری رکھدا اے۔",
"babel-5": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|پروفشنل]] جانکاری رکھدا اے۔",
"babel-N": "ایہ ورتنوالا [[$2|$3]] دے بارے وچ [[$1|ماں بولی]] جڈی جانکاری رکھدا اے۔",
"babel-0-n": "ایہ ورتنوالا [[$2|پنجابی]] نوں [[$1|نئیں]] جاندا (یا اینوں مشکل نال سمجھدا اے)۔",
- "babel-1-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|پدری]] جانکاری رکھدا اے۔",
- "babel-2-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|درمیانی]] جانکاری رکھدا اے۔",
+ "babel-1-n": "ایہ ورتن آلا [[$2|پنجابی]] دے بارے وچ [[$1|بنیادی]] جانکاری رکھدا اے۔",
+ "babel-2-n": "ایہ ورتن آلا [[$2|پنجابی]] دے بارے وچ [[$1|درمیانی]] جانکاری رکھدا اے۔",
"babel-3-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|چوکھی]] جانکاری رکھدا اے۔",
- "babel-4-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|چنگی پلی]] جانکاری رکھدا اے۔",
- "babel-5-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|پروفشنل]] جانکاری رکھدا اے۔",
- "babel-N-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے چ [[$1|ماں بولی]] جڈی جانکاری رکھدا اے۔",
+ "babel-4-n": "ایہ ورتن آلا [[$2|پنجابی]] دے بارے وچ [[$1|چنگی بھلی]] جانکاری رکھدا اے۔",
+ "babel-5-n": "ایہ ورتن آلا [[$2|پنجابی]] دے بارے وچ [[$1|پروفشنل]] جانکاری رکھدا اے۔",
+ "babel-N-n": "اے ورتن آلا [[$2|پنجابی]] دے بارے وچ [[$1|ماں بولی]] جڈی جانکاری رکھدا اے۔",
"babel-footer": "بولی حساب نال ورتن والے"
}
diff --git a/MLEB/Babel/i18n/qqq.json b/MLEB/Babel/i18n/qqq.json
index c09d66dc..8e075142 100644
--- a/MLEB/Babel/i18n/qqq.json
+++ b/MLEB/Babel/i18n/qqq.json
@@ -4,6 +4,7 @@
"Dereckson",
"KartikMistry",
"Lloffiwr",
+ "MuratTheTurkish",
"Od1n",
"Purodha",
"Raimond Spekking",
@@ -19,7 +20,7 @@
"babel": "Header of Babel box. Parameters:\n* $1 - (Optional) the name of the page it is used on, for GENDER support",
"babel-desc": "{{desc|name=Babel|url=https://www.mediawiki.org/wiki/Extension:Babel}}",
"babel-url": "{{doc-important|Do not translate the namespace \"<code>Project:</code>\".}}\nThe page name at which more information about the babel system can be found.",
- "babel-footer-url": "Unless this message is empty, this is used as link target in the last entry,\nalso known as the footer, of the outer Babel-box,\nprovided that the installation chooses to have a footer.\nThe corresponding link anchor is the message [[MediaWiki:babel-footer/{{UILANGCODE}}|babel-footer]] {{msg-mw|Babel-footer|notext=}}.\n\nFor installations having a 'Babel users per language' category tree, its root should be entered here.\nWhen translating, you can copy the category name from existing Babel systems in your language, but you can as well use a more generic name and leave it to individual installations, how to deal with it.\n\nThere is no need to alter the name space name <code lang=\"en\">Category</code>.",
+ "babel-footer-url": "Unless this message is empty, this is used as link target in the last entry,\nalso known as the footer, of the outer Babel-box,\nprovided that the installation chooses to have a footer.\n{{msg-mw|Babel-footer|notext=}}.\n\nFor installations having a 'Babel users per language' category tree, its root should be entered here.\nWhen translating, you can copy the category name from existing Babel systems in your language, but you can as well use a more generic name and leave it to individual installations, how to deal with it.\n\nThere is no need to alter the name space name <code lang=\"en\">Category</code>.",
"babel-autocreate-reason": "Edit summary for an automatically created Babel category page. Parameters:\n* $1 is a page title for information on Babel.",
"babel-autocreate-text-levels": "Text describing a category, at the top of the category page.\n\n* $1 is the level (0 to 5, or N).\n* $2 is a language name.\n* $3 is a language code (optional; for customisation).",
"babel-autocreate-text-main": "Text describing a category, at the top of the category page.\n\n* $1 is a language name.",
@@ -39,6 +40,6 @@
"babel-5-n": "{{Babel Message Description|5|native=yes}}",
"babel-N-n": "{{Babel Message Description|N|native=yes}}",
"babel-portal": "{{notranslate}}",
- "babel-template": "{{Optional}}{{doc-important|Do not translate \"Template:\".}}\nThis message contains the template schema for additional templates that can be used in Babel. Parameters:\n* $1 is the parameter value used in the <nowiki>#babel</nowiki> parser tag.",
+ "babel-template": "{{Optional}}{{doc-important|Do not translate \"<code>Template:</code>\".}}\nThis message contains the template schema for additional templates that can be used in Babel. Parameters:\n* $1 is the parameter value used in the <nowiki>#babel</nowiki> parser tag.",
"babel-footer": "This text is used in the last entry (footer) of the outer box. It is a link anchor, if {{msg-mw|babel-footer-url}} is not empty, otherwise, it is only text. No footer is generated, when this text is empty."
}
diff --git a/MLEB/Babel/i18n/rue.json b/MLEB/Babel/i18n/rue.json
index da288b09..13a3231a 100644
--- a/MLEB/Babel/i18n/rue.json
+++ b/MLEB/Babel/i18n/rue.json
@@ -22,7 +22,7 @@
"babel-0-n": "Сесь хосновач [[$1|не говорить]] [[$2|русинськым языком]] (ци тяжко го розуміє).",
"babel-1-n": "Сесь хосновач говорить [[$2|по-русинськы]] на [[$1|начальному рôвні]].",
"babel-2-n": "Сесь хосновач говорить [[$2|по-русинськы]] на [[$1|середньому рôвні]].",
- "babel-3-n": "Сесь хосновач говорить [[$2|по-русинськы]] на [[$1|високому рôвні]].",
+ "babel-3-n": "Сесь хосновач говорить [[$2|по-русинськы]] на [[$1|высокому рівні]].",
"babel-4-n": "Сесь хосновач говорить [[$2|русинськым языком]] майже ги [[$1|рôдным]].",
"babel-5-n": "Сесь хосновач говорить [[$2|по-русинськы]] на [[$1|професіональному рôвні]].",
"babel-N-n": "Для сього хосновача [[$2|русинськый язык]] - [[$1|рôдный]].",
diff --git a/MLEB/Babel/i18n/sc.json b/MLEB/Babel/i18n/sc.json
index eb0cbd36..61c83f60 100644
--- a/MLEB/Babel/i18n/sc.json
+++ b/MLEB/Babel/i18n/sc.json
@@ -3,6 +3,7 @@
"authors": [
"Andria",
"Gloria sah",
+ "L2212",
"Marzedu",
"Taxandru"
]
@@ -21,12 +22,12 @@
"babel-4": "Custu impitadore tenet una connoscéntzia [[$1|cante sa limba mama]] de su [[$2|$3]].",
"babel-5": "Custu impitadore tenet una connoscéntzia [[$1|professionale]] de su [[$2|$3]].",
"babel-N": "Custu impitadore faeddat su [[$2|$3]] comente [[$1|limba mama]].",
- "babel-0-n": "Custu impitadore [[$1|non cumprendet]] su '''[[$2|Sardu]]''', o ddu cumprendet cun aprentu mannu.",
- "babel-1-n": "Custu impitadore podet azudare, ca unu '''[[$1|azicu]]''' de '''[[$2|Sardu]]''' lu connoschet.",
- "babel-2-n": "Custu impitadore podet azudare, ca connoschet su '''[[$2|Sardu]]''' e lu '''[[$1|cumprendet]]'''.",
- "babel-3-n": "Custu impitadore potet azudare '''[[$1|meda]]''' pro ite ischit faeddare e iscrìere su '''[[$2|Sardu]]'''.",
- "babel-4-n": "Custu impitadore faeddat su '''[[$2|Sardu]]''' in modu '''[[$1|perfetu]]'''.",
+ "babel-0-n": "Custu impitadore [[$1|non cumprendet]] su '''[[$2|sardu]]''', o ddu cumprendet cun apentu mannu.",
+ "babel-1-n": "Custu impitadore podet agiudare, ca unu '''[[$1|azicu]]''' de '''[[$2|sardu]]''' lu connoschet.",
+ "babel-2-n": "Custu impitadore podet agiudare, ca connoschet su '''[[$2|sardu]]''' e lu '''[[$1|cumprendet]]'''.",
+ "babel-3-n": "Custu impitadore podet agiudare '''[[$1|meda]]''', ca ischit faeddare e iscrìere su '''[[$2|sardu]]''' comente si tocat.",
+ "babel-4-n": "Custu impitadore faeddat su '''[[$2|sardu]]''' in manera '''[[$1|perfeta]]'''.",
"babel-5-n": "Custu impitadore connoschet su [[$2|Sardu]] a livellu [[$1|profesionale]].",
- "babel-N-n": "Custu impitadore faeddat su [[$2|Sardu]] comente [[$1|limba mama]].",
+ "babel-N-n": "Custu impitadore faeddat su [[$2|sardu]] comente [[$1|limba mama]].",
"babel-footer": "Impitadores pro limba"
}
diff --git a/MLEB/Babel/i18n/shi.json b/MLEB/Babel/i18n/shi.json
index 9675c487..ca66547a 100644
--- a/MLEB/Babel/i18n/shi.json
+++ b/MLEB/Babel/i18n/shi.json
@@ -2,27 +2,28 @@
"@metadata": {
"authors": [
"Amara-Amaziɣ",
+ "Ayour2002",
"Dalinanir"
]
},
- "babel": "ⵓⵎⵍⴰⵏ ⴱⴰⴱⵉⵍ ⵏ ⵓⵙⵎⵔⴰⵙ",
+ "babel": "Umlan babil n usmras",
"babel-desc": "Zayd awur <code>#babel</code> lli radd immurzm s utumatik yat tanaka (taznbilt) nu umsqdac Babil d mas rad yaf an ig timuḍimin n idɣarn.",
- "babel-url": "Project:ⴱⴰⴱⵉⵍ",
+ "babel-url": "Project:Babil",
"babel-autocreate-reason": "Askr utumatik n [[$1|Babel]] talɣa .",
- "babel-autocreate-text-levels": "Mdn v talɣa yad ar mmaln mas llan ɣ uswir n $1 i tutlayt n $2.",
- "babel-autocreate-text-main": " Imqdacn ɣ talɣa yad ar mlan masd darsn tusna ɣ tutlayt $1.",
- "babel-0": "ⴰⵙⵎⵔⴰⵙ ⴰⴷ [[$1|ⵓⵔ]] ⴷⴰⵔⵙ ⵜⵓⵙⵙⵏⴰ ⴳ [[$2|$3]] (ⵏⵖ ⴰⵔ ⵜⵜ ⵉⵜⵜⵔⵎⴰⵙ ⵙ ⵜⵎⴰⵔⴰ ⵉⴳⴳⵓⵜⵏ).",
- "babel-1": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ [[$1|ⵜⴰⵙⵉⵍⴰⵏⵜ]] ⵏ [[$2|$3]].",
- "babel-2": "Amdan ad dars tusna s uswir [[$2|$3]] ɣ [[$1|anamas]].",
- "babel-3": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ [[$1|ⵢⴰⵜⵜⵓⵢⵏ]] ⵏ [[$2|$3]].",
- "babel-4": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ ⵢⴰⵥⵏ ⵉ [[$1|ⵜⵉⵏ ⵓⵎⵙⵙⵉⵡⵍ ⴰⵏⵚⵍⵉ]] ⵏ [[$2|$3]].",
- "babel-5": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ ⵉⴳⴰⵏ [[$1|ⴲⵔⵓⴼⵉⵙⵢⵓⵏⵉⵍ]] ⵏ [[$2|$3]].",
- "babel-N": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⵜⴳⴰ ⴷⴰⵔⵙ [[$2|$3]] [[$1|ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵢⵎⵎⴰⵜ]].",
- "babel-0-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ [[$1|ⵓⵔ]] ⴷⴰⵔⵙ ⴽⵔⴰ ⵏ ⵜⵓⵙⵙⵏⴰ ⵖ [[$2|ⵜⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]] (ⵏⵖ ⴰⵔ ⵜⵜ ⵉⵜⵜⵔⵎⴰⵙ ⵙ ⵜⵎⴰⵔⴰ ⵉⴳⴳⵓⵜⵏ).",
- "babel-1-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ [[$1|ⵜⴰⵙⵉⵍⴰⵏⵜ]] ⵖ [[$2|ⵜⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]].",
- "babel-2-n": "Amdan ad dars tusna s [[$1|uswir anamas]] ɣ [[$2|Tamaziɣt tasusit]].",
- "babel-3-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ [[$1|ⵢⴰⵜⵜⵓⵢⵏ]] ⵖ [[$2|ⵜⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]].",
- "babel-4-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ ⵢⴰⵥⵏ ⵉ [[$1|ⵜⵉⵏ ⵓⵎⵙⵙⵉⵡⵍ ⴰⵏⵚⵍⵉ]] ⵖ [[$2|ⵜⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]].",
- "babel-5-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⴷⴰⵔⵙ ⵢⴰⵜ ⵜⵓⵙⵙⵏⴰ ⵉⴳⴰⵏ [[$1|ⴲⵔⵓⴼⵉⵙⵢⵓⵏⵉⵍ]] ⵖ [[$2|ⵜⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]].",
- "babel-N-n": "{{GENDER:$4|ⴰⵙⵎⵔⴰⵙ|ⵜⴰⵙⵎⵔⴰⵙⵜ}} ⴰⴷ ⵜⴳⴰ ⴷⴰⵔⵙ [[$2|ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵜⴰⵛⵍⵃⵉⵜ)]] [[$1|ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵢⵎⵎⴰⵜ]]."
+ "babel-autocreate-text-levels": "Middn ɣ talɣa yad ar mmaln mas llan ɣ uswir n $1 i tutlayt n $2.",
+ "babel-autocreate-text-main": "Middn ɣ talɣa yad ar mlan mas-d darsn tusna ɣ tutlayt $1.",
+ "babel-0": "Asmras ad [[$1|ur]] dars tussna ɣ [[$2|$3]] (nɣ ar tt ittrmas s tmmara iggutn).",
+ "babel-1": "Asmras ad dars yat tussna [[$1|tasilant]] n [[$2|$3]].",
+ "babel-2": "Asmras ad dars tussna s uswir [[$1|anamas]] ɣ [[$2|$3]].",
+ "babel-3": "Asmras ad dars yat tussna [[$1|yattuyn]] n [[$2|$3]].",
+ "babel-4": "Asmras ad dars yat tussna yaẓn i [[$1|tin umsawal anṣli]] n [[$2|$3]].",
+ "babel-5": "Asmras ad dars yat tussna [[$1|iqqurn]] n [[$2|$3]].",
+ "babel-N": "Asmras ad tga dars [[$2|$3]] [[$1|tutlayt taymmat]].",
+ "babel-0-n": "Asmras ad [[$1|ur]] dars kra n tussna ɣ [[$2|Taclḥit)]] (nɣ ar tt ittrmas s tmmara iggutn).",
+ "babel-1-n": "Asmras ad dars yat tussna [[$1|tasilant]] ɣ [[$2|Taclḥit]].",
+ "babel-2-n": "Asmras ad dars tussna s [[$1|uswir anammas]] ɣ [[$2|Taclḥit]].",
+ "babel-3-n": "Asmras ad dars yat tussna [[$1|yattuyn]] ɣ [[$2|Taclḥit]].",
+ "babel-4-n": "Asmras ad dars yat tussna yaẓn i [[$1|tin umssiwl anṣli]] ɣ [[$2|Taclḥit]].",
+ "babel-5-n": "Asmras ad dars yat tussna [[$1|iqqurn]] ɣ [[$2|Taclḥit]].",
+ "babel-N-n": "Asmras ad tga dars [[$2|Taclḥit]] [[$1|tutlayt taymmat]]."
}
diff --git a/MLEB/Babel/i18n/shy.json b/MLEB/Babel/i18n/shy.json
new file mode 100644
index 00000000..847bbf7d
--- /dev/null
+++ b/MLEB/Babel/i18n/shy.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "JackPotte"
+ ]
+ },
+ "babel-0-n": "This user has [[$1|no]] knowledge of [[$2|Shawiya]] (or understands it with considerable difficulty).",
+ "babel-1-n": "This user has [[$1|basic]] knowledge of [[$2|Shawiya]].",
+ "babel-2-n": "This user has [[$1|intermediate]] knowledge of [[$2|Shawiya]].",
+ "babel-3-n": "This user has [[$1|advanced]] knowledge of [[$2|Shawiya]].",
+ "babel-4-n": "This user has [[$1|near native speaker]] knowledge of [[$2|Shawiya]].",
+ "babel-5-n": "This user has [[$1|professional]] knowledge of [[$2|Shawiya]].",
+ "babel-N-n": "This user has a [[$1|native]] understanding of [[$2|Shawiya]]."
+}
diff --git a/MLEB/Babel/i18n/sl.json b/MLEB/Babel/i18n/sl.json
index e861ffee..bd263cb2 100644
--- a/MLEB/Babel/i18n/sl.json
+++ b/MLEB/Babel/i18n/sl.json
@@ -3,6 +3,7 @@
"authors": [
"Daimona Eaytoy",
"Dbc334",
+ "Eleassar",
"Smihael",
"Yerpo"
]
@@ -21,7 +22,7 @@
"babel-4": "Uporabnik govori [[$2|$3]] [[$1|skoraj enako dobro kakor prvi jezik]].",
"babel-5": "Uporabnik govori [[$2|$3]] na [[$1|profesionalni]] ravni.",
"babel-N": "Ta uporabnik govori [[$2|{{GRAMMAR:akuzativ|$3}}]] kot [[$1|materni jezik]].",
- "babel-0-n": "Uporabnik [[$1|ne govori]] [[$2|slovenščine]] oz. ima velike težave pri razumevanju.",
+ "babel-0-n": "Uporabnik [[$1|ne govori]] [[$2|slovenščine]] ali ima velike težave pri razumevanju.",
"babel-1-n": "Uporabnik pozna '''[[$1|osnove]]''' '''[[$2|slovenskega jezika]]'''.",
"babel-2-n": "Uporabnik '''[[$1|srednje dobro]]''' govori '''[[$2|slovenščino]]'''.",
"babel-3-n": "Uporabnik '''[[$1|zelo dobro]]''' govori '''[[$2|slovenščino]]'''.",
diff --git a/MLEB/Babel/i18n/smn.json b/MLEB/Babel/i18n/smn.json
new file mode 100644
index 00000000..9cfc5499
--- /dev/null
+++ b/MLEB/Babel/i18n/smn.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Seipinne"
+ ]
+ },
+ "babel": "Kevttee kielâmáttu",
+ "babel-footer-url": ":Category:Babel - Kevtteeh kielâ mield",
+ "babel-0": "Taat kevttee máttá [[$2|$3]] [[$1|uáli jo uccáá teikkâ ij määti tom ollágin]].",
+ "babel-2": "Taat kevttee máttá [[$2|$3]] [[$1|viehâ pyereest]].",
+ "babel-4": "Taat kevttee máttá [[$2|$3]] [[$1|eenikielâlii sárnoo náál]].",
+ "babel-N": "Taam kevttee [[$1|eenikielâ]] lii [[$2|$3]].",
+ "babel-1-n": "Taat kevttee máttá [[$1|váhá]] [[$2|anarâškielâ]].",
+ "babel-3-n": "Taat kevttee máttá [[$2|anarâškielâ]] [[$1|uáli jo pyereest]].",
+ "babel-5-n": "Taat kevttee máttá [[$2|anarâškielâ]] [[$1|áámmátlâš tääsist]]."
+}
diff --git a/MLEB/Babel/i18n/tg-cyrl.json b/MLEB/Babel/i18n/tg-cyrl.json
index 24decad5..636ad53f 100644
--- a/MLEB/Babel/i18n/tg-cyrl.json
+++ b/MLEB/Babel/i18n/tg-cyrl.json
@@ -4,6 +4,7 @@
"Curasao",
"Ibrahim",
"ToJack",
+ "Whytheonlyone",
"ZxxZxxZ"
]
},
@@ -20,8 +21,8 @@
"babel-2": "Ин корбар [[$2|$3]]ро дар сатҳи [[$1|миёна]] мефаҳмад.",
"babel-3": "[[$2|$3]] — [[$1|бо сатҳи дониши озоди]]",
"babel-4": "Корбари мазкур ба '''[[$2|тоҷикӣ]]''' дар сатҳи '''[[$1|хуб]]''' монанди қариб забони модариаш медонад.",
- "babel-5": "[[$2|$3]] — [[$1|бо сатҳи дониши олии]]",
- "babel-N": "[[$2|$3]] — [[$1|забони модари]]",
+ "babel-5": "Ин корбар дониши [[$1|касбии]] [[$2|$3]]-ро дорад.",
+ "babel-N": "Корбари мазкур [[$2|$3]]-ро дар сатҳи забони [[$1|модариаш]] мефаҳмад.",
"babel-0-n": "Корбари мазкур [[$2|забони тоҷикиро]] [[$1|намефаҳмад]] (ё бо душворӣ мефаҳмад).",
"babel-1-n": "Корбари мазкур [[$1|дар сатҳи муқаддамоти]] [[$2|забони тоҷикиро]] медонад.",
"babel-2-n": "Корбари мазкур [[$2|тоҷикиро]] [[$1|хуб]] медонад.",
diff --git a/MLEB/Babel/i18n/th.json b/MLEB/Babel/i18n/th.json
index 027be003..3380631e 100644
--- a/MLEB/Babel/i18n/th.json
+++ b/MLEB/Babel/i18n/th.json
@@ -6,7 +6,8 @@
"Geonuch",
"Horus",
"Manop",
- "Passawuth"
+ "Passawuth",
+ "Patsagorn Y."
]
},
"babel": "ข้อมูลภาษาของผู้ใช้",
@@ -19,7 +20,7 @@
"babel-0": "ผู้ใช้คนนี้[[$1|ไม่มี]]ความรู้เกี่ยวกับ[[$2|$3]] (หรือเข้าใจได้ด้วยความยากลำบาก)",
"babel-1": "ผู้ใช้คนนี้มีความรู้[[$1|พื้นฐาน]]เกี่ยวกับ[[$2|$3]]",
"babel-2": "ผู้ใช้คนนี้มีความรู้[[$1|ระดับกลาง]]เกี่ยวกับ[[$2|$3]]",
- "babel-3": "ผู้ใช้คนนี้มีความรู้[[$1|ระดับสูง]]เกี่ยวกับ[[$2|$3]]",
+ "babel-3": "ผู้ใช้คนนี้มีความรู้[[$1|ระดับสูง]]เกี่ยวกับ[[$2|ภาษา$3]]",
"babel-4": "ผู้ใช้คนนี้สามารถใช้[[$2|$3]]ได้เหมือน[[$1|ภาษาแม่]]",
"babel-5": "ผู้ใช้คนนี้สามารถใช้[[$2|$3]]ได้อย่าง[[$1|เชี่ยวชาญ]]",
"babel-N": "ผู้ใช้คนนี้ใช้[[$2|$3]]เป็น[[$1|ภาษาแม่]]",
diff --git a/MLEB/Babel/i18n/tl.json b/MLEB/Babel/i18n/tl.json
index a9e55abe..8d0581f4 100644
--- a/MLEB/Babel/i18n/tl.json
+++ b/MLEB/Babel/i18n/tl.json
@@ -1,31 +1,32 @@
{
"@metadata": {
"authors": [
- "AnakngAraw"
+ "AnakngAraw",
+ "GinawaSaHapon"
]
},
- "babel": "Kabatirang pangtagagamit ng Babel",
- "babel-desc": "Nagdaragdag ng tungkuling pambanghay (''parser'') na <code>#babel</code> para payagan ang kusang paglitaw ng isang hanay sa kahong pantagagamit ng babel na may kakayahang magsali ng nakahandang mga suleras",
+ "babel": "Impormasyon ng tagagamit ng Babel",
+ "babel-desc": "Dinadagdag ang parser function na <code>#babel</code> para payagan ang agarang paggawa ng hanay ng babel userbox na kayang magsama ng mga custom na padron",
"babel-url": "Project:Babel",
- "babel-footer-url": ":Category:Babel - Mga tagagamit ayon sa wika",
- "babel-autocreate-reason": "Kusang lumilikha ng pahina ng kauriang pam-[[$1|Babel]].",
- "babel-autocreate-text-levels": "Nagpapakita na may kakayahang pang-antas $1 sa wikang $2 ang mga tagagamit na nasa kauriang ito.",
- "babel-autocreate-text-main": "Nagpapakitang may kaalaman sa wikang $1 ang mga tagagamit na nasa kauriang ito.",
+ "babel-footer-url": ":Category:Babel - Tagagamit base sa wika",
+ "babel-autocreate-reason": "Agad na gumawa ng pahina ng kategorya ng [[$1|Babel]].",
+ "babel-autocreate-text-levels": "Ang mga tagagamit na nasa kategoryang ito ay nagsabing na ang antas ng kakayahan nila sa wika na $2 ay $1.",
+ "babel-autocreate-text-main": "Ang mga tagagamit na nasa kategoryang ito ay nagsabing ng antas ng kaalaman nila sa wika na $1.",
"babel-autocreate-user": "Babel Likhain-ng-Kusa",
- "babel-0": "[[$1|Walang]] kaalaman sa [[$2|$3]] (o may malaking kahirapan sa pagunawa dito) ang tagagamit na ito.",
- "babel-1": "May [[$1|payak]] na kaalaman sa [[$2|$3]] ang tagagamit na ito.",
- "babel-2": "May [[$1|panggitnang]] kaalaman sa [[$2|$3]] ang tagagamit na ito.",
- "babel-3": "May [[$1|mahigit]] na kaalaman sa [[$2|$3]] ang tagagamit na ito.",
- "babel-4": "May [[$1|malakatutubong]] kaalaman sa pagsasalita ng [[$2|$3]] ang tagagamit na ito.",
- "babel-5": "May [[$1|dalubhasang]] kaalaman sa [[$2|$3]] ang tagagamit na ito.",
- "babel-N": "May [[$1|katutubong]] pang-unawa sa [[$2|$3]] ang tagagamit na ito.",
- "babel-0-n": "[[$1|Walang]] kaalaman sa [[$2|Tagalog]] (o may kahirapan sa pagunawa dito) ang tagagamit na ito.",
- "babel-1-n": "May [[$1|payak]] na kaalaman sa [[$2|Tagalog]] ang tagagamit na ito.",
- "babel-2-n": "May [[$1|panggitnang]] kaalaman sa [[$2|Tagalog]] ang tagagamit na ito.",
- "babel-3-n": "May [[$1|mahigit]] na kaalaman sa [[$2|Tagalog]] ang tagagamit na ito.",
- "babel-4-n": "May [[$1|malakatutubong]] kaalaman sa pagsasalita ng [[$2|Tagalog]] ang tagagamit na ito.",
- "babel-5-n": "May [[$1|dalubhasang]] kaalaman sa [[$2|Tagalog]] ang tagagamit na ito.",
- "babel-N-n": "May [[$1|katutubong]] pang-unawa sa [[$2|Tagalog]] ang tagagamit na ito.",
+ "babel-0": "[[$1|Walang]] alam ang tagagamit na ito sa [[$2|$3]] (o di kaya'y nahihirapan siyang intindihin ito).",
+ "babel-1": "[[$1|Payak]] ang kaalaman ng tagagamit na ito sa [[$2|$3]].",
+ "babel-2": "[[$1|Medyo]] may alam ang tagagamit na ito sa [[$2|$3]].",
+ "babel-3": "[[$1|Malaki]] ang kaalaman ng tagagamit na ito sa [[$2|$3]].",
+ "babel-4": "[[$1|Mala-katutubo]] na ang kaalaman ng tagagamit na ito sa [[$2|$3]].",
+ "babel-5": "[[$1|Pampropesyonal]] na ang kaalaman ng tagagamit na ito sa [[$2|$3]].",
+ "babel-N": "[[$1|Katutubo]] ng [[$2|$3]] ang tagagamit na ito.",
+ "babel-0-n": "[[$1|Walang]] alam ang tagagamit na ito sa [[$2|Tagalog]] (o di kaya'y nahihirapan siyang intindihin ito).",
+ "babel-1-n": "[[$1|Payak]] ang kaalaman ng tagagamit na ito sa [[$2|Tagalog]].",
+ "babel-2-n": "[[$1|Medyo]] may alam ang tagagamit na ito sa [[$2|Tagalog]].",
+ "babel-3-n": "[[$1|Malaki]] ang kaalaman ng tagagamit na ito sa [[$2|Tagalog]].",
+ "babel-4-n": "[[$1|Mala-katutubo]] na ang kaalaman ng tagagamit na ito sa [[$2|Tagalog]].",
+ "babel-5-n": "[[$1|Pampropesyonal]] na ang kaalaman ng tagagamit na ito sa [[$2|Tagalog]].",
+ "babel-N-n": "[[$1|Katutubo]] ng [[$2|Tagalog]] ang tagagamit na ito.",
"babel-template": "Template:Tagagamit $1",
- "babel-footer": "Mga tagagamit ayon sa wika"
+ "babel-footer": "Mga tagagamit base sa wika"
}
diff --git a/MLEB/Babel/i18n/tly.json b/MLEB/Babel/i18n/tly.json
index 309a2666..4574aa89 100644
--- a/MLEB/Babel/i18n/tly.json
+++ b/MLEB/Babel/i18n/tly.json
@@ -1,21 +1,23 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"JHeydar",
"Patriot Kur",
+ "QeneralĞasım",
"Vugar 1981",
"Гусейн"
]
},
"babel": "Babil iştirokəkə məlumot",
- "babel-desc": "Ziyod kardeydə analiz kardey funksiyə <code>#babel</code>, haşteydə avtomatik ofəye sun de zıvonon barədə məlumoti iyən de mımkunoti co ğəlibon daxıl karde",
+ "babel-desc": "Ziyod kardeydə analiz kardey funksiyə <code>#babel</code>, haşteydə avtomatik ofəye sun de zıvonon barədə məlumoti iyən de mımkunoti co nımunəyon daxıl karde",
"babel-url": "Project:Babil",
"babel-footer-url": ":Category:Babil - iştirokəkon zıvononədə",
"babel-autocreate-reason": "Səhifə avtomatik ofəye [[$1|Babil]] tispirədə.",
- "babel-autocreate-text-levels": "İştirokəkon çe ın tispiriku işorә kardəşone zınəyon səviyyə $1 bo zıvoni $2.",
+ "babel-autocreate-text-levels": "İştirokəkon çe ın tispiriku işorə kardəşone zınəyon səviyyə $1 bo zıvoni $2.",
"babel-autocreate-text-main": "İştirokəkon bı tispirədə zıvoni zınəy işorə kardəşone $1.",
"babel-0": "In iştirokəkə [[$1|zıneydəni]] [[$2|$3]] (yaanki çətin dərəseydə).",
- "babel-1": "In iştirokəkə [[$1|zəif]] zıneydә [[$2|$3]].",
+ "babel-1": "In iştirokəkə [[$1|zəif]] zıneydə [[$2|$3]].",
"babel-2": "In iştirokəkə [[$1|miyonə səviyyədə]] zıneydə [[$2|$3]].",
"babel-3": "In iştirokəkə [[$1|çok]] zıneydə [[$2|$3]].",
"babel-4": "In iştirokəkə bənə [[$1|moə zıvoni]] zıneydə [[$2|$3]].",
@@ -25,7 +27,7 @@
"babel-1-n": "In iştirokəkə [[$1|zəif]] zıneydə [[$2|Tolışi]].",
"babel-2-n": "In iştirokəkə [[$1|miyonə səviyyədə]] zıneydə [[$2|Tolışə zıvoni]].",
"babel-3-n": "In iştirokəkə [[$1|çok]] zıneydə [[$2|Tolışə zıvoni]].",
- "babel-4-n": "In iştirokəkə bənə [[$1|moə zıvoni]] зынејдә [[$2|Tolışə zıvoni]].",
+ "babel-4-n": "In iştirokəkə bənə [[$1|moə zıvoni]] zıneydə [[$2|Tolışə zıvoni]].",
"babel-5-n": "In iştirokəkə [[$1|peşəkor səviyyədə]] zıneydə [[$2|Tolışə zıvoni]].",
"babel-N-n": "Bo ın iştirokəkə [[$2|Tolışə zıvon]] [[$1|moə zıvone]].",
"babel-footer": "İştirokəkon zıvononədə"
diff --git a/MLEB/Babel/i18n/tt.json b/MLEB/Babel/i18n/tt.json
index c42a4c1e..af8dd037 100644
--- a/MLEB/Babel/i18n/tt.json
+++ b/MLEB/Babel/i18n/tt.json
@@ -16,4 +16,4 @@
"babel-4-n": "Бу кулланучы [[$2|татарча]] [[$1|бик әйбәт]] белә.",
"babel-5-n": "Бу кулланучы [[$2|татарча]] [[$1|һөнәри дәрәҗәдә]] белә.",
"babel-N-n": "Бу кулланучы өчен [[$2|татар теле]] [[$1|туган тел]]."
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/udm.json b/MLEB/Babel/i18n/udm.json
index 48f430d6..268fda8d 100644
--- a/MLEB/Babel/i18n/udm.json
+++ b/MLEB/Babel/i18n/udm.json
@@ -3,14 +3,30 @@
"authors": [
"Irus",
"Kaganer",
+ "Kotwys",
"Purodha",
"Wadorgurt"
]
},
+ "babel": "Пыриськисьёс сярысь Вавилон тодэт",
"babel-url": "Project:Вавилон",
"babel-autocreate-reason": "[[$1|Вавилон]] категорилэсь бамзэ автоматической кылдытон.",
"babel-autocreate-text-levels": "Та категорие пырись викиавторъёс дунъязы $1 уровеньлы «$2» кылэз тодон-валанзэс.",
"babel-autocreate-text-main": "Та категорие пырись викиавторъёс пусйизы асьсэлэсь «$1» кылэз тодон-валанзэс.",
"babel-autocreate-user": "Babel AutoCreate",
+ "babel-0": "Та пыриськись [[$2|$3 кылэз]] [[$1|уг тоды]] (яке секытэн вала).",
+ "babel-1": "Та пыриськисьлэн [[$2|$3 кылэз]] [[$1|инъет]] тодонэз.",
+ "babel-2": "Та пыриськись [[$2|$3 кылэз]] [[$1|шоро-куспо]] тодэ.",
+ "babel-3": "Та пыриськись [[$2|$3 кылэз]] [[$1|усто]] тодэ.",
+ "babel-4": "Та пыриськись [[$2|$3 кылэз]] [[$1|анай кылэз кадь]] тодэ.",
+ "babel-5": "Та пыриськись [[$2|$3 кылэз]] [[$1|удысужлыко]] тодэ.",
+ "babel-N": "Та пыриськись [[$2|$3 кылэз]] [[$1|вордӥськемысеныз]] тодэ.",
+ "babel-0-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|уг тоды]] (яке секытэн вала).",
+ "babel-1-n": "Та пыриськисьлэн [[$2|удмурт кылэз]] [[$1|инъет]] тодонэз.",
+ "babel-2-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|шоро-куспо]] тодэ.",
+ "babel-3-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|усто]] тодэ.",
+ "babel-4-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|анай кылэз кадь]] тодэ.",
+ "babel-5-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|удысужлыко]] тодэ.",
+ "babel-N-n": "Та пыриськись [[$2|удмурт кылэз]] [[$1|вордӥськемысеныз]] тодэ.",
"babel-footer": "Викиавторъёс кылъёссыя"
}
diff --git a/MLEB/Babel/i18n/vec.json b/MLEB/Babel/i18n/vec.json
index 751b85cc..62140ab6 100644
--- a/MLEB/Babel/i18n/vec.json
+++ b/MLEB/Babel/i18n/vec.json
@@ -6,26 +6,26 @@
"Gloria sah"
]
},
- "babel": "Babel utente",
- "babel-desc": "Zonta la funsion parser <code>#babel</code> par permétar la generazion automatica de un riquadro \"utente Babel\" con la possibilità de inserir template personalizà",
+ "babel": "Babel utensa",
+ "babel-desc": "Zonta ła funsion parser <code>#babel</code> par permétar la zenerasion automàtega de un recuadro \"utensa Babel\" co ła pusibiłità de zontar modełi personałizai.",
"babel-url": "Project:Babel",
- "babel-footer-url": ":Category:Babel - Utenti par lengua",
- "babel-autocreate-reason": "Creo automaticamente la pàxena de la categoria [[$1|Babel]].",
- "babel-autocreate-text-levels": "I utenti in sta categoria i gà indicà de verghe un livèl de conossensa $1 de la lengua $2.",
- "babel-autocreate-text-main": "I utenti in sta categoria i dixe el so łiveło de conosensa in $1.",
- "babel-0": "Sto utente qua [[$1|no'l parla]] par gnente el [[$2|$3]] (o el lo capisse con gran fadiga).",
- "babel-1": "Sto utente qua el parla [[$1|na s-cianta]] el [[$2|$3]].",
- "babel-2": "Sto utente qua el parla [[$1|'bastansa ben]] el [[$2|$3]].",
- "babel-3": "Sto utente qua el parla el [[$2|$3]] [[$1|ben assè]].",
- "babel-4": "Sto utente qua el parla el [[$2|$3]] squasi [[$1|come la so lengua mare]].",
- "babel-5": "Sto utente qua el parla el [[$2|$3]] a [[$1|livèi da professionista]].",
- "babel-N": "Sto utente qua el parla el [[$2|$3]] [[$1|da co che'l xe nato]].",
- "babel-0-n": "Sto utente qua [[$1|no'l parla]] par gnente la [[$2|lengua veneta]] (o el la capisse con gran fadiga).",
- "babel-1-n": "Sto utente qua el parla [[$1|na s-cianta]] la [[$2|lengua veneta]].",
- "babel-2-n": "Sto utente qua el parla [[$1|'bastansa ben]] la [[$2|lengua veneta]].",
- "babel-3-n": "Sto utente qua el parla la [[$2|lengua veneta]] [[$1|ben assè]].",
- "babel-4-n": "Sto utente qua el parla la [[$2|lengua veneta]] squasi [[$1|come la so lengua mare]].",
- "babel-5-n": "Sto utente qua el parla la [[$2|lengua veneta]] a [[$1|livèi da professionista]].",
- "babel-N-n": "Sto utente qua el parla la [[$2|lengua veneta]] [[$1|da co che'l xe nato]].",
- "babel-footer": "Utenti par lengua"
+ "babel-footer-url": ":Category:Utenti par łengua",
+ "babel-autocreate-reason": "Creo automategamente ła voze de ła categoria [[$1|Babel]].",
+ "babel-autocreate-text-levels": "Łe utense inte sta categoria łe ga dito de ver on liveło de conosimento $1 de ła łéngua $2.",
+ "babel-autocreate-text-main": "Łe utense inte sta categoria łe ìndega el so łiveło de conosimento in $1.",
+ "babel-0": "Sta utensa cuà [[$1|no ła parla]] par gnente el [[$2|$3]] (o ło capise co granda fadiga).",
+ "babel-1": "Sta utensa cuà ła ga on conosimento [[$1|bàzego]] del [[$2|$3]].",
+ "babel-2": "Sta utensa cuà ła parla [[$1|bastansa ben]] el [[$2|$3]].",
+ "babel-3": "Sta utensa cuà ła ga on conosimento [[$1|vansà]] del [[$2|$3]].",
+ "babel-4": "Sta utensa cuà ła ga on conosimento [[$1|cuazi łénguamare]] del [[$2|$3]].",
+ "babel-5": "Sta utensa cuà ła ga on conosimento [[$1|profesionałe]] del [[$2|$3]].",
+ "babel-N": "Sta utensa cuà ła parla el [[$2|$3]] [[$1|da co ła ze nasesta]].",
+ "babel-0-n": "Sta utensa cuà [[$1|no]] ła ga nisun conosimento de ła [[$2|łéngua vèneta]] (o ła capise co granda fadiga).",
+ "babel-1-n": "Sta utensa cuà ła ga on conosimento [[$1|bàzego]] de ła [[$2|łéngua vèneta]].",
+ "babel-2-n": "Sta utensa cuà ła parla [[$1|bastansa ben]] ła [[$2|łéngua vèneta]].",
+ "babel-3-n": "Sta utensa cuà ła parla ła [[$2|łéngua vèneta]] [[$1|ben asè]].",
+ "babel-4-n": "Sta utensa cuà ła ga on conosimento cuazi [[$1|marełéngua]] de ła [[$2|łéngua vèneta]].",
+ "babel-5-n": "Sta utensa cuà ła ga on conosimento [[$1|profesionałe]] de ła [[$2|łéngua vèneta]].",
+ "babel-N-n": "Sta utensa cuà ła parla ła [[$2|łéngua vèneta]] [[$1|da co ła ze nasesta]].",
+ "babel-footer": "Utense par łéngua"
}
diff --git a/MLEB/Babel/i18n/zh-cn.json b/MLEB/Babel/i18n/zh-cn.json
index 51ba73f3..089c531c 100644
--- a/MLEB/Babel/i18n/zh-cn.json
+++ b/MLEB/Babel/i18n/zh-cn.json
@@ -11,4 +11,4 @@
"babel-4-n": "这位用户有[[$1|接近母语讲者]]的[[$2|大陆式中文]]知识。",
"babel-5-n": "这位用户有[[$1|专业]]的[[$2|大陆式中文]]知识。",
"babel-N-n": "这位用户明白以[[$1|母语]]为主的[[$2|大陆式中文]]。"
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/zh-sg.json b/MLEB/Babel/i18n/zh-sg.json
index fdc3a571..f7665048 100644
--- a/MLEB/Babel/i18n/zh-sg.json
+++ b/MLEB/Babel/i18n/zh-sg.json
@@ -11,4 +11,4 @@
"babel-4-n": "这位用户有[[$1|接近母语讲者]]的[[$2|星式中文]]知识。",
"babel-5-n": "这位用户有[[$1|专业]]的[[$2|星式中文]]知识。",
"babel-N-n": "这位用户明白以[[$1|母语]]为主的[[$2|星式中文]]。"
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/zh-tw.json b/MLEB/Babel/i18n/zh-tw.json
index 7b658742..bc20866a 100644
--- a/MLEB/Babel/i18n/zh-tw.json
+++ b/MLEB/Babel/i18n/zh-tw.json
@@ -26,4 +26,4 @@
"babel-4-n": "這位用戶有[[$1|接近母語講者]]的[[$2|台式中文]]知識。",
"babel-5-n": "這位用戶有[[$1|專業]]的[[$2|台式中文]]知識。",
"babel-N-n": "[[$2|台式中文]]是這位用戶的的[[$1|母語]]。"
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/i18n/zh.json b/MLEB/Babel/i18n/zh.json
index 34e73d99..fa424b9e 100644
--- a/MLEB/Babel/i18n/zh.json
+++ b/MLEB/Babel/i18n/zh.json
@@ -5,4 +5,4 @@
]
},
"babel-url": "Project:巴別"
-} \ No newline at end of file
+}
diff --git a/MLEB/Babel/includes/BabelLanguageCodes.php b/MLEB/Babel/includes/BabelLanguageCodes.php
index 8501e0bd..02110aa1 100644
--- a/MLEB/Babel/includes/BabelLanguageCodes.php
+++ b/MLEB/Babel/includes/BabelLanguageCodes.php
@@ -27,7 +27,7 @@ class BabelLanguageCodes {
self::$mapToMediaWikiCodeCache = [];
// Is the code a proper BCP 47 code for one of MediaWiki's nonstandard codes?
// If so, return the internal MediaWiki code.
- if ( method_exists( 'LanguageCode', 'getNonstandardLanguageCodeMapping' ) ) {
+ if ( method_exists( LanguageCode::class, 'getNonstandardLanguageCodeMapping' ) ) {
$mapping = LanguageCode::getNonstandardLanguageCodeMapping();
foreach ( $mapping as $mwCode => $bcp47code ) {
// Careful, because the nonstandardlanguagecodemapping
@@ -39,7 +39,7 @@ class BabelLanguageCodes {
}
// Is the code one of MediaWiki's legacy fake codes? If so, return the modern
// equivalent code (T101086)
- if ( method_exists( 'LanguageCode', 'getDeprecatedCodeMapping' ) ) {
+ if ( method_exists( LanguageCode::class, 'getDeprecatedCodeMapping' ) ) {
$mapping = LanguageCode::getDeprecatedCodeMapping();
foreach ( $mapping as $deprecatedCode => $mwCode ) {
self::$mapToMediaWikiCodeCache[ strtolower( $deprecatedCode ) ] =
diff --git a/MLEB/Babel/includes/BabelStatic.php b/MLEB/Babel/includes/BabelStatic.php
index 9e5aa351..20b3226e 100644
--- a/MLEB/Babel/includes/BabelStatic.php
+++ b/MLEB/Babel/includes/BabelStatic.php
@@ -26,25 +26,36 @@ class BabelStatic {
* @param DatabaseUpdater $updater
*/
public static function onLoadExtensionSchemaUpdates( DatabaseUpdater $updater ) {
- $dir = dirname( __DIR__ ) . '/';
- $updater->addExtensionTable( 'babel', $dir . 'babel.sql' );
+ $dir = dirname( __DIR__ ) . '/sql/';
+ $dbType = $updater->getDB()->getType();
- if ( $updater->getDB()->getType() === 'mysql' ) {
+ if ( $dbType === 'mysql' ) {
+ $updater->addExtensionTable( 'babel',
+ $dir . 'tables-generated.sql'
+ );
$updater->modifyExtensionField(
'babel',
'babel_lang',
- $dir . 'sql/babel-babel_lang-length-type.sql'
+ $dir . 'babel-babel_lang-length-type.sql'
);
$updater->modifyExtensionField(
'babel',
'babel_level',
- $dir . 'sql/babel-babel_level-type.sql'
+ $dir . 'babel-babel_level-type.sql'
+ );
+ } elseif ( $dbType === 'sqlite' ) {
+ $updater->addExtensionTable( 'babel',
+ $dir . 'sqlite/tables-generated.sql'
);
- } elseif ( $updater->getDB()->getType() === 'sqlite' ) {
+
$updater->modifyExtensionField(
'babel',
'babel_lang',
- $dir . 'sql/babel-babel_lang-length.sqlite.sql'
+ $dir . 'sqlite/babel-babel_lang-length.sql'
+ );
+ } elseif ( $dbType === 'postgres' ) {
+ $updater->addExtensionTable( 'babel',
+ $dir . 'postgres/tables-generated.sql'
);
}
}
diff --git a/MLEB/Babel/package-lock.json b/MLEB/Babel/package-lock.json
index ba35f248..c3f0b8c7 100644
--- a/MLEB/Babel/package-lock.json
+++ b/MLEB/Babel/package-lock.json
@@ -12,45 +12,45 @@
}
},
"@babel/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
- "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helpers": "^7.9.0",
- "@babel/parser": "^7.9.0",
- "@babel/template": "^7.8.6",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.7.tgz",
+ "integrity": "sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.7",
+ "@babel/types": "^7.12.7",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
"json5": "^2.1.2",
- "lodash": "^4.17.13",
+ "lodash": "^4.17.19",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -58,125 +58,125 @@
}
},
"@babel/generator": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
- "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
"dev": true,
"requires": {
- "@babel/types": "^7.9.5",
+ "@babel/types": "^7.12.5",
"jsesc": "^2.5.1",
- "lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-function-name": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
- "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.9.5"
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
- "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.9.0",
- "lodash": "^4.17.13"
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz",
+ "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.11.0"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
- "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
"dev": true
},
"@babel/helpers": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
- "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0"
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/highlight": {
@@ -191,47 +191,38 @@
}
},
"@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==",
"dev": true
},
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
"@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -239,38 +230,38 @@
}
},
"@babel/traverse": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
- "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.7.tgz",
+ "integrity": "sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.5",
- "@babel/helper-function-name": "^7.9.5",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.5",
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.13"
+ "lodash": "^4.17.19"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -284,16 +275,53 @@
}
},
"@babel/types": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
- "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.5",
- "lodash": "^4.17.13",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz",
+ "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
"@nodelib/fs.scandir": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
@@ -321,22 +349,22 @@
}
},
"@stylelint/postcss-css-in-js": {
- "version": "0.37.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz",
- "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==",
+ "version": "0.37.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+ "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
"dev": true,
"requires": {
"@babel/core": ">=7.9.0"
}
},
"@stylelint/postcss-markdown": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
- "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
"dev": true,
"requires": {
- "remark": "^12.0.0",
- "unist-util-find-all-after": "^3.0.1"
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
}
},
"@types/color-name": {
@@ -345,10 +373,25 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
"@types/minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
"dev": true
},
"@types/normalize-package-data": {
@@ -369,6 +412,16 @@
"integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
"dev": true
},
+ "JSONStream": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz",
+ "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": ">=2.2.7 <3"
+ }
+ },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -376,24 +429,24 @@
"dev": true
},
"acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
@@ -447,6 +500,12 @@
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
+ "array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true
+ },
"array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
@@ -483,10 +542,16 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "ast-metadata-inferer": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
+ "integrity": "sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg==",
+ "dev": true
+ },
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -502,18 +567,18 @@
"dev": true
},
"autoprefixer": {
- "version": "9.7.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz",
- "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==",
+ "version": "9.8.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+ "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
"dev": true,
"requires": {
- "browserslist": "^4.11.1",
- "caniuse-lite": "^1.0.30001039",
- "chalk": "^2.4.2",
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "colorette": "^1.2.1",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
- "postcss": "^7.0.27",
- "postcss-value-parser": "^4.0.3"
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
}
},
"bail": {
@@ -603,15 +668,16 @@
}
},
"browserslist": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
- "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
+ "version": "4.14.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz",
+ "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001043",
- "electron-to-chromium": "^1.3.413",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
+ "caniuse-lite": "^1.0.30001157",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.591",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.66"
}
},
"cache-base": {
@@ -637,16 +703,27 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
- "caniuse-lite": {
- "version": "1.0.30001045",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001045.tgz",
- "integrity": "sha512-Y8o2Iz1KPcD6FjySbk1sPpvJqchgxk/iow0DABpGyzA1UeQAuxh63Xh0Enj5/BrsYbXtCN32JmR4ZxQTCQ6E6A==",
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001159",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz",
+ "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==",
"dev": true
},
"chalk": {
@@ -666,12 +743,6 @@
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -707,6 +778,28 @@
}
}
},
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"clone-regexp": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
@@ -716,12 +809,6 @@
"is-regexp": "^2.0.0"
}
},
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -747,6 +834,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -754,9 +847,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz",
+ "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==",
"dev": true
},
"component-emitter": {
@@ -786,37 +879,29 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
+ "core-js": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
+ "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
"cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
+ "import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "dependencies": {
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
+ "yaml": "^1.10.0"
}
},
"cross-spawn": {
@@ -841,6 +926,90 @@
}
}
},
+ "css-rule-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
+ "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=",
+ "dev": true,
+ "requires": {
+ "css-tokenize": "^1.0.1",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "css-tokenize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
+ "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^1.0.33"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -876,6 +1045,14 @@
"requires": {
"decamelize": "^1.1.0",
"map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
}
},
"decode-uri-component": {
@@ -944,14 +1121,6 @@
"dev": true,
"requires": {
"path-type": "^4.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
}
},
"doctrine": {
@@ -963,6 +1132,53 @@
"esutils": "^2.0.2"
}
},
+ "doiuse": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.0.tgz",
+ "integrity": "sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.14.7",
+ "caniuse-lite": "^1.0.30001157",
+ "css-rule-stream": "^1.1.0",
+ "duplexer2": "0.0.2",
+ "jsonfilter": "^1.1.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.1.6",
+ "source-map": "^0.7.3",
+ "through2": "^4.0.2",
+ "yargs": "^16.1.0"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -974,15 +1190,15 @@
},
"dependencies": {
"domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+ "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==",
"dev": true
},
"entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true
}
}
@@ -1012,10 +1228,51 @@
"domelementtype": "1"
}
},
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"electron-to-chromium": {
- "version": "1.3.414",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz",
- "integrity": "sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ==",
+ "version": "1.3.603",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz",
+ "integrity": "sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ==",
"dev": true
},
"emoji-regex": {
@@ -1048,6 +1305,12 @@
"is-arrayish": "^0.2.1"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1055,28 +1318,29 @@
"dev": true
},
"eslint": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
- "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
- "eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
- "esquery": "^1.2.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -1084,7 +1348,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.14",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -1093,19 +1357,48 @@
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
+ "table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"chalk": {
@@ -1116,6 +1409,26 @@
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"color-convert": {
@@ -1133,61 +1446,247 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
"semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.20.0.tgz",
+ "integrity": "sha512-F2dm+S6aCDDb99Fr6KD9L7u1gOK819deG6xAG4EIVaLsHdQhjbcpNUuzUkUmGmpEHIYHqSpwkZ1EvBMc9Pxn+w==",
+ "dev": true,
+ "requires": {
+ "eslint": "^7.23.0",
+ "eslint-plugin-compat": "^3.9.0",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^32.3.0",
+ "eslint-plugin-json-es": "^1.5.3",
+ "eslint-plugin-mediawiki": "^0.2.7",
+ "eslint-plugin-mocha": "^8.1.0",
+ "eslint-plugin-no-jquery": "^2.6.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^6.0.0",
+ "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-wdio": "^7.0.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
}
}
}
},
- "eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
- "dev": true,
- "requires": {
- "eslint": "^7.2.0",
- "eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
- "eslint-plugin-vue": "^6.2.2",
- "eslint-plugin-wdio": "^6.0.12"
+ "eslint-plugin-compat": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz",
+ "integrity": "sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^2.0.7",
+ "ast-metadata-inferer": "^0.4.0",
+ "browserslist": "^4.12.2",
+ "caniuse-lite": "^1.0.30001166",
+ "core-js": "^3.6.5",
+ "find-up": "^4.1.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.2"
+ },
+ "dependencies": {
+ "caniuse-lite": {
+ "version": "1.0.30001208",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz",
+ "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
}
},
"eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
@@ -1195,72 +1694,88 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
+ "version": "32.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz",
+ "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==",
"dev": true,
"requires": {
- "comment-parser": "^0.7.5",
- "debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
+ "comment-parser": "1.1.2",
+ "debug": "^4.3.1",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
"regextras": "^0.7.1",
- "semver": "^6.3.0",
+ "semver": "^7.3.4",
"spdx-expression-parse": "^3.0.1"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
+ "lru-cache": "^6.0.0"
}
}
}
},
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "eslint-plugin-json-es": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+ "integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ }
}
},
"eslint-plugin-mediawiki": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.5.tgz",
- "integrity": "sha512-Xs5G4f1EnS6+9gFWkk28nWA9xcOEPx7YZEGsMYGLelZRAF+2DmV/PigF5N5VqoOkNBpwcbXqLD8wLfkg29aF8w==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+ "integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^6.2.2",
+ "eslint-plugin-vue": "^7.7.0",
"upath": "^1.2.0"
}
},
"eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+ "integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
}
},
"eslint-plugin-no-jquery": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.5.0.tgz",
- "integrity": "sha512-RrQ380mUJJKdjgpQ/tZAJ3B3W1n3LbVmULooS2Pv5pUDcc5uVHVSJMTdUlsbvQyfo6hWP2LJ4FbOoDzENWcF7A==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.6.0.tgz",
+ "integrity": "sha512-xC7pbNHJMdyxqhzcNMRrmC5/tbt1T4KCKXjOqUpKm/CaRryGKS5iWztzWPrL0KwyI3R3ub6goHFmIQS19f+mZA==",
"dev": true
},
"eslint-plugin-node": {
@@ -1277,6 +1792,16 @@
"semver": "^6.1.0"
},
"dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
@@ -1292,35 +1817,51 @@
}
},
"eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
- "dev": true
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-6.0.0.tgz",
+ "integrity": "sha512-+R8z2umSTIiWcxmTQ9nGoML8DL0VQJg4C+E9OpJ2KF9QL4WL/FoayROeTG5Z9zhlZ2qqa+9WkZ1YD6mx89io8w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "requireindex": "^1.2.0"
+ }
},
"eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"requires": {
+ "eslint-utils": "^2.1.0",
"natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
+ "semver": "^7.3.2",
+ "vue-eslint-parser": "^7.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"eslint-plugin-wdio": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-6.0.12.tgz",
- "integrity": "sha512-qZqcU1Z0bqrqhYM1MbwIvKQxcQEGIOEclOjcveavvLZAN4ezpXb1Ogw3xu+UK13iArregJOMI6uUt+JkFmER1A==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.4.2.tgz",
+ "integrity": "sha512-tkISFycJmRFMKsEjetRcAmWSHKJKnw5rKHDxfE7Ob3tF5lbmYlCLfNKH0UwanOpSdulpe52s3K+CBHSd6qUUNQ==",
"dev": true
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -1340,14 +1881,22 @@
"dev": true
},
"espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^7.2.0",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -1357,29 +1906,37 @@
"dev": true
},
"esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -1567,15 +2124,15 @@
}
},
"fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@@ -1598,22 +2155,28 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz",
+ "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
}
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -1625,6 +2188,16 @@
"to-regex-range": "^5.0.1"
}
},
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -1669,20 +2242,19 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"for-in": {
@@ -1715,6 +2287,12 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
@@ -1722,9 +2300,21 @@
"dev": true
},
"gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true
},
"get-value": {
@@ -1783,18 +2373,26 @@
}
},
"globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+ "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"globby": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
- "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@@ -1806,9 +2404,9 @@
},
"dependencies": {
"ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
}
}
@@ -1829,9 +2427,9 @@
}
},
"grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1841,8 +2439,8 @@
"glob": "~7.1.6",
"grunt-cli": "~1.3.2",
"grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
"iconv-lite": "~0.4.13",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
@@ -1934,12 +2532,11 @@
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@@ -1975,9 +2572,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -1992,65 +2589,124 @@
"dev": true
},
"grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
"dev": true,
"requires": {
"colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
+ "grunt-legacy-log-utils": "~2.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.5"
+ "lodash": "~4.17.19"
}
},
"grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
"dev": true,
"requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
"dev": true,
"requires": {
"async": "~1.5.2",
"exit": "~0.1.1",
"getobject": "~0.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
"which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
}
},
"grunt-stylelint": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.15.0.tgz",
- "integrity": "sha512-1G5kbT3Y6OtAqgIv/XErtI6ai1t1UdtQWXxUV5Gd900PQoEzu/WrBYhGNAXdb/9nAsNWNjFHQjtdXQtZcDmobA==",
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.16.0.tgz",
+ "integrity": "sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==",
"dev": true,
"requires": {
- "chalk": "^3.0.0"
+ "chalk": "^4.1.0"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -2079,9 +2735,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -2095,6 +2751,15 @@
"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true
},
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -2175,10 +2840,13 @@
"dev": true
},
"hosted-git-info": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
- "dev": true
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+ "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"html-tags": {
"version": "3.1.0",
@@ -2237,6 +2905,12 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
"indexes-of": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
@@ -2260,9 +2934,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"interpret": {
@@ -2313,12 +2987,6 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -2336,11 +3004,20 @@
"dev": true
},
"is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
},
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -2476,24 +3153,12 @@
"unc-path-regex": "^0.1.2"
}
},
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -2519,9 +3184,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -2529,9 +3194,9 @@
}
},
"jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true
},
"jsesc": {
@@ -2540,10 +3205,10 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"json-schema-traverse": {
@@ -2567,10 +3232,58 @@
"minimist": "^1.2.5"
}
},
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+ "jsonfilter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz",
+ "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^0.8.4",
+ "minimist": "^1.1.0",
+ "stream-combiner": "^0.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "jsonparse": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
+ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
"dev": true
},
"kind-of": {
@@ -2580,16 +3293,56 @@
"dev": true
},
"known-css-properties": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz",
- "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==",
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
+ "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
"dev": true
},
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
+ "ldjson-stream": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
+ "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=",
+ "dev": true,
+ "requires": {
+ "split2": "^0.2.1",
+ "through2": "^0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
},
"levn": {
"version": "0.4.1",
@@ -2756,21 +3509,12 @@
"dev": true
},
"locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "dependencies": {
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
+ "p-locate": "^4.1.0"
}
},
"lodash": {
@@ -2779,13 +3523,70 @@
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
"dev": true
},
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
"log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"dev": true,
"requires": {
- "chalk": "^2.4.2"
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"longest-streak": {
@@ -2794,6 +3595,15 @@
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -2810,9 +3620,9 @@
"dev": true
},
"map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
"dev": true
},
"map-visit": {
@@ -2824,42 +3634,87 @@
"object-visit": "^1.0.0"
}
},
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
"mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true
},
- "mdast-util-compact": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
- "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz",
+ "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==",
"dev": true,
"requires": {
- "unist-util-visit": "^2.0.0"
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "micromark": "~2.10.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz",
+ "integrity": "sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true
+ },
+ "meow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
+ "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ }
}
},
"merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
+ "micromark": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz",
+ "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
@@ -2871,9 +3726,9 @@
}
},
"min-indent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
- "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true
},
"minimatch": {
@@ -2892,13 +3747,14 @@
"dev": true
},
"minimist-options": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
- "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
"dev": true,
"requires": {
"arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
},
"dependencies": {
"is-plain-obj": {
@@ -2930,21 +3786,39 @@
}
}
},
- "mkdirp": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
- "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.18.tgz",
+ "integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
+ "dev": true
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -2971,9 +3845,9 @@
"dev": true
},
"node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
+ "version": "1.1.67",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
+ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
"nopt": {
@@ -2986,15 +3860,33 @@
}
},
"normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+ "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
"dev": true,
"requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
+ "hosted-git-info": "^3.0.6",
+ "resolve": "^1.17.0",
+ "semver": "^7.3.2",
"validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.1.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
}
},
"normalize-range": {
@@ -3138,27 +4030,27 @@
}
},
"p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "^2.2.0"
}
},
"p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parent-module": {
@@ -3195,6 +4087,18 @@
"path-root": "^0.1.1"
}
},
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
@@ -3207,6 +4111,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -3240,32 +4150,18 @@
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
"dev": true
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- }
- }
- },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -3273,9 +4169,9 @@
"dev": true
},
"postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
@@ -3324,29 +4220,6 @@
"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
"dev": true
},
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- },
- "dependencies": {
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- }
- }
- },
"postcss-resolve-nested-selector": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -3373,23 +4246,24 @@
}
},
"postcss-scss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
- "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
"dev": true,
"requires": {
- "postcss": "^7.0.0"
+ "postcss": "^7.0.6"
}
},
"postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
}
},
"postcss-syntax": {
@@ -3399,9 +4273,9 @@
"dev": true
},
"postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
"prelude-ls": {
@@ -3429,11 +4303,60 @@
"dev": true
},
"ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
"dev": true
},
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -3454,11 +4377,15 @@
"resolve": "^1.1.6"
}
},
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
- "dev": true
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
},
"regex-not": {
"version": "1.0.2",
@@ -3483,60 +4410,32 @@
"dev": true
},
"remark": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.0.tgz",
- "integrity": "sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^8.0.0",
- "remark-stringify": "^8.0.0",
- "unified": "^9.0.0"
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
}
},
"remark-parse": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.1.tgz",
- "integrity": "sha512-Ye/5W57tdQZWsfkuVyRq9SUWRgECHnDsMuyUMzdSKpTbNPkZeGtoYfsrkeSi4+Xyl0mhcPPddHITXPcCPHrl3w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^2.0.0",
- "vfile-location": "^3.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-from-markdown": "^0.8.0"
}
},
"remark-stringify": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.0.0.tgz",
- "integrity": "sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz",
+ "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^2.0.0",
- "mdast-util-compact": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^3.0.0",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "mdast-util-to-markdown": "^0.5.0"
}
},
"repeat-element": {
@@ -3557,6 +4456,24 @@
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
@@ -3627,18 +4544,18 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
},
"safe-buffer": {
@@ -3707,9 +4624,9 @@
"dev": true
},
"signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"slash": {
@@ -3719,20 +4636,38 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
@@ -3891,9 +4826,9 @@
"dev": true
},
"spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -3907,9 +4842,9 @@
"dev": true
},
"spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -3937,18 +4872,57 @@
"extend-shallow": "^3.0.0"
}
},
+ "split2": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
+ "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=",
+ "dev": true,
+ "requires": {
+ "through2": "~0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -3970,6 +4944,16 @@
}
}
},
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -4002,41 +4986,29 @@
},
"dependencies": {
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
}
}
},
- "stringify-entities": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.0.tgz",
- "integrity": "sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw==",
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.2",
- "is-hexadecimal": "^1.0.0"
+ "ansi-regex": "^5.0.0"
}
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- }
+ "min-indent": "^1.0.0"
}
},
"strip-json-comments": {
@@ -4052,48 +5024,48 @@
"dev": true
},
"stylelint": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.3.2.tgz",
- "integrity": "sha512-kpO3/Gz2ZY40EWUwFYYkgpzhf8ZDUyKpcui5+pS0XKJBj/EMYmZpOJoL8IFAz2yApYeg91NVy5yAjE39hDzWvQ==",
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
+ "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
"dev": true,
"requires": {
- "@stylelint/postcss-css-in-js": "^0.37.1",
- "@stylelint/postcss-markdown": "^0.36.1",
- "autoprefixer": "^9.7.6",
+ "@stylelint/postcss-css-in-js": "^0.37.2",
+ "@stylelint/postcss-markdown": "^0.36.2",
+ "autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
- "chalk": "^4.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
+ "chalk": "^4.1.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.2.0",
"execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
+ "fast-glob": "^3.2.4",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.0",
+ "get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
- "globby": "^11.0.0",
+ "globby": "^11.0.1",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
- "ignore": "^5.1.4",
+ "ignore": "^5.1.8",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.18.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
+ "known-css-properties": "^0.20.0",
+ "lodash": "^4.17.20",
+ "log-symbols": "^4.0.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^6.1.0",
+ "meow": "^8.0.0",
"micromatch": "^4.0.2",
"normalize-selector": "^0.2.0",
- "postcss": "^7.0.27",
+ "postcss": "^7.0.35",
"postcss-html": "^0.36.0",
"postcss-less": "^3.1.4",
"postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^6.0.2",
+ "postcss-scss": "^2.1.1",
+ "postcss-selector-parser": "^6.0.4",
"postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.3",
+ "postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
"slash": "^3.0.0",
"specificity": "^0.4.1",
@@ -4102,42 +5074,42 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
+ "table": "^6.0.3",
+ "v8-compile-cache": "^2.2.0",
"write-file-atomic": "^3.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
}
},
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
+ "color-convert": "^2.0.1"
}
},
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
"chalk": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
- "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -4159,163 +5131,90 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "p-locate": "^4.1.0"
+ "ms": "2.1.2"
}
},
- "map-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
- "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
- "meow": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
- "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
+ "file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"dev": true,
"requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.1.1",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.0.0",
- "minimist-options": "^4.0.1",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.0",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.8.1",
- "yargs-parser": "^18.1.1"
+ "flat-cache": "^3.0.4"
}
},
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "p-try": "^2.0.0"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
+ "flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+ "dev": true
},
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
},
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
},
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
+ "glob": "^7.1.3"
}
},
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
}
},
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -4325,39 +5224,74 @@
"ansi-regex": "^5.0.0"
}
},
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "min-indent": "^1.0.0"
+ "has-flag": "^4.0.0"
}
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "table": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
}
},
- "trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+ "v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"dev": true
}
}
},
"stylelint-config-wikimedia": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.1.tgz",
- "integrity": "sha512-R/E7xVKwDyneKmVwkNi+TqJlXZjnL5IH+bQPmfHrgwwyAekNx5GdYZ+tVjx7VBXdv/pjOr0HevVpXSQe86ZfVQ==",
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.3.tgz",
+ "integrity": "sha512-+n082jsEfX4v+ra5F6RfsEnjG6VymnHc613yJeyQAJtigL/+B5XDduVmtXk5vPZ01s0eXTOzVuK0aJ98ofmkoA==",
"dev": true,
"requires": {
- "stylelint": "13.3.2"
+ "stylelint": "13.8.0",
+ "stylelint-no-unsupported-browser-features": "4.1.4"
+ }
+ },
+ "stylelint-no-unsupported-browser-features": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz",
+ "integrity": "sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA==",
+ "dev": true,
+ "requires": {
+ "doiuse": "^4.3.1",
+ "lodash": "^4.17.15",
+ "postcss": "^8.1.4"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
"sugarss": {
@@ -4385,39 +5319,40 @@
"dev": true
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+ "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^7.0.2",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
},
"dependencies": {
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "ajv": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
+ "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
}
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
}
}
},
@@ -4427,6 +5362,21 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -4480,16 +5430,10 @@
"is-number": "^7.0.0"
}
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
+ "trim-newlines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+ "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
"dev": true
},
"trough": {
@@ -4538,20 +5482,10 @@
"util-deprecate": "^1.0.2"
}
},
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
"unified": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz",
- "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
"dev": true,
"requires": {
"bail": "^1.0.0",
@@ -4581,29 +5515,20 @@
"dev": true
},
"unist-util-find-all-after": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
- "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+ "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
"dev": true,
"requires": {
"unist-util-is": "^4.0.0"
}
},
"unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz",
+ "integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
- "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
"unist-util-stringify-position": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -4613,27 +5538,6 @@
"@types/unist": "^2.0.2"
}
},
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- },
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -4708,9 +5612,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -4733,9 +5637,9 @@
}
},
"vfile": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz",
- "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
+ "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
@@ -4746,9 +5650,9 @@
}
},
"vfile-location": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
- "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
"dev": true
},
"vfile-message": {
@@ -4761,54 +5665,17 @@
"unist-util-stringify-position": "^2.0.0"
}
},
- "vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.2",
- "vscode-uri": "^2.1.2"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
"vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+ "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"eslint-scope": "^5.0.0",
"eslint-visitor-keys": "^1.1.0",
"espree": "^6.2.1",
- "esquery": "^1.0.1",
+ "esquery": "^1.4.0",
"lodash": "^4.17.15"
},
"dependencies": {
@@ -4840,21 +5707,58 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
@@ -4873,32 +5777,50 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"yaml": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz",
- "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz",
+ "integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==",
"dev": true,
"requires": {
- "@babel/runtime": "^7.9.2"
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- }
- }
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/MLEB/Babel/package.json b/MLEB/Babel/package.json
index 75b51d24..44d81a81 100644
--- a/MLEB/Babel/package.json
+++ b/MLEB/Babel/package.json
@@ -4,11 +4,11 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.20.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
"grunt-eslint": "23.0.0",
- "grunt-stylelint": "0.15.0",
- "stylelint-config-wikimedia": "0.10.1"
+ "grunt-stylelint": "0.16.0",
+ "stylelint-config-wikimedia": "0.10.3"
}
}
diff --git a/MLEB/Babel/sql/postgres/tables-generated.sql b/MLEB/Babel/sql/postgres/tables-generated.sql
new file mode 100644
index 00000000..5b7aa6fb
--- /dev/null
+++ b/MLEB/Babel/sql/postgres/tables-generated.sql
@@ -0,0 +1,12 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: ./tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE babel (
+ babel_user INT NOT NULL,
+ babel_lang TEXT NOT NULL,
+ babel_level TEXT NOT NULL,
+ PRIMARY KEY(babel_user, babel_lang)
+);
+
+CREATE INDEX babel_lang_level ON babel (babel_lang, babel_level);
diff --git a/MLEB/Babel/sql/babel-babel_lang-length.sqlite.sql b/MLEB/Babel/sql/sqlite/babel-babel_lang-length.sql
index b10377d6..b10377d6 100644
--- a/MLEB/Babel/sql/babel-babel_lang-length.sqlite.sql
+++ b/MLEB/Babel/sql/sqlite/babel-babel_lang-length.sql
diff --git a/MLEB/Babel/sql/sqlite/tables-generated.sql b/MLEB/Babel/sql/sqlite/tables-generated.sql
new file mode 100644
index 00000000..893eb07f
--- /dev/null
+++ b/MLEB/Babel/sql/sqlite/tables-generated.sql
@@ -0,0 +1,12 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: ./tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE /*_*/babel (
+ babel_user INTEGER UNSIGNED NOT NULL,
+ babel_lang BLOB NOT NULL,
+ babel_level BLOB NOT NULL,
+ PRIMARY KEY(babel_user, babel_lang)
+);
+
+CREATE INDEX babel_lang_level ON /*_*/babel (babel_lang, babel_level);
diff --git a/MLEB/Babel/sql/tables-generated.sql b/MLEB/Babel/sql/tables-generated.sql
new file mode 100644
index 00000000..7af046ca
--- /dev/null
+++ b/MLEB/Babel/sql/tables-generated.sql
@@ -0,0 +1,11 @@
+-- This file is automatically generated using maintenance/generateSchemaSql.php.
+-- Source: ./tables.json
+-- Do not modify this file directly.
+-- See https://www.mediawiki.org/wiki/Manual:Schema_changes
+CREATE TABLE /*_*/babel (
+ babel_user INT UNSIGNED NOT NULL,
+ babel_lang VARBINARY(35) NOT NULL,
+ babel_level VARBINARY(2) NOT NULL,
+ INDEX babel_lang_level (babel_lang, babel_level),
+ PRIMARY KEY(babel_user, babel_lang)
+) /*$wgDBTableOptions*/;
diff --git a/MLEB/Babel/sql/tables.json b/MLEB/Babel/sql/tables.json
new file mode 100644
index 00000000..255d4dc4
--- /dev/null
+++ b/MLEB/Babel/sql/tables.json
@@ -0,0 +1,34 @@
+[
+ {
+ "name": "babel",
+ "columns": [
+ {
+ "name": "babel_user",
+ "comment": "user id",
+ "type": "integer",
+ "options": { "notnull": true, "unsigned": true }
+ },
+ {
+ "name": "babel_lang",
+ "comment": "language code",
+ "type": "binary",
+ "options": { "notnull": true, "length": 35 }
+ },
+ {
+ "name": "babel_level",
+ "comment": "level (1-5, N)",
+ "type": "binary",
+ "options": { "notnull": true, "length": 2 }
+ }
+ ],
+ "indexes": [
+ {
+ "name": "babel_lang_level",
+ "comment": "Query all users who know a language at a specific level",
+ "columns": [ "babel_lang", "babel_level" ],
+ "unique": false
+ }
+ ],
+ "pk": [ "babel_user", "babel_lang" ]
+ }
+]
diff --git a/MLEB/Babel/tests/phpunit/BabelStaticTest.php b/MLEB/Babel/tests/phpunit/unit/BabelStaticTest.php
index 2603b72b..722fa31b 100644
--- a/MLEB/Babel/tests/phpunit/BabelStaticTest.php
+++ b/MLEB/Babel/tests/phpunit/unit/BabelStaticTest.php
@@ -1,8 +1,10 @@
<?php
-namespace Babel\Tests;
+namespace Babel\Tests\Unit;
+use Babel;
use BabelStatic;
+use Parser;
/**
* @covers BabelStatic
@@ -12,15 +14,15 @@ use BabelStatic;
* @license GPL-2.0-or-later
* @author Thiemo Kreuz
*/
-class BabelStaticTest extends \PHPUnit\Framework\TestCase {
+class BabelStaticTest extends \MediaWikiUnitTestCase {
public function testOnParserFirstCallInit() {
- $parser = $this->getMockBuilder( 'Parser' )
+ $parser = $this->getMockBuilder( Parser::class )
->disableOriginalConstructor()
->getMock();
$parser->expects( $this->once() )
->method( 'setFunctionHook' )
- ->with( 'babel', [ 'Babel', 'Render' ] )
+ ->with( 'babel', [ Babel::class, 'Render' ] )
->will( $this->returnValue( true ) );
BabelStatic::onParserFirstCallInit( $parser );
diff --git a/MLEB/CleanChanges/.eslintrc.json b/MLEB/CleanChanges/.eslintrc.json
index 007c6cb5..8b9c82cf 100644
--- a/MLEB/CleanChanges/.eslintrc.json
+++ b/MLEB/CleanChanges/.eslintrc.json
@@ -1,13 +1,10 @@
{
"root": true,
"extends": [
- "wikimedia/client",
- "wikimedia/jquery"
+ "wikimedia/client-es5",
+ "wikimedia/jquery",
+ "wikimedia/mediawiki"
],
- "globals": {
- "mw": false,
- "OO": false
- },
"rules": {
"no-jquery/no-global-selector": "warn",
"no-jquery/no-sizzle": "warn"
diff --git a/MLEB/CleanChanges/.phpcs.xml b/MLEB/CleanChanges/.phpcs.xml
index 9407e2ba..2644df60 100644
--- a/MLEB/CleanChanges/.phpcs.xml
+++ b/MLEB/CleanChanges/.phpcs.xml
@@ -5,6 +5,6 @@
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
</rule>
<file>.</file>
- <arg name="extensions" value="php,php5,inc" />
+ <arg name="extensions" value="php" />
<arg name="encoding" value="UTF-8" />
</ruleset>
diff --git a/MLEB/CleanChanges/Gruntfile.js b/MLEB/CleanChanges/Gruntfile.js
index b899c3b8..e343048a 100644
--- a/MLEB/CleanChanges/Gruntfile.js
+++ b/MLEB/CleanChanges/Gruntfile.js
@@ -5,7 +5,6 @@ module.exports = function ( grunt ) {
grunt.loadNpmTasks( 'grunt-banana-checker' );
grunt.loadNpmTasks( 'grunt-eslint' );
- grunt.loadNpmTasks( 'grunt-jsonlint' );
grunt.loadNpmTasks( 'grunt-stylelint' );
grunt.initConfig( {
@@ -14,7 +13,7 @@ module.exports = function ( grunt ) {
cache: true
},
all: [
- '**/*.js',
+ '**/*.{js,json}',
'!node_modules/**',
'!vendor/**'
]
@@ -26,16 +25,9 @@ module.exports = function ( grunt ) {
'!vendor/**'
]
},
- banana: conf.MessagesDirs,
- jsonlint: {
- all: [
- '**/*.json',
- '!node_modules/**',
- '!vendor/**'
- ]
- }
+ banana: conf.MessagesDirs
} );
- grunt.registerTask( 'test', [ 'eslint', 'stylelint', 'jsonlint', 'banana' ] );
+ grunt.registerTask( 'test', [ 'eslint', 'stylelint', 'banana' ] );
grunt.registerTask( 'default', 'test' );
};
diff --git a/MLEB/CleanChanges/RELEASE-NOTES b/MLEB/CleanChanges/RELEASE-NOTES
index b989e7fc..a54f3485 100644
--- a/MLEB/CleanChanges/RELEASE-NOTES
+++ b/MLEB/CleanChanges/RELEASE-NOTES
@@ -1,5 +1,5 @@
-== CleanChanges 2020.07 ==
-Released at 2020-07-24.
+== CleanChanges 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* Localisation and maintenance updates.
+* No updates.
diff --git a/MLEB/CleanChanges/composer.json b/MLEB/CleanChanges/composer.json
index 9474ba4a..8bd77e9b 100644
--- a/MLEB/CleanChanges/composer.json
+++ b/MLEB/CleanChanges/composer.json
@@ -9,9 +9,9 @@
"composer/installers": ">=1.0.1"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
"php-parallel-lint/php-parallel-lint": "1.2.0"
},
@@ -24,6 +24,7 @@
"parallel-lint . --exclude vendor --exclude node_modules",
"phpcs -p -s",
"minus-x check ."
- ]
+ ],
+ "phan": "phan -d . --long-progress-bar"
}
}
diff --git a/MLEB/CleanChanges/extension.json b/MLEB/CleanChanges/extension.json
index efc973c0..07214523 100644
--- a/MLEB/CleanChanges/extension.json
+++ b/MLEB/CleanChanges/extension.json
@@ -1,23 +1,20 @@
{
"name": "Clean Changes",
- "version": "2020-07-20 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "2021-06-01 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"author": "Niklas Laxström",
"url": "https://www.mediawiki.org/wiki/Extension:CleanChanges",
"descriptionmsg": "cleanchanges-desc",
"license-name": "GPL-2.0-or-later",
"type": "other",
"AutoloadClasses": {
- "NCL": "includes/NCL.php",
"CCFilters": "includes/CCFilters.php"
},
"config": {
"CCTrailerFilter": false,
- "CCUserFilter": true,
- "CCFiltersOnly": true
+ "CCUserFilter": true
},
"Hooks": {
- "FetchChangesList": "NCL::hook",
- "MakeGlobalVariablesScript": "NCL::addScriptVariables",
+ "FetchChangesList": "CCFilters::hook",
"ChangesListSpecialPageQuery": [
"CCFilters::user",
"CCFilters::trailer"
@@ -33,9 +30,6 @@
]
},
"ResourceModules": {
- "ext.cleanchanges": {
- "scripts": "resources/cleanchanges.js"
- },
"ext.cleanchanges.uls": {
"scripts": "resources/cleanchanges.uls.js",
"styles": "resources/cleanchanges.uls.css"
diff --git a/MLEB/CleanChanges/i18n/af.json b/MLEB/CleanChanges/i18n/af.json
index 5c2c5635..9d68f7a9 100644
--- a/MLEB/CleanChanges/i18n/af.json
+++ b/MLEB/CleanChanges/i18n/af.json
@@ -4,10 +4,8 @@
"Naudefj"
]
},
- "cleanchanges-changerightslink": "verander groepe",
"cleanchanges-desc": "Meer kompakte weergawe van die [[Special:RecentChanges|lys van onlangse wysigings]]",
"cleanchanges-language": "Taal:",
"cleanchanges-language-na": "Alle tale",
- "cleanchanges-users": "Gebruikers (geskei deur \"|\"):",
- "cleanchanges-showuserlinks": "Wys gebruiker se skakels"
+ "cleanchanges-users": "Gebruikers (geskei deur \"|\"):"
}
diff --git a/MLEB/CleanChanges/i18n/ar.json b/MLEB/CleanChanges/i18n/ar.json
index d384829a..bd43d170 100644
--- a/MLEB/CleanChanges/i18n/ar.json
+++ b/MLEB/CleanChanges/i18n/ar.json
@@ -6,10 +6,8 @@
"ديفيد"
]
},
- "cleanchanges-changerightslink": "تغيير المجموعات",
"cleanchanges-desc": "عرض أكثر ضغطا [[Special:RecentChanges|لقائمة أحدث التغييرات]]",
"cleanchanges-language": "اللغة:",
"cleanchanges-language-na": "الكل",
- "cleanchanges-users": "المستخدمون (للفصل: |):",
- "cleanchanges-showuserlinks": "إظهار وصلات المستخدم"
+ "cleanchanges-users": "المستخدمون (للفصل: |):"
}
diff --git a/MLEB/CleanChanges/i18n/arc.json b/MLEB/CleanChanges/i18n/arc.json
index 1ec471cd..9c0b6a6b 100644
--- a/MLEB/CleanChanges/i18n/arc.json
+++ b/MLEB/CleanChanges/i18n/arc.json
@@ -7,6 +7,5 @@
},
"cleanchanges-desc": "[[Special:RecentChanges|ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ]]ܚܙܝܬܐ ܙܥܘܪܬܐ ܕ",
"cleanchanges-language": "ܠܫܢܐ:",
- "cleanchanges-language-na": "ܟܠ",
- "cleanchanges-showuserlinks": "ܚܘܝ ܐܣܘܪ̈ܐ ܕܡܦܠܚܢܐ"
+ "cleanchanges-language-na": "ܟܠ"
}
diff --git a/MLEB/CleanChanges/i18n/arz.json b/MLEB/CleanChanges/i18n/arz.json
index 24b5dd31..5a1516b7 100644
--- a/MLEB/CleanChanges/i18n/arz.json
+++ b/MLEB/CleanChanges/i18n/arz.json
@@ -5,10 +5,8 @@
"Ouda"
]
},
- "cleanchanges-changerightslink": "تغيير المجموعات",
"cleanchanges-desc": "عرض أكثر ضغطا ل [[Special:RecentChanges|قائمة أحدث التغييرات]]",
"cleanchanges-language": "اللغة:",
"cleanchanges-language-na": "الكل",
- "cleanchanges-users": "المستخدمون (للفصل: |):",
- "cleanchanges-showuserlinks": "إظهار وصلات المستخدم"
+ "cleanchanges-users": "المستخدمون (للفصل: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ast.json b/MLEB/CleanChanges/i18n/ast.json
index 63ba599b..9bdbecbc 100644
--- a/MLEB/CleanChanges/i18n/ast.json
+++ b/MLEB/CleanChanges/i18n/ast.json
@@ -5,10 +5,8 @@
"Xuacu"
]
},
- "cleanchanges-changerightslink": "camudar grupos",
"cleanchanges-desc": "Vísualización más compacta de la [[Special:RecentChanges|llista de cambeos recientes]]",
"cleanchanges-language": "Llingua:",
"cleanchanges-language-na": "Toos",
- "cleanchanges-users": "Usuarios (Sep: |):",
- "cleanchanges-showuserlinks": "Amosar enllaces d'usuariu"
+ "cleanchanges-users": "Usuarios (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ba.json b/MLEB/CleanChanges/i18n/ba.json
index 7873ba0b..18f40b50 100644
--- a/MLEB/CleanChanges/i18n/ba.json
+++ b/MLEB/CleanChanges/i18n/ba.json
@@ -4,10 +4,8 @@
"Assele"
]
},
- "cleanchanges-changerightslink": "төркөмдәрҙе үҙгәртергә",
"cleanchanges-desc": "[[Special:RecentChanges|Һуңғы үҙгәртеүҙәр исемлегенең]] ҡыҫылған күренеше",
"cleanchanges-language": "Тел:",
"cleanchanges-language-na": "Барыһы ла",
- "cleanchanges-users": "Ҡатнашыусылар (Бүлгес: |):",
- "cleanchanges-showuserlinks": "Ҡатнашыусы һылтанмаларын күрһәтергә"
+ "cleanchanges-users": "Ҡатнашыусылар (Бүлгес: |):"
}
diff --git a/MLEB/CleanChanges/i18n/bcl.json b/MLEB/CleanChanges/i18n/bcl.json
index 23003710..805013d3 100644
--- a/MLEB/CleanChanges/i18n/bcl.json
+++ b/MLEB/CleanChanges/i18n/bcl.json
@@ -4,10 +4,8 @@
"Geopoet"
]
},
- "cleanchanges-changerightslink": "ribayan an mga grupo",
"cleanchanges-desc": "Mas masidsidong pagpapahiling kan [[Special:RecentChanges|listahan kan dae pa sana nahahaloy na mga kaliwatan]]",
"cleanchanges-language": "Lengguwahe:",
"cleanchanges-language-na": "Gabos",
- "cleanchanges-users": "Mga Paragamit (Pagsuhayon:|):",
- "cleanchanges-showuserlinks": "Ipahiling an kasugpunan nin paragamit"
+ "cleanchanges-users": "Mga Paragamit (Pagsuhayon:|):"
}
diff --git a/MLEB/CleanChanges/i18n/be-tarask.json b/MLEB/CleanChanges/i18n/be-tarask.json
index 734d4103..b5260c89 100644
--- a/MLEB/CleanChanges/i18n/be-tarask.json
+++ b/MLEB/CleanChanges/i18n/be-tarask.json
@@ -5,10 +5,8 @@
"Jim-by"
]
},
- "cleanchanges-changerightslink": "зьмяніць групы",
"cleanchanges-desc": "Болей кампактны паказ [[Special:RecentChanges|сьпісу апошніх зьменаў]]",
"cleanchanges-language": "Мова:",
"cleanchanges-language-na": "Усе",
- "cleanchanges-users": "Удзельнікі (разьдзяляльнік: |):",
- "cleanchanges-showuserlinks": "Паказваць спасылкі ўдзельнікаў"
+ "cleanchanges-users": "Удзельнікі (разьдзяляльнік: |):"
}
diff --git a/MLEB/CleanChanges/i18n/bg.json b/MLEB/CleanChanges/i18n/bg.json
index 8ddf65da..272408ea 100644
--- a/MLEB/CleanChanges/i18n/bg.json
+++ b/MLEB/CleanChanges/i18n/bg.json
@@ -5,10 +5,8 @@
"Spiritia"
]
},
- "cleanchanges-changerightslink": "промяна на групите",
"cleanchanges-desc": "По-компактно показване на [[Special:RecentChanges|списъка с последните промени]]",
"cleanchanges-language": "Език:",
"cleanchanges-language-na": "Всички",
- "cleanchanges-users": "Потребители (Разд: |):",
- "cleanchanges-showuserlinks": "Показване на потребителските връзки"
+ "cleanchanges-users": "Потребители (Разд: |):"
}
diff --git a/MLEB/CleanChanges/i18n/bn.json b/MLEB/CleanChanges/i18n/bn.json
index c2327e8b..f8fb750d 100644
--- a/MLEB/CleanChanges/i18n/bn.json
+++ b/MLEB/CleanChanges/i18n/bn.json
@@ -5,10 +5,8 @@
"Zaheen"
]
},
- "cleanchanges-changerightslink": "দল পরিবর্তন করুন",
"cleanchanges-desc": "[[Special:RecentChanges|সাম্প্রতিক পরিবর্তনসমূহের তালিকার]] আরও সংহত প্রদর্শন",
"cleanchanges-language": "ভাষা:",
"cleanchanges-language-na": "সকল",
- "cleanchanges-users": "ব্যবহারকারী (পার্থক্যকারী: |):",
- "cleanchanges-showuserlinks": "ব্যবহারকারী লিংকগুলো দেখাও"
+ "cleanchanges-users": "ব্যবহারকারী (পার্থক্যকারী: |):"
}
diff --git a/MLEB/CleanChanges/i18n/br.json b/MLEB/CleanChanges/i18n/br.json
index 5dec41e0..997e26a5 100644
--- a/MLEB/CleanChanges/i18n/br.json
+++ b/MLEB/CleanChanges/i18n/br.json
@@ -4,10 +4,8 @@
"Fulup"
]
},
- "cleanchanges-changerightslink": "kemmañ a ra ar strolladoù",
"cleanchanges-desc": "Doare diskouez krennoc'h evit [[Special:RecentChanges|roll ar c'hemmoù diwezhañ]]",
"cleanchanges-language": "Yezh :",
"cleanchanges-language-na": "An holl",
- "cleanchanges-users": "Implijerien (Dispart. gant |) :",
- "cleanchanges-showuserlinks": "Diskwel liammoù an implijer-mañ"
+ "cleanchanges-users": "Implijerien (Dispart. gant |) :"
}
diff --git a/MLEB/CleanChanges/i18n/bs.json b/MLEB/CleanChanges/i18n/bs.json
index 338e99e2..a9477613 100644
--- a/MLEB/CleanChanges/i18n/bs.json
+++ b/MLEB/CleanChanges/i18n/bs.json
@@ -4,10 +4,8 @@
"CERminator"
]
},
- "cleanchanges-changerightslink": "promijeni grupe",
"cleanchanges-desc": "Kompaktniji prikaz [[Special:RecentChanges|spiska nedavnih promjena]]",
"cleanchanges-language": "Jezik:",
"cleanchanges-language-na": "Sve",
- "cleanchanges-users": "Korisnici: (Razdv: |):",
- "cleanchanges-showuserlinks": "Prikaži korisničke linkove"
+ "cleanchanges-users": "Korisnici: (Razdv: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ca.json b/MLEB/CleanChanges/i18n/ca.json
index f2fbae35..e71cc46d 100644
--- a/MLEB/CleanChanges/i18n/ca.json
+++ b/MLEB/CleanChanges/i18n/ca.json
@@ -6,10 +6,8 @@
"Solde"
]
},
- "cleanchanges-changerightslink": "canvia els grups",
"cleanchanges-desc": "Versió més compacta de la [[Special:RecentChanges|llista de canvis recents]]",
"cleanchanges-language": "Idioma:",
"cleanchanges-language-na": "Tot",
- "cleanchanges-users": "Usuaris (Separador: |):",
- "cleanchanges-showuserlinks": "Mostra els enllaços de l'usuari/a"
+ "cleanchanges-users": "Usuaris (Separador: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ce.json b/MLEB/CleanChanges/i18n/ce.json
index 5523689f..be46ca71 100644
--- a/MLEB/CleanChanges/i18n/ce.json
+++ b/MLEB/CleanChanges/i18n/ce.json
@@ -5,10 +5,8 @@
"Умар"
]
},
- "cleanchanges-changerightslink": "хийца тобанаш",
"cleanchanges-desc": "Алсамо тIеIовдан гайтар [[Special:RecentChanges|керла нисдарийн могӀам]]",
"cleanchanges-language": "Мотт:",
"cleanchanges-language-na": "Массо",
- "cleanchanges-users": "Декъашхой (дӀасакъасторг: |):",
- "cleanchanges-showuserlinks": "Декъашхойн хьажоргаш гойту"
+ "cleanchanges-users": "Декъашхой (дӀасакъасторг: |):"
}
diff --git a/MLEB/CleanChanges/i18n/cs.json b/MLEB/CleanChanges/i18n/cs.json
index ead687e9..bfa15fbc 100644
--- a/MLEB/CleanChanges/i18n/cs.json
+++ b/MLEB/CleanChanges/i18n/cs.json
@@ -6,10 +6,8 @@
"Mormegil"
]
},
- "cleanchanges-changerightslink": "změnit skupiny",
"cleanchanges-desc": "Kompaktnější zobrazení [[Special:RecentChanges|seznamu posledních změn]]",
"cleanchanges-language": "Jazyk:",
"cleanchanges-language-na": "Všechny",
- "cleanchanges-users": "Uživatelé (odd.&nbsp;|):",
- "cleanchanges-showuserlinks": "Ukázat uživatelské odkazy"
+ "cleanchanges-users": "Uživatelé (odd.&nbsp;|):"
}
diff --git a/MLEB/CleanChanges/i18n/cy.json b/MLEB/CleanChanges/i18n/cy.json
index fc329bb7..46973f4a 100644
--- a/MLEB/CleanChanges/i18n/cy.json
+++ b/MLEB/CleanChanges/i18n/cy.json
@@ -4,10 +4,8 @@
"Lloffiwr"
]
},
- "cleanchanges-changerightslink": "newid grwpiau",
"cleanchanges-desc": "Dangos manylion cryno yn unig ar y [[Special:RecentChanges|rhestr newidiadau diweddar]]",
"cleanchanges-language": "Iaith:",
"cleanchanges-language-na": "Oll",
- "cleanchanges-users": "Defnyddwyr (Gwah: |):",
- "cleanchanges-showuserlinks": "Dangos cysylltiadau at ddefnyddwyr"
+ "cleanchanges-users": "Defnyddwyr (Gwah: |):"
}
diff --git a/MLEB/CleanChanges/i18n/da.json b/MLEB/CleanChanges/i18n/da.json
index 102c1154..1719954b 100644
--- a/MLEB/CleanChanges/i18n/da.json
+++ b/MLEB/CleanChanges/i18n/da.json
@@ -5,10 +5,8 @@
"Christian List"
]
},
- "cleanchanges-changerightslink": "ændr grupper",
"cleanchanges-desc": "Mere kompakt visning af [[Special:RecentChanges|seneste ændringer]]",
"cleanchanges-language": "Sprog:",
"cleanchanges-language-na": "Alle",
- "cleanchanges-users": "Brugere (adskil med |):",
- "cleanchanges-showuserlinks": "Vis brugerhenvisninger"
+ "cleanchanges-users": "Brugere (adskil med |):"
}
diff --git a/MLEB/CleanChanges/i18n/de.json b/MLEB/CleanChanges/i18n/de.json
index 016e53d8..9cdbf0da 100644
--- a/MLEB/CleanChanges/i18n/de.json
+++ b/MLEB/CleanChanges/i18n/de.json
@@ -5,10 +5,8 @@
"Raimond Spekking"
]
},
- "cleanchanges-changerightslink": "Gruppen ändern",
"cleanchanges-desc": "Ermöglicht eine kompaktere Anzeige der [[Special:RecentChanges|letzten Änderungen]]",
"cleanchanges-language": "Sprache:",
"cleanchanges-language-na": "Alle",
- "cleanchanges-users": "Benutzer (Trennzeichen:&nbsp;„|“):",
- "cleanchanges-showuserlinks": "Zeige Benutzerlinks"
+ "cleanchanges-users": "Benutzer (Trennzeichen:&nbsp;„|“):"
}
diff --git a/MLEB/CleanChanges/i18n/diq.json b/MLEB/CleanChanges/i18n/diq.json
index 6f2307a0..55bbc993 100644
--- a/MLEB/CleanChanges/i18n/diq.json
+++ b/MLEB/CleanChanges/i18n/diq.json
@@ -6,10 +6,8 @@
"Mirzali"
]
},
- "cleanchanges-changerightslink": "Gruban bıvurnê",
"cleanchanges-desc": "Dehena asayışa kompakta [[Special:RecentChanges|Listey vurriyayışanê peyênan ]]",
"cleanchanges-language": "Zıwan:",
"cleanchanges-language-na": "Pêro",
- "cleanchanges-users": "Karberi (Ciya: |):",
- "cleanchanges-showuserlinks": "Linkanê Karberan bıasne"
+ "cleanchanges-users": "Karberi (Ciya: |):"
}
diff --git a/MLEB/CleanChanges/i18n/dsb.json b/MLEB/CleanChanges/i18n/dsb.json
index 3abe40ea..80493aa8 100644
--- a/MLEB/CleanChanges/i18n/dsb.json
+++ b/MLEB/CleanChanges/i18n/dsb.json
@@ -4,10 +4,8 @@
"Michawiki"
]
},
- "cleanchanges-changerightslink": "kupki změniś",
"cleanchanges-desc": "Kompaktnejše zwobraznjenje [[Special:RecentChanges|lisćiny aktualnych změnow]]",
"cleanchanges-language": "Rěc:",
"cleanchanges-language-na": "Wšykne",
- "cleanchanges-users": "Wužywarje (źěleńske znamješko: |);",
- "cleanchanges-showuserlinks": "Wužywarske wótkaze pokazaś"
+ "cleanchanges-users": "Wužywarje (źěleńske znamješko: |);"
}
diff --git a/MLEB/CleanChanges/i18n/ee.json b/MLEB/CleanChanges/i18n/ee.json
index e4f515f9..0a15cde8 100644
--- a/MLEB/CleanChanges/i18n/ee.json
+++ b/MLEB/CleanChanges/i18n/ee.json
@@ -4,7 +4,6 @@
"Natsubee"
]
},
- "cleanchanges-changerightslink": "ɖɔli hamewo",
"cleanchanges-language": "Gbe:",
"cleanchanges-language-na": "Wokatã"
}
diff --git a/MLEB/CleanChanges/i18n/el.json b/MLEB/CleanChanges/i18n/el.json
index 00386d97..8eda4646 100644
--- a/MLEB/CleanChanges/i18n/el.json
+++ b/MLEB/CleanChanges/i18n/el.json
@@ -7,10 +7,8 @@
"Protnet"
]
},
- "cleanchanges-changerightslink": "αλλαγή ομάδων",
"cleanchanges-desc": "Πιο συμπαγής προβολή της [[Special:RecentChanges|λίστας προσφάτων αλλαγών]]",
"cleanchanges-language": "Γλώσσα:",
"cleanchanges-language-na": "Όλες",
- "cleanchanges-users": "Χρήστες (διαχωρισμένοι με |):",
- "cleanchanges-showuserlinks": "Προβολή συνδέσμων χρήστη"
+ "cleanchanges-users": "Χρήστες (διαχωρισμένοι με |):"
}
diff --git a/MLEB/CleanChanges/i18n/en.json b/MLEB/CleanChanges/i18n/en.json
index dbb3572e..be2d9996 100644
--- a/MLEB/CleanChanges/i18n/en.json
+++ b/MLEB/CleanChanges/i18n/en.json
@@ -2,12 +2,8 @@
"@metadata": {
"authors": []
},
- "cleanchanges-changerightslink": "change groups",
"cleanchanges-desc": "More compact display of the [[Special:RecentChanges|recent changes list]]",
"cleanchanges-language": "Language:",
"cleanchanges-language-na": "All",
- "cleanchanges-users": "Users (Sep: |):",
- "cleanchanges-showuserlinks": "Show user links",
- "cleanchanges-rcinfo-2": "($1; $2)",
- "cleanchanges-rcinfo-3": "($1; $2; $3)"
-} \ No newline at end of file
+ "cleanchanges-users": "Users (Sep: |):"
+}
diff --git a/MLEB/CleanChanges/i18n/eo.json b/MLEB/CleanChanges/i18n/eo.json
index ef0ce15d..01f20ba1 100644
--- a/MLEB/CleanChanges/i18n/eo.json
+++ b/MLEB/CleanChanges/i18n/eo.json
@@ -5,10 +5,8 @@
"Yekrats"
]
},
- "cleanchanges-changerightslink": "ŝanĝu grupojn",
"cleanchanges-desc": "Pli kompakta versio de la [[Special:RecentChanges|listo de lastaj ŝanĝoj]]",
"cleanchanges-language": "Lingvo:",
"cleanchanges-language-na": "Ĉiuj",
- "cleanchanges-users": "Uzantoj (disigilo: |):",
- "cleanchanges-showuserlinks": "Vidi uzantoj ligiloj"
+ "cleanchanges-users": "Uzantoj (disigilo: |):"
}
diff --git a/MLEB/CleanChanges/i18n/es.json b/MLEB/CleanChanges/i18n/es.json
index 9262e2a5..a714927d 100644
--- a/MLEB/CleanChanges/i18n/es.json
+++ b/MLEB/CleanChanges/i18n/es.json
@@ -5,10 +5,8 @@
"Sanbec"
]
},
- "cleanchanges-changerightslink": "cambiar grupos",
"cleanchanges-desc": "Visualización más compacta de la [[Special:RecentChanges|lista de cambios recientes]]",
"cleanchanges-language": "Idioma:",
"cleanchanges-language-na": "Todos",
- "cleanchanges-users": "Usuarios (sep.: |):",
- "cleanchanges-showuserlinks": "Mostrar enlaces de usuario"
+ "cleanchanges-users": "Usuarios (sep.: |):"
}
diff --git a/MLEB/CleanChanges/i18n/et.json b/MLEB/CleanChanges/i18n/et.json
index 36dc395b..f5010c9e 100644
--- a/MLEB/CleanChanges/i18n/et.json
+++ b/MLEB/CleanChanges/i18n/et.json
@@ -5,10 +5,8 @@
"Pikne"
]
},
- "cleanchanges-changerightslink": "muuda rühmi",
"cleanchanges-desc": "Kompaktsem ülevaade [[Special:RecentChanges|viimastest muudatustest]]",
"cleanchanges-language": "Keel:",
"cleanchanges-language-na": "Kõik",
- "cleanchanges-users": "Kasutajad (erald:&nbsp;|):",
- "cleanchanges-showuserlinks": "Näita kasutajalinke"
+ "cleanchanges-users": "Kasutajad (erald:&nbsp;|):"
}
diff --git a/MLEB/CleanChanges/i18n/eu.json b/MLEB/CleanChanges/i18n/eu.json
index 6d49c82b..3d85aebf 100644
--- a/MLEB/CleanChanges/i18n/eu.json
+++ b/MLEB/CleanChanges/i18n/eu.json
@@ -5,10 +5,8 @@
"Kobazulo"
]
},
- "cleanchanges-changerightslink": "taldeak aldatu",
"cleanchanges-desc": "Bistaratze trinkoagoa [[Special:RecentChanges|aldaketa berrien zerrendarako]]",
"cleanchanges-language": "Hizkuntza:",
"cleanchanges-language-na": "Guztiak",
- "cleanchanges-users": "Erabiltzaileak (\"|\" ikurrarekin bereizirik)",
- "cleanchanges-showuserlinks": "Erabiltzaileen estekak erakutsi"
+ "cleanchanges-users": "Erabiltzaileak (\"|\" ikurrarekin bereizirik)"
}
diff --git a/MLEB/CleanChanges/i18n/fa.json b/MLEB/CleanChanges/i18n/fa.json
index 18402c55..dc6aea87 100644
--- a/MLEB/CleanChanges/i18n/fa.json
+++ b/MLEB/CleanChanges/i18n/fa.json
@@ -6,12 +6,8 @@
"Mjbmr"
]
},
- "cleanchanges-changerightslink": "گروه‌های تغییر",
"cleanchanges-desc": "نمایش فشرده‌تری از [[Special:RecentChanges|فهرست تغییرات اخیر]]",
"cleanchanges-language": "زبان:",
"cleanchanges-language-na": "همه",
- "cleanchanges-users": "کاربران (جدا کردن با: |):",
- "cleanchanges-showuserlinks": "نمایش پیوندهای کاربر",
- "cleanchanges-rcinfo-2": "($1؛ $2)",
- "cleanchanges-rcinfo-3": "($1؛ $2؛ $3)"
+ "cleanchanges-users": "کاربران (جدا کردن با: |):"
}
diff --git a/MLEB/CleanChanges/i18n/fi.json b/MLEB/CleanChanges/i18n/fi.json
index d7064c2b..ccd0ac48 100644
--- a/MLEB/CleanChanges/i18n/fi.json
+++ b/MLEB/CleanChanges/i18n/fi.json
@@ -5,10 +5,8 @@
"Vililikku"
]
},
- "cleanchanges-changerightslink": "muokkaa ryhmiä",
"cleanchanges-desc": "Tiivistetymmät [[Special:RecentChanges|muutoslistaukset]].",
"cleanchanges-language": "Kieli:",
"cleanchanges-language-na": "Kaikki",
- "cleanchanges-users": "Käyttäjät (erotin: |)",
- "cleanchanges-showuserlinks": "Näytä käyttäjälinkit"
+ "cleanchanges-users": "Käyttäjät (erotin: |)"
}
diff --git a/MLEB/CleanChanges/i18n/fr.json b/MLEB/CleanChanges/i18n/fr.json
index 7127f415..9bbacdac 100644
--- a/MLEB/CleanChanges/i18n/fr.json
+++ b/MLEB/CleanChanges/i18n/fr.json
@@ -7,12 +7,8 @@
"Verdy p"
]
},
- "cleanchanges-changerightslink": "changer de groupes",
"cleanchanges-desc": "Affichage plus compact de la [[Special:RecentChanges|liste des modifications récentes]]",
"cleanchanges-language": "Langue :",
"cleanchanges-language-na": "Tous",
- "cleanchanges-users": "Utilisateurs (sép. par « | ») :",
- "cleanchanges-showuserlinks": "Afficher les liens d’utilisateur",
- "cleanchanges-rcinfo-2": "($1 ; $2)",
- "cleanchanges-rcinfo-3": "($1 ; $2 ; $3)"
+ "cleanchanges-users": "Utilisateurs (sép. par « | ») :"
}
diff --git a/MLEB/CleanChanges/i18n/frp.json b/MLEB/CleanChanges/i18n/frp.json
index 076bc944..9c8edc49 100644
--- a/MLEB/CleanChanges/i18n/frp.json
+++ b/MLEB/CleanChanges/i18n/frp.json
@@ -4,9 +4,7 @@
"ChrisPtDe"
]
},
- "cleanchanges-changerightslink": "changiér les tropes",
"cleanchanges-language": "Lengoua :",
"cleanchanges-language-na": "Tôs",
- "cleanchanges-users": "Usanciérs (sèp. per |) :",
- "cleanchanges-showuserlinks": "Fâre vêre los lims a l’usanciér"
+ "cleanchanges-users": "Usanciérs (sèp. per |) :"
}
diff --git a/MLEB/CleanChanges/i18n/fy.json b/MLEB/CleanChanges/i18n/fy.json
index 0c412e3d..f2bb11d5 100644
--- a/MLEB/CleanChanges/i18n/fy.json
+++ b/MLEB/CleanChanges/i18n/fy.json
@@ -6,10 +6,8 @@
"Snakesteuben"
]
},
- "cleanchanges-changerightslink": "feroarje groepen",
"cleanchanges-desc": "Kompaktere werjefte fan de [[Special:RecentChanges|list mei lêste feroarings]]",
"cleanchanges-language": "Taal:",
"cleanchanges-language-na": "Alle talen",
- "cleanchanges-users": "Meidoggers (Skaat mei |):",
- "cleanchanges-showuserlinks": "Meidoggerskeppelingen sjen litte"
+ "cleanchanges-users": "Meidoggers (Skaat mei |):"
}
diff --git a/MLEB/CleanChanges/i18n/gl.json b/MLEB/CleanChanges/i18n/gl.json
index 360450b1..9d613297 100644
--- a/MLEB/CleanChanges/i18n/gl.json
+++ b/MLEB/CleanChanges/i18n/gl.json
@@ -6,10 +6,8 @@
"Toliño"
]
},
- "cleanchanges-changerightslink": "mudar grupos",
"cleanchanges-desc": "Unha presentación máis compacta da [[Special:RecentChanges|lista de cambios recentes]]",
"cleanchanges-language": "Lingua:",
"cleanchanges-language-na": "Todas",
- "cleanchanges-users": "Usuarios (separados por |):",
- "cleanchanges-showuserlinks": "Amosar as ligazóns de usuario"
+ "cleanchanges-users": "Usuarios (separados por |):"
}
diff --git a/MLEB/CleanChanges/i18n/grc.json b/MLEB/CleanChanges/i18n/grc.json
index 3a311044..ce15dc3b 100644
--- a/MLEB/CleanChanges/i18n/grc.json
+++ b/MLEB/CleanChanges/i18n/grc.json
@@ -5,10 +5,8 @@
"Omnipaedista"
]
},
- "cleanchanges-changerightslink": "ἀλλάττειν ὁμάδας",
"cleanchanges-desc": "Ἔτι συμπεπυκνωμένη δεῖξις τῆς [[Special:RecentChanges|καταλογῆς προσφάτων μεταβολῶν]]",
"cleanchanges-language": "Γλῶττα:",
"cleanchanges-language-na": "Ἅπασαι",
- "cleanchanges-users": "Χρώμενοι (Διαχ: |):",
- "cleanchanges-showuserlinks": "Δεικνύναι συνδέσμους χρωμένου"
+ "cleanchanges-users": "Χρώμενοι (Διαχ: |):"
}
diff --git a/MLEB/CleanChanges/i18n/gsw.json b/MLEB/CleanChanges/i18n/gsw.json
index ca1ca5f9..a314db33 100644
--- a/MLEB/CleanChanges/i18n/gsw.json
+++ b/MLEB/CleanChanges/i18n/gsw.json
@@ -5,10 +5,8 @@
"Als-Holder"
]
},
- "cleanchanges-changerightslink": "Gruppen ändere",
"cleanchanges-desc": "Kompakteri Aazeig vu dr [[Special:RecentChanges|letschten Änderige]]",
"cleanchanges-language": "Sproch:",
"cleanchanges-language-na": "Alli",
- "cleanchanges-users": "Benutzer (Trännzeiche: |):",
- "cleanchanges-showuserlinks": "Zeig Benutzer-Links"
+ "cleanchanges-users": "Benutzer (Trännzeiche: |):"
}
diff --git a/MLEB/CleanChanges/i18n/haw.json b/MLEB/CleanChanges/i18n/haw.json
index 3c43f4d5..68d5ceb1 100644
--- a/MLEB/CleanChanges/i18n/haw.json
+++ b/MLEB/CleanChanges/i18n/haw.json
@@ -5,9 +5,7 @@
"Kolonahe"
]
},
- "cleanchanges-changerightslink": "hoʻololi hui",
"cleanchanges-language": "ʻŌlelo:",
"cleanchanges-language-na": "Nā mea apau",
- "cleanchanges-users": "Mea hoʻohana (hoʻokaʻawale ʻia: |):",
- "cleanchanges-showuserlinks": "Hōʻike i nā loulou mea hoʻohana"
+ "cleanchanges-users": "Mea hoʻohana (hoʻokaʻawale ʻia: |):"
}
diff --git a/MLEB/CleanChanges/i18n/he.json b/MLEB/CleanChanges/i18n/he.json
index 5cc5fee3..a4f4bc00 100644
--- a/MLEB/CleanChanges/i18n/he.json
+++ b/MLEB/CleanChanges/i18n/he.json
@@ -6,10 +6,8 @@
"YaronSh"
]
},
- "cleanchanges-changerightslink": "שינוי קבוצות",
"cleanchanges-desc": "הצגה מרוכזת יותר של [[Special:RecentChanges|רשימת השינויים האחרונים]]",
"cleanchanges-language": "שפה:",
"cleanchanges-language-na": "הכול",
- "cleanchanges-users": "משתמשים (הפרדה: |):",
- "cleanchanges-showuserlinks": "הצגת קישורי המשתמש"
+ "cleanchanges-users": "משתמשים (הפרדה: |):"
}
diff --git a/MLEB/CleanChanges/i18n/hi.json b/MLEB/CleanChanges/i18n/hi.json
index ec66180e..d67e8306 100644
--- a/MLEB/CleanChanges/i18n/hi.json
+++ b/MLEB/CleanChanges/i18n/hi.json
@@ -6,10 +6,8 @@
"Kaustubh"
]
},
- "cleanchanges-changerightslink": "ग्रुप बदलें",
"cleanchanges-desc": "[[Special:RecentChanges|हाल में हुए बदलाव]] संक्षिप्त रूपमें दर्शायें",
"cleanchanges-language": "भाषा:",
"cleanchanges-language-na": "सभी",
- "cleanchanges-users": "उपयोक्तागण (\"|\" से विभक्त)",
- "cleanchanges-showuserlinks": "उपयोक्ता कड़ियाँ दिखाएँ"
+ "cleanchanges-users": "उपयोक्तागण (\"|\" से विभक्त)"
}
diff --git a/MLEB/CleanChanges/i18n/hr.json b/MLEB/CleanChanges/i18n/hr.json
index f1c5267e..50746ba7 100644
--- a/MLEB/CleanChanges/i18n/hr.json
+++ b/MLEB/CleanChanges/i18n/hr.json
@@ -5,10 +5,8 @@
"Ex13"
]
},
- "cleanchanges-changerightslink": "promijeni skupine",
"cleanchanges-desc": "Kompaktniji prikaz [[Special:RecentChanges|nedavnih promjena]]",
"cleanchanges-language": "Jezik:",
"cleanchanges-language-na": "Svi",
- "cleanchanges-users": "Suradnici (razdjeljivač: |):",
- "cleanchanges-showuserlinks": "Prikaži poveznice suradnika"
+ "cleanchanges-users": "Suradnici (razdjeljivač: |):"
}
diff --git a/MLEB/CleanChanges/i18n/hsb.json b/MLEB/CleanChanges/i18n/hsb.json
index 78095190..ad7328c2 100644
--- a/MLEB/CleanChanges/i18n/hsb.json
+++ b/MLEB/CleanChanges/i18n/hsb.json
@@ -4,10 +4,8 @@
"Michawiki"
]
},
- "cleanchanges-changerightslink": "skupiny změnić",
"cleanchanges-desc": "Kompaktniše zwobraznjenje [[Special:RecentChanges|lisćiny aktualnych změnow]]",
"cleanchanges-language": "Rěč:",
"cleanchanges-language-na": "Wšě",
- "cleanchanges-users": "Wužiwarjo (dźělenske znamješko: |):",
- "cleanchanges-showuserlinks": "Wužiwarske wotkazy pokazać"
+ "cleanchanges-users": "Wužiwarjo (dźělenske znamješko: |):"
}
diff --git a/MLEB/CleanChanges/i18n/hu.json b/MLEB/CleanChanges/i18n/hu.json
index 6f66408a..719c6af3 100644
--- a/MLEB/CleanChanges/i18n/hu.json
+++ b/MLEB/CleanChanges/i18n/hu.json
@@ -4,10 +4,8 @@
"Dani"
]
},
- "cleanchanges-changerightslink": "csoportok megváltoztatása",
"cleanchanges-desc": "A [[Special:RecentChanges|friss változtatások listájának]] tömörebb változata",
"cleanchanges-language": "Nyelv:",
"cleanchanges-language-na": "összes",
- "cleanchanges-users": "Szerkesztők (elválasztó: |):",
- "cleanchanges-showuserlinks": "Szerkesztőlinkek megjelenítése"
+ "cleanchanges-users": "Szerkesztők (elválasztó: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ia.json b/MLEB/CleanChanges/i18n/ia.json
index f47d4091..b4946e80 100644
--- a/MLEB/CleanChanges/i18n/ia.json
+++ b/MLEB/CleanChanges/i18n/ia.json
@@ -4,10 +4,8 @@
"McDutchie"
]
},
- "cleanchanges-changerightslink": "cambiar gruppos",
"cleanchanges-desc": "Presentation plus compacte del [[Special:RecentChanges|lista de modificationes recente]]",
"cleanchanges-language": "Lingua:",
"cleanchanges-language-na": "Totes",
- "cleanchanges-users": "Usatores (Sep: |):",
- "cleanchanges-showuserlinks": "Monstrar ligamines de usator"
+ "cleanchanges-users": "Usatores (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/id.json b/MLEB/CleanChanges/i18n/id.json
index 1bd9491e..27743707 100644
--- a/MLEB/CleanChanges/i18n/id.json
+++ b/MLEB/CleanChanges/i18n/id.json
@@ -5,10 +5,8 @@
"Rex"
]
},
- "cleanchanges-changerightslink": "ubah kelompok",
"cleanchanges-desc": "Tampilan lebih padat dari [[Special:RecentChanges|daftar perubahan terbaru]]",
"cleanchanges-language": "Bahasa:",
"cleanchanges-language-na": "Semua",
- "cleanchanges-users": "Pengguna (Pemisah: |):",
- "cleanchanges-showuserlinks": "Tunjukkan pranala pengguna"
+ "cleanchanges-users": "Pengguna (Pemisah: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ig.json b/MLEB/CleanChanges/i18n/ig.json
index 28370cf4..b2add1a1 100644
--- a/MLEB/CleanChanges/i18n/ig.json
+++ b/MLEB/CleanChanges/i18n/ig.json
@@ -4,10 +4,8 @@
"Ukabia"
]
},
- "cleanchanges-changerightslink": "gbánwe ọtú",
"cleanchanges-desc": "Nke ílé gí dí ntà nke [[Special:RecentChanges|ndétu ihe gbanwere na ógè nso]]",
"cleanchanges-language": "Ásụ̀sụ̀:",
"cleanchanges-language-na": "Haníle",
- "cleanchanges-users": "Ọ'bànifé (Sep: |):",
- "cleanchanges-showuserlinks": "Zí jikodo ọ'bànifé"
+ "cleanchanges-users": "Ọ'bànifé (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/it.json b/MLEB/CleanChanges/i18n/it.json
index 677d867b..593dc059 100644
--- a/MLEB/CleanChanges/i18n/it.json
+++ b/MLEB/CleanChanges/i18n/it.json
@@ -6,10 +6,8 @@
"Nemo bis"
]
},
- "cleanchanges-changerightslink": "modifica gruppi",
"cleanchanges-desc": "Presentazione più compatta della [[Special:RecentChanges|lista delle ultime modifiche]]",
"cleanchanges-language": "Lingua:",
"cleanchanges-language-na": "Tutte",
- "cleanchanges-users": "Utenti (Sep: |):",
- "cleanchanges-showuserlinks": "Mostra collegamenti utente"
+ "cleanchanges-users": "Utenti (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ja.json b/MLEB/CleanChanges/i18n/ja.json
index 0ac986dc..2cefbe71 100644
--- a/MLEB/CleanChanges/i18n/ja.json
+++ b/MLEB/CleanChanges/i18n/ja.json
@@ -8,12 +8,8 @@
"神樂坂秀吉"
]
},
- "cleanchanges-changerightslink": "権限を変更",
"cleanchanges-desc": "[[Special:RecentChanges|最近の更新一覧]]をよりコンパクトに表示する",
"cleanchanges-language": "言語:",
"cleanchanges-language-na": "すべて",
- "cleanchanges-users": "利用者 (| で区切る):",
- "cleanchanges-showuserlinks": "利用者リンクを表示",
- "cleanchanges-rcinfo-2": "($1; $2)",
- "cleanchanges-rcinfo-3": "($1; $2; $3)"
+ "cleanchanges-users": "利用者 (| で区切る):"
}
diff --git a/MLEB/CleanChanges/i18n/ka.json b/MLEB/CleanChanges/i18n/ka.json
index f2c3a557..5978319c 100644
--- a/MLEB/CleanChanges/i18n/ka.json
+++ b/MLEB/CleanChanges/i18n/ka.json
@@ -5,11 +5,8 @@
"David1010"
]
},
- "cleanchanges-changerightslink": "ჯგუფების ცვლილება",
"cleanchanges-desc": "[[Special:RecentChanges|ბოლო ცვლილებების სიის]] უფრო კომპაქტური ჩვენება",
"cleanchanges-language": "ენა:",
"cleanchanges-language-na": "ყველა",
- "cleanchanges-users": "მომხმარებლები (გამყოფი: |):",
- "cleanchanges-rcinfo-2": "($1; $2)",
- "cleanchanges-rcinfo-3": "($1; $2; $3)"
+ "cleanchanges-users": "მომხმარებლები (გამყოფი: |):"
}
diff --git a/MLEB/CleanChanges/i18n/kk-cyrl.json b/MLEB/CleanChanges/i18n/kk-cyrl.json
index 70a12a02..ea188234 100644
--- a/MLEB/CleanChanges/i18n/kk-cyrl.json
+++ b/MLEB/CleanChanges/i18n/kk-cyrl.json
@@ -4,9 +4,7 @@
"Arystanbek"
]
},
- "cleanchanges-changerightslink": "Топтарды өзгерту",
"cleanchanges-language": "Тіл:",
"cleanchanges-language-na": "Барлығы",
- "cleanchanges-users": "Қатысушылар (Бөл: |):",
- "cleanchanges-showuserlinks": "Қатысушы сілтемелерін көрсету"
+ "cleanchanges-users": "Қатысушылар (Бөл: |):"
}
diff --git a/MLEB/CleanChanges/i18n/km.json b/MLEB/CleanChanges/i18n/km.json
index 19f6d3c5..6bf64768 100644
--- a/MLEB/CleanChanges/i18n/km.json
+++ b/MLEB/CleanChanges/i18n/km.json
@@ -7,10 +7,8 @@
"គីមស៊្រុន"
]
},
- "cleanchanges-changerightslink": "ផ្លាស់ប្តូរក្រុម",
"cleanchanges-desc": "[[Special:RecentChanges|បញ្ជីបន្លាស់ប្ដូរថ្មីៗ]]ខ្នាតខ្លី",
"cleanchanges-language": "ភាសា៖",
"cleanchanges-language-na": "ទាំងអស់",
- "cleanchanges-users": "អ្នកប្រើប្រាស់​(ខណ្ឌដោយ |)៖",
- "cleanchanges-showuserlinks": "បង្ហាញ​តំណ​អ្នកប្រើប្រាស់"
+ "cleanchanges-users": "អ្នកប្រើប្រាស់​(ខណ្ឌដោយ |)៖"
}
diff --git a/MLEB/CleanChanges/i18n/ko.json b/MLEB/CleanChanges/i18n/ko.json
index 07d7d81d..8eead5d6 100644
--- a/MLEB/CleanChanges/i18n/ko.json
+++ b/MLEB/CleanChanges/i18n/ko.json
@@ -5,10 +5,8 @@
"아라"
]
},
- "cleanchanges-changerightslink": "그룹 바꾸기",
"cleanchanges-desc": "[[Special:RecentChanges|최근 바뀜 목록]]을 더 조밀하게 표시합니다",
"cleanchanges-language": "언어:",
"cleanchanges-language-na": "모두",
- "cleanchanges-users": "사용자 (구분선: |):",
- "cleanchanges-showuserlinks": "사용자 링크 보기"
+ "cleanchanges-users": "사용자 (구분선: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ksh.json b/MLEB/CleanChanges/i18n/ksh.json
index 292aadd3..00acd93d 100644
--- a/MLEB/CleanChanges/i18n/ksh.json
+++ b/MLEB/CleanChanges/i18n/ksh.json
@@ -4,10 +4,8 @@
"Purodha"
]
},
- "cleanchanges-changerightslink": "Jroppe aanpasse",
"cleanchanges-desc": "Määt en köötere [[Special:RecentChanges|Leß met de {{lcfirst:{{int:Recentchanges}}}}]].",
"cleanchanges-language": "Schprohch:",
"cleanchanges-language-na": "jehde",
- "cleanchanges-users": "Metmaacher (donn | dozwesche, wann et zwei udder mih sen):",
- "cleanchanges-showuserlinks": "Links op Metmaacher zeije"
+ "cleanchanges-users": "Metmaacher (donn | dozwesche, wann et zwei udder mih sen):"
}
diff --git a/MLEB/CleanChanges/i18n/ku-latn.json b/MLEB/CleanChanges/i18n/ku-latn.json
index c8ef8f16..71f7668e 100644
--- a/MLEB/CleanChanges/i18n/ku-latn.json
+++ b/MLEB/CleanChanges/i18n/ku-latn.json
@@ -4,9 +4,7 @@
"George Animal"
]
},
- "cleanchanges-changerightslink": "koman biguherîne",
"cleanchanges-language": "Ziman:",
"cleanchanges-language-na": "Hemû",
- "cleanchanges-users": "Bikarhêner (Sep: |):",
- "cleanchanges-showuserlinks": "Lînkên bikarhêneran nîşan bide"
+ "cleanchanges-users": "Bikarhêner (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/lb.json b/MLEB/CleanChanges/i18n/lb.json
index d9b6f057..43d93724 100644
--- a/MLEB/CleanChanges/i18n/lb.json
+++ b/MLEB/CleanChanges/i18n/lb.json
@@ -4,10 +4,8 @@
"Robby"
]
},
- "cleanchanges-changerightslink": "ännert d'Gruppen",
"cleanchanges-desc": "[[Special:RecentChanges|Lëscht vun de rezenten Ännerunge]] méi kompakt weisen",
"cleanchanges-language": "Sprooch:",
"cleanchanges-language-na": "All",
- "cleanchanges-users": "Benotzer (Sep: |):",
- "cleanchanges-showuserlinks": "D'Linke vun dësem Benotzer weisen"
+ "cleanchanges-users": "Benotzer (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/li.json b/MLEB/CleanChanges/i18n/li.json
index 2ce38693..cbd25c19 100644
--- a/MLEB/CleanChanges/i18n/li.json
+++ b/MLEB/CleanChanges/i18n/li.json
@@ -4,10 +4,8 @@
"Pahles"
]
},
- "cleanchanges-changerightslink": "gróppe verangere",
"cleanchanges-desc": "Mier compacte weergave van de [[Special:RecentChanges|lies mit recènte verangeringe]]",
"cleanchanges-language": "Sjpraok:",
"cleanchanges-language-na": "Alle sjpraoke",
- "cleanchanges-users": "Gebroekers (sjeijingsteike \"|\"):",
- "cleanchanges-showuserlinks": "Gebroekersverwiezinge betrachte"
+ "cleanchanges-users": "Gebroekers (sjeijingsteike \"|\"):"
}
diff --git a/MLEB/CleanChanges/i18n/lij.json b/MLEB/CleanChanges/i18n/lij.json
index e6ea1988..ab99c905 100644
--- a/MLEB/CleanChanges/i18n/lij.json
+++ b/MLEB/CleanChanges/i18n/lij.json
@@ -4,10 +4,8 @@
"Giromin Cangiaxo"
]
},
- "cleanchanges-changerightslink": "modiffica groppi",
"cleanchanges-desc": "Presentaçion ciù compatta da [[Special:RecentChanges|lista di urtime modiffiche]]",
"cleanchanges-language": "Lengua:",
"cleanchanges-language-na": "Tutti",
- "cleanchanges-users": "Utenti (Sep: |):",
- "cleanchanges-showuserlinks": "Mostra conlegimenti utente"
+ "cleanchanges-users": "Utenti (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/lki.json b/MLEB/CleanChanges/i18n/lki.json
index 7099856f..c2348b0c 100644
--- a/MLEB/CleanChanges/i18n/lki.json
+++ b/MLEB/CleanChanges/i18n/lki.json
@@ -5,10 +5,8 @@
"Lakzon"
]
},
- "cleanchanges-changerightslink": "گروه‌های گؤەڕانن/تغییر",
"cleanchanges-desc": "نمایش فشرده‌تری از [[Special:RecentChanges|فهرست تغییرات اخیر]]",
"cleanchanges-language": ":زوون",
"cleanchanges-language-na": "کؤل(گشت)",
- "cleanchanges-users": "کاربران (جدا کردن با: |):",
- "cleanchanges-showuserlinks": "نمایش پیوندهای کاربر"
+ "cleanchanges-users": "کاربران (جدا کردن با: |):"
}
diff --git a/MLEB/CleanChanges/i18n/lt.json b/MLEB/CleanChanges/i18n/lt.json
index 91106818..28a26686 100644
--- a/MLEB/CleanChanges/i18n/lt.json
+++ b/MLEB/CleanChanges/i18n/lt.json
@@ -4,10 +4,8 @@
"Eitvys200"
]
},
- "cleanchanges-changerightslink": "pakeisti grupes",
"cleanchanges-desc": "Labiau kompaktiškas [[Special:RecentChanges|naujausių pakeitimų sąrašo]] rodinys",
"cleanchanges-language": "Kalba:",
"cleanchanges-language-na": "Visi",
- "cleanchanges-users": "Vartotojai (Atskirti: |):",
- "cleanchanges-showuserlinks": "Rodyti vartotojo nuorodas"
+ "cleanchanges-users": "Vartotojai (Atskirti: |):"
}
diff --git a/MLEB/CleanChanges/i18n/mk.json b/MLEB/CleanChanges/i18n/mk.json
index 248ccb89..bde17a89 100644
--- a/MLEB/CleanChanges/i18n/mk.json
+++ b/MLEB/CleanChanges/i18n/mk.json
@@ -4,10 +4,8 @@
"Brest"
]
},
- "cleanchanges-changerightslink": "промена на групи",
"cleanchanges-desc": "Компактен приказ на [[Special:RecentChanges|скорешни промени]]",
"cleanchanges-language": "Јазик:",
"cleanchanges-language-na": "Сите",
- "cleanchanges-users": "Корисници (разделник: |):",
- "cleanchanges-showuserlinks": "Прикажи кориснички врски"
+ "cleanchanges-users": "Корисници (разделник: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ml.json b/MLEB/CleanChanges/i18n/ml.json
index a6fe9201..f82c1870 100644
--- a/MLEB/CleanChanges/i18n/ml.json
+++ b/MLEB/CleanChanges/i18n/ml.json
@@ -5,10 +5,8 @@
"Shijualex"
]
},
- "cleanchanges-changerightslink": "സംഘങ്ങൾ മാറ്റുക",
"cleanchanges-desc": "[[Special:RecentChanges|പുതിയ മാറ്റങ്ങളുടെ പട്ടികയുടെ]] ഒതുക്കമുള്ള പ്രദർശനം",
"cleanchanges-language": "ഭാഷ:",
"cleanchanges-language-na": "എല്ലാം",
- "cleanchanges-users": "ഉപയോക്താക്കൾ (പിരിക്കാൻ: |)",
- "cleanchanges-showuserlinks": "ഉപയോക്തൃ കണ്ണികൾ പ്രദർശിപ്പിക്കുക"
+ "cleanchanges-users": "ഉപയോക്താക്കൾ (പിരിക്കാൻ: |)"
}
diff --git a/MLEB/CleanChanges/i18n/mr.json b/MLEB/CleanChanges/i18n/mr.json
index 5b0e7813..37eb5ce1 100644
--- a/MLEB/CleanChanges/i18n/mr.json
+++ b/MLEB/CleanChanges/i18n/mr.json
@@ -6,10 +6,8 @@
"V.narsikar"
]
},
- "cleanchanges-changerightslink": "गट बदला",
"cleanchanges-desc": "[[Special:RecentChanges|अलीकडील बदल यादीचे]] संक्षिप्त रुपात दर्शन",
"cleanchanges-language": "भाषा:",
"cleanchanges-language-na": "सर्व",
- "cleanchanges-users": "सदस्य (Sep: |):",
- "cleanchanges-showuserlinks": "सदस्य दुवे दाखवा"
+ "cleanchanges-users": "सदस्य (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ms.json b/MLEB/CleanChanges/i18n/ms.json
index 44179bb6..44a94744 100644
--- a/MLEB/CleanChanges/i18n/ms.json
+++ b/MLEB/CleanChanges/i18n/ms.json
@@ -5,10 +5,8 @@
"Emrrans"
]
},
- "cleanchanges-changerightslink": "tukar kumpulan",
"cleanchanges-desc": "Pemaparan [[Special:RecentChanges|senarai perubahan terkini]] yang lebih padat",
"cleanchanges-language": "Bahasa:",
"cleanchanges-language-na": "Semua",
- "cleanchanges-users": "Pengguna (Sep: |):",
- "cleanchanges-showuserlinks": "Tunjukkan pautan pengguna"
+ "cleanchanges-users": "Pengguna (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/mt.json b/MLEB/CleanChanges/i18n/mt.json
index 357cdf25..1a45d6dd 100644
--- a/MLEB/CleanChanges/i18n/mt.json
+++ b/MLEB/CleanChanges/i18n/mt.json
@@ -5,10 +5,8 @@
"Roderick Mallia"
]
},
- "cleanchanges-changerightslink": "biddel il-gruppi",
"cleanchanges-desc": "Preżentazzjoni iktar kompatta tal-[[Special:RecentChanges|lista tat-tibdil riċenti]]",
"cleanchanges-language": "Lingwa:",
"cleanchanges-language-na": "Kollha",
- "cleanchanges-users": "Utenti (Sep: |):",
- "cleanchanges-showuserlinks": "Uri l-ħoloq tal-utent"
+ "cleanchanges-users": "Utenti (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/my.json b/MLEB/CleanChanges/i18n/my.json
index 3b2bdba5..802feb57 100644
--- a/MLEB/CleanChanges/i18n/my.json
+++ b/MLEB/CleanChanges/i18n/my.json
@@ -4,9 +4,7 @@
"Dr Lotus Black"
]
},
- "cleanchanges-changerightslink": "အုပ်စုများကို ပြောင်းလဲရန်",
"cleanchanges-language": "ဘာသာစကား:",
"cleanchanges-language-na": "အားလုံး",
- "cleanchanges-users": "အသုံးပြုသူများ (| ခြား၍):",
- "cleanchanges-showuserlinks": "အသုံးပြုသူလင့်ခ်များ ပြရန်"
+ "cleanchanges-users": "အသုံးပြုသူများ (| ခြား၍):"
}
diff --git a/MLEB/CleanChanges/i18n/nah.json b/MLEB/CleanChanges/i18n/nah.json
index 9b590cda..32e32ef3 100644
--- a/MLEB/CleanChanges/i18n/nah.json
+++ b/MLEB/CleanChanges/i18n/nah.json
@@ -6,10 +6,8 @@
"Teòtlalili"
]
},
- "cleanchanges-changerightslink": "ticpatlaz tlatlacentlaliliztli",
"cleanchanges-desc": "Monextiz ocachi tepiton in [[Special:RecentChanges|yancuic tlapatlaliztli ipan tlahtoltecpanaliztli]]",
"cleanchanges-language": "Tlahtolli:",
"cleanchanges-language-na": "Mochtin",
- "cleanchanges-users": "Tequitiuhqueh (Sep: |):",
- "cleanchanges-showuserlinks": "Monextia inetzohuilhuan in tequitiuhqui"
+ "cleanchanges-users": "Tequitiuhqueh (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/nb.json b/MLEB/CleanChanges/i18n/nb.json
index 229f18c5..08bd02a3 100644
--- a/MLEB/CleanChanges/i18n/nb.json
+++ b/MLEB/CleanChanges/i18n/nb.json
@@ -5,10 +5,8 @@
"Nghtwlkr"
]
},
- "cleanchanges-changerightslink": "endre grupper",
"cleanchanges-desc": "Mer kompakt visning av [[Special:RecentChanges|siste endringer]]",
"cleanchanges-language": "Språk:",
"cleanchanges-language-na": "Alle",
- "cleanchanges-users": "Brukere (separer med |):",
- "cleanchanges-showuserlinks": "Vis brukerlenker"
+ "cleanchanges-users": "Brukere (separer med |):"
}
diff --git a/MLEB/CleanChanges/i18n/nl.json b/MLEB/CleanChanges/i18n/nl.json
index b8700bb5..a5890b4a 100644
--- a/MLEB/CleanChanges/i18n/nl.json
+++ b/MLEB/CleanChanges/i18n/nl.json
@@ -4,10 +4,8 @@
"Siebrand"
]
},
- "cleanchanges-changerightslink": "groepen wijzigen",
"cleanchanges-desc": "Meer compacte weergave van de [[Special:RecentChanges|lijst met recente wijzigingen]]",
"cleanchanges-language": "Taal:",
"cleanchanges-language-na": "Alle talen",
- "cleanchanges-users": "Gebruikers (scheidingsteken \"|\"):",
- "cleanchanges-showuserlinks": "Gebruikerskoppelingen weergeven"
+ "cleanchanges-users": "Gebruikers (scheidingsteken \"|\"):"
}
diff --git a/MLEB/CleanChanges/i18n/nn.json b/MLEB/CleanChanges/i18n/nn.json
index 6cf9795b..a572e22f 100644
--- a/MLEB/CleanChanges/i18n/nn.json
+++ b/MLEB/CleanChanges/i18n/nn.json
@@ -5,10 +5,8 @@
"Njardarlogar"
]
},
- "cleanchanges-changerightslink": "endra grupper",
"cleanchanges-desc": "Meir kompakt vising av [[Special:RecentChanges|siste endringar]]",
"cleanchanges-language": "Språk:",
"cleanchanges-language-na": "Alle",
- "cleanchanges-users": "Brukarar (separer med |):",
- "cleanchanges-showuserlinks": "Vis brukarlenkjer"
+ "cleanchanges-users": "Brukarar (separer med |):"
}
diff --git a/MLEB/CleanChanges/i18n/oc.json b/MLEB/CleanChanges/i18n/oc.json
index e2b0cf8a..b27ced2a 100644
--- a/MLEB/CleanChanges/i18n/oc.json
+++ b/MLEB/CleanChanges/i18n/oc.json
@@ -4,10 +4,8 @@
"Cedric31"
]
},
- "cleanchanges-changerightslink": "càmbia los gropes",
"cleanchanges-desc": "Afichatge mai compacte de la [[Special:RecentChanges|lista dels darrièrs cambiaments]]",
"cleanchanges-language": "Lenga :",
"cleanchanges-language-na": "Totes",
- "cleanchanges-users": "Utilizaires (sep. per |) :",
- "cleanchanges-showuserlinks": "Afichar los ligams d'aqueste utilizaire"
+ "cleanchanges-users": "Utilizaires (sep. per |) :"
}
diff --git a/MLEB/CleanChanges/i18n/or.json b/MLEB/CleanChanges/i18n/or.json
index 8f2e4bc1..a962a73b 100644
--- a/MLEB/CleanChanges/i18n/or.json
+++ b/MLEB/CleanChanges/i18n/or.json
@@ -6,6 +6,5 @@
]
},
"cleanchanges-language": "ଭାଷା:",
- "cleanchanges-language-na": "ସବୁ",
- "cleanchanges-showuserlinks": "ବ୍ୟବହାରକାରୀ ଲିଙ୍କ ଦେଖାନ୍ତୁ"
+ "cleanchanges-language-na": "ସବୁ"
}
diff --git a/MLEB/CleanChanges/i18n/pl.json b/MLEB/CleanChanges/i18n/pl.json
index 142bab34..4709a6f0 100644
--- a/MLEB/CleanChanges/i18n/pl.json
+++ b/MLEB/CleanChanges/i18n/pl.json
@@ -11,10 +11,8 @@
"Wpedzich"
]
},
- "cleanchanges-changerightslink": "zmień grupy",
"cleanchanges-desc": "Bardziej zwarta wersja [[Special:RecentChanges|ostatnich zmian]]",
"cleanchanges-language": "Język:",
"cleanchanges-language-na": "Wszystkie",
- "cleanchanges-users": "Użytkownicy (rozdziel znakiem „|”):",
- "cleanchanges-showuserlinks": "Pokaż linki użytkownika"
+ "cleanchanges-users": "Użytkownicy (rozdziel znakiem „|”):"
}
diff --git a/MLEB/CleanChanges/i18n/pms.json b/MLEB/CleanChanges/i18n/pms.json
index 98f60663..9bb734c5 100644
--- a/MLEB/CleanChanges/i18n/pms.json
+++ b/MLEB/CleanChanges/i18n/pms.json
@@ -4,10 +4,8 @@
"Dragonòt"
]
},
- "cleanchanges-changerightslink": "cambia ij grup",
"cleanchanges-desc": "Visualisassion pì s-ciassa dla [[Special:RecentChanges|lista dij cambe ressent]]",
"cleanchanges-language": "Lenga:",
"cleanchanges-language-na": "Tùit",
- "cleanchanges-users": "Utent (Sep: |):",
- "cleanchanges-showuserlinks": "Mosta colegament ëd l'utent"
+ "cleanchanges-users": "Utent (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/pnb.json b/MLEB/CleanChanges/i18n/pnb.json
new file mode 100644
index 00000000..5f64bda8
--- /dev/null
+++ b/MLEB/CleanChanges/i18n/pnb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "cleanchanges-language": "بولی:"
+}
diff --git a/MLEB/CleanChanges/i18n/ps.json b/MLEB/CleanChanges/i18n/ps.json
index 77f12757..fb5cbdcf 100644
--- a/MLEB/CleanChanges/i18n/ps.json
+++ b/MLEB/CleanChanges/i18n/ps.json
@@ -6,11 +6,8 @@
"Baloch Khan"
]
},
- "cleanchanges-changerightslink": "ډلې بدلول",
"cleanchanges-desc": "د [[Special:RecentChanges|وروستي بدلونونو لړليک]] په ډېره وړوکې بڼه ښکاره کوي.",
"cleanchanges-language": "ژبه:",
"cleanchanges-language-na": "ټول",
- "cleanchanges-users": "کارن (بېلول: |):",
- "cleanchanges-showuserlinks": "د کارن تړنې ښکاره کول",
- "cleanchanges-rcinfo-3": "($1؛ $2؛ $3)"
+ "cleanchanges-users": "کارن (بېلول: |):"
}
diff --git a/MLEB/CleanChanges/i18n/pt-br.json b/MLEB/CleanChanges/i18n/pt-br.json
index 525053f9..aa887547 100644
--- a/MLEB/CleanChanges/i18n/pt-br.json
+++ b/MLEB/CleanChanges/i18n/pt-br.json
@@ -5,10 +5,8 @@
"Luckas"
]
},
- "cleanchanges-changerightslink": "alterar grupos",
"cleanchanges-desc": "Apresentação mais compacta da [[Special:RecentChanges|lista de mudanças recentes]]",
"cleanchanges-language": "Língua:",
"cleanchanges-language-na": "Todas",
- "cleanchanges-users": "Utilizadores (Sep: |):",
- "cleanchanges-showuserlinks": "Mostrar links de usuário"
+ "cleanchanges-users": "Utilizadores (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/pt.json b/MLEB/CleanChanges/i18n/pt.json
index 60201a5f..d647d268 100644
--- a/MLEB/CleanChanges/i18n/pt.json
+++ b/MLEB/CleanChanges/i18n/pt.json
@@ -5,10 +5,8 @@
"Malafaya"
]
},
- "cleanchanges-changerightslink": "alterar grupos",
"cleanchanges-desc": "Apresentação mais compacta da [[Special:RecentChanges|lista de mudanças recentes]]",
"cleanchanges-language": "Língua:",
"cleanchanges-language-na": "Todas",
- "cleanchanges-users": "Utilizadores (Sep: |):",
- "cleanchanges-showuserlinks": "Mostrar hiperligações de utilizador"
+ "cleanchanges-users": "Utilizadores (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/qqq.json b/MLEB/CleanChanges/i18n/qqq.json
index e39f1d9a..9c9475a2 100644
--- a/MLEB/CleanChanges/i18n/qqq.json
+++ b/MLEB/CleanChanges/i18n/qqq.json
@@ -9,12 +9,8 @@
"Umherirrender"
]
},
- "cleanchanges-changerightslink": "Link text for a link in the recent changes page to manage user rights for a user.\nIt is shown after clicking on the \"Show user links\"-picture if you are allowed to manage user rights.",
"cleanchanges-desc": "{{desc|name=CleanChanges|url=https://www.mediawiki.org/wiki/Extension:CleanChanges}}",
"cleanchanges-language": "{{Identical|Language}}",
"cleanchanges-language-na": "Used in the trailer selection of [[Special:RecentChanges]] to not filter on any trailer.\n\n{{Identical|All}}",
- "cleanchanges-users": "Used as label for \"Users\" input box.\n\n\"Sep: |\" stands for \"Separate with |\" or \"|-separated\".",
- "cleanchanges-showuserlinks": "Used as HTML <code>alt=</code> and <code>title=</code> attribute for HTML <code><nowiki><img></nowiki></code> tag for <code>magnify-clip.png</code>.\n\nThe image is used as link text.\nThe link is an action link to show/hide User Info.",
- "cleanchanges-rcinfo-2": "{{Optional}}\nUse in enhanced recent changes when CleanChanges is enabled. Parameters:\n* $1 - the number of changes in the overview with {{msg-mw|Nchanges}} used as link text or a diff link with {{msg-mw|Diff}} as link text\n* $2 - a link to the page history. {{msg-mw|Hist}} is used as link text",
- "cleanchanges-rcinfo-3": "{{Optional}}\nUse in enhanced recent changes when CleanChanges is enabled. Parameters:\n* $1 - the number of changes in the overview with {{msg-mw|Nchanges}} used as link text or a diff link with {{msg-mw|Diff}} as link text\n* $2 - a link to the page history. {{msg-mw|Hist}} is used as link text\n* $3 - the size change from the oldest revision to the latest revision in the overview"
+ "cleanchanges-users": "Used as label for \"Users\" input box.\n\n\"Sep: |\" stands for \"Separate with |\" or \"|-separated\"."
}
diff --git a/MLEB/CleanChanges/i18n/ro.json b/MLEB/CleanChanges/i18n/ro.json
index c67e03e0..54ea2e04 100644
--- a/MLEB/CleanChanges/i18n/ro.json
+++ b/MLEB/CleanChanges/i18n/ro.json
@@ -6,9 +6,7 @@
"Stelistcristi"
]
},
- "cleanchanges-changerightslink": "schimbă grupurile",
"cleanchanges-language": "Limbă:",
"cleanchanges-language-na": "Toate",
- "cleanchanges-users": "Utilizatori (sep. prin |):",
- "cleanchanges-showuserlinks": "Arată legăturile utilizatorului"
+ "cleanchanges-users": "Utilizatori (sep. prin |):"
}
diff --git a/MLEB/CleanChanges/i18n/roa-tara.json b/MLEB/CleanChanges/i18n/roa-tara.json
index 4f27af0c..76e54f07 100644
--- a/MLEB/CleanChanges/i18n/roa-tara.json
+++ b/MLEB/CleanChanges/i18n/roa-tara.json
@@ -4,10 +4,8 @@
"Joetaras"
]
},
- "cleanchanges-changerightslink": "cange le gruppe",
"cleanchanges-desc": "Fa vedè cchiù combatte 'a [[Special:RecentChanges|liste de le cangiaminde recende]]",
"cleanchanges-language": "Lènghe:",
"cleanchanges-language-na": "Tutte",
- "cleanchanges-users": "Utinde (Sep: |):",
- "cleanchanges-showuserlinks": "Fa vedè le collagaminde de l'utende"
+ "cleanchanges-users": "Utinde (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ru.json b/MLEB/CleanChanges/i18n/ru.json
index dee42d8a..feb264f3 100644
--- a/MLEB/CleanChanges/i18n/ru.json
+++ b/MLEB/CleanChanges/i18n/ru.json
@@ -7,10 +7,8 @@
"Александр Сигачёв"
]
},
- "cleanchanges-changerightslink": "изменить группы",
"cleanchanges-desc": "Более сжатое представление [[Special:RecentChanges|списка свежих правок]]",
"cleanchanges-language": "Язык:",
"cleanchanges-language-na": "Все",
- "cleanchanges-users": "Участники (разделитель: |):",
- "cleanchanges-showuserlinks": "Показать ссылки участника"
+ "cleanchanges-users": "Участники (разделитель: |):"
}
diff --git a/MLEB/CleanChanges/i18n/rue.json b/MLEB/CleanChanges/i18n/rue.json
index 6e222403..36697982 100644
--- a/MLEB/CleanChanges/i18n/rue.json
+++ b/MLEB/CleanChanges/i18n/rue.json
@@ -4,9 +4,7 @@
"Gazeb"
]
},
- "cleanchanges-changerightslink": "змінити ґрупы",
"cleanchanges-language": "Язык:",
"cleanchanges-language-na": "Вшыткы",
- "cleanchanges-users": "Хоснователї (Оддїлёвач |):",
- "cleanchanges-showuserlinks": "Указати одказы хоснователя"
+ "cleanchanges-users": "Хоснователї (Оддїлёвач |):"
}
diff --git a/MLEB/CleanChanges/i18n/sah.json b/MLEB/CleanChanges/i18n/sah.json
index 163b6816..6678949e 100644
--- a/MLEB/CleanChanges/i18n/sah.json
+++ b/MLEB/CleanChanges/i18n/sah.json
@@ -4,10 +4,8 @@
"HalanTul"
]
},
- "cleanchanges-changerightslink": "бөлөхтөрү уларытыы",
"cleanchanges-desc": "[[Special:RecentChanges|Кэнники уларытыылары]] арыый дьаһамырдык көрдөрүү",
"cleanchanges-language": "Тыла:",
"cleanchanges-language-na": "Бары",
- "cleanchanges-users": "Кыттааччылар (араарыы: |):",
- "cleanchanges-showuserlinks": "Кыттааччылар сигэлэрин көрдөр"
+ "cleanchanges-users": "Кыттааччылар (араарыы: |):"
}
diff --git a/MLEB/CleanChanges/i18n/sh.json b/MLEB/CleanChanges/i18n/sh.json
index f72a43eb..80f2c3f1 100644
--- a/MLEB/CleanChanges/i18n/sh.json
+++ b/MLEB/CleanChanges/i18n/sh.json
@@ -4,10 +4,8 @@
"Vlad5250"
]
},
- "cleanchanges-changerightslink": "promijena grupa",
"cleanchanges-desc": "Kompaktniji prikaz [[Special:RecentChanges|nedavnih promjena]]",
"cleanchanges-language": "Jezik:",
"cleanchanges-language-na": "Svi",
- "cleanchanges-users": "Korisnici (razdjeljivač: |):",
- "cleanchanges-showuserlinks": "Prikaži korisničke linkove"
+ "cleanchanges-users": "Korisnici (razdjeljivač: |):"
}
diff --git a/MLEB/CleanChanges/i18n/shn.json b/MLEB/CleanChanges/i18n/shn.json
new file mode 100644
index 00000000..666c8253
--- /dev/null
+++ b/MLEB/CleanChanges/i18n/shn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Saimawnkham"
+ ]
+ },
+ "cleanchanges-language": "ၽႃႇသႃႇၵႂၢမ်း:"
+}
diff --git a/MLEB/CleanChanges/i18n/si.json b/MLEB/CleanChanges/i18n/si.json
index dc5cb999..ef9a7333 100644
--- a/MLEB/CleanChanges/i18n/si.json
+++ b/MLEB/CleanChanges/i18n/si.json
@@ -4,9 +4,7 @@
"පසිඳු කාවින්ද"
]
},
- "cleanchanges-changerightslink": "කාණ්ඩ වෙනස් කරන්න",
"cleanchanges-language": "භාෂාව:",
"cleanchanges-language-na": "සියල්ල",
- "cleanchanges-users": "පරිශීලකයන් (වෙන්: |):",
- "cleanchanges-showuserlinks": "පරිශීලක සබැඳි පෙන්වන්න"
+ "cleanchanges-users": "පරිශීලකයන් (වෙන්: |):"
}
diff --git a/MLEB/CleanChanges/i18n/sk.json b/MLEB/CleanChanges/i18n/sk.json
index 8cecd2d4..8f3e8675 100644
--- a/MLEB/CleanChanges/i18n/sk.json
+++ b/MLEB/CleanChanges/i18n/sk.json
@@ -4,10 +4,8 @@
"Helix84"
]
},
- "cleanchanges-changerightslink": "zmeniť skupiny",
"cleanchanges-desc": "Kompaktnejšie zobrazenie [[Special:RecentChanges|zoznamu posledných úprav]]",
"cleanchanges-language": "Jazyk:",
"cleanchanges-language-na": "Všetky",
- "cleanchanges-users": "Používatelia (Oddeľ: „|”):",
- "cleanchanges-showuserlinks": "Zobrazovať používateľské odkazy"
+ "cleanchanges-users": "Používatelia (Oddeľ: „|”):"
}
diff --git a/MLEB/CleanChanges/i18n/sl.json b/MLEB/CleanChanges/i18n/sl.json
index fdbead4c..1e526264 100644
--- a/MLEB/CleanChanges/i18n/sl.json
+++ b/MLEB/CleanChanges/i18n/sl.json
@@ -1,13 +1,12 @@
{
"@metadata": {
"authors": [
- "Dbc334"
+ "Dbc334",
+ "Eleassar"
]
},
- "cleanchanges-changerightslink": "spremeni skupine",
- "cleanchanges-desc": "Bolj strjen prikaz [[Special:RecentChanges|seznama zadnjih sprememb]]",
+ "cleanchanges-desc": "Bolj strnjen prikaz [[Special:RecentChanges|seznama zadnjih sprememb]]",
"cleanchanges-language": "Jezik:",
"cleanchanges-language-na": "Vse",
- "cleanchanges-users": "Uporabniki (ločilo: |):",
- "cleanchanges-showuserlinks": "Prikaži uporabniške povezave"
+ "cleanchanges-users": "Uporabniki (ločilo: |):"
}
diff --git a/MLEB/CleanChanges/i18n/smn.json b/MLEB/CleanChanges/i18n/smn.json
new file mode 100644
index 00000000..5279dd82
--- /dev/null
+++ b/MLEB/CleanChanges/i18n/smn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "cleanchanges-language": "Kielâ:"
+}
diff --git a/MLEB/CleanChanges/i18n/sr-ec.json b/MLEB/CleanChanges/i18n/sr-ec.json
index 1e16dcfc..bf228065 100644
--- a/MLEB/CleanChanges/i18n/sr-ec.json
+++ b/MLEB/CleanChanges/i18n/sr-ec.json
@@ -6,10 +6,8 @@
"Михајло Анђелковић"
]
},
- "cleanchanges-changerightslink": "промени групе",
"cleanchanges-desc": "Компактнији приказ списка [[Special:RecentChanges|скорашњих измена]]",
"cleanchanges-language": "Језик:",
"cleanchanges-language-na": "Све",
- "cleanchanges-users": "Корисници (раздв. |):",
- "cleanchanges-showuserlinks": "Прикажи корисничке везе"
+ "cleanchanges-users": "Корисници (раздв. |):"
}
diff --git a/MLEB/CleanChanges/i18n/sr-el.json b/MLEB/CleanChanges/i18n/sr-el.json
index 35fe1730..0c694c9e 100644
--- a/MLEB/CleanChanges/i18n/sr-el.json
+++ b/MLEB/CleanChanges/i18n/sr-el.json
@@ -5,10 +5,8 @@
"Rancher"
]
},
- "cleanchanges-changerightslink": "promeni grupe",
"cleanchanges-desc": "Kompaktniji prikaz spiska [[Special:RecentChanges|skorašnjih izmena]]",
"cleanchanges-language": "Jezik:",
"cleanchanges-language-na": "Sve",
- "cleanchanges-users": "Korisnici (razdv. |):",
- "cleanchanges-showuserlinks": "Pokaži korisničke linkove"
+ "cleanchanges-users": "Korisnici (razdv. |):"
}
diff --git a/MLEB/CleanChanges/i18n/stq.json b/MLEB/CleanChanges/i18n/stq.json
index 7cd0473b..0a7f1e59 100644
--- a/MLEB/CleanChanges/i18n/stq.json
+++ b/MLEB/CleanChanges/i18n/stq.json
@@ -4,10 +4,8 @@
"Pyt"
]
},
- "cleanchanges-changerightslink": "Benutsergjuchte",
"cleanchanges-desc": "Kompaktere Anwiesenge fon do [[Special:RecentChanges|lääste Annerengen]]",
"cleanchanges-language": "Sproake:",
"cleanchanges-language-na": "aal",
- "cleanchanges-users": "Benutsere (Tränteeken: |):",
- "cleanchanges-showuserlinks": "Wies Benutser-Linke"
+ "cleanchanges-users": "Benutsere (Tränteeken: |):"
}
diff --git a/MLEB/CleanChanges/i18n/su.json b/MLEB/CleanChanges/i18n/su.json
index 5b5a0672..80bbbaa2 100644
--- a/MLEB/CleanChanges/i18n/su.json
+++ b/MLEB/CleanChanges/i18n/su.json
@@ -5,10 +5,8 @@
"Kandar"
]
},
- "cleanchanges-changerightslink": "Ganti grup",
"cleanchanges-desc": "Pamidang leuwih basajan ti [[Special:RecentChanges|Nu anyar robah]]",
"cleanchanges-language": "Basa:",
"cleanchanges-language-na": "Kabéh",
- "cleanchanges-users": "Pamaké (Pisah: |):",
- "cleanchanges-showuserlinks": "Témbongkeun tutumbu pamaké"
+ "cleanchanges-users": "Pamaké (Pisah: |):"
}
diff --git a/MLEB/CleanChanges/i18n/sv.json b/MLEB/CleanChanges/i18n/sv.json
index fd2283bd..85c749ca 100644
--- a/MLEB/CleanChanges/i18n/sv.json
+++ b/MLEB/CleanChanges/i18n/sv.json
@@ -6,10 +6,8 @@
"Najami"
]
},
- "cleanchanges-changerightslink": "ändra grupper",
"cleanchanges-desc": "Visar [[Special:RecentChanges|senaste ändringarna]] på ett mer kompakt sätt",
"cleanchanges-language": "Språk:",
"cleanchanges-language-na": "Alla",
- "cleanchanges-users": "Användare (Separera med: |):",
- "cleanchanges-showuserlinks": "Visa användarlänkar"
+ "cleanchanges-users": "Användare (Separera med: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ta.json b/MLEB/CleanChanges/i18n/ta.json
index d5eecd52..5ae6e4e1 100644
--- a/MLEB/CleanChanges/i18n/ta.json
+++ b/MLEB/CleanChanges/i18n/ta.json
@@ -4,10 +4,8 @@
"TRYPPN"
]
},
- "cleanchanges-changerightslink": "குழுக்களை மாற்று",
"cleanchanges-desc": "[[Special:RecentChanges|அண்மைய மாற்றங்களின் பட்டியல்]] மிகச் சுருக்கமாக காட்டப்பட்டுள்ளது",
"cleanchanges-language": "மொழி:",
"cleanchanges-language-na": "அனைத்தும்",
- "cleanchanges-users": "பயனர்கள் (Sep: |):",
- "cleanchanges-showuserlinks": "பயனரின் இணைப்புக்களைக் காட்டவும்"
+ "cleanchanges-users": "பயனர்கள் (Sep: |):"
}
diff --git a/MLEB/CleanChanges/i18n/te.json b/MLEB/CleanChanges/i18n/te.json
index a979719e..21449023 100644
--- a/MLEB/CleanChanges/i18n/te.json
+++ b/MLEB/CleanChanges/i18n/te.json
@@ -5,10 +5,8 @@
"Veeven"
]
},
- "cleanchanges-changerightslink": "గుంపులను మార్చండి",
"cleanchanges-desc": "[[Special:RecentChanges|ఇటీవలి మార్పుల]]ని సంక్షిప్తముగా చూపుము",
"cleanchanges-language": "భాష:",
"cleanchanges-language-na": "అన్నీ",
- "cleanchanges-users": "వాడుకరులు (| తో వేరుపరచి):",
- "cleanchanges-showuserlinks": "వాడుకరి లింకులను చూపుము"
+ "cleanchanges-users": "వాడుకరులు (| తో వేరుపరచి):"
}
diff --git a/MLEB/CleanChanges/i18n/tg-cyrl.json b/MLEB/CleanChanges/i18n/tg-cyrl.json
index bdd7de65..fdc03e72 100644
--- a/MLEB/CleanChanges/i18n/tg-cyrl.json
+++ b/MLEB/CleanChanges/i18n/tg-cyrl.json
@@ -4,7 +4,6 @@
"Ibrahim"
]
},
- "cleanchanges-changerightslink": "тағйири гурӯҳҳо",
"cleanchanges-language": "Забон:",
"cleanchanges-language-na": "Ҳама"
}
diff --git a/MLEB/CleanChanges/i18n/tg-latn.json b/MLEB/CleanChanges/i18n/tg-latn.json
index 63f68dff..6af4d3a5 100644
--- a/MLEB/CleanChanges/i18n/tg-latn.json
+++ b/MLEB/CleanChanges/i18n/tg-latn.json
@@ -4,7 +4,6 @@
"Liangent"
]
},
- "cleanchanges-changerightslink": "taƣjiri gurūhho",
"cleanchanges-language": "Zabon:",
"cleanchanges-language-na": "Hama"
}
diff --git a/MLEB/CleanChanges/i18n/th.json b/MLEB/CleanChanges/i18n/th.json
index 2f1ccf85..e0825385 100644
--- a/MLEB/CleanChanges/i18n/th.json
+++ b/MLEB/CleanChanges/i18n/th.json
@@ -5,10 +5,8 @@
"Octahedron80"
]
},
- "cleanchanges-changerightslink": "เปลี่ยนแปลงกลุ่ม",
"cleanchanges-desc": "การแสดงผล[[Special:RecentChanges|รายการเปลี่ยนแปลงล่าสุด]]ที่กะทัดรัดมากขึ้น",
"cleanchanges-language": "ภาษา:",
"cleanchanges-language-na": "ทั้งหมด",
- "cleanchanges-users": "ผู้ใช้ (คั่นด้วย: |):",
- "cleanchanges-showuserlinks": "แสดงลิงก์ผู้ใช้"
+ "cleanchanges-users": "ผู้ใช้ (คั่นด้วย: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ti.json b/MLEB/CleanChanges/i18n/ti.json
new file mode 100644
index 00000000..8822fa14
--- /dev/null
+++ b/MLEB/CleanChanges/i18n/ti.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joanmp17"
+ ]
+ },
+ "cleanchanges-language": "ቋንቋ፦",
+ "cleanchanges-language-na": "ኩሎም"
+}
diff --git a/MLEB/CleanChanges/i18n/tl.json b/MLEB/CleanChanges/i18n/tl.json
index 33790634..f5bfd6aa 100644
--- a/MLEB/CleanChanges/i18n/tl.json
+++ b/MLEB/CleanChanges/i18n/tl.json
@@ -4,10 +4,8 @@
"AnakngAraw"
]
},
- "cleanchanges-changerightslink": "baguhin ang mga pangkat",
"cleanchanges-desc": "Mas masinsing pagpapalitaw ng [[Special:RecentChanges|talaan ng kamakailang mga pagbabago]]",
"cleanchanges-language": "Wika:",
"cleanchanges-language-na": "Lahat",
- "cleanchanges-users": "Mga tagagamit (Panghiwalay: |):",
- "cleanchanges-showuserlinks": "Ipakita ang mga kawing ng tagagamit"
+ "cleanchanges-users": "Mga tagagamit (Panghiwalay: |):"
}
diff --git a/MLEB/CleanChanges/i18n/tly.json b/MLEB/CleanChanges/i18n/tly.json
new file mode 100644
index 00000000..e239e390
--- /dev/null
+++ b/MLEB/CleanChanges/i18n/tly.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Patriot Kur"
+ ]
+ },
+ "cleanchanges-language-na": "Həmə"
+}
diff --git a/MLEB/CleanChanges/i18n/tr.json b/MLEB/CleanChanges/i18n/tr.json
index aeef1572..38973221 100644
--- a/MLEB/CleanChanges/i18n/tr.json
+++ b/MLEB/CleanChanges/i18n/tr.json
@@ -2,13 +2,12 @@
"@metadata": {
"authors": [
"Joseph",
- "Karduelis"
+ "Karduelis",
+ "MuratTheTurkish"
]
},
- "cleanchanges-changerightslink": "grupları değiştir",
- "cleanchanges-desc": "[[Special:RecentChanges|Son değişiklikler listesinin]] daha kompakt görünümü",
+ "cleanchanges-desc": "[[Special:RecentChanges|Son değişiklikler listesinin]] daha kavram görünümü",
"cleanchanges-language": "Dil:",
"cleanchanges-language-na": "Hepsi",
- "cleanchanges-users": "Kullanıcılar (Ayr: |):",
- "cleanchanges-showuserlinks": "Kullanıcı bağlantılarını göster"
+ "cleanchanges-users": "Kullanıcılar (Ayr: |):"
}
diff --git a/MLEB/CleanChanges/i18n/tt-cyrl.json b/MLEB/CleanChanges/i18n/tt-cyrl.json
index 62c37a8f..8a5bb9bb 100644
--- a/MLEB/CleanChanges/i18n/tt-cyrl.json
+++ b/MLEB/CleanChanges/i18n/tt-cyrl.json
@@ -5,10 +5,8 @@
"Рашат Якупов"
]
},
- "cleanchanges-changerightslink": "төркемнәрне төзәтергә",
"cleanchanges-desc": "[[Special:RecentChanges|Баягы төзәтмәләрнең]] тыгызлау",
"cleanchanges-language": "Тел:",
"cleanchanges-language-na": "Барысы",
- "cleanchanges-users": "Кулланучылар (бүлүче: |):",
- "cleanchanges-showuserlinks": "Кулланучылар сылтамаларын күрсәтү"
+ "cleanchanges-users": "Кулланучылар (бүлүче: |):"
}
diff --git a/MLEB/CleanChanges/i18n/uk.json b/MLEB/CleanChanges/i18n/uk.json
index 50ed3482..6e21c5eb 100644
--- a/MLEB/CleanChanges/i18n/uk.json
+++ b/MLEB/CleanChanges/i18n/uk.json
@@ -6,10 +6,8 @@
"Prima klasy4na"
]
},
- "cleanchanges-changerightslink": "змінити групи",
"cleanchanges-desc": "Більш стисле відображення [[Special:RecentChanges|списку останніх змін]]",
"cleanchanges-language": "Мова:",
"cleanchanges-language-na": "Усі",
- "cleanchanges-users": "Користувачі (через: |):",
- "cleanchanges-showuserlinks": "Показувати посилання користувачів"
+ "cleanchanges-users": "Користувачі (через: |):"
}
diff --git a/MLEB/CleanChanges/i18n/ur.json b/MLEB/CleanChanges/i18n/ur.json
index c1bd3a31..8dd36517 100644
--- a/MLEB/CleanChanges/i18n/ur.json
+++ b/MLEB/CleanChanges/i18n/ur.json
@@ -4,10 +4,8 @@
"Muhammad Shuaib"
]
},
- "cleanchanges-changerightslink": "حلقوں میں تبدیلی کریں",
"cleanchanges-desc": "[[Special:RecentChanges|حالیہ تبدیلیوں کی فہرست]] کو مزید پیوستہ کر دکھائیں",
"cleanchanges-language": "زبان:",
"cleanchanges-language-na": "تمام",
- "cleanchanges-users": "صارفین (برائے فصل: |):",
- "cleanchanges-showuserlinks": "صارف کے روابط دکھائیں"
+ "cleanchanges-users": "صارفین (برائے فصل: |):"
}
diff --git a/MLEB/CleanChanges/i18n/vec.json b/MLEB/CleanChanges/i18n/vec.json
index c5072e64..cfe9b605 100644
--- a/MLEB/CleanChanges/i18n/vec.json
+++ b/MLEB/CleanChanges/i18n/vec.json
@@ -4,10 +4,8 @@
"Candalua"
]
},
- "cleanchanges-changerightslink": "canbia grupi",
"cleanchanges-desc": "Visualixassion pi conpatta de la [[Special:RecentChanges|lista dei canbiamenti reçenti]]",
"cleanchanges-language": "Lengua:",
"cleanchanges-language-na": "Tute",
- "cleanchanges-users": "Utenti (separà da |):",
- "cleanchanges-showuserlinks": "Mostra colegamenti utente"
+ "cleanchanges-users": "Utenti (separà da |):"
}
diff --git a/MLEB/CleanChanges/i18n/vi.json b/MLEB/CleanChanges/i18n/vi.json
index 823a7676..13d8f61b 100644
--- a/MLEB/CleanChanges/i18n/vi.json
+++ b/MLEB/CleanChanges/i18n/vi.json
@@ -6,10 +6,8 @@
"Vinhtantran"
]
},
- "cleanchanges-changerightslink": "thay đổi nhóm",
"cleanchanges-desc": "Hiển thị [[Special:RecentChanges|danh sách thay đổi gần đây]] ngắn gọn hơn",
"cleanchanges-language": "Ngôn ngữ:",
"cleanchanges-language-na": "Tất cả",
- "cleanchanges-users": "Thành viên (Phân cách: |):",
- "cleanchanges-showuserlinks": "Hiện liên kết người dùng"
+ "cleanchanges-users": "Thành viên (Phân cách: |):"
}
diff --git a/MLEB/CleanChanges/i18n/vo.json b/MLEB/CleanChanges/i18n/vo.json
index 5e319f07..2c00d75f 100644
--- a/MLEB/CleanChanges/i18n/vo.json
+++ b/MLEB/CleanChanges/i18n/vo.json
@@ -4,10 +4,8 @@
"Smeira"
]
},
- "cleanchanges-changerightslink": "votükön grupis",
"cleanchanges-desc": "Jonön ma fomät brefikum [[Special:RecentChanges|lisedi votükamas nulik]]",
"cleanchanges-language": "Pük:",
"cleanchanges-language-na": "Valiks",
- "cleanchanges-users": "Gebans (teilamal: |):",
- "cleanchanges-showuserlinks": "Jonön gebanayümis"
+ "cleanchanges-users": "Gebans (teilamal: |):"
}
diff --git a/MLEB/CleanChanges/i18n/wa.json b/MLEB/CleanChanges/i18n/wa.json
index d5b9a845..1e8c1c18 100644
--- a/MLEB/CleanChanges/i18n/wa.json
+++ b/MLEB/CleanChanges/i18n/wa.json
@@ -4,10 +4,8 @@
"Srtxg"
]
},
- "cleanchanges-changerightslink": "candjî les groupes",
"cleanchanges-desc": "Håynaedje pus rasseré del [[Special:RecentChanges|djivêye des dierins candjmints]]",
"cleanchanges-language": "Lingaedje:",
"cleanchanges-language-na": "Tos",
- "cleanchanges-users": "Uzeus (disp. avou |):",
- "cleanchanges-showuserlinks": "Mostrer les loyéns d' l' uzeus"
+ "cleanchanges-users": "Uzeus (disp. avou |):"
}
diff --git a/MLEB/CleanChanges/i18n/zh-hans.json b/MLEB/CleanChanges/i18n/zh-hans.json
index 384a291e..08da47f4 100644
--- a/MLEB/CleanChanges/i18n/zh-hans.json
+++ b/MLEB/CleanChanges/i18n/zh-hans.json
@@ -8,10 +8,8 @@
"Xiaomingyan"
]
},
- "cleanchanges-changerightslink": "更改群组",
"cleanchanges-desc": "更简洁的显示[[Special:RecentChanges|最近更改清单]]",
"cleanchanges-language": "语言:",
"cleanchanges-language-na": "所有",
- "cleanchanges-users": "用户(分隔符:|):",
- "cleanchanges-showuserlinks": "显示用户链接"
+ "cleanchanges-users": "用户(分隔符:|):"
}
diff --git a/MLEB/CleanChanges/i18n/zh-hant.json b/MLEB/CleanChanges/i18n/zh-hant.json
index aa947e68..db323d27 100644
--- a/MLEB/CleanChanges/i18n/zh-hant.json
+++ b/MLEB/CleanChanges/i18n/zh-hant.json
@@ -12,10 +12,8 @@
"Xiplus"
]
},
- "cleanchanges-changerightslink": "變更群組",
"cleanchanges-desc": "更精簡的顯示[[Special:RecentChanges|最近變更清單]]",
"cleanchanges-language": "語言:",
"cleanchanges-language-na": "全部",
- "cleanchanges-users": "使用者 (分隔: |):",
- "cleanchanges-showuserlinks": "顯示使用者連結"
+ "cleanchanges-users": "使用者 (分隔: |):"
}
diff --git a/MLEB/CleanChanges/images/Arr_.png b/MLEB/CleanChanges/images/Arr_.png
deleted file mode 100644
index c0384e4e..00000000
--- a/MLEB/CleanChanges/images/Arr_.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/images/Arr_d.png b/MLEB/CleanChanges/images/Arr_d.png
deleted file mode 100644
index d476a168..00000000
--- a/MLEB/CleanChanges/images/Arr_d.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/images/Arr_l.png b/MLEB/CleanChanges/images/Arr_l.png
deleted file mode 100644
index 970c0e55..00000000
--- a/MLEB/CleanChanges/images/Arr_l.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/images/Arr_r.png b/MLEB/CleanChanges/images/Arr_r.png
deleted file mode 100644
index 82f5369a..00000000
--- a/MLEB/CleanChanges/images/Arr_r.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/images/Arr_u.png b/MLEB/CleanChanges/images/Arr_u.png
deleted file mode 100644
index 8566f6b7..00000000
--- a/MLEB/CleanChanges/images/Arr_u.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/images/showuserlinks.png b/MLEB/CleanChanges/images/showuserlinks.png
deleted file mode 100644
index 872a40f5..00000000
--- a/MLEB/CleanChanges/images/showuserlinks.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/CleanChanges/includes/CCFilters.php b/MLEB/CleanChanges/includes/CCFilters.php
index 477c6d91..d788dd8c 100644
--- a/MLEB/CleanChanges/includes/CCFilters.php
+++ b/MLEB/CleanChanges/includes/CCFilters.php
@@ -154,4 +154,17 @@ class CCFilters {
$items['tailer'] = [ wfMessage( 'cleanchanges-language' )->escaped(), $str ];
}
+
+ /**
+ * Hook: FetchChangesList
+ * @param User $user
+ * @param Skin $skin
+ */
+ public static function hook( User $user, Skin $skin ): void {
+ global $wgCCTrailerFilter;
+
+ if ( $wgCCTrailerFilter && defined( 'ULS_VERSION' ) ) {
+ $skin->getOutput()->addModules( 'ext.cleanchanges.uls' );
+ }
+ }
}
diff --git a/MLEB/CleanChanges/includes/NCL.php b/MLEB/CleanChanges/includes/NCL.php
deleted file mode 100644
index 1fa5c014..00000000
--- a/MLEB/CleanChanges/includes/NCL.php
+++ /dev/null
@@ -1,756 +0,0 @@
-<?php
-
-/**
- * Generate a list of changes using an Enhanced system (use javascript).
- */
-class NCL extends EnhancedChangesList {
- /**
- * Determines which version of changes list to provide, or none.
- * @param User $user
- * @param Skin $skin
- * @param array &$list
- * @return bool
- */
- public static function hook( User $user, Skin $skin, &$list ) {
- global $wgCCTrailerFilter, $wgCCFiltersOnly;
-
- $list = null;
-
- if ( $wgCCTrailerFilter && defined( 'ULS_VERSION' ) ) {
- $skin->getOutput()->addModules( 'ext.cleanchanges.uls' );
- }
-
- if ( $wgCCFiltersOnly ) {
- return true;
- }
-
- /* allow override */
- $request = $skin->getRequest();
- if ( $request->getBool( 'cleanrc' ) ) {
- $list = new NCL( $skin );
- }
- if ( $request->getBool( 'newrc' ) ) {
- $list = new EnhancedChangesList( $skin );
- }
- if ( $request->getBool( 'oldrc' ) ) {
- $list = new OldChangesList( $skin );
- }
-
- if ( !$list && $user->getOption( 'usenewrc' ) ) {
- $list = new NCL( $skin );
- }
-
- if ( $list instanceof NCL ) {
- $skin->getOutput()->addModules( 'ext.cleanchanges' );
- }
-
- /* If some list was specified, stop processing */
- return $list === null;
- }
-
- protected static $userinfo = [];
-
- /**
- * @param array &$vars
- * @return bool
- */
- public static function addScriptVariables( &$vars ) {
- $vars += self::$userinfo;
- return true;
- }
-
- /**
- * String that comes between page details and the user details. By default
- * only larger space.
- */
- protected $userSeparator = "\xc2\xa0 \xc2\xa0";
-
- /**
- * Text direction, true for ltr and false for rtl
- */
- protected $direction = true;
-
- /**
- * Text direction mark (LRM or RLM)
- * @var string
- */
- protected $dir;
-
- /**
- * @param IContextSource|Skin $skin
- */
- public function __construct( $skin ) {
- $lang = $this->getLanguage();
- parent::__construct( $skin );
- $this->direction = !$lang->isRTL();
- $this->dir = $lang->getDirMark();
- }
-
- /**
- * @return String
- */
- public function beginRecentChangesList() {
- parent::beginRecentChangesList();
- $dir = $this->direction ? 'ltr' : 'rtl';
- return Xml::openElement(
- 'div',
- [ 'style' => "direction: $dir" ]
- );
- }
-
- /**
- * @return string
- */
- public function endRecentChangesList() {
- return $this->recentChangesBlock() . '</div>';
- }
-
- /**
- * @param RCCacheEntry|null $rc
- * @return int
- */
- protected function isLog( RCCacheEntry $rc = null ) {
- if ( $rc && $rc->getAttribute( 'rc_type' ) == RC_LOG ) {
- return 2;
- }
- return 0;
- }
-
- /**
- * @param RCCacheEntry $rc
- * @return string
- */
- protected function getLogTitle( RCCacheEntry $rc ) {
- $logtype = $rc->getAttribute( 'rc_log_type' );
- $logpage = new LogPage( $logtype );
- $logname = $logpage->getName()->escaped();
- $titleObj = SpecialPage::getTitleFor( 'Log', $logtype );
- $link = Linker::link( $titleObj, $logname );
- return $this->msg( 'parentheses' )->rawParams( $link )->escaped();
- }
-
- /**
- * Format a line for enhanced recentchange (aka with JavaScript and block of lines).
- * @param RecentChange &$baseRC
- * @param bool $watched
- * @param int|null $linenumber
- * @return string
- */
- public function recentChangesLine( &$baseRC, $watched = false, $linenumber = null ) {
- # Create a specialised object
- $rc = RCCacheEntry::newFromParent( $baseRC );
-
- // Extract most used variables
- $timestamp = $rc->getAttribute( 'rc_timestamp' );
- $titleObj = $rc->getTitle();
- $rc_id = $rc->getAttribute( 'rc_id' );
-
- $lang = $this->getLanguage();
- $date = $lang->date( $timestamp, /* adj */ true, /* format */ true );
- $time = $lang->time( $timestamp, /* adj */ true, /* format */ true );
-
- # Should patrol-related stuff be shown?
- $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
-
- $logEntry = $this->isLog( $rc );
- if ( $logEntry ) {
- $clink = $this->getLogTitle( $rc );
- } elseif ( $rc->unpatrolled && $rc->getAttribute( 'rc_type' ) == RC_NEW ) {
- # Unpatrolled new page, give rc_id in query
- $clink = linker::linkKnown(
- $titleObj,
- null,
- [],
- [ 'rcid' => $rc_id ]
- );
- } else {
- $clink = Linker::linkKnown( $titleObj );
- }
-
- $rc->watched = $watched;
- $rc->link = $this->maybeWatchedLink( $clink, $watched );
- $rc->timestamp = $time;
- $rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
- $rc->_reqCurId = [ 'curid' => $rc->getAttribute( 'rc_cur_id' ) ];
- $rc->_reqOldId = [ 'oldid' => $rc->getAttribute( 'rc_this_oldid' ) ];
- $this->makeLinks( $rc );
-
- // Make user links
- if ( self::isDeleted( $rc, Revision::DELETED_USER ) ) {
- $rc->_user = ' <span class="history-deleted">' .
- $this->msg( 'rev-deleted-user' )->escaped() .
- '</span>';
- $rc->_userInfo = '';
- self::$userinfo += [];
- } else {
- // @phan-suppress-next-line SecurityCheck-DoubleEscaped
- $rc->_user = Linker::userLink(
- $rc->getAttribute( 'rc_user' ),
- $rc->getAttribute( 'rc_user_text' )
- );
- $stuff = $this->userToolLinks(
- $rc->getAttribute( 'rc_user' ),
- $rc->getAttribute( 'rc_user_text' )
- );
- // TODO: userToolLinks can return ''
- self::$userinfo += $stuff[1];
- $rc->_userInfo = $stuff[0];
- }
-
- if ( !$this->isLog( $rc ) ) {
- $rc->_comment = $this->getComment( $rc );
- }
-
- $rc->_watching = $this->numberofWatchingusers( $baseRC->numberofWatchingusers );
-
- # If it's a new day, add the headline and flush the cache
- $ret = '';
- if ( $date !== $this->lastdate ) {
- # Process current cache
- $ret = $this->recentChangesBlock();
- $this->rc_cache = [];
- $ret .= Xml::element( 'h4', null, $date ) . "\n";
- $this->lastdate = $date;
- }
-
- # Put accumulated information into the cache, for later display
- # Page moves go on their own line
- if ( $logEntry ) {
- $secureName = $this->getLogTitle( $rc );
- } else {
- $secureName = $titleObj->getPrefixedDBkey();
- }
- $this->rc_cache[$secureName][] = $rc;
-
- return $ret;
- }
-
- /**
- * @param RCCacheEntry $rc
- */
- protected function makeLinks( RCCacheEntry $rc ) {
- /* These will be overriden with actual links below, if applicable */
- $rc->_curLink = $this->message['cur'];
- $rc->_diffLink = $this->message['diff'];
- $rc->_lastLink = $this->message['last'];
- $rc->_histLink = $this->message['hist'];
-
- if ( !$this->isLog( $rc ) ) {
- # Make cur, diff and last links
- $querycur = [ 'diff' => 0 ] + $rc->_reqCurId + $rc->_reqOldId;
- $querydiff = [
- 'diff' => $rc->getAttribute( 'rc_this_oldid' ),
- 'oldid' => $rc->getAttribute( 'rc_last_oldid' ),
- 'rcid' => $rc->unpatrolled ? $rc->getAttribute( 'rc_id' ) : '',
- ] + $rc->_reqCurId;
-
- $rc->_curLink = Linker::linkKnown( $rc->getTitle(),
- $this->message['cur'], [], $querycur );
-
- if ( $rc->getAttribute( 'rc_type' ) != RC_NEW ) {
- $rc->_diffLink = Linker::linkKnown( $rc->getTitle(),
- $this->message['diff'], [], $querydiff );
- }
-
- if ( $rc->getAttribute( 'rc_last_oldid' ) != 0 ) {
- // This is not the first revision
- $rc->_lastLink = Linker::linkKnown( $rc->getTitle(),
- $this->message['last'], [], $querydiff );
- }
-
- $rc->_histLink = Linker::link( $rc->getTitle(),
- $this->message['hist'], [],
- $rc->_reqCurId + [ 'action' => 'history' ]
- );
- }
- }
-
- /**
- * Enhanced RC group
- * @param RCCacheEntry[] $block
- * @return string
- */
- protected function recentChangesBlockGroup( $block ) {
- # Collate list of users
- $isnew = false;
- $userlinks = [];
- $overrides = [ 'minor' => false, 'bot' => false ];
- $oldid = 0;
- foreach ( $block as $rcObj ) {
- $oldid = $rcObj->getAttribute( 'rc_last_oldid' );
- if ( $rcObj->getAttribute( 'rc_new' ) ) {
- $isnew = $overrides['new'] = true;
- }
- $u = $rcObj->_user;
- if ( !isset( $userlinks[$u] ) ) {
- $userlinks[$u] = 0;
- }
- if ( $rcObj->unpatrolled ) {
- $overrides['patrol'] = true;
- }
-
- $userlinks[$u]++;
- }
-
- # Main line, flags and timestamp
-
- $info = Xml::tags( 'code', null,
- $this->getFlags( $block[0], $overrides ) . ' ' . $block[0]->timestamp );
- $rci = 'RCI' . $this->rcCacheIndex;
- $rcl = 'RCL' . $this->rcCacheIndex;
- $rcm = 'RCM' . $this->rcCacheIndex;
- $linkAttribs = [
- 'data-mw-cleanchanges-level' => $rci,
- 'data-mw-cleanchanges-other' => $rcm,
- 'data-mw-cleanchanges-link' => $rcl,
- 'tabindex' => '0',
- 'role' => 'button',
- 'class' => 'mw-cleanchanges-showblock'
- ];
- $tl =
- Xml::tags( 'span', [ 'id' => $rcm ],
- Xml::tags( 'a', $linkAttribs,
- $this->arrow( $this->direction ? 'r' : 'l' ) ) ) .
- Xml::tags( 'span', [ 'id' => $rcl, 'style' => 'display: none;' ],
- Xml::tags( 'a', $linkAttribs, $this->downArrow() ) );
-
- $items = [ $tl . $info ];
-
- # Article link
- $items[] = $block[0]->link;
-
- $log = $this->isLog( $block[0] );
- if ( !$log ) {
- # Changes
- $n = count( $block );
- static $nchanges = [];
- if ( !isset( $nchanges[$n] ) ) {
- $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
- }
-
- if ( !$isnew ) {
- $changes = Linker::linkKnown(
- $block[0]->getTitle(),
- $nchanges[$n],
- [],
- [
- 'curid' => $block[0]->getAttribute( 'rc_cur_id' ),
- 'diff' => $block[0]->getAttribute( 'rc_this_oldid' ),
- 'oldid' => $oldid
- ]
- );
- } else {
- $changes = $nchanges[$n];
- }
-
- $size = $this->getCharacterDifference( $block[0], $block[count( $block ) - 1] );
- $items[] = $this->changeInfo( $changes, $block[0]->_histLink, $size );
- }
-
- $items[] = $this->userSeparator;
-
- # Sort the list and convert to text
- $items[] = $this->makeUserlinks( $userlinks );
- $items[] = $block[0]->_watching;
-
- $lines = Xml::tags( 'div', null, implode( " {$this->dir}", $items ) ) . "\n";
-
- # Sub-entries
- $lines .= Xml::tags( 'div',
- [ 'id' => $rci, 'style' => 'display: none;' ],
- $this->subEntries( $block )
- ) . "\n";
-
- $this->rcCacheIndex++;
- return $lines . "\n";
- }
-
- /**
- * Generate HTML for an arrow or placeholder graphic
- * @param string $dir One of '', 'd', 'l', 'r'
- * @param string $alt
- * @param string $title
- * @return string HTML "<img>" tag
- */
- protected function arrow( $dir, $alt = '', $title = '' ) {
- global $wgExtensionAssetsPath;
-
- return Html::element(
- 'img',
- [
- 'src' => "$wgExtensionAssetsPath/CleanChanges/images/Arr_$dir.png",
- 'width' => 12,
- 'height' => 12,
- 'alt' => $alt,
- 'title' => $title,
- ]
- );
- }
-
- /**
- * Generate HTML for a right- or left-facing arrow,
- * depending on language direction.
- * @return string HTML "<img>" tag
- */
- protected function sideArrow() {
- $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
-
- return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
- }
-
- /**
- * Generate HTML for a down-facing arrow
- * depending on language direction.
- * @return string HTML "<img>" tag
- */
- protected function downArrow() {
- return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
- }
-
- /**
- * Generate HTML for a spacer image
- * @return string HTML "<img>" tag
- */
- protected function spacerArrow() {
- return $this->arrow( '', UtfNormal\Utils::codepointToUtf8( 0xa0 ) ); // non-breaking space
- }
-
- /**
- * @param RCCacheEntry[] $block
- * @return string
- */
- protected function subEntries( array $block ) {
- $lines = '';
- foreach ( $block as $rcObj ) {
- $items = [];
- $log = $this->isLog( $rcObj );
-
- $time = $rcObj->timestamp;
- if ( !$log ) {
- $time = Linker::linkKnown(
- $rcObj->getTitle(),
- htmlspecialchars( $rcObj->timestamp ),
- [],
- /** @phan-suppress-next-line PhanTypeMismatchArgument */
- $rcObj->_reqOldId + $rcObj->_reqCurId
- );
- }
-
- $info = $this->getFlags( $rcObj ) . ' ' . $time;
- $items[] = $this->spacerArrow() . Xml::tags( 'code', null, $info );
-
- if ( !$log ) {
- $cur = $rcObj->_curLink;
- $last = $rcObj->_lastLink;
-
- if ( $block[0] === $rcObj ) {
- // no point diffing first to first
- $cur = $this->message['cur'];
- }
-
- $items[] = $this->changeInfo( $cur, $last, $this->getCharacterDifference( $rcObj ) );
- }
-
- $items[] = $this->userSeparator;
-
- if ( $this->isLog( $rcObj ) ) {
- $items[] = $this->insertLogEntry( $rcObj );
- } else {
- $items[] = $rcObj->_user;
- $items[] = $rcObj->_userInfo;
- $items[] = $rcObj->_comment;
- }
-
- $lines .= '<div>' . implode( " {$this->dir}", $items ) . "</div>\n";
- }
- return $lines;
- }
-
- /**
- * @param string $diff
- * @param string $hist
- * @param mixed $size
- * @return string
- */
- protected function changeInfo( $diff, $hist, $size ) {
- if ( is_int( $size ) ) {
- $size = $this->wrapCharacterDifference( $size );
- // FIXME: i18n: Hard coded parentheses and spaces.
- return $this->msg( 'cleanchanges-rcinfo-3' )->rawParams( $diff, $hist, $size )->escaped();
- } else {
- return $this->msg( 'cleanchanges-rcinfo-2' )->rawParams( $diff, $hist )->escaped();
- }
- }
-
- /**
- * Enhanced RC ungrouped line.
- * @param RCCacheEntry $rcObj
- * @return string a HTML formated line
- */
- protected function recentChangesBlockLine( $rcObj ) {
- # Flag and Timestamp
- $info = $this->getFlags( $rcObj ) . ' ' . $rcObj->timestamp;
- $items = [ $this->spacerArrow() . Xml::tags( 'code', null, $info ) ];
-
- # Article link
- $items[] = $rcObj->link;
-
- if ( !$this->isLog( $rcObj ) ) {
- $items[] = $this->changeInfo( $rcObj->_diffLink, $rcObj->_histLink,
- $this->getCharacterDifference( $rcObj )
- );
- }
-
- $items[] = $this->userSeparator;
-
- if ( $this->isLog( $rcObj ) ) {
- $items[] = $this->insertLogEntry( $rcObj );
- } else {
- $items[] = $rcObj->_user;
- $items[] = $rcObj->_userInfo;
- $items[] = $rcObj->_comment;
- $items[] = $rcObj->_watching;
- }
-
- return '<div>' . implode( " {$this->dir}", $items ) . "</div>\n";
- }
-
- /**
- * @param RCCacheEntry $rc
- * @return string
- */
- public function getComment( RCCacheEntry $rc ) {
- $comment = $rc->getAttribute( 'rc_comment' );
- $action = '';
- if ( $comment === '' ) {
- return $action;
- } elseif ( self::isDeleted( $rc, LogPage::DELETED_COMMENT ) ) {
- $priviledged = $this->getUser()->isAllowed( 'deleterevision' );
- if ( $priviledged ) {
- return $action . ' <span class="history-deleted">' .
- Linker::formatComment( $comment ) .
- '</span>';
- }
- return $action . ' <span class="history-deleted">' .
- $this->msg( 'rev-deleted-comment' )->escaped() .
- '</span>';
- }
- return $action . Linker::commentBlock( $comment, $rc->getTitle() );
- }
-
- /**
- * Enhanced user tool links, with javascript functionality.
- * @param int $userId user id, 0 for anons
- * @param string $userText username
- * @return array|string Either an array of html and array of messages, or ''
- * [0]: html span and links to user tools
- * [1]: array of escaped message strings
- */
- public function userToolLinks( $userId, $userText ) {
- global $wgDisableAnonTalk;
- $talkable = !( $wgDisableAnonTalk && 0 == $userId );
-
- /*
- * Assign each different user a running id. This is used to show user tool
- * links on demand with javascript, to reduce page size when one user has
- * multiple changes.
- *
- * $linkindex is the running id, and $users contain username -> html snippet
- * for javascript.
- */
-
- static $linkindex = 0;
- $linkindex++;
-
- static $users = [];
- $userindex = array_search( $userText, $users, true );
- if ( $userindex === false ) {
- $users[] = $userText;
- $userindex = count( $users ) - 1;
- }
-
- global $wgExtensionAssetsPath;
- $image = Xml::element( 'img', [
- 'src' => $wgExtensionAssetsPath . '/CleanChanges/images/showuserlinks.png',
- 'alt' => $this->msg( 'cleanchanges-showuserlinks' )->text(),
- 'title' => $this->msg( 'cleanchanges-showuserlinks' )->text(),
- 'width' => '15',
- 'height' => '11',
- ]
- );
-
- $rci = 'RCUI' . $userindex;
- $rcl = 'RCUL' . $linkindex;
- $rcm = 'RCUM' . $linkindex;
- $linkAttribs = [
- 'tabindex' => '0',
- 'role' => 'button',
- 'class' => 'mw-cleanchanges-showuserinfo',
- 'data-mw-userinfo-id' => $rci,
- 'data-mw-userinfo-target' => $rcl
- ];
- $tl = Xml::tags( 'span', [ 'id' => $rcm ],
- Xml::tags( 'a', $linkAttribs, $image )
- );
- $tl .= Xml::element( 'span', [ 'id' => $rcl ], ' ' );
-
- $items = [];
- if ( $talkable ) {
- $items[] = Linker::userTalkLink( $userId, $userText );
- }
- if ( $userId ) {
- $targetPage = SpecialPage::getTitleFor( 'Contributions', $userText );
- $items[] = Linker::linkKnown( $targetPage,
- $this->msg( 'contribslink' )->escaped() );
- }
- if ( $this->getUser()->isAllowed( 'block' ) ) {
- $items[] = Linker::blockLink( $userId, $userText );
- }
- if ( $userId ) {
- $userrightsPage = new UserrightsPage();
- if ( $userrightsPage->userCanChangeRights( User::newFromId( $userId ) ) ) {
- $targetPage = SpecialPage::getTitleFor( 'Userrights', $userText );
- $items[] = Linker::linkKnown( $targetPage,
- $this->msg( 'cleanchanges-changerightslink' )->escaped() );
- }
- }
-
- if ( $items ) {
- $msg = $this->msg( 'parentheses' )
- ->rawParams( $this->getLanguage()->pipeList( $items ) )
- ->escaped();
- $data = [ "wgUserInfo$rci" => $msg ];
-
- return [ $tl, $data ];
- } else {
- return '';
- }
- }
-
- /**
- * Makes aggregated list of contributors for a changes group.
- * Example: [Usera; AnotherUser; ActiveUser ‎(2×); Userabc ‎(6×)]
- * @param array $userlinks
- * @return string
- */
- protected function makeUserlinks( $userlinks ) {
- /*
- * User with least changes first, and fallback to alphabetical sorting if
- * multiple users have same number of changes.
- */
- krsort( $userlinks );
- asort( $userlinks );
-
- $users = [];
- foreach ( $userlinks as $userlink => $count ) {
- $text = $userlink;
- if ( $count > 1 ) {
- $lang = $this->getLanguage();
- $count = $lang->formatNum( $count );
- $text .= "{$lang->getDirMark()}×$count";
- }
- array_push( $users, $text );
- }
- $text = implode( '; ', $users );
- return $this->XMLwrapper( 'changedby', "[$text]", 'span', false );
- }
-
- /**
- * @param RCCacheEntry $rc
- * @param array|null $overrides
- * @return string
- */
- protected function getFlags( $rc, array $overrides = null ) {
- // @todo We assume all characters are of equal width, which they may be not
- $map = [
- # item => field letter-or-something
- 'new' => [ 'rc_new', self::flag( 'newpage' ) ],
- 'minor' => [ 'rc_minor', self::flag( 'minor' ) ],
- 'bot' => [ 'rc_bot', self::flag( 'bot' ) ],
- ];
-
- static $nothing = "\xc2\xa0";
-
- $items = [];
- foreach ( $map as $item => $data ) {
- list( $field, $flag ) = $data;
- $bool = $overrides[$item] ?? $rc->getAttribute( $field );
- $items[] = $bool ? $flag : $nothing;
- }
-
- if ( $this->getUser()->useRCPatrol() ) {
- if ( isset( $overrides['patrol'] ) ) {
- $items[] = $overrides['patrol'] ? self::flag( 'unpatrolled' ) : $nothing;
- } elseif ( $this->showAsUnpatrolled( $rc ) ) {
- $items[] = self::flag( 'unpatrolled' );
- } else {
- $items[] = $nothing;
- }
- }
-
- return implode( '', $items );
- }
-
- /**
- * @param RCCacheEntry $new
- * @param RCCacheEntry|null $old
- * @return mixed
- */
- protected function getCharacterDifference( $new, $old = null ) {
- if ( $old === null ) {
- $old = $new;
- }
-
- $newSize = $new->getAttribute( 'rc_new_len' );
- $oldSize = $old->getAttribute( 'rc_old_len' );
- if ( $newSize === null || $oldSize === null ) {
- // @todo Return null instead of string here?
- return '';
- }
-
- return $newSize - $oldSize;
- }
-
- /**
- * @param mixed $szdiff Character difference.
- * @return string
- */
- public function wrapCharacterDifference( $szdiff ) {
- global $wgRCChangedSizeThreshold;
- static $cache = [];
- if ( !isset( $cache[$szdiff] ) ) {
- // @todo FIXME: Hard coded text (+).
- $prefix = $szdiff > 0 ? '+' : '';
- $cache[$szdiff] = $prefix . $this->msg( 'rc-change-size',
- $this->getLanguage()->formatNum( $szdiff )
- )->text();
- }
-
- $tag = 'span';
- if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
- $tag = 'strong';
- }
-
- if ( $szdiff === 0 ) {
- return $this->XMLwrapper( 'mw-plusminus-null', $cache[$szdiff], $tag );
- } elseif ( $szdiff > 0 ) {
- return $this->XMLwrapper( 'mw-plusminus-pos', $cache[$szdiff], $tag );
- }
- return $this->XMLwrapper( 'mw-plusminus-neg', $cache[$szdiff], $tag );
- }
-
- /**
- * @param string $class
- * @param string $content
- * @param string $tag
- * @param bool $escape
- * @return string
- */
- protected function XMLwrapper( $class, $content, $tag = 'span', $escape = true ) {
- if ( $escape ) {
- return Xml::element( $tag, [ 'class' => $class ], $content );
- }
- return Xml::tags( $tag, [ 'class' => $class ], $content );
- }
-}
diff --git a/MLEB/CleanChanges/package-lock.json b/MLEB/CleanChanges/package-lock.json
index 1c7e81ab..71ee651a 100644
--- a/MLEB/CleanChanges/package-lock.json
+++ b/MLEB/CleanChanges/package-lock.json
@@ -12,29 +12,49 @@
}
},
"@babel/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
- "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helpers": "^7.9.0",
- "@babel/parser": "^7.9.0",
- "@babel/template": "^7.8.6",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.7.tgz",
+ "integrity": "sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.7",
+ "@babel/types": "^7.12.7",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
"json5": "^2.1.2",
- "lodash": "^4.17.13",
+ "lodash": "^4.17.19",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -44,125 +64,125 @@
}
},
"@babel/generator": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
- "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
"dev": true,
"requires": {
- "@babel/types": "^7.9.5",
+ "@babel/types": "^7.12.5",
"jsesc": "^2.5.1",
- "lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-function-name": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
- "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.9.5"
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
- "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.9.0",
- "lodash": "^4.17.13"
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz",
+ "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.11.0"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
- "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
"dev": true
},
"@babel/helpers": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
- "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0"
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/highlight": {
@@ -177,48 +197,81 @@
}
},
"@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==",
"dev": true
},
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
"@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ }
}
},
"@babel/traverse": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
- "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.7.tgz",
+ "integrity": "sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.5",
- "@babel/helper-function-name": "^7.9.5",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.5",
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.13"
+ "lodash": "^4.17.19"
},
"dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -228,16 +281,53 @@
}
},
"@babel/types": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
- "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.5",
- "lodash": "^4.17.13",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz",
+ "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
"@nodelib/fs.scandir": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
@@ -265,22 +355,22 @@
}
},
"@stylelint/postcss-css-in-js": {
- "version": "0.37.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz",
- "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==",
+ "version": "0.37.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+ "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
"dev": true,
"requires": {
"@babel/core": ">=7.9.0"
}
},
"@stylelint/postcss-markdown": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
- "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
"dev": true,
"requires": {
- "remark": "^12.0.0",
- "unist-util-find-all-after": "^3.0.1"
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
}
},
"@types/color-name": {
@@ -289,10 +379,25 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
"@types/minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
"dev": true
},
"@types/normalize-package-data": {
@@ -313,11 +418,15 @@
"integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
"dev": true
},
- "JSV": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
- "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
- "dev": true
+ "JSONStream": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz",
+ "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": ">=2.2.7 <3"
+ }
},
"abbrev": {
"version": "1.1.1",
@@ -326,24 +435,24 @@
"dev": true
},
"acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
- "version": "6.10.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
- "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
@@ -397,6 +506,12 @@
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
+ "array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true
+ },
"array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
@@ -433,10 +548,16 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "ast-metadata-inferer": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
+ "integrity": "sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg==",
+ "dev": true
+ },
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -452,18 +573,18 @@
"dev": true
},
"autoprefixer": {
- "version": "9.7.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz",
- "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==",
+ "version": "9.8.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+ "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
"dev": true,
"requires": {
- "browserslist": "^4.11.1",
- "caniuse-lite": "^1.0.30001039",
- "chalk": "^2.4.2",
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "colorette": "^1.2.1",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
- "postcss": "^7.0.27",
- "postcss-value-parser": "^4.0.3"
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
}
},
"bail": {
@@ -553,15 +674,16 @@
}
},
"browserslist": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
- "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
+ "version": "4.14.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz",
+ "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001043",
- "electron-to-chromium": "^1.3.413",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
+ "caniuse-lite": "^1.0.30001157",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.591",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.66"
}
},
"cache-base": {
@@ -587,16 +709,27 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
- "caniuse-lite": {
- "version": "1.0.30001045",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001045.tgz",
- "integrity": "sha512-Y8o2Iz1KPcD6FjySbk1sPpvJqchgxk/iow0DABpGyzA1UeQAuxh63Xh0Enj5/BrsYbXtCN32JmR4ZxQTCQ6E6A==",
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001159",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz",
+ "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==",
"dev": true
},
"chalk": {
@@ -616,12 +749,6 @@
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -657,6 +784,28 @@
}
}
},
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"clone-regexp": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
@@ -666,12 +815,6 @@
"is-regexp": "^2.0.0"
}
},
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -697,6 +840,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -704,9 +853,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz",
+ "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==",
"dev": true
},
"component-emitter": {
@@ -736,37 +885,29 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
+ "core-js": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
+ "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
"cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
+ "import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "dependencies": {
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
+ "yaml": "^1.10.0"
}
},
"cross-spawn": {
@@ -791,6 +932,90 @@
}
}
},
+ "css-rule-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
+ "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=",
+ "dev": true,
+ "requires": {
+ "css-tokenize": "^1.0.1",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "css-tokenize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
+ "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^1.0.33"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -826,6 +1051,14 @@
"requires": {
"decamelize": "^1.1.0",
"map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
}
},
"decode-uri-component": {
@@ -894,14 +1127,6 @@
"dev": true,
"requires": {
"path-type": "^4.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
}
},
"doctrine": {
@@ -913,6 +1138,53 @@
"esutils": "^2.0.2"
}
},
+ "doiuse": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.0.tgz",
+ "integrity": "sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.14.7",
+ "caniuse-lite": "^1.0.30001157",
+ "css-rule-stream": "^1.1.0",
+ "duplexer2": "0.0.2",
+ "jsonfilter": "^1.1.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.1.6",
+ "source-map": "^0.7.3",
+ "through2": "^4.0.2",
+ "yargs": "^16.1.0"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -924,15 +1196,15 @@
},
"dependencies": {
"domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+ "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==",
"dev": true
},
"entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true
}
}
@@ -962,10 +1234,51 @@
"domelementtype": "1"
}
},
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"electron-to-chromium": {
- "version": "1.3.414",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz",
- "integrity": "sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ==",
+ "version": "1.3.603",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz",
+ "integrity": "sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ==",
"dev": true
},
"emoji-regex": {
@@ -998,6 +1311,12 @@
"is-arrayish": "^0.2.1"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1005,28 +1324,29 @@
"dev": true
},
"eslint": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
- "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
- "eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
- "esquery": "^1.2.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -1034,7 +1354,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.14",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -1043,19 +1363,48 @@
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
+ "table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"chalk": {
@@ -1066,6 +1415,26 @@
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"color-convert": {
@@ -1083,55 +1452,223 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.20.0.tgz",
+ "integrity": "sha512-F2dm+S6aCDDb99Fr6KD9L7u1gOK819deG6xAG4EIVaLsHdQhjbcpNUuzUkUmGmpEHIYHqSpwkZ1EvBMc9Pxn+w==",
+ "dev": true,
+ "requires": {
+ "eslint": "^7.23.0",
+ "eslint-plugin-compat": "^3.9.0",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^32.3.0",
+ "eslint-plugin-json-es": "^1.5.3",
+ "eslint-plugin-mediawiki": "^0.2.7",
+ "eslint-plugin-mocha": "^8.1.0",
+ "eslint-plugin-no-jquery": "^2.6.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^6.0.0",
+ "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-wdio": "^7.0.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "@babel/highlight": "^7.10.4"
}
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
}
}
},
- "eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
- "dev": true,
- "requires": {
- "eslint": "^7.2.0",
- "eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
- "eslint-plugin-vue": "^6.2.2",
- "eslint-plugin-wdio": "^6.0.12"
+ "eslint-plugin-compat": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz",
+ "integrity": "sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^2.0.7",
+ "ast-metadata-inferer": "^0.4.0",
+ "browserslist": "^4.12.2",
+ "caniuse-lite": "^1.0.30001166",
+ "core-js": "^3.6.5",
+ "find-up": "^4.1.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.2"
+ },
+ "dependencies": {
+ "caniuse-lite": {
+ "version": "1.0.30001208",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz",
+ "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==",
+ "dev": true
+ }
}
},
"eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
@@ -1139,72 +1676,88 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
+ "version": "32.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz",
+ "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==",
"dev": true,
"requires": {
- "comment-parser": "^0.7.5",
- "debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
+ "comment-parser": "1.1.2",
+ "debug": "^4.3.1",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
"regextras": "^0.7.1",
- "semver": "^6.3.0",
+ "semver": "^7.3.4",
"spdx-expression-parse": "^3.0.1"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
+ "lru-cache": "^6.0.0"
}
}
}
},
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "eslint-plugin-json-es": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+ "integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ }
}
},
"eslint-plugin-mediawiki": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.5.tgz",
- "integrity": "sha512-Xs5G4f1EnS6+9gFWkk28nWA9xcOEPx7YZEGsMYGLelZRAF+2DmV/PigF5N5VqoOkNBpwcbXqLD8wLfkg29aF8w==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+ "integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^6.2.2",
+ "eslint-plugin-vue": "^7.7.0",
"upath": "^1.2.0"
}
},
"eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+ "integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
}
},
"eslint-plugin-no-jquery": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.5.0.tgz",
- "integrity": "sha512-RrQ380mUJJKdjgpQ/tZAJ3B3W1n3LbVmULooS2Pv5pUDcc5uVHVSJMTdUlsbvQyfo6hWP2LJ4FbOoDzENWcF7A==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.6.0.tgz",
+ "integrity": "sha512-xC7pbNHJMdyxqhzcNMRrmC5/tbt1T4KCKXjOqUpKm/CaRryGKS5iWztzWPrL0KwyI3R3ub6goHFmIQS19f+mZA==",
"dev": true
},
"eslint-plugin-node": {
@@ -1221,6 +1774,16 @@
"semver": "^6.1.0"
},
"dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
@@ -1236,43 +1799,40 @@
}
},
"eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
- "dev": true
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-6.0.0.tgz",
+ "integrity": "sha512-+R8z2umSTIiWcxmTQ9nGoML8DL0VQJg4C+E9OpJ2KF9QL4WL/FoayROeTG5Z9zhlZ2qqa+9WkZ1YD6mx89io8w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "requireindex": "^1.2.0"
+ }
},
"eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"requires": {
+ "eslint-utils": "^2.1.0",
"natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- }
+ "semver": "^7.3.2",
+ "vue-eslint-parser": "^7.6.0"
}
},
"eslint-plugin-wdio": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-6.0.12.tgz",
- "integrity": "sha512-qZqcU1Z0bqrqhYM1MbwIvKQxcQEGIOEclOjcveavvLZAN4ezpXb1Ogw3xu+UK13iArregJOMI6uUt+JkFmER1A==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.4.2.tgz",
+ "integrity": "sha512-tkISFycJmRFMKsEjetRcAmWSHKJKnw5rKHDxfE7Ob3tF5lbmYlCLfNKH0UwanOpSdulpe52s3K+CBHSd6qUUNQ==",
"dev": true
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -1292,14 +1852,22 @@
"dev": true
},
"espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^7.2.0",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -1309,29 +1877,37 @@
"dev": true
},
"esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -1519,15 +2095,15 @@
}
},
"fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@@ -1550,22 +2126,28 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz",
+ "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
}
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -1577,6 +2159,16 @@
"to-regex-range": "^5.0.1"
}
},
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -1621,20 +2213,19 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"for-in": {
@@ -1667,6 +2258,12 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
@@ -1674,9 +2271,21 @@
"dev": true
},
"gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true
},
"get-value": {
@@ -1735,18 +2344,26 @@
}
},
"globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+ "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"globby": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
- "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@@ -1758,9 +2375,9 @@
},
"dependencies": {
"ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
}
}
@@ -1781,9 +2398,9 @@
}
},
"grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1793,8 +2410,8 @@
"glob": "~7.1.6",
"grunt-cli": "~1.3.2",
"grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
"iconv-lite": "~0.4.13",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
@@ -1872,12 +2489,11 @@
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@@ -1913,9 +2529,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -1923,24 +2539,6 @@
}
}
},
- "grunt-jsonlint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-jsonlint/-/grunt-jsonlint-1.1.0.tgz",
- "integrity": "sha1-ox7pckCu4/NDyiY8Rb1TIGMSfbI=",
- "dev": true,
- "requires": {
- "jsonlint": "1.6.2",
- "strip-json-comments": "^2.0.0"
- },
- "dependencies": {
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- }
- }
- },
"grunt-known-options": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
@@ -1948,65 +2546,124 @@
"dev": true
},
"grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
"dev": true,
"requires": {
"colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
+ "grunt-legacy-log-utils": "~2.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.5"
+ "lodash": "~4.17.19"
}
},
"grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
"dev": true,
"requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
"dev": true,
"requires": {
"async": "~1.5.2",
"exit": "~0.1.1",
"getobject": "~0.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
"which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
}
},
"grunt-stylelint": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.15.0.tgz",
- "integrity": "sha512-1G5kbT3Y6OtAqgIv/XErtI6ai1t1UdtQWXxUV5Gd900PQoEzu/WrBYhGNAXdb/9nAsNWNjFHQjtdXQtZcDmobA==",
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.16.0.tgz",
+ "integrity": "sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==",
"dev": true,
"requires": {
- "chalk": "^3.0.0"
+ "chalk": "^4.1.0"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -2035,9 +2692,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -2051,11 +2708,14 @@
"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true
},
- "has-color": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
- "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
- "dev": true
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
},
"has-flag": {
"version": "3.0.0",
@@ -2137,10 +2797,13 @@
"dev": true
},
"hosted-git-info": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
- "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
- "dev": true
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+ "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"html-tags": {
"version": "3.1.0",
@@ -2199,6 +2862,12 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
"indexes-of": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
@@ -2222,9 +2891,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"interpret": {
@@ -2275,12 +2944,6 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -2298,11 +2961,20 @@
"dev": true
},
"is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
},
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -2438,24 +3110,12 @@
"unc-path-regex": "^0.1.2"
}
},
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -2481,9 +3141,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -2491,9 +3151,9 @@
}
},
"jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true
},
"jsesc": {
@@ -2502,10 +3162,10 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"json-schema-traverse": {
@@ -2529,22 +3189,60 @@
"minimist": "^1.2.5"
}
},
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
- "dev": true
- },
- "jsonlint": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz",
- "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=",
+ "jsonfilter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz",
+ "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=",
"dev": true,
"requires": {
- "JSV": ">= 4.0.x",
- "nomnom": ">= 1.5.x"
+ "JSONStream": "^0.8.4",
+ "minimist": "^1.1.0",
+ "stream-combiner": "^0.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
}
},
+ "jsonparse": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
+ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
+ "dev": true
+ },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -2552,16 +3250,56 @@
"dev": true
},
"known-css-properties": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz",
- "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==",
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
+ "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
"dev": true
},
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
+ "ldjson-stream": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
+ "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=",
+ "dev": true,
+ "requires": {
+ "split2": "^0.2.1",
+ "through2": "^0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
},
"levn": {
"version": "0.4.1",
@@ -2728,21 +3466,12 @@
"dev": true
},
"locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "dependencies": {
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
+ "p-locate": "^4.1.0"
}
},
"lodash": {
@@ -2751,13 +3480,70 @@
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
"dev": true
},
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
"log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"dev": true,
"requires": {
- "chalk": "^2.4.2"
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"longest-streak": {
@@ -2766,6 +3552,15 @@
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -2782,9 +3577,9 @@
"dev": true
},
"map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
"dev": true
},
"map-visit": {
@@ -2796,42 +3591,87 @@
"object-visit": "^1.0.0"
}
},
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
"mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true
},
- "mdast-util-compact": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
- "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz",
+ "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==",
"dev": true,
"requires": {
- "unist-util-visit": "^2.0.0"
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "micromark": "~2.10.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz",
+ "integrity": "sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true
+ },
+ "meow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
+ "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ }
}
},
"merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
+ "micromark": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz",
+ "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
@@ -2843,9 +3683,9 @@
}
},
"min-indent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
- "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true
},
"minimatch": {
@@ -2864,13 +3704,14 @@
"dev": true
},
"minimist-options": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
- "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
"dev": true,
"requires": {
"arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
},
"dependencies": {
"is-plain-obj": {
@@ -2902,21 +3743,39 @@
}
}
},
- "mkdirp": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
- "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.18.tgz",
+ "integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
+ "dev": true
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -2943,46 +3802,11 @@
"dev": true
},
"node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
+ "version": "1.1.67",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
+ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
- "nomnom": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
- "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
- "dev": true,
- "requires": {
- "chalk": "~0.4.0",
- "underscore": "~1.6.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
- "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
- "dev": true
- },
- "chalk": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
- "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
- "dev": true,
- "requires": {
- "ansi-styles": "~1.0.0",
- "has-color": "~0.1.0",
- "strip-ansi": "~0.1.0"
- }
- },
- "strip-ansi": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
- "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
- "dev": true
- }
- }
- },
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -2993,22 +3817,26 @@
}
},
"normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+ "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
"dev": true,
"requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
+ "hosted-git-info": "^3.0.6",
+ "resolve": "^1.17.0",
+ "semver": "^7.3.2",
"validate-npm-package-license": "^3.0.1"
},
"dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
+ "resolve": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.1.0",
+ "path-parse": "^1.0.6"
+ }
}
}
},
@@ -3153,27 +3981,27 @@
}
},
"p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "^2.2.0"
}
},
"p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parent-module": {
@@ -3210,6 +4038,18 @@
"path-root": "^0.1.1"
}
},
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
@@ -3222,6 +4062,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -3255,32 +4101,18 @@
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
"dev": true
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- }
- }
- },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -3288,9 +4120,9 @@
"dev": true
},
"postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
@@ -3339,29 +4171,6 @@
"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
"dev": true
},
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- },
- "dependencies": {
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- }
- }
- },
"postcss-resolve-nested-selector": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -3388,23 +4197,24 @@
}
},
"postcss-scss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
- "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
"dev": true,
"requires": {
- "postcss": "^7.0.0"
+ "postcss": "^7.0.6"
}
},
"postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
}
},
"postcss-syntax": {
@@ -3414,9 +4224,9 @@
"dev": true
},
"postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
"prelude-ls": {
@@ -3444,11 +4254,66 @@
"dev": true
},
"ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
"dev": true
},
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -3469,11 +4334,15 @@
"resolve": "^1.1.6"
}
},
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
- "dev": true
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
},
"regex-not": {
"version": "1.0.2",
@@ -3498,60 +4367,32 @@
"dev": true
},
"remark": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.0.tgz",
- "integrity": "sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^8.0.0",
- "remark-stringify": "^8.0.0",
- "unified": "^9.0.0"
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
}
},
"remark-parse": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.1.tgz",
- "integrity": "sha512-Ye/5W57tdQZWsfkuVyRq9SUWRgECHnDsMuyUMzdSKpTbNPkZeGtoYfsrkeSi4+Xyl0mhcPPddHITXPcCPHrl3w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^2.0.0",
- "vfile-location": "^3.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-from-markdown": "^0.8.0"
}
},
"remark-stringify": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.0.0.tgz",
- "integrity": "sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz",
+ "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^2.0.0",
- "mdast-util-compact": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^3.0.0",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "mdast-util-to-markdown": "^0.5.0"
}
},
"repeat-element": {
@@ -3572,6 +4413,24 @@
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
"version": "1.14.2",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz",
@@ -3642,18 +4501,18 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
}
},
"run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
},
"safe-buffer": {
@@ -3722,9 +4581,9 @@
"dev": true
},
"signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"slash": {
@@ -3734,20 +4593,38 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
},
"dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
@@ -3906,9 +4783,9 @@
"dev": true
},
"spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -3922,9 +4799,9 @@
"dev": true
},
"spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -3952,18 +4829,57 @@
"extend-shallow": "^3.0.0"
}
},
+ "split2": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
+ "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=",
+ "dev": true,
+ "requires": {
+ "through2": "~0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -3985,6 +4901,16 @@
}
}
},
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -4017,41 +4943,29 @@
},
"dependencies": {
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
}
}
},
- "stringify-entities": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.0.tgz",
- "integrity": "sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw==",
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.2",
- "is-hexadecimal": "^1.0.0"
+ "ansi-regex": "^5.0.0"
}
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- }
+ "min-indent": "^1.0.0"
}
},
"strip-json-comments": {
@@ -4067,48 +4981,48 @@
"dev": true
},
"stylelint": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.3.2.tgz",
- "integrity": "sha512-kpO3/Gz2ZY40EWUwFYYkgpzhf8ZDUyKpcui5+pS0XKJBj/EMYmZpOJoL8IFAz2yApYeg91NVy5yAjE39hDzWvQ==",
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
+ "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
"dev": true,
"requires": {
- "@stylelint/postcss-css-in-js": "^0.37.1",
- "@stylelint/postcss-markdown": "^0.36.1",
- "autoprefixer": "^9.7.6",
+ "@stylelint/postcss-css-in-js": "^0.37.2",
+ "@stylelint/postcss-markdown": "^0.36.2",
+ "autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
- "chalk": "^4.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
+ "chalk": "^4.1.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.2.0",
"execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
+ "fast-glob": "^3.2.4",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.0",
+ "get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
- "globby": "^11.0.0",
+ "globby": "^11.0.1",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
- "ignore": "^5.1.4",
+ "ignore": "^5.1.8",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.18.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
+ "known-css-properties": "^0.20.0",
+ "lodash": "^4.17.20",
+ "log-symbols": "^4.0.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^6.1.0",
+ "meow": "^8.0.0",
"micromatch": "^4.0.2",
"normalize-selector": "^0.2.0",
- "postcss": "^7.0.27",
+ "postcss": "^7.0.35",
"postcss-html": "^0.36.0",
"postcss-less": "^3.1.4",
"postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^6.0.2",
+ "postcss-scss": "^2.1.1",
+ "postcss-selector-parser": "^6.0.4",
"postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.3",
+ "postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
"slash": "^3.0.0",
"specificity": "^0.4.1",
@@ -4117,42 +5031,42 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
+ "table": "^6.0.3",
+ "v8-compile-cache": "^2.2.0",
"write-file-atomic": "^3.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
}
},
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
+ "color-convert": "^2.0.1"
}
},
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
"chalk": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
- "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -4174,163 +5088,90 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "p-locate": "^4.1.0"
+ "ms": "2.1.2"
}
},
- "map-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
- "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
- "meow": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
- "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
+ "file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"dev": true,
"requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.1.1",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.0.0",
- "minimist-options": "^4.0.1",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.0",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.8.1",
- "yargs-parser": "^18.1.1"
+ "flat-cache": "^3.0.4"
}
},
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "p-try": "^2.0.0"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
+ "flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+ "dev": true
},
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
},
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
},
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
+ "glob": "^7.1.3"
}
},
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
}
},
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -4340,39 +5181,74 @@
"ansi-regex": "^5.0.0"
}
},
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "min-indent": "^1.0.0"
+ "has-flag": "^4.0.0"
}
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "table": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
}
},
- "trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+ "v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"dev": true
}
}
},
"stylelint-config-wikimedia": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.1.tgz",
- "integrity": "sha512-R/E7xVKwDyneKmVwkNi+TqJlXZjnL5IH+bQPmfHrgwwyAekNx5GdYZ+tVjx7VBXdv/pjOr0HevVpXSQe86ZfVQ==",
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.3.tgz",
+ "integrity": "sha512-+n082jsEfX4v+ra5F6RfsEnjG6VymnHc613yJeyQAJtigL/+B5XDduVmtXk5vPZ01s0eXTOzVuK0aJ98ofmkoA==",
"dev": true,
"requires": {
- "stylelint": "13.3.2"
+ "stylelint": "13.8.0",
+ "stylelint-no-unsupported-browser-features": "4.1.4"
+ }
+ },
+ "stylelint-no-unsupported-browser-features": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz",
+ "integrity": "sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA==",
+ "dev": true,
+ "requires": {
+ "doiuse": "^4.3.1",
+ "lodash": "^4.17.15",
+ "postcss": "^8.1.4"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
"sugarss": {
@@ -4400,39 +5276,40 @@
"dev": true
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+ "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^7.0.2",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
},
"dependencies": {
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "ajv": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
+ "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
}
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
}
}
},
@@ -4442,6 +5319,21 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -4495,16 +5387,10 @@
"is-number": "^7.0.0"
}
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
+ "trim-newlines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+ "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
"dev": true
},
"trough": {
@@ -4543,12 +5429,6 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
- "underscore": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
- "dev": true
- },
"underscore.string": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
@@ -4559,20 +5439,10 @@
"util-deprecate": "^1.0.2"
}
},
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
"unified": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz",
- "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
"dev": true,
"requires": {
"bail": "^1.0.0",
@@ -4602,29 +5472,20 @@
"dev": true
},
"unist-util-find-all-after": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
- "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+ "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
"dev": true,
"requires": {
"unist-util-is": "^4.0.0"
}
},
"unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz",
+ "integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
- "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
"unist-util-stringify-position": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -4634,27 +5495,6 @@
"@types/unist": "^2.0.2"
}
},
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- },
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -4729,9 +5569,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -4754,9 +5594,9 @@
}
},
"vfile": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz",
- "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
+ "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
@@ -4767,9 +5607,9 @@
}
},
"vfile-location": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
- "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
"dev": true
},
"vfile-message": {
@@ -4782,54 +5622,17 @@
"unist-util-stringify-position": "^2.0.0"
}
},
- "vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.2",
- "vscode-uri": "^2.1.2"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
"vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+ "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"eslint-scope": "^5.0.0",
"eslint-visitor-keys": "^1.1.0",
"espree": "^6.2.1",
- "esquery": "^1.0.1",
+ "esquery": "^1.4.0",
"lodash": "^4.17.15"
},
"dependencies": {
@@ -4861,21 +5664,58 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
"write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
@@ -4894,32 +5734,50 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"yaml": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz",
- "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz",
+ "integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==",
"dev": true,
"requires": {
- "@babel/runtime": "^7.9.2"
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- }
- }
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/MLEB/CleanChanges/package.json b/MLEB/CleanChanges/package.json
index 33a2892e..44d81a81 100644
--- a/MLEB/CleanChanges/package.json
+++ b/MLEB/CleanChanges/package.json
@@ -4,12 +4,11 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.20.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
"grunt-eslint": "23.0.0",
- "grunt-jsonlint": "1.1.0",
- "grunt-stylelint": "0.15.0",
- "stylelint-config-wikimedia": "0.10.1"
+ "grunt-stylelint": "0.16.0",
+ "stylelint-config-wikimedia": "0.10.3"
}
}
diff --git a/MLEB/CleanChanges/resources/cleanchanges.js b/MLEB/CleanChanges/resources/cleanchanges.js
deleted file mode 100644
index 37389f3e..00000000
--- a/MLEB/CleanChanges/resources/cleanchanges.js
+++ /dev/null
@@ -1,62 +0,0 @@
-( function () {
- 'use strict';
-
- window.toggleVisibilityE = function ( levelId, otherId, linkId, type ) {
- var thisLevel = document.getElementById( levelId ),
- otherLevel = document.getElementById( otherId ),
- linkLevel = document.getElementById( linkId );
-
- if ( thisLevel.style.display === 'none' ) {
- thisLevel.style.display = type;
- otherLevel.style.display = 'none';
- linkLevel.style.display = 'inline';
- } else {
- thisLevel.style.display = 'none';
- otherLevel.style.display = 'inline';
- linkLevel.style.display = 'none';
- }
- };
-
- window.showUserInfo = function ( sourceVar, targetId ) {
- $( '#' + targetId ).html( mw.config.get( sourceVar ) );
- };
-
- $( function () {
- $( '.mw-cleanchanges-showuserinfo' ).each( function () {
- var $this, id, target;
-
- $this = $( this );
- id = $this.data( 'mw-userinfo-id' );
- target = $this.data( 'mw-userinfo-target' );
- if ( id !== undefined ) {
- $this.on( 'click keypress', function ( e ) {
- if (
- e.type === 'click' ||
- e.type === 'keypress' && e.which === 13
- ) {
- window.showUserInfo( 'wgUserInfo' + id, target );
- }
- } );
- }
- } );
- $( '.mw-cleanchanges-showblock' ).each( function () {
- var $this, level, other, link;
-
- $this = $( this );
- level = $this.data( 'mw-cleanchanges-level' );
- other = $this.data( 'mw-cleanchanges-other' );
- link = $this.data( 'mw-cleanchanges-link' );
- if ( level !== undefined ) {
- $this.on( 'click keypress', function ( e ) {
- if (
- e.type === 'click' ||
- e.type === 'keypress' && e.which === 13
- ) {
- window.toggleVisibilityE( level, other, link, 'block' );
- }
- } );
- }
- } );
-
- } );
-}() );
diff --git a/MLEB/LocalisationUpdate/.eslintrc.json b/MLEB/LocalisationUpdate/.eslintrc.json
index 1a97f6e1..96060c6b 100644
--- a/MLEB/LocalisationUpdate/.eslintrc.json
+++ b/MLEB/LocalisationUpdate/.eslintrc.json
@@ -1,7 +1,8 @@
{
"root": true,
"extends": [
- "wikimedia/client",
- "wikimedia/jquery"
+ "wikimedia/client-es5",
+ "wikimedia/jquery",
+ "wikimedia/mediawiki"
]
}
diff --git a/MLEB/LocalisationUpdate/.phan/config.php b/MLEB/LocalisationUpdate/.phan/config.php
index 76efd06d..1d390670 100644
--- a/MLEB/LocalisationUpdate/.phan/config.php
+++ b/MLEB/LocalisationUpdate/.phan/config.php
@@ -1,3 +1,12 @@
<?php
-return require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php';
+$cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php';
+
+$cfg['file_list'] = array_merge(
+ $cfg['file_list'],
+ [
+ 'update.php',
+ ]
+);
+
+return $cfg;
diff --git a/MLEB/LocalisationUpdate/.phpcs.xml b/MLEB/LocalisationUpdate/.phpcs.xml
index e141847d..13300aa2 100644
--- a/MLEB/LocalisationUpdate/.phpcs.xml
+++ b/MLEB/LocalisationUpdate/.phpcs.xml
@@ -1,7 +1,6 @@
<?xml version="1.0"?>
<ruleset>
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
- <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
</rule>
<rule ref="MediaWiki.NamingConventions.ValidGlobalName">
@@ -10,6 +9,6 @@
</properties>
</rule>
<file>.</file>
- <arg name="extensions" value="php,php5,inc" />
+ <arg name="extensions" value="php" />
<arg name="encoding" value="UTF-8" />
</ruleset>
diff --git a/MLEB/LocalisationUpdate/Gruntfile.js b/MLEB/LocalisationUpdate/Gruntfile.js
index 61875ba3..f178aed5 100644
--- a/MLEB/LocalisationUpdate/Gruntfile.js
+++ b/MLEB/LocalisationUpdate/Gruntfile.js
@@ -9,7 +9,6 @@ module.exports = function ( grunt ) {
banana: conf.MessagesDirs,
eslint: {
options: {
- extensions: [ '.js', '.json' ],
cache: true
},
all: [
diff --git a/MLEB/LocalisationUpdate/RELEASE-NOTES b/MLEB/LocalisationUpdate/RELEASE-NOTES
index d7ff0258..3650e295 100644
--- a/MLEB/LocalisationUpdate/RELEASE-NOTES
+++ b/MLEB/LocalisationUpdate/RELEASE-NOTES
@@ -1,5 +1,5 @@
-== LocalisationUpdate 2020.07 ==
-Released at 2020-07-24.
+== LocalisationUpdate 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* Localisation and maintenance updates.
+* No updates.
diff --git a/MLEB/LocalisationUpdate/composer.json b/MLEB/LocalisationUpdate/composer.json
index b4e76bf9..d74459d0 100644
--- a/MLEB/LocalisationUpdate/composer.json
+++ b/MLEB/LocalisationUpdate/composer.json
@@ -35,9 +35,9 @@
"php": ">=7.1"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
"php-parallel-lint/php-parallel-lint": "1.2.0"
},
@@ -50,6 +50,7 @@
"parallel-lint . --exclude vendor --exclude node_modules",
"phpcs -p -s",
"minus-x check ."
- ]
+ ],
+ "phan": "phan -d . --long-progress-bar"
}
}
diff --git a/MLEB/LocalisationUpdate/extension.json b/MLEB/LocalisationUpdate/extension.json
index f25a0128..aa0ee29e 100644
--- a/MLEB/LocalisationUpdate/extension.json
+++ b/MLEB/LocalisationUpdate/extension.json
@@ -2,7 +2,7 @@
"@note": "This file must be kept in sync with LocalisationUpdate.php",
"name": "LocalisationUpdate",
"namemsg": "localisationupdate-extensionname",
- "version": "1.4.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "1.4.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"author": [
"Tom Maaswinkel",
"Niklas Laxström",
diff --git a/MLEB/LocalisationUpdate/i18n/en.json b/MLEB/LocalisationUpdate/i18n/en.json
index a15cef56..48617f19 100644
--- a/MLEB/LocalisationUpdate/i18n/en.json
+++ b/MLEB/LocalisationUpdate/i18n/en.json
@@ -6,4 +6,4 @@
},
"localisationupdate-extensionname": "LocalisationUpdate",
"localisationupdate-desc": "Keeps the localised messages as up to date as possible"
-} \ No newline at end of file
+}
diff --git a/MLEB/LocalisationUpdate/i18n/fr.json b/MLEB/LocalisationUpdate/i18n/fr.json
index b62e2b6b..16403218 100644
--- a/MLEB/LocalisationUpdate/i18n/fr.json
+++ b/MLEB/LocalisationUpdate/i18n/fr.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
- "Crochet.david"
+ "Crochet.david",
+ "Verdy p"
]
},
+ "localisationupdate-extensionname": "LocalisationUpdate",
"localisationupdate-desc": "Maintenir la traduction des messages à jour autant que possible"
}
diff --git a/MLEB/LocalisationUpdate/includes/Fetcher/FetcherFactory.php b/MLEB/LocalisationUpdate/includes/Fetcher/FetcherFactory.php
index 4bb05132..1c479514 100644
--- a/MLEB/LocalisationUpdate/includes/Fetcher/FetcherFactory.php
+++ b/MLEB/LocalisationUpdate/includes/Fetcher/FetcherFactory.php
@@ -11,6 +11,10 @@ namespace LocalisationUpdate\Fetcher;
* Constructs fetchers based on the repository urls.
*/
class FetcherFactory {
+ /**
+ * @param string $path
+ * @return Fetcher
+ */
public function getFetcher( $path ) {
if ( strpos( $path, 'https://raw.github.com/' ) === 0 ) {
return new GitHubFetcher();
diff --git a/MLEB/LocalisationUpdate/includes/Reader/JSONReader.php b/MLEB/LocalisationUpdate/includes/Reader/JSONReader.php
index 6d27eed1..d867d5c3 100644
--- a/MLEB/LocalisationUpdate/includes/Reader/JSONReader.php
+++ b/MLEB/LocalisationUpdate/includes/Reader/JSONReader.php
@@ -11,9 +11,14 @@ namespace LocalisationUpdate\Reader;
* Reads MediaWiki JSON i18n files.
*/
class JSONReader implements Reader {
- /// @var string Language tag
+ /**
+ * @var string|null Language tag
+ */
protected $code;
+ /**
+ * @param string|null $code Language tag
+ */
public function __construct( $code = null ) {
$this->code = $code;
}
@@ -21,7 +26,7 @@ class JSONReader implements Reader {
/**
* @param string $contents
*
- * @return array
+ * @return string[][]
*/
public function parse( $contents ) {
$messages = \FormatJson::decode( $contents, true );
diff --git a/MLEB/LocalisationUpdate/includes/Updater.php b/MLEB/LocalisationUpdate/includes/Updater.php
index 9c1046f6..b185699f 100644
--- a/MLEB/LocalisationUpdate/includes/Updater.php
+++ b/MLEB/LocalisationUpdate/includes/Updater.php
@@ -14,6 +14,12 @@ use LocalisationUpdate\Reader\ReaderFactory;
* Executes the localisation update.
*/
class Updater {
+
+ /**
+ * @var Update
+ */
+ private $logger;
+
/**
* Whether the path is a pattern and thus we need to use appropriate
* code for fetching directories.
@@ -89,13 +95,13 @@ class Updater {
*
* @param array $origin
* @param array $remote
- * @param array $blacklist Array of message keys to ignore, keys as as array keys.
+ * @param array $ignore Array of message keys to ignore, keys as as array keys.
* @return array
*/
- public function findChangedTranslations( $origin, $remote, $blacklist = [] ) {
+ public function findChangedTranslations( $origin, $remote, $ignore = [] ) {
$changed = [];
foreach ( $remote as $key => $value ) {
- if ( isset( $blacklist[$key] ) ) {
+ if ( isset( $ignore[$key] ) ) {
continue;
}
@@ -126,6 +132,14 @@ class Updater {
return array_filter( $files );
}
+ /**
+ * @param Finder $finder
+ * @param ReaderFactory $readerFactory
+ * @param FetcherFactory $fetcherFactory
+ * @param array $repos
+ * @param Update $logger
+ * @return array
+ */
public function execute(
Finder $finder,
ReaderFactory $readerFactory,
diff --git a/MLEB/LocalisationUpdate/package-lock.json b/MLEB/LocalisationUpdate/package-lock.json
index 7eb6cb24..650001fd 100644
--- a/MLEB/LocalisationUpdate/package-lock.json
+++ b/MLEB/LocalisationUpdate/package-lock.json
@@ -3,29 +3,79 @@
"lockfileVersion": 1,
"dependencies": {
"@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
"@babel/highlight": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
- "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/helper-validator-identifier": "^7.12.11",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz",
+ "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
}
},
"@types/color-name": {
@@ -41,21 +91,21 @@
"dev": true
},
"acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -136,10 +186,16 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "ast-metadata-inferer": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
+ "integrity": "sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg==",
+ "dev": true
+ },
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -254,6 +310,19 @@
}
}
},
+ "browserslist": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz",
+ "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001208",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.712",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ }
+ },
"cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@@ -277,15 +346,61 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
+ "caniuse-lite": {
+ "version": "1.0.30001208",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz",
+ "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==",
+ "dev": true
+ },
"chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"class-utils": {
@@ -336,6 +451,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -343,9 +464,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz",
+ "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==",
"dev": true
},
"component-emitter": {
@@ -366,6 +487,12 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
+ "core-js": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
+ "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==",
+ "dev": true
+ },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -471,10 +598,16 @@
"esutils": "^2.0.2"
}
},
+ "electron-to-chromium": {
+ "version": "1.3.717",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz",
+ "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==",
+ "dev": true
+ },
"emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"enquirer": {
@@ -486,6 +619,12 @@
"ansi-colors": "^4.1.1"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -493,28 +632,29 @@
"dev": true
},
"eslint": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
- "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
- "eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
- "esquery": "^1.2.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -522,7 +662,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.14",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -531,92 +671,124 @@
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
+ "table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
},
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.20.0.tgz",
+ "integrity": "sha512-F2dm+S6aCDDb99Fr6KD9L7u1gOK819deG6xAG4EIVaLsHdQhjbcpNUuzUkUmGmpEHIYHqSpwkZ1EvBMc9Pxn+w==",
+ "dev": true,
+ "requires": {
+ "eslint": "^7.23.0",
+ "eslint-plugin-compat": "^3.9.0",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^32.3.0",
+ "eslint-plugin-json-es": "^1.5.3",
+ "eslint-plugin-mediawiki": "^0.2.7",
+ "eslint-plugin-mocha": "^8.1.0",
+ "eslint-plugin-no-jquery": "^2.6.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^6.0.0",
+ "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-wdio": "^7.0.0"
+ },
+ "dependencies": {
+ "eslint": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
}
},
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
"dev": true
},
- "semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
}
}
},
- "eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
- "dev": true,
- "requires": {
- "eslint": "^7.2.0",
- "eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
- "eslint-plugin-vue": "^6.2.2",
- "eslint-plugin-wdio": "^6.0.12"
+ "eslint-plugin-compat": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz",
+ "integrity": "sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^2.0.7",
+ "ast-metadata-inferer": "^0.4.0",
+ "browserslist": "^4.12.2",
+ "caniuse-lite": "^1.0.30001166",
+ "core-js": "^3.6.5",
+ "find-up": "^4.1.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.2"
}
},
"eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
@@ -624,72 +796,88 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
+ "version": "32.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz",
+ "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==",
"dev": true,
"requires": {
- "comment-parser": "^0.7.5",
- "debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
+ "comment-parser": "1.1.2",
+ "debug": "^4.3.1",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
"regextras": "^0.7.1",
- "semver": "^6.3.0",
+ "semver": "^7.3.4",
"spdx-expression-parse": "^3.0.1"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
+ "lru-cache": "^6.0.0"
}
}
}
},
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "eslint-plugin-json-es": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+ "integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ }
}
},
"eslint-plugin-mediawiki": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.5.tgz",
- "integrity": "sha512-Xs5G4f1EnS6+9gFWkk28nWA9xcOEPx7YZEGsMYGLelZRAF+2DmV/PigF5N5VqoOkNBpwcbXqLD8wLfkg29aF8w==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+ "integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^6.2.2",
+ "eslint-plugin-vue": "^7.7.0",
"upath": "^1.2.0"
}
},
"eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+ "integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
}
},
"eslint-plugin-no-jquery": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.5.0.tgz",
- "integrity": "sha512-RrQ380mUJJKdjgpQ/tZAJ3B3W1n3LbVmULooS2Pv5pUDcc5uVHVSJMTdUlsbvQyfo6hWP2LJ4FbOoDzENWcF7A==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.6.0.tgz",
+ "integrity": "sha512-xC7pbNHJMdyxqhzcNMRrmC5/tbt1T4KCKXjOqUpKm/CaRryGKS5iWztzWPrL0KwyI3R3ub6goHFmIQS19f+mZA==",
"dev": true
},
"eslint-plugin-node": {
@@ -706,6 +894,16 @@
"semver": "^6.1.0"
},
"dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
@@ -721,35 +919,40 @@
}
},
"eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
- "dev": true
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-6.0.0.tgz",
+ "integrity": "sha512-+R8z2umSTIiWcxmTQ9nGoML8DL0VQJg4C+E9OpJ2KF9QL4WL/FoayROeTG5Z9zhlZ2qqa+9WkZ1YD6mx89io8w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "requireindex": "^1.2.0"
+ }
},
"eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"requires": {
+ "eslint-utils": "^2.1.0",
"natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
+ "semver": "^7.3.2",
+ "vue-eslint-parser": "^7.6.0"
}
},
"eslint-plugin-wdio": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-6.0.12.tgz",
- "integrity": "sha512-qZqcU1Z0bqrqhYM1MbwIvKQxcQEGIOEclOjcveavvLZAN4ezpXb1Ogw3xu+UK13iArregJOMI6uUt+JkFmER1A==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.4.2.tgz",
+ "integrity": "sha512-tkISFycJmRFMKsEjetRcAmWSHKJKnw5rKHDxfE7Ob3tF5lbmYlCLfNKH0UwanOpSdulpe52s3K+CBHSd6qUUNQ==",
"dev": true
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -769,14 +972,22 @@
"dev": true
},
"espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^7.2.0",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -786,29 +997,37 @@
"dev": true
},
"esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -1005,12 +1224,12 @@
"dev": true
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -1036,6 +1255,16 @@
}
}
},
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -1080,20 +1309,19 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"for-in": {
@@ -1145,9 +1373,9 @@
"dev": true
},
"glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -1159,9 +1387,9 @@
}
},
"glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@@ -1192,18 +1420,26 @@
}
},
"globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+ "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1213,8 +1449,8 @@
"glob": "~7.1.6",
"grunt-cli": "~1.3.2",
"grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
"iconv-lite": "~0.4.13",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
@@ -1303,6 +1539,34 @@
"requires": {
"chalk": "^4.0.0",
"eslint": "^7.0.0"
+ }
+ },
+ "grunt-known-options": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
+ "dev": true
+ },
+ "grunt-legacy-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
+ "dev": true,
+ "requires": {
+ "colors": "~1.1.2",
+ "grunt-legacy-log-utils": "~2.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.19"
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
+ "dev": true,
+ "requires": {
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
},
"dependencies": {
"ansi-styles": {
@@ -1347,9 +1611,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -1357,47 +1621,27 @@
}
}
},
- "grunt-known-options": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
- "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
- "dev": true
- },
- "grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
- "dev": true,
- "requires": {
- "colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
- "hooker": "~0.2.3",
- "lodash": "~4.17.5"
- }
- },
- "grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
- "dev": true,
- "requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
- }
- },
"grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
"dev": true,
"requires": {
"async": "~1.5.2",
"exit": "~0.1.1",
"getobject": "~0.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
"which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
}
},
"has-flag": {
@@ -1469,9 +1713,9 @@
"dev": true
},
"import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -1501,9 +1745,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"interpret": {
@@ -1600,9 +1844,9 @@
"dev": true
},
"is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
@@ -1692,9 +1936,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -1702,9 +1946,9 @@
}
},
"jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true
},
"json-schema-traverse": {
@@ -1719,12 +1963,6 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
- "dev": true
- },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -1780,12 +2018,36 @@
}
}
},
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
"lodash": {
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
"dev": true
},
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -1840,12 +2102,6 @@
"brace-expansion": "^1.1.7"
}
},
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -1867,15 +2123,6 @@
}
}
},
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1907,6 +2154,12 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
+ "node-releases": {
+ "version": "1.1.71",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "dev": true
+ },
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -2032,6 +2285,30 @@
"os-tmpdir": "^1.0.0"
}
},
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -2064,6 +2341,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -2122,9 +2405,9 @@
"dev": true
},
"ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
"dev": true
},
"rechoir": {
@@ -2170,10 +2453,22 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
@@ -2208,9 +2503,9 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
@@ -2232,9 +2527,9 @@
"dev": true
},
"semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
"dev": true
},
"set-value": {
@@ -2276,14 +2571,40 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
}
},
"snapdragon": {
@@ -2434,15 +2755,25 @@
"dev": true
},
"spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true
},
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
"spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+ "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
"dev": true
},
"split-string": {
@@ -2482,31 +2813,14 @@
}
},
"string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
@@ -2534,15 +2848,41 @@
}
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+ "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^7.0.2",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
+ "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ }
}
},
"text-table": {
@@ -2683,9 +3023,9 @@
"dev": true
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
@@ -2710,9 +3050,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
- "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -2724,54 +3064,17 @@
"homedir-polyfill": "^1.0.1"
}
},
- "vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.2",
- "vscode-uri": "^2.1.2"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
"vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+ "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"eslint-scope": "^5.0.0",
"eslint-visitor-keys": "^1.1.0",
"espree": "^6.2.1",
- "esquery": "^1.0.1",
+ "esquery": "^1.4.0",
"lodash": "^4.17.15"
},
"dependencies": {
@@ -2809,14 +3112,11 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
}
diff --git a/MLEB/LocalisationUpdate/package.json b/MLEB/LocalisationUpdate/package.json
index 42300860..60c10e61 100644
--- a/MLEB/LocalisationUpdate/package.json
+++ b/MLEB/LocalisationUpdate/package.json
@@ -4,8 +4,8 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.20.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
"grunt-eslint": "23.0.0"
}
diff --git a/MLEB/LocalisationUpdate/tests/phpunit/UpdaterTest.php b/MLEB/LocalisationUpdate/tests/phpunit/UpdaterTest.php
index 466c4b2b..6b0c679f 100644
--- a/MLEB/LocalisationUpdate/tests/phpunit/UpdaterTest.php
+++ b/MLEB/LocalisationUpdate/tests/phpunit/UpdaterTest.php
@@ -48,24 +48,24 @@ class UpdaterTest extends \PHPUnit\Framework\TestCase {
$input = [ 'file' => 'Hello World!' ];
$output = [ 'en' => [ 'key' => $input['file'] ] ];
- $reader = $this->createMock( 'LocalisationUpdate\Reader\Reader' );
+ $reader = $this->createMock( \LocalisationUpdate\Reader\Reader::class );
$reader
->expects( $this->once() )
->method( 'parse' )
- ->will( $this->returnValue( $output ) );
+ ->willReturn( $output );
- $factory = $this->createMock( 'LocalisationUpdate\Reader\ReaderFactory' );
+ $factory = $this->createMock( \LocalisationUpdate\Reader\ReaderFactory::class );
$factory
->expects( $this->once() )
->method( 'getReader' )
- ->will( $this->returnValue( $reader ) );
+ ->willReturn( $reader );
$observed = $updater->readMessages( $factory, $input );
$this->assertEquals( $output, $observed, 'Tries to parse given file' );
}
public function testFindChangedTranslations() {
- $updater = $updater = new Updater();
+ $updater = new Updater();
$origin = [
'A' => '1',
@@ -73,14 +73,18 @@ class UpdaterTest extends \PHPUnit\Framework\TestCase {
'D' => '4',
];
$remote = [
- 'A' => '1', // No change key
- 'B' => '2', // New key
- 'C' => '33', // Changed key
- 'D' => '44', // Blacklisted key
+ // No change key
+ 'A' => '1',
+ // New key
+ 'B' => '2',
+ // Changed key
+ 'C' => '33',
+ // Ignored key
+ 'D' => '44',
];
- $blacklist = [ 'D' => 0 ];
+ $ignore = [ 'D' => 0 ];
$expected = [ 'B' => '2', 'C' => '33' ];
- $observed = $updater->findChangedTranslations( $origin, $remote, $blacklist );
+ $observed = $updater->findChangedTranslations( $origin, $remote, $ignore );
$this->assertEquals( $expected, $observed, 'Changed and new keys returned' );
}
}
diff --git a/MLEB/LocalisationUpdate/update.php b/MLEB/LocalisationUpdate/update.php
index fefa2529..905013d4 100644
--- a/MLEB/LocalisationUpdate/update.php
+++ b/MLEB/LocalisationUpdate/update.php
@@ -1,6 +1,12 @@
<?php
-use LocalisationUpdate\LocalisationUpdate;
+namespace LocalisationUpdate;
+
+use FormatJson;
+use Language;
+use LocalisationUpdate\Fetcher\FetcherFactory;
+use LocalisationUpdate\Reader\ReaderFactory;
+use Maintenance;
$IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
? getenv( 'MW_INSTALL_PATH' )
@@ -25,8 +31,8 @@ class Update extends Maintenance {
public function execute() {
// Prevent the script from timing out
set_time_limit( 0 );
- ini_set( "max_execution_time", 0 );
- ini_set( 'memory_limit', -1 );
+ ini_set( 'max_execution_time', '0' );
+ ini_set( 'memory_limit', '-1' );
global $IP;
global $wgLocalisationUpdateRepositories;
@@ -34,21 +40,21 @@ class Update extends Maintenance {
$dir = LocalisationUpdate::getDirectory();
if ( !$dir ) {
- $this->error( "No cache directory configured", true );
+ $this->fatalError( 'No cache directory configured' );
return;
}
$lc = Language::getLocalisationCache();
$messagesDirs = $lc->getMessagesDirs();
- $finder = new LocalisationUpdate\Finder( $messagesDirs, $IP );
- $readerFactory = new LocalisationUpdate\ReaderFactory();
- $fetcherFactory = new LocalisationUpdate\FetcherFactory();
+ $finder = new Finder( $messagesDirs, $IP );
+ $readerFactory = new ReaderFactory();
+ $fetcherFactory = new FetcherFactory();
$repoid = $this->getOption( 'repoid', $wgLocalisationUpdateRepository );
if ( !isset( $wgLocalisationUpdateRepositories[$repoid] ) ) {
$known = implode( ', ', array_keys( $wgLocalisationUpdateRepositories ) );
- $this->error( "Unknown repoid $repoid; known: $known", true );
+ $this->fatalError( "Unknown repoid $repoid; known: $known" );
return;
}
$repos = $wgLocalisationUpdateRepositories[$repoid];
@@ -58,7 +64,7 @@ class Update extends Maintenance {
$logger = $this;
// Do it ;)
- $updater = new LocalisationUpdate\Updater();
+ $updater = new Updater();
$updatedMessages = $updater->execute(
$finder,
$readerFactory,
@@ -81,10 +87,16 @@ class Update extends Maintenance {
$this->output( "Saved $count new translations\n" );
}
+ /**
+ * @param string $msg
+ */
public function logInfo( $msg ) {
$this->output( $msg . "\n" );
}
+ /**
+ * @param string $msg
+ */
public function logError( $msg ) {
$this->error( $msg );
}
diff --git a/MLEB/Translate/.eslintrc.json b/MLEB/Translate/.eslintrc.json
index 2ebdc144..260fb0fd 100644
--- a/MLEB/Translate/.eslintrc.json
+++ b/MLEB/Translate/.eslintrc.json
@@ -6,6 +6,9 @@
"wikimedia/mediawiki",
"wikimedia/jsduck"
],
+ "globals": {
+ "Chart": "readonly"
+ },
"rules": {
"max-len": "off",
"no-use-before-define": "off",
@@ -13,9 +16,10 @@
"no-jquery/no-animate-toggle": "warn",
"no-jquery/no-class-state": "off",
"no-jquery/no-each-util": "warn",
- "no-jquery/no-fade": "warn",
"no-jquery/no-global-selector": "off",
"no-jquery/no-map-util": "warn",
- "no-jquery/no-sizzle": "warn"
+ "no-jquery/no-sizzle": "warn",
+ "no-shadow": "warn",
+ "no-jquery/no-visibility": "error"
}
}
diff --git a/MLEB/Translate/.mailmap b/MLEB/Translate/.mailmap
index aeec07a2..3e7e435a 100644
--- a/MLEB/Translate/.mailmap
+++ b/MLEB/Translate/.mailmap
@@ -23,7 +23,10 @@ James D. Forrester <jforrester@wikimedia.org>
Joel Sahleen <jsahleen@wikimedia.org>
Justin Du <justin.d128@gmail.com>
Kunal Grover <kunalgrover05@gmail.com>
-Kunal Mehta <legoktm@gmail.com> <legoktm@member.fsf.org>
+Kunal Mehta <legoktm@debian.org>
+Kunal Mehta <legoktm@debian.org> <legoktm@member.fsf.org>
+Kunal Mehta <legoktm@debian.org> <legoktm.wikipedia@gmail.com>
+Kunal Mehta <legoktm@debian.org> <legoktm@gmail.com>
MarcoAurelio <strigiwm@gmail.com> <maurelio@tools.wmflabs.org>
Marius Hoch <hoo@online.de>
Matthew Walker <mwalker@wikimedia.org>
diff --git a/MLEB/Translate/.phan/config.php b/MLEB/Translate/.phan/config.php
index 247d9d4b..17b01064 100644
--- a/MLEB/Translate/.phan/config.php
+++ b/MLEB/Translate/.phan/config.php
@@ -13,7 +13,6 @@ $cfg['file_list'] = array_merge(
'MessageCollection.php',
'MessageGroupConfigurationParser.php',
'MessageGroups.php',
- 'MessageValidator.php',
'MetaYamlSchemaExtender.php',
'TranslateEditAddons.php',
'TranslateHooks.php',
@@ -26,11 +25,9 @@ $cfg['directory_list'] = array_merge(
[
'api',
'ffs',
- 'insertables',
'messagegroups',
'scripts',
'specials',
- 'stash',
'stringmangler',
'tag',
'translationaids',
diff --git a/MLEB/Translate/.phan/stubs/languagedetector.php b/MLEB/Translate/.phan/stubs/languagedetector.php
index 480fb992..bde412fb 100644
--- a/MLEB/Translate/.phan/stubs/languagedetector.php
+++ b/MLEB/Translate/.phan/stubs/languagedetector.php
@@ -36,9 +36,7 @@ class Learn {
class Config {
- /**
- * @param bool $use
- */
+ /** @param bool $use */
public function useMb( $use ) {
}
diff --git a/MLEB/Translate/.phan/stubs/metayaml.php b/MLEB/Translate/.phan/stubs/metayaml.php
index 2f0007e8..c5521779 100644
--- a/MLEB/Translate/.phan/stubs/metayaml.php
+++ b/MLEB/Translate/.phan/stubs/metayaml.php
@@ -12,15 +12,11 @@ class MetaYaml {
public function __construct( array $schema, $validate = false ) {
}
- /**
- * @return bool
- */
+ /** @return bool */
public function validateSchema() {
}
- /**
- * @return array
- */
+ /** @return array */
public function getSchema() {
}
diff --git a/MLEB/Translate/.phan/stubs/phplot.php b/MLEB/Translate/.phan/stubs/phplot.php
deleted file mode 100644
index 95fc28ad..00000000
--- a/MLEB/Translate/.phan/stubs/phplot.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-/**
- * stub for davefx/phplot
- * @phpcs:disable MediaWiki.Files.ClassMatchesFilename
- */
-class PHPlot {
-
- /**
- * @param int $width
- * @param int $height
- * @param string|null $output_file
- * @param string|null $input_file
- */
- public function __construct( $width, $height, $output_file = null, $input_file = null ) {
- }
-
- /**
- * @param string|null $which_font
- * @return bool
- */
- public function SetDefaultTTFont( $which_font = null ) {
- }
-
- /**
- * @param string $which_elem
- * @param string $which_font
- * @param int $which_size
- * @param int|null $which_spacing
- * @return bool
- */
- public function SetFontTTF( $which_elem, $which_font, $which_size = 12, $which_spacing = null ) {
- }
-
- /**
- * @param array $which_dv
- * @return bool
- */
- public function SetDataValues( $which_dv ) {
- }
-
- /**
- * @param string|string[] $which_leg
- * @return bool
- */
- public function SetLegend( $which_leg ) {
- }
-
- /**
- * @param string $which_ytitle
- * @param string $which_ypos
- * @return bool
- */
- public function SetYTitle( $which_ytitle, $which_ypos = 'plotleft' ) {
- }
-
- /**
- * @param float $which_ti
- * @return bool
- */
- public function SetYTickIncrement( $which_ti = '' ) {
- }
-
- /**
- * @param float|null $xmin
- * @param float|null $ymin
- * @param float|null $xmax
- * @param float|null $ymax
- * @return bool
- */
- public function SetPlotAreaWorld( $xmin = null, $ymin = null, $xmax = null, $ymax = null ) {
- }
-
- /**
- * @param string $which_xtlp
- * @return bool
- */
- public function SetXTickLabelPos( $which_xtlp ) {
- }
-
- /**
- * @param string $which_tp
- * @return bool
- */
- public function SetXTickPos( $which_tp ) {
- }
-
- /**
- * @param float $which_xla
- * @return bool
- */
- public function SetXLabelAngle( $which_xla ) {
- }
-
- /**
- * @param string|int[]|null $which_color
- * @return bool
- */
- public function SetTransparentColor( $which_color = null ) {
- }
-
- /**
- * @param string|int[] $which_color
- * @return bool
- */
- public function SetBackgroundColor( $which_color ) {
- }
-
- /**
- * @return bool
- */
- public function DrawGraph() {
- }
-
-}
diff --git a/MLEB/Translate/.phpcs.xml b/MLEB/Translate/.phpcs.xml
index 27653236..c89c3bf8 100644
--- a/MLEB/Translate/.phpcs.xml
+++ b/MLEB/Translate/.phpcs.xml
@@ -2,37 +2,41 @@
<ruleset>
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
<exclude name="Generic.Files.OneObjectStructurePerFile.MultipleFound" />
- <exclude name="MediaWiki.Commenting.FunctionAnnotations.UnrecognizedAnnotation" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected"/>
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
<exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
<exclude name="MediaWiki.Commenting.MissingCovers.MissingCovers" />
- <exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingVar" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.WrongStyle" />
+ <exclude name="MediaWiki.PHPUnit.AssertCount.NotUsed" />
+ <exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage" />
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
+ <exclude name="PSR2.Classes.PropertyDeclaration.Multiple" />
</rule>
<rule ref="Generic.Files.LineLength">
<exclude-pattern>Translate\.alias\.php</exclude-pattern>
+ <exclude-pattern>Translate\.i18n\.magic\.php</exclude-pattern>
+ <exclude-pattern>Translate/tests/phpunit/data/Example*\.php</exclude-pattern>
</rule>
<rule ref="MediaWiki.NamingConventions.ValidGlobalName">
<properties>
<property name="ignoreList" type="array" value="$IP" />
</properties>
</rule>
- <!-- New code uses parameter and return type hints. Repeating them in tags adds no
- additional value. -->
+ <!-- New code uses parameter and return type hints. Repeating them in tags adds no additional value. -->
<rule ref="MediaWiki.Commenting.FunctionComment.MissingParamTag">
- <exclude-pattern>src/</exclude-pattern>
- <exclude-pattern>tests/</exclude-pattern>
- <!-- Temporarily until moved under src/ -->
- <exclude-pattern>MessageValidator\.php</exclude-pattern>
+ <!-- exclude pattern here does not support relative path and CI exclude this for the whole repo -->
+ <exclude-pattern>Translate/src/</exclude-pattern>
+ <exclude-pattern>Translate/tests/</exclude-pattern>
</rule>
<!-- Same as above. No idea why it is named without "Tag". -->
<rule ref="MediaWiki.Commenting.FunctionComment.MissingReturn">
- <exclude-pattern>src/</exclude-pattern>
- <exclude-pattern>tests/</exclude-pattern>
- <!-- Temporarily until moved under src/ -->
- <exclude-pattern>MessageValidator\.php</exclude-pattern>
+ <!-- exclude pattern here does not support relative path and CI exclude this for the whole repo -->
+ <exclude-pattern>Translate/src/</exclude-pattern>
+ <exclude-pattern>Translate/tests/</exclude-pattern>
</rule>
<rule ref="MediaWiki.Files.ClassMatchesFilename.NotMatch">
<exclude-pattern>tests/|ttmserver/|scripts/|Message\.php</exclude-pattern>
@@ -40,4 +44,26 @@
<file>.</file>
<arg name="extensions" value="php"/>
<arg name="encoding" value="UTF-8"/>
+
+ <!-- See https://github.com/slevomat/coding-standard#sniffs-included-in-this-standard -->
+ <config name="installed_paths" value="../../slevomat/coding-standard"/>
+ <rule ref="SlevomatCodingStandard.ControlStructures.RequireNullCoalesceOperator" />
+ <rule ref="SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn" />
+ <rule ref="SlevomatCodingStandard.ControlStructures.UselessTernaryOperator" />
+ <rule ref="SlevomatCodingStandard.Classes.PropertySpacing">
+ <properties>
+ <property name="minLinesCountBeforeWithComment" value="0"/>
+ <property name="maxLinesCountBeforeWithComment" value="0"/>
+ <property name="minLinesCountBeforeWithoutComment" value="0"/>
+ <property name="maxLinesCountBeforeWithoutComment" value="0"/>
+ </properties>
+ </rule>
+ <!-- Remove once decision has been made on: https://phabricator.wikimedia.org/T220719 -->
+ <rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing">
+ <properties>
+ <property name="spacesCountBeforeColon" value="0"/>
+ </properties>
+ </rule>
+ <rule ref="SlevomatCodingStandard.Commenting.RequireOneLineDocComment" />
+ <rule ref="SlevomatCodingStandard.Whitespaces.DuplicateSpaces" />
</ruleset>
diff --git a/MLEB/Translate/Gruntfile.js b/MLEB/Translate/Gruntfile.js
index f850d904..84e7cc65 100644
--- a/MLEB/Translate/Gruntfile.js
+++ b/MLEB/Translate/Gruntfile.js
@@ -24,7 +24,8 @@ module.exports = function ( grunt ) {
'**/*.css',
'**/*.less',
'!node_modules/**',
- '!vendor/**'
+ '!vendor/**',
+ '!resources/lib/**'
]
},
// eslint-disable-next-line es/no-object-assign
diff --git a/MLEB/Translate/HISTORY b/MLEB/Translate/HISTORY
index 8b6916f7..4777fc1e 100644
--- a/MLEB/Translate/HISTORY
+++ b/MLEB/Translate/HISTORY
@@ -109,12 +109,12 @@ release announcements or the git log.
- Fixed fatal errors in Special:MessageGroupStats
* 2012-06-21
- Fixed recent incompatibility with MW 1.19.
-- Improved hiding of blacklisted groups on Special:LanguageStats.
+- Improved hiding of excluded groups on Special:LanguageStats.
* 2012-06-11
- Allow setting message group state for a group only for specific user right.
This redefines $wgTranslateWorkflowStates to hold the rights required for
a state transition.
-- Allow black listing and white listing of languages in YAML configuration. YAML
+- Allow excluding and including languages in YAML configuration. YAML
files will have new top level section called LANGUAGES. LANGUAGES can have
optional subsections whitelist and blacklist, which take an array of language
codes. If a subsection is not specified, the white/blacklist value will
diff --git a/MLEB/Translate/Message.php b/MLEB/Translate/Message.php
index b853e1e4..32b13b1b 100644
--- a/MLEB/Translate/Message.php
+++ b/MLEB/Translate/Message.php
@@ -135,12 +135,8 @@ class ThinMessage extends TMessage {
'last-translator-text' => 'rev_user_text',
'last-translator-id' => 'rev_user',
];
-
- /**
- * @var stdClass Database Result Row
- */
+ /** @var stdClass Database Result Row */
protected $row;
-
/** @var string Stored translation. */
protected $translation;
@@ -160,9 +156,7 @@ class ThinMessage extends TMessage {
$this->translation = $text;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function translation() {
if ( !isset( $this->row ) ) {
return $this->infile();
diff --git a/MLEB/Translate/MessageCollection.php b/MLEB/Translate/MessageCollection.php
index 44e2d56b..e3f538af 100644
--- a/MLEB/Translate/MessageCollection.php
+++ b/MLEB/Translate/MessageCollection.php
@@ -8,7 +8,7 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
@@ -16,7 +16,7 @@ use MediaWiki\Revision\SlotRecord;
/**
* Core message collection class.
*
- * Message group is collection of messages of one message group in one
+ * Message collection is collection of messages of one message group in one
* language. It handles loading of the messages in one huge batch, and also
* stores information that can be used to filter the collection in different
* ways.
@@ -30,66 +30,41 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
*/
private const MAX_ITEMS_PER_QUERY = 2000;
- /**
- * @var string Language code.
- */
+ /** @var string Language code. */
public $code;
-
- /**
- * @var MessageDefinitions
- */
- protected $definitions = null;
-
- /**
- * @var array array( %Message key => translation, ... )
- */
- protected $infile = [];
-
+ /** @var MessageDefinitions */
+ private $definitions = null;
+ /** @var array array( %Message key => translation, ... ) */
+ private $infile = [];
// Keys and messages.
- /**
- * @var array array( %Message display key => database key, ... )
- */
+ /** @var array array( %Message display key => database key, ... ) */
protected $keys = [];
-
- /**
- * @var array array( %Message String => TMessage, ... )
- */
+ /** @var array array( %Message String => TMessage, ... ) */
protected $messages = [];
-
- /**
- * @var array
- */
- protected $reverseMap;
-
+ /** @var array */
+ private $reverseMap;
// Database resources
/** @var ?Traversable Stored message existence and fuzzy state. */
- protected $dbInfo;
-
+ private $dbInfo;
/** @var ?Traversable Stored translations in database. */
- protected $dbData;
-
+ private $dbData;
/** @var ?Traversable Stored reviews in database. */
- protected $dbReviewData;
-
+ private $dbReviewData;
/**
* Tags, copied to thin messages
* tagtype => keys
* @var array[]
*/
protected $tags = [];
-
/**
* Properties, copied to thin messages
* @var array[]
*/
- protected $properties = [];
-
- /**
- * @var string[] Authors.
- */
- protected $authors = [];
+ private $properties = [];
+ /** @var string[] Authors. */
+ private $authors = [];
/**
* Constructors. Use newFromDefinitions() instead.
@@ -113,9 +88,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
return $collection;
}
- /**
- * @return string
- */
+ /** @return string */
public function getLanguage() {
return $this->code;
}
@@ -188,9 +161,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
foreach ( $this->messages as $m ) {
// Check if there are authors
- /**
- * @var TMessage $m
- */
+ /** @var TMessage $m */
$author = $m->getProperty( 'last-translator-text' );
if ( $author === null ) {
@@ -290,15 +261,9 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
// Handle string offsets
if ( !ctype_digit( (string)$offset ) ) {
- $count = 0;
- foreach ( array_keys( $this->keys ) as $index ) {
- if ( $index === $offset ) {
- break;
- }
- $count++;
- }
+ $pos = array_search( $offset, array_keys( $this->keys ), true );
// Now offset is always an integer, suitable for array_slice
- $offset = $count;
+ $offset = $pos !== false ? $pos : count( $this->keys );
}
// False means that cannot go back or forward
@@ -364,9 +329,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
$this->applyFilter( $type, $condition, $value );
}
- /**
- * @return array
- */
+ /** @return array */
public static function getAvailableFilters() {
return [
'fuzzy',
@@ -422,18 +385,31 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
$this->keys = $keys;
}
+ /** @internal For MessageGroupStats */
+ public function filterUntranslatedOptional(): void {
+ $optionalKeys = array_flip( $this->tags['optional'] ?? [] );
+ // Convert plain message keys to array<string,TitleValue>
+ $optional = $this->filterOnCondition( $this->keys, $optionalKeys, false );
+ // Then get reduce that list to those which have no translation. Ensure we don't
+ // accidentally populate the info cache with too few keys.
+ $this->loadInfo( $this->keys );
+ $untranslatedOptional = $this->filterHastranslation( $optional, true );
+ // Now remove that list from the full list
+ $this->keys = $this->filterOnCondition( $this->keys, $untranslatedOptional );
+ }
+
/**
* Filters list of keys with other list of keys according to the condition.
* In other words, you have a list of keys, and you have determined list of
* keys that have some feature. Now you can either take messages that are
* both in the first list and the second list OR are in the first list but
- * are not in the second list (conditition = true and false respectively).
+ * are not in the second list (conditition = false and true respectively).
* What makes this more complex is that second list of keys might not be a
* subset of the first list of keys.
* @param string[] $keys List of keys to filter.
* @param string[] $condKeys Second list of keys for filtering.
* @param bool $condition True (default) to return keys which are on first
- * and second list, false to return keys which are on the first but not on
+ * but not on the second list, false to return keys which are on both.
* second.
* @return string[] Filtered keys.
*/
@@ -532,48 +508,32 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
}
$revStore = MediaWikiServices::getInstance()->getRevisionStore();
- if ( is_callable( [ $revStore, 'newRevisionsFromBatch' ] ) ) {
- $infileRows = [];
- foreach ( $this->dbData as $row ) {
- $mkey = $this->rowToKey( $row );
- if ( isset( $this->infile[$mkey] ) ) {
- $infileRows[] = $row;
- }
+ $infileRows = [];
+ foreach ( $this->dbData as $row ) {
+ $mkey = $this->rowToKey( $row );
+ if ( isset( $this->infile[$mkey] ) ) {
+ $infileRows[] = $row;
}
+ }
- $revisions = $revStore->newRevisionsFromBatch( $infileRows, [
- 'slots' => [ SlotRecord::MAIN ],
- 'content' => true
- ] )->getValue();
- foreach ( $infileRows as $row ) {
- /** @var RevisionRecord|null $rev */
- $rev = $revisions[$row->rev_id];
- if ( $rev ) {
- /** @var TextContent $content */
- $content = $rev->getContent( SlotRecord::MAIN );
- if ( $content ) {
- $mkey = $this->rowToKey( $row );
- if ( $this->infile[$mkey] === $content->getText() ) {
- // Remove unchanged messages from the list
- unset( $keys[$mkey] );
- }
+ $revisions = $revStore->newRevisionsFromBatch( $infileRows, [
+ 'slots' => [ SlotRecord::MAIN ],
+ 'content' => true
+ ] )->getValue();
+ foreach ( $infileRows as $row ) {
+ /** @var RevisionRecord|null $rev */
+ $rev = $revisions[$row->rev_id];
+ if ( $rev ) {
+ /** @var TextContent $content */
+ $content = $rev->getContent( SlotRecord::MAIN );
+ if ( $content ) {
+ $mkey = $this->rowToKey( $row );
+ if ( $this->infile[$mkey] === $content->getText() ) {
+ // Remove unchanged messages from the list
+ unset( $keys[$mkey] );
}
}
}
- } else {
- // Pre 1.34 compatibility
- foreach ( $this->dbData as $row ) {
- $mkey = $this->rowToKey( $row );
- if ( !isset( $this->infile[$mkey] ) ) {
- continue;
- }
-
- $text = Revision::getRevisionText( $row );
- if ( $this->infile[$mkey] === $text ) {
- // Remove unchanged messages from the list
- unset( $keys[$mkey] );
- }
- }
}
// Remove the messages which have changed from the original list
@@ -750,12 +710,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
$dbr = TranslateUtils::getSafeReadDB();
$revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
- if ( is_callable( [ $revisionStore, 'newRevisionsFromBatch' ] ) ) {
- $revQuery = $revisionStore->getQueryInfo( [ 'page' ] );
- } else {
- // Pre MW 1.34 compatibility
- $revQuery = $revisionStore->getQueryInfo( [ 'page', 'text' ] );
- }
+ $revQuery = $revisionStore->getQueryInfo( [ 'page' ] );
$tables = $revQuery['tables'];
$fields = $revQuery['fields'];
$joins = $revQuery['joins'];
@@ -841,9 +796,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
}
$map = [];
- /**
- * @var TitleValue $title
- */
+ /** @var TitleValue $title */
foreach ( $this->keys as $mkey => $title ) {
$map[$title->getNamespace()][$title->getDBkey()] = $mkey;
}
@@ -865,44 +818,26 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
$definitions = $this->definitions->getDefinitions();
$revStore = MediaWikiServices::getInstance()->getRevisionStore();
$queryFlags = TranslateUtils::shouldReadFromMaster() ? $revStore::READ_LATEST : 0;
- if ( is_callable( [ $revStore, 'getContentBlobsForBatch' ] ) ) {
- foreach ( array_keys( $this->keys ) as $mkey ) {
- $messages[$mkey] = new ThinMessage( $mkey, $definitions[$mkey] );
- }
- if ( $this->dbData !== null ) {
- $slotRows = $revStore->getContentBlobsForBatch(
- $this->dbData, [ SlotRecord::MAIN ], $queryFlags
- )->getValue();
+ foreach ( array_keys( $this->keys ) as $mkey ) {
+ $messages[$mkey] = new ThinMessage( $mkey, $definitions[$mkey] );
+ }
- foreach ( $this->dbData as $row ) {
- $mkey = $this->rowToKey( $row );
- if ( !isset( $messages[$mkey] ) ) {
- continue;
- }
- $messages[$mkey]->setRow( $row );
- $messages[$mkey]->setProperty( 'revision', $row->page_latest );
+ if ( $this->dbData !== null ) {
+ $slotRows = $revStore->getContentBlobsForBatch(
+ $this->dbData, [ SlotRecord::MAIN ], $queryFlags
+ )->getValue();
- if ( isset( $slotRows[$row->rev_id][SlotRecord::MAIN] ) ) {
- $slot = $slotRows[$row->rev_id][SlotRecord::MAIN];
- $messages[$mkey]->setTranslation( $slot->blob_data );
- }
+ foreach ( $this->dbData as $row ) {
+ $mkey = $this->rowToKey( $row );
+ if ( !isset( $messages[$mkey] ) ) {
+ continue;
}
- }
- } else {
- // Pre MW 1.34 compatibility
- foreach ( array_keys( $this->keys ) as $mkey ) {
- $messages[$mkey] = new ThinMessage( $mkey, $definitions[$mkey] );
- }
+ $messages[$mkey]->setRow( $row );
+ $messages[$mkey]->setProperty( 'revision', $row->page_latest );
- // Copy rows if any.
- if ( $this->dbData !== null ) {
- foreach ( $this->dbData as $row ) {
- $mkey = $this->rowToKey( $row );
- if ( !isset( $messages[$mkey] ) ) {
- continue;
- }
- $messages[$mkey]->setRow( $row );
- $messages[$mkey]->setProperty( 'revision', $row->page_latest );
+ if ( isset( $slotRows[$row->rev_id][SlotRecord::MAIN] ) ) {
+ $slot = $slotRows[$row->rev_id][SlotRecord::MAIN];
+ $messages[$mkey]->setTranslation( $slot->blob_data );
}
}
}
@@ -992,9 +927,7 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
$this->messages[$offset] = $value;
}
- /**
- * @param mixed $offset
- */
+ /** @param mixed $offset */
public function offsetUnset( $offset ) {
unset( $this->keys[$offset] );
}
@@ -1057,22 +990,28 @@ class MessageCollection implements ArrayAccess, Iterator, Countable {
* API totally changed in 2011-12-28
*/
class MessageDefinitions {
- protected $namespace;
- protected $messages;
- protected $pages;
+ /** @var int|false */
+ private $namespace;
+ /** @var string[] */
+ private $messages;
+ /** @var Title[] */
+ private $pages;
+ /**
+ * @param string[] $messages
+ * @param int|false $namespace
+ */
public function __construct( array $messages, $namespace = false ) {
$this->namespace = $namespace;
$this->messages = $messages;
}
+ /** @return string[] */
public function getDefinitions() {
return $this->messages;
}
- /**
- * @return Title[] List of title indexed by message key.
- */
+ /** @return Title[] List of title indexed by message key. */
public function getPages() {
$namespace = $this->namespace;
if ( $this->pages !== null ) {
diff --git a/MLEB/Translate/MessageGroupConfigurationParser.php b/MLEB/Translate/MessageGroupConfigurationParser.php
index 2d3dbf7f..83a1c9fd 100644
--- a/MLEB/Translate/MessageGroupConfigurationParser.php
+++ b/MLEB/Translate/MessageGroupConfigurationParser.php
@@ -1,6 +1,5 @@
<?php
/**
- *
* @file
* @author Niklas Laxström
* @license GPL-2.0-or-later
@@ -11,7 +10,7 @@
* @since 2014.01
*/
class MessageGroupConfigurationParser {
- protected $baseSchema;
+ private $baseSchema;
public function __construct() {
// Don't perform validations if library not available
diff --git a/MLEB/Translate/MessageGroups.php b/MLEB/Translate/MessageGroups.php
index c5a6ae83..4b4bf1fc 100644
--- a/MLEB/Translate/MessageGroups.php
+++ b/MLEB/Translate/MessageGroups.php
@@ -16,25 +16,14 @@ use MediaWiki\MediaWikiServices;
* @todo Clean up the mixed static/member method interface.
*/
class MessageGroups {
- /**
- * @var string[]|null Cache for message group priorities
- */
- protected static $prioritycache;
-
- /**
- * @var MessageGroup[]|null Map of (group ID => MessageGroup)
- */
- protected $groups;
-
- /**
- * @var MessageGroupLoader[]|null
- */
- protected $groupLoaders;
-
- /**
- * @var WANObjectCache|null
- */
- protected $cache;
+ /** @var string[]|null Cache for message group priorities */
+ private static $prioritycache;
+ /** @var MessageGroup[]|null Map of (group ID => MessageGroup) */
+ private $groups;
+ /** @var MessageGroupLoader[]|null */
+ private $groupLoaders;
+ /** @var WANObjectCache|null */
+ private $cache;
/**
* Tracks the current cache verison. Update this when there are incompatible changes
@@ -42,7 +31,7 @@ class MessageGroups {
* will automatically expire and be cleared off.
* @var int
*/
- private const CACHE_VERSION = 3;
+ private const CACHE_VERSION = 4;
/**
* Initialises the list of groups
@@ -510,9 +499,7 @@ class MessageGroups {
$pathFinder = function ( &$paths, $group, $targetId, $prefix = '' )
use ( &$pathFinder ) {
if ( $group instanceof AggregateMessageGroup ) {
- /**
- * @var MessageGroup $subgroup
- */
+ /** @var MessageGroup $subgroup */
foreach ( $group->getGroups() as $subgroup ) {
$subId = $subgroup->getId();
if ( $subId === $targetId ) {
@@ -536,9 +523,7 @@ class MessageGroups {
}
foreach ( $structure as $rootGroup ) {
- /**
- * @var MessageGroup $rootGroup
- */
+ /** @var MessageGroup $rootGroup */
if ( $rootGroup->getId() === $group->getId() ) {
// Yay we found a top-level group
$pathFinder( $paths, $rootGroup, $targetId, $id );
@@ -555,10 +540,7 @@ class MessageGroups {
return $paths;
}
- /**
- * Constructor function.
- * @return self
- */
+ /** @return self */
public static function singleton() {
static $instance;
if ( !$instance instanceof self ) {
@@ -636,7 +618,7 @@ class MessageGroups {
// Slow path for the ones with wildcards
$matcher = new StringMatcher( '', $ids );
foreach ( self::getAllGroups() as $id => $_ ) {
- if ( $matcher->match( $id ) ) {
+ if ( $matcher->matches( $id ) ) {
$all[] = $id;
}
}
@@ -689,9 +671,7 @@ class MessageGroups {
// Determine the top level groups of the tree
$tree = $groups;
- /**
- * @var MessageGroup $o
- */
+ /** @var MessageGroup $o */
foreach ( $groups as $id => $o ) {
if ( !$o->exists() ) {
unset( $groups[$id], $tree[$id] );
@@ -699,9 +679,7 @@ class MessageGroups {
}
if ( $o instanceof AggregateMessageGroup ) {
- /**
- * @var AggregateMessageGroup $o
- */
+ /** @var AggregateMessageGroup $o */
foreach ( $o->getGroups() as $sid => $so ) {
unset( $tree[$sid] );
}
@@ -867,8 +845,8 @@ class MessageGroups {
$allowed = true;
$discouraged = false;
- $whitelist = $group->getTranslatableLanguages();
- if ( is_array( $whitelist ) && !isset( $whitelist[$language] ) ) {
+ $inclusionList = $group->getTranslatableLanguages();
+ if ( is_array( $inclusionList ) && !isset( $inclusionList[$language] ) ) {
$allowed = false;
}
diff --git a/MLEB/Translate/README b/MLEB/Translate/README
index dd7903cf..5f34664d 100644
--- a/MLEB/Translate/README
+++ b/MLEB/Translate/README
@@ -6,7 +6,7 @@ to manage multilingual wikis in a sensible way.
See http://www.gnu.org/licenses/gpl2.html
== Installation ==
-For very very quick start add the following to LocalSettings.php:
+For a very very quick start add the following to LocalSettings.php:
wfLoadExtension( 'Translate' );
$wgGroupPermissions['user']['translate'] = true;
@@ -19,10 +19,18 @@ More documentation is at
https://www.mediawiki.org/wiki/Help:Extension:Translate/Configuration
== Contributing ==
-* Translations? Go to https://translatewiki.net and sign up.
-* Code? File format handlers? New message groups? Graphics? Suggestions?
- Bug reports? File a bug or feature request or join us at #mediawiki-i18n
- and let us know what you have in mind.
+To translate this extension go to https://translatewiki.net and sign up.
-Known bugs and feature requests are collected at:
+To contribute features, fixes and code maintenance, please see
+* https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_become_a_MediaWiki_hacker
+* https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct
+* https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Getting_started_with_development
+
+There is also a dedicated Translate and translatewiki.net development
+environment, see
+* https://gerrit.wikimedia.org/r/plugins/gitiles/translatewiki/+/refs/heads/master/puppet/README
+
+Known bugs and feature requests are collected and reported at
https://phabricator.wikimedia.org/tag/mediawiki-extensions-translate/
+
+You can chat with the developers at #mediawiki-i18n on Freenode IRC.
diff --git a/MLEB/Translate/RELEASE-NOTES b/MLEB/Translate/RELEASE-NOTES
index 4b053035..7e45d76c 100644
--- a/MLEB/Translate/RELEASE-NOTES
+++ b/MLEB/Translate/RELEASE-NOTES
@@ -1,15 +1,6 @@
-== Translate 2020.07 ==
-Released at 2020-07-24.
+== Translate 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* Fixes to moving and deletion of translatable pages. ([[phab:T168591|Phab:T168591]])
-* Improved escape sequence handling for the Android XML file format. ([[phab:T192062|Phab:T192062]])
-* Display a help message when editing a translatable page source. ([[phab:T192052|Phab:T192052]])
-* Translations are now published instead of saved, for consistency with rest of MediaWiki. ([[phab:T131132|Phab:T131132]])
-* Updated Google Translate integration ([[phab:T33695|Phab:T33695]])
-* Patrolling of edits to translation pages is allowed. ([[phab:T151172|Phab:T151172]])
-* Message index should now be more robust and issues like "the message does not correspond to any message group" when translating should no longer occur. ([[phab:T221119|Phab:T221119]])
-* Ensure plural keyword other is always present in exports for yaml and json. ([[gerrit:c/mediawiki/extensions/Translate/+/603470|Gerrit Patch]])
-* Interface changes to message validator code. If you have custom validators, you need to migrate them to a new interface. ([[gerrit:c/mediawiki/extensions/Translate/+/604400|Gerrit Patch]])
-* Translatable pages can now prevent wrapping of outdated (and in future untranslated) units by using &lt;translate nowrap> syntax.<!-- unescape for email -->([[phab:T256625|Phab:T256625]])
-* Slight changes to Special:PageTranslation interface. ([[gerrit:c/mediawiki/extensions/Translate/+/610073|Gerrit Patch]])
+* Fix metadata handling for translatable page moves and deletions.
+ ({{Phab|T282905}})
diff --git a/MLEB/Translate/Translate.alias.php b/MLEB/Translate/Translate.alias.php
index ad4ec79d..67ee7576 100644
--- a/MLEB/Translate/Translate.alias.php
+++ b/MLEB/Translate/Translate.alias.php
@@ -20,7 +20,7 @@ $specialPageAliases['en'] = [
'PageTranslation' => [ 'PageTranslation' ],
'PageTranslationDeletePage' => [ 'PageTranslationDeletePage' ],
'SearchTranslations' => [ 'SearchTranslations' ],
- 'SupportedLanguages' => [ 'SupportedLanguages' ],
+ 'SupportedLanguages' => [ 'ActiveLanguages', 'SupportedLanguages' ],
'Translate' => [ 'Translate' ],
'TranslationStash' => [ 'TranslationStash' ],
'TranslationStats' => [ 'TranslationStats', 'TranslationStatistics' ],
diff --git a/MLEB/Translate/TranslateEditAddons.php b/MLEB/Translate/TranslateEditAddons.php
index 2dec1ca0..2f18b460 100644
--- a/MLEB/Translate/TranslateEditAddons.php
+++ b/MLEB/Translate/TranslateEditAddons.php
@@ -103,65 +103,6 @@ class TranslateEditAddons {
}
/**
- * Replace the normal save button with one that says if you are editing
- * message documentation to try to avoid accidents.
- * Hook: EditPageBeforeEditButtons
- *
- * @param EditPage $editpage
- * @param array &$buttons
- * @param int $tabindex
- */
- public static function buttonHack( EditPage $editpage, &$buttons, $tabindex ) {
- $handle = new MessageHandle( $editpage->getTitle() );
- if ( !$handle->isValid() ) {
- return;
- }
-
- $context = $editpage->getArticle()->getContext();
-
- if ( $handle->isDoc() ) {
- $langCode = $context->getLanguage()->getCode();
- $name = TranslateUtils::getLanguageName( $handle->getCode(), $langCode );
- $attribs = [
- 'id' => 'wpSave',
- 'name' => 'wpSave',
- 'tabindex' => ++$tabindex,
- ] + Linker::tooltipAndAccesskeyAttribs( 'save' );
-
- $saveConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
- $buttons['save'] = new OOUI\ButtonInputWidget( [
- // Support: IE 6 – Use <input>, otherwise it can't distinguish which button was clicked
- 'useInputTag' => true,
- 'flags' => [ 'progressive', 'primary' ],
- 'label' => $context->msg( 'translate-save', $name )->text(),
- 'type' => 'submit',
- ] + $saveConfig );
- }
-
- try {
- $supportUrl = SupportAid::getSupportUrl( $handle->getTitle() );
- } catch ( TranslationHelperException $e ) {
- return;
- }
-
- $attribs = [
- 'id' => 'wpSupport',
- 'name' => 'wpSupport',
- 'type' => 'button',
- 'tabindex' => ++$tabindex,
- 'title' => $context->msg( 'translate-js-support-title' )->text(),
- ];
-
- $attribs += [
- 'label' => $context->msg( 'translate-js-support' )->text(),
- 'href' => $supportUrl,
- 'target' => '_blank',
- ];
- $saveConfig = OOUI\Element::configFromHtmlAttributes( $attribs );
- $buttons['ask'] = new OOUI\ButtonWidget( $saveConfig );
- }
-
- /**
* @param EditPage $editpage
* @return string
*/
@@ -507,7 +448,6 @@ class TranslateEditAddons {
$boxes = [];
$boxes[] = $th->callBox( 'documentation', [ $th, 'getDocumentationBox' ] );
$boxes[] = $th->callBox( 'definition', [ $th, 'getDefinitionBox' ] );
- $boxes[] = $th->callBox( 'translation', [ $th, 'getTranslationDisplayBox' ] );
$output = implode( "\n", $boxes );
$output = Html::rawElement(
diff --git a/MLEB/Translate/TranslateHooks.php b/MLEB/Translate/TranslateHooks.php
index 06c74889..3d092870 100644
--- a/MLEB/Translate/TranslateHooks.php
+++ b/MLEB/Translate/TranslateHooks.php
@@ -7,8 +7,12 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
-use MediaWiki\Extensions\Translate\SystemUsers\TranslateUserManager;
+use MediaWiki\Config\ServiceOptions;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\TranslateUserManager;
+use MediaWiki\Extension\Translate\TranslatorSandbox\ManageTranslatorSandboxSpecialPage;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashSpecialPage;
+use MediaWiki\Hook\BeforeParserFetchTemplateRevisionRecordHook;
use MediaWiki\Hook\PageMoveCompleteHook;
use MediaWiki\Hook\SidebarBeforeOutputHook;
use MediaWiki\MediaWikiServices;
@@ -32,7 +36,7 @@ class TranslateHooks {
* Do late setup that depends on configuration.
*/
public static function setupTranslate() {
- global $wgTranslatePHPlot, $wgAutoloadClasses, $wgHooks, $wgTranslateYamlLibrary;
+ global $wgHooks, $wgTranslateYamlLibrary;
/*
* Text that will be shown in translations if the translation is outdated.
@@ -46,11 +50,7 @@ class TranslateHooks {
$wgTranslateYamlLibrary = function_exists( 'yaml_parse' ) ? 'phpyaml' : 'spyc';
}
- if ( $wgTranslatePHPlot ) {
- $wgAutoloadClasses['PHPlot'] = $wgTranslatePHPlot;
- }
-
- $usePageSaveComplete = version_compare( MW_VERSION, '1.35', '>=' );
+ $usePageSaveComplete = version_compare( TranslateUtils::getMWVersion(), '1.35', '>=' );
if ( $usePageSaveComplete ) {
$wgHooks['PageSaveComplete'][] = 'TranslateEditAddons::onSaveComplete';
} else {
@@ -154,6 +154,11 @@ class TranslateHooks {
$wgHooks['ParserOutputPostCacheTransform'][] =
'PageTranslationHooks::onParserOutputPostCacheTransform';
+ if ( interface_exists( BeforeParserFetchTemplateRevisionRecordHook::class ) ) {
+ $wgHooks['BeforeParserFetchTemplateRevisionRecord'][] =
+ 'PageTranslationHooks::fetchTranslatableTemplateAndTitle';
+ }
+
// Set the page content language
$wgHooks['PageContentLanguage'][] = 'PageTranslationHooks::onPageContentLanguage';
@@ -199,8 +204,35 @@ class TranslateHooks {
if ( $wgTranslateUseSandbox ) {
global $wgSpecialPages, $wgAvailableRights, $wgDefaultUserOptions;
- $wgSpecialPages['ManageTranslatorSandbox'] = 'SpecialManageTranslatorSandbox';
- $wgSpecialPages['TranslationStash'] = 'SpecialTranslationStash';
+ $wgSpecialPages['ManageTranslatorSandbox'] = [
+ 'class' => ManageTranslatorSandboxSpecialPage::class,
+ 'services' => [
+ 'Translate:TranslationStashReader',
+ ],
+ 'args' => [
+ function () {
+ return new ServiceOptions(
+ ManageTranslatorSandboxSpecialPage::CONSTRUCTOR_OPTIONS,
+ MediaWikiServices::getInstance()->getMainConfig()
+ );
+ }
+ ]
+ ];
+ $wgSpecialPages['TranslationStash'] = [
+ 'class' => TranslationStashSpecialPage::class,
+ 'services' => [
+ 'LanguageNameUtils',
+ 'Translate:TranslationStashReader'
+ ],
+ 'args' => [
+ function () {
+ return new ServiceOptions(
+ TranslationStashSpecialPage::CONSTRUCTOR_OPTIONS,
+ MediaWikiServices::getInstance()->getMainConfig()
+ );
+ }
+ ]
+ ];
$wgDefaultUserOptions['translate-sandbox'] = '';
// right-translate-sandboxmanage action-translate-sandboxmanage
$wgAvailableRights[] = 'translate-sandboxmanage';
@@ -269,17 +301,12 @@ class TranslateHooks {
* Used for setting an AbuseFilter variable.
*
* @param AbuseFilterVariableHolder &$vars
- * @param Title|null $title
- * @todo Remove "AbuseFilter-filterAction" from extension.json once we support 1.34+ only.
- * At that point, add a $user parameter to this handler, add typehints on all arguments
- * (including $title which will always be a Title), and remove the logging below.
+ * @param Title $title
+ * @param User $user
*/
- public static function onAbuseFilterAlterVariables( &$vars, $title ) {
- if ( !$title instanceof Title ) {
- wfDebugLog( 'T143073', 'Got non-Title in ' . wfGetAllCallers( 5 ) );
- return;
- }
-
+ public static function onAbuseFilterAlterVariables(
+ &$vars, Title $title, User $user
+ ) {
$handle = new MessageHandle( $title );
// Only set this variable if we are in a proper namespace to avoid
@@ -455,6 +482,13 @@ class TranslateHooks {
"$dir/translate_reviews-patch-01-primary-key.sql",
true
] );
+
+ $updater->addExtensionUpdate( [
+ 'addTable',
+ 'translate_cache',
+ "$dir/translate_cache.sql",
+ true
+ ] );
}
/**
@@ -834,17 +868,12 @@ class TranslateHooks {
return '';
}
- /**
- * @param ResourceLoader $resourceLoader
- */
+ /** @param ResourceLoader $resourceLoader */
public static function onResourceLoaderRegisterModules( ResourceLoader $resourceLoader ) {
- global $wgVersion;
-
- // Support: MediaWiki <= 1.33
- $hasOldJqUI = version_compare( $wgVersion, '1.34', '<' );
-
// Support: MediaWiki <= 1.34
- $hasOldTokens = $hasOldNotify = version_compare( $wgVersion, '1.35', '<' );
+ $hasOldTokens = $hasOldNotify = version_compare(
+ TranslateUtils::getMWVersion(), '1.35', '<'
+ );
$tpl = [
'localBasePath' => __DIR__,
@@ -866,7 +895,7 @@ class TranslateHooks {
'ext.translate.base',
'ext.translate.loader',
'ext.translate.statsbar',
- $hasOldJqUI ? 'jquery.ui.position' : 'jquery.ui',
+ 'jquery.ui',
'mediawiki.jqueryMsg'
],
'messages' => [
@@ -876,16 +905,10 @@ class TranslateHooks {
'translate-msggroupselector-view-subprojects'
]
],
- 'ext.translate.multiselectautocomplete' => $tpl + [
- 'scripts' => 'resources/js/ext.translate.multiselectautocomplete.js',
- 'dependencies' => [
- $hasOldJqUI ? 'jquery.ui.autocomplete' : 'jquery.ui',
- ]
- ],
'ext.translate.special.aggregategroups' => $tpl + [
'scripts' => 'resources/js/ext.translate.special.aggregategroups.js',
'dependencies' => [
- $hasOldJqUI ? 'jquery.ui.autocomplete' : 'jquery.ui',
+ 'jquery.ui',
'mediawiki.api',
'mediawiki.util'
],
@@ -902,7 +925,7 @@ class TranslateHooks {
'ext.translate.special.importtranslations' => $tpl + [
'scripts' => 'resources/js/ext.translate.special.importtranslations.js',
'dependencies' => [
- $hasOldJqUI ? 'jquery.ui.autocomplete' : 'jquery.ui',
+ 'jquery.ui',
]
],
'ext.translate.special.managetranslatorsandbox' => $tpl + [
@@ -911,7 +934,7 @@ class TranslateHooks {
'ext.translate.loader',
'ext.translate.translationstashstorage',
'ext.uls.mediawiki',
- $hasOldJqUI ? 'jquery.ui.dialog' : 'jquery.ui',
+ 'jquery.ui',
'mediawiki.api',
'mediawiki.jqueryMsg',
'mediawiki.language',
@@ -943,15 +966,20 @@ class TranslateHooks {
'ext.translate.special.searchtranslations.operatorsuggest' => $tpl + [
'scripts' => 'resources/js/ext.translate.special.operatorsuggest.js',
'dependencies' => [
- $hasOldJqUI ? 'jquery.ui.autocomplete' : 'jquery.ui',
+ 'jquery.ui',
]
],
'ext.translate.special.pagetranslation' => $tpl + [
- 'scripts' => 'resources/js/ext.translate.special.pagetranslation.js',
+ 'packageFiles' => [
+ 'resources/js/ext.translate.special.pagetranslation.js',
+ 'resources/js/LanguagesMultiselectWidget.js'
+ ],
'dependencies' => [
- 'ext.translate.multiselectautocomplete',
- 'mediawiki.ui.button',
'mediawiki.Uri',
+ 'mediawiki.api',
+ 'mediawiki.ui.button',
+ 'mediawiki.widgets',
+ 'oojs-ui-widgets',
$hasOldTokens ? 'user.tokens' : 'user.options',
],
'targets' => [
@@ -1050,6 +1078,9 @@ class TranslateHooks {
"translate-smg-rename-new",
"translate-smg-rename-rename",
"translate-smg-rename-dialog-title",
+ "translate-smg-loading",
+ "translate-smg-group-action-resolve",
+ "translate-smg-unknown-error",
"percent"
],
"scripts" => [
@@ -1117,6 +1148,7 @@ class TranslateHooks {
$validationResponse = $messageValidator->validateMessage( $message, $handle->getCode() );
if ( $validationResponse->hasErrors() ) {
+ // @phan-suppress-next-line SecurityCheck-DoubleEscaped
$status->fatal( new \ApiRawMessage(
$context->msg( 'translate-syntax-error' )->parse(),
'translate-validation-failed',
diff --git a/MLEB/Translate/TranslateUtils.php b/MLEB/Translate/TranslateUtils.php
index 546be5c7..3cb7ee5e 100644
--- a/MLEB/Translate/TranslateUtils.php
+++ b/MLEB/Translate/TranslateUtils.php
@@ -79,66 +79,43 @@ class TranslateUtils {
$dbr = wfGetDB( DB_REPLICA );
$revStore = MediaWikiServices::getInstance()->getRevisionStore();
$titleContents = [];
- if ( is_callable( [ $revStore, 'newRevisionsFromBatch' ] ) ) {
- $query = $revStore->getQueryInfo( [ 'page', 'user' ] );
- $rows = $dbr->select(
- $query['tables'],
- $query['fields'],
- [
- 'page_namespace' => $namespace,
- 'page_title' => $titles
- ],
- __METHOD__,
- [],
- $query['joins'] + [ 'JOIN', 'page_latest=rev_id' ]
- );
-
- $revisions = $revStore->newRevisionsFromBatch( $rows, [
- 'slots' => true,
- 'content' => true
- ] )->getValue();
- foreach ( $rows as $row ) {
- /** @var RevisionRecord|null $rev */
- $rev = $revisions[$row->rev_id];
- if ( $rev ) {
- /** @var TextContent $content */
- $content = $rev->getContent( SlotRecord::MAIN );
- if ( $content ) {
- $titleContents[$row->page_title] = [
- $content->getText(),
- $row->rev_user_text
- ];
- }
+
+ $query = $revStore->getQueryInfo( [ 'page', 'user' ] );
+ $rows = $dbr->select(
+ $query['tables'],
+ $query['fields'],
+ [
+ 'page_namespace' => $namespace,
+ 'page_title' => $titles,
+ 'page_latest=rev_id',
+ ],
+ __METHOD__,
+ [],
+ $query['joins']
+ );
+
+ $revisions = $revStore->newRevisionsFromBatch( $rows, [
+ 'slots' => true,
+ 'content' => true
+ ] )->getValue();
+
+ foreach ( $rows as $row ) {
+ /** @var RevisionRecord|null $rev */
+ $rev = $revisions[$row->rev_id];
+ if ( $rev ) {
+ /** @var TextContent $content */
+ $content = $rev->getContent( SlotRecord::MAIN );
+ if ( $content ) {
+ $titleContents[$row->page_title] = [
+ $content->getText(),
+ $row->rev_user_text
+ ];
}
}
- $rows->free();
- } else {
- // Pre 1.34 compatibility
- $actorQuery = ActorMigration::newMigration()->getJoin( 'rev_user' );
- $rows = $dbr->select( [ 'page', 'revision', 'text' ] + $actorQuery['tables'],
- [
- 'page_title', 'old_text', 'old_flags',
- 'rev_user_text' => $actorQuery['fields']['rev_user_text']
- ],
- [
- 'page_namespace' => $namespace,
- 'page_title' => $titles
- ],
- __METHOD__,
- [],
- [
- 'revision' => [ 'JOIN', 'page_latest=rev_id' ],
- 'text' => [ 'JOIN', 'rev_text_id=old_id' ],
- ] + $actorQuery['joins']
- );
- foreach ( $rows as $row ) {
- $titleContents[$row->page_title] = [
- Revision::getRevisionText( $row ),
- $row->rev_user_text
- ];
- }
- $rows->free();
}
+
+ $rows->free();
+
return $titleContents;
}
@@ -190,16 +167,6 @@ class TranslateUtils {
$dbr = wfGetDB( DB_REPLICA );
- if ( class_exists( ActorMigration::class ) ) {
- $actorQuery = ActorMigration::newMigration()->getJoin( 'rc_user' );
- } else {
- $actorQuery = [
- 'tables' => [],
- 'fields' => [ 'rc_user_text' => 'rc_user_text' ],
- 'joins' => [],
- ];
- }
-
$hours = (int)$hours;
$cutoff_unixtime = time() - ( $hours * 3600 );
$cutoff = $dbr->timestamp( $cutoff_unixtime );
@@ -213,15 +180,15 @@ class TranslateUtils {
}
$res = $dbr->select(
- [ 'recentchanges' ] + $actorQuery['tables'],
+ [ 'recentchanges', 'actor' ],
array_merge( [
'rc_namespace', 'rc_title', 'rc_timestamp',
- 'rc_user_text' => $actorQuery['fields']['rc_user_text'],
+ 'rc_user_text' => 'actor_name',
], $extraFields ),
$conds,
__METHOD__,
[],
- $actorQuery['joins']
+ [ 'actor' => [ 'JOIN', 'actor_id=rc_actor' ] ]
);
$rows = iterator_to_array( $res );
@@ -451,12 +418,7 @@ class TranslateUtils {
$formats = [];
$filename = substr( $icon, 7 );
- if ( method_exists( MediaWikiServices::class, 'getRepoGroup' ) ) {
- // MediaWiki 1.34+
- $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $filename );
- } else {
- $file = wfFindFile( $filename );
- }
+ $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile( $filename );
if ( !$file ) {
wfWarn( "Unknown message group icon file $icon" );
@@ -498,7 +460,7 @@ class TranslateUtils {
$lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
$index = self::shouldReadFromMaster() ? DB_MASTER : DB_REPLICA;
- return $lb->getConnection( $index );
+ return $lb->getConnectionRef( $index );
}
/**
@@ -580,15 +542,8 @@ class TranslateUtils {
*/
public static function allowsSubpages( Title $title ): bool {
$mwInstance = MediaWikiServices::getInstance();
- if ( is_callable( [ $mwInstance, 'getNamespaceInfo' ] ) ) {
- $namespaceInfo = $mwInstance->getNamespaceInfo();
- return $namespaceInfo->hasSubpages( $title->getNamespace() );
- } else {
- // BC for MW 1.33
- global $wgNamespacesWithSubpages;
- return isset( $wgNamespacesWithSubpages[ $title->getNamespace() ] ) &&
- $wgNamespacesWithSubpages[ $title->getNamespace() ];
- }
+ $namespaceInfo = $mwInstance->getNamespaceInfo();
+ return $namespaceInfo->hasSubpages( $title->getNamespace() );
}
public static function isEditPage( WebRequest $request ): bool {
@@ -598,10 +553,19 @@ class TranslateUtils {
}
$action = $request->getVal( 'action' );
- if ( $action === 'edit' ) {
- return true;
+ return $action === 'edit';
+ }
+
+ /**
+ * Add support for <= 1.34. Wrapper method to fetch the the MW version
+ * @return string
+ */
+ public static function getMWVersion(): string {
+ if ( defined( 'MW_VERSION' ) ) {
+ return MW_VERSION;
}
- return false;
+ global $wgVersion;
+ return $wgVersion;
}
}
diff --git a/MLEB/Translate/api/ApiAggregateGroups.php b/MLEB/Translate/api/ApiAggregateGroups.php
index 5899bc07..7e403d84 100644
--- a/MLEB/Translate/api/ApiAggregateGroups.php
+++ b/MLEB/Translate/api/ApiAggregateGroups.php
@@ -34,12 +34,12 @@ class ApiAggregateGroups extends ApiBase {
}
$aggregateGroup = $params['aggregategroup'];
$subgroups = TranslateMetadata::getSubgroups( $aggregateGroup );
- if ( !$subgroups ) {
- // For newly created groups the subgroups value might be empty,
- // but check that.
- if ( TranslateMetadata::get( $aggregateGroup, 'name' ) === false ) {
- $this->dieWithError( 'apierror-translate-invalidaggregategroup', 'invalidaggregategroup' );
- }
+ if ( $subgroups === null ) {
+ // For a newly created aggregate group, it may contain no subgroups, but null
+ // means the group does not exist or something has gone wrong.
+
+ $this->dieWithError( 'apierror-translate-invalidaggregategroup', 'invalidaggregategroup' );
+ // For static analysers
$subgroups = [];
}
@@ -191,7 +191,7 @@ class ApiAggregateGroups extends ApiBase {
return 'csrf';
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'do' => [
ApiBase::PARAM_TYPE => [ 'associate', 'dissociate', 'remove', 'add', 'update' ],
diff --git a/MLEB/Translate/api/ApiGroupReview.php b/MLEB/Translate/api/ApiGroupReview.php
index cb448ccd..bcac0a02 100644
--- a/MLEB/Translate/api/ApiGroupReview.php
+++ b/MLEB/Translate/api/ApiGroupReview.php
@@ -121,7 +121,7 @@ class ApiGroupReview extends ApiBase {
return 'csrf';
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'group' => [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiManageMessageGroups.php b/MLEB/Translate/api/ApiManageMessageGroups.php
index 24f24c50..aa031b8f 100644
--- a/MLEB/Translate/api/ApiManageMessageGroups.php
+++ b/MLEB/Translate/api/ApiManageMessageGroups.php
@@ -6,8 +6,8 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
-use MediaWiki\Extensions\Translate\Utilities\StringComparators\SimpleStringComparator;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Utilities\StringComparators\SimpleStringComparator;
/**
* API module for managing message group changes.
@@ -139,11 +139,11 @@ class ApiManageMessageGroups extends ApiBase {
// language key is renamed, but one of the non source language keys is removed,
// renaming it will not remove the translation, but only rename it. This
// scenario is highly unlikely though.
- $msg = $msg === null ? $sourceChanges->findMessage( $code, $renameKey, [
+ $msg = $msg ?? $sourceChanges->findMessage( $code, $renameKey, [
MessageSourceChange::DELETION,
MessageSourceChange::CHANGE,
MessageSourceChange::RENAME
- ], $msgState ) : $msg;
+ ], $msgState );
if ( $msg === null ) {
continue;
@@ -289,7 +289,7 @@ class ApiManageMessageGroups extends ApiBase {
}
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'groupId' => [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiQueryLanguageStats.php b/MLEB/Translate/api/ApiQueryLanguageStats.php
index a25cda21..04d61d7a 100644
--- a/MLEB/Translate/api/ApiQueryLanguageStats.php
+++ b/MLEB/Translate/api/ApiQueryLanguageStats.php
@@ -42,7 +42,7 @@ class ApiQueryLanguageStats extends ApiStatsQuery {
return $data;
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
$params = parent::getAllowedParams();
$params['language'] = [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiQueryManageMessageGroups.php b/MLEB/Translate/api/ApiQueryManageMessageGroups.php
index dc493cd3..84387b47 100644
--- a/MLEB/Translate/api/ApiQueryManageMessageGroups.php
+++ b/MLEB/Translate/api/ApiQueryManageMessageGroups.php
@@ -6,8 +6,8 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
-use MediaWiki\Extensions\Translate\Utilities\StringComparators\SimpleStringComparator;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Utilities\StringComparators\SimpleStringComparator;
/**
* API module for querying message group changes.
@@ -114,7 +114,7 @@ class ApiQueryManageMessageGroups extends ApiQueryBase {
return $renameList;
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
$params = parent::getAllowedParams();
$params['groupId'] = [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiQueryMessageCollection.php b/MLEB/Translate/api/ApiQueryMessageCollection.php
index 68c0bb23..85b4a498 100644
--- a/MLEB/Translate/api/ApiQueryMessageCollection.php
+++ b/MLEB/Translate/api/ApiQueryMessageCollection.php
@@ -14,6 +14,10 @@
*/
class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
+ /**
+ * @param ApiQuery $query
+ * @param string $moduleName
+ */
public function __construct( $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'mc' );
}
@@ -75,9 +79,7 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
}
if ( MessageGroups::isDynamic( $group ) ) {
- /**
- * @var RecentMessageGroup $group
- */
+ /** @var RecentMessageGroup $group */
// @phan-suppress-next-line PhanUndeclaredMethod
$group->setLanguage( $params['language'] );
}
@@ -225,7 +227,7 @@ class ApiQueryMessageCollection extends ApiQueryGeneratorBase {
);
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'group' => [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiQueryMessageGroupStats.php b/MLEB/Translate/api/ApiQueryMessageGroupStats.php
index 274d0790..73b53585 100644
--- a/MLEB/Translate/api/ApiQueryMessageGroupStats.php
+++ b/MLEB/Translate/api/ApiQueryMessageGroupStats.php
@@ -44,7 +44,7 @@ class ApiQueryMessageGroupStats extends ApiStatsQuery {
return $data;
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
$params = parent::getAllowedParams();
$params['group'] = [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiQueryMessageGroups.php b/MLEB/Translate/api/ApiQueryMessageGroups.php
index 20f1d13c..5751b5c3 100644
--- a/MLEB/Translate/api/ApiQueryMessageGroups.php
+++ b/MLEB/Translate/api/ApiQueryMessageGroups.php
@@ -80,13 +80,11 @@ class ApiQueryMessageGroups extends ApiQueryBase {
$result = $this->getResult();
$matcher = new StringMatcher( '', $filter );
- /**
- * @var MessageGroup|array $mixed
- */
+ /** @var MessageGroup|array $mixed */
foreach ( $groups as $mixed ) {
// array when Format = tree
$group = is_array( $mixed ) ? reset( $mixed ) : $mixed;
- if ( $filter !== [] && !$matcher->match( $group->getId() ) ) {
+ if ( $filter !== [] && !$matcher->matches( $group->getId() ) ) {
continue;
}
@@ -246,7 +244,7 @@ class ApiQueryMessageGroups extends ApiQueryBase {
return $stateConfig;
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
$allowedParams = [
'depth' => [
ApiBase::PARAM_TYPE => 'integer',
diff --git a/MLEB/Translate/api/ApiQueryMessageTranslations.php b/MLEB/Translate/api/ApiQueryMessageTranslations.php
index 13eed8b6..3a24a720 100644
--- a/MLEB/Translate/api/ApiQueryMessageTranslations.php
+++ b/MLEB/Translate/api/ApiQueryMessageTranslations.php
@@ -112,7 +112,7 @@ class ApiQueryMessageTranslations extends ApiQueryBase {
$result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'message' );
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'title' => [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiSearchTranslations.php b/MLEB/Translate/api/ApiSearchTranslations.php
index 85e215ac..539e765b 100644
--- a/MLEB/Translate/api/ApiSearchTranslations.php
+++ b/MLEB/Translate/api/ApiSearchTranslations.php
@@ -1,4 +1,5 @@
<?php
+
/**
* API module for search translations
* @since 2015.07
@@ -60,7 +61,7 @@ class ApiSearchTranslations extends ApiBase {
];
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
global $wgLanguageCode,
$wgTranslateTranslationDefaultService;
$available = $this->getAvailableTranslationServices();
diff --git a/MLEB/Translate/api/ApiStatsQuery.php b/MLEB/Translate/api/ApiStatsQuery.php
index 51244e0e..d2ee762c 100644
--- a/MLEB/Translate/api/ApiStatsQuery.php
+++ b/MLEB/Translate/api/ApiStatsQuery.php
@@ -76,20 +76,13 @@ abstract class ApiStatsQuery extends ApiQueryBase {
];
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'offset' => [
ApiBase::PARAM_DFLT => '0',
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
],
- 'timelimit' => [
- ApiBase::PARAM_DFLT => 8,
- ApiBase::PARAM_TYPE => 'integer',
- ApiBase::PARAM_MAX => 10,
- ApiBase::PARAM_MIN => 0,
- ApiBase::PARAM_DEPRECATED => true, // Since 2018.10
- ],
];
}
}
diff --git a/MLEB/Translate/api/ApiTTMServer.php b/MLEB/Translate/api/ApiTTMServer.php
index 62b7d002..da0d8cf3 100644
--- a/MLEB/Translate/api/ApiTTMServer.php
+++ b/MLEB/Translate/api/ApiTTMServer.php
@@ -58,7 +58,7 @@ class ApiTTMServer extends ApiBase {
return $good;
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
global $wgTranslateTranslationDefaultService;
$available = $this->getAvailableTranslationServices();
diff --git a/MLEB/Translate/api/ApiTranslateSandbox.php b/MLEB/Translate/api/ApiTranslateSandbox.php
index a4046605..da7fb30d 100644
--- a/MLEB/Translate/api/ApiTranslateSandbox.php
+++ b/MLEB/Translate/api/ApiTranslateSandbox.php
@@ -7,6 +7,9 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\MediaWikiServices;
+use MediaWiki\User\UserNameUtils;
+
/**
* WebAPI for the sandbox feature of Translate.
* @ingroup API TranslateAPI
@@ -48,7 +51,16 @@ class ApiTranslateSandbox extends ApiBase {
}
$username = $params['username'];
- if ( User::getCanonicalName( $username, 'creatable' ) === false ) {
+
+ if ( is_callable( [ UserNameUtils::class, 'getCanonical' ] ) ) {
+ // MW 1.35+
+ $userNameUtils = MediaWikiServices::getInstance()->getUserNameUtils();
+ $canonicalName = $userNameUtils->getCanonical( $username, UserNameUtils::RIGOR_CREATABLE );
+ } else {
+ $canonicalName = User::getCanonicalName( $username, 'creatable' );
+ }
+
+ if ( $canonicalName === false ) {
$this->dieWithError( 'noname', 'invalidusername' );
}
@@ -73,8 +85,16 @@ class ApiTranslateSandbox extends ApiBase {
'id' => $user->getId(),
] ];
- $user->setOption( 'language', $this->getContext()->getLanguage()->getCode() );
- $user->saveSettings();
+ $services = MediaWikiServices::getInstance();
+ if ( method_exists( $services, 'getUserOptionsManager' ) ) {
+ // MW 1.35+
+ $userOptionsManager = $services->getUserOptionsManager();
+ $userOptionsManager->setOption( $user, 'language', $this->getContext()->getLanguage()->getCode() );
+ $userOptionsManager->saveOptions( $user );
+ } else {
+ $user->setOption( 'language', $this->getContext()->getLanguage()->getCode() );
+ $user->saveSettings();
+ }
$this->getResult()->addValue( null, $this->getModuleName(), $output );
}
@@ -188,7 +208,7 @@ class ApiTranslateSandbox extends ApiBase {
return 'csrf';
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'do' => [
ApiBase::PARAM_TYPE => [ 'create', 'delete', 'promote', 'remind' ],
diff --git a/MLEB/Translate/api/ApiTranslationAids.php b/MLEB/Translate/api/ApiTranslationAids.php
index 67560df1..db70d335 100644
--- a/MLEB/Translate/api/ApiTranslationAids.php
+++ b/MLEB/Translate/api/ApiTranslationAids.php
@@ -49,6 +49,7 @@ class ApiTranslationAids extends ApiBase {
$result = $this->getResult();
// Create list of aids, populate web services queries
+ /** @var TranslationAid[] $aids */
$aids = [];
$dataProvider = new TranslationAidDataProvider( $handle );
@@ -103,7 +104,7 @@ class ApiTranslationAids extends ApiBase {
$result->addValue( null, 'times', $times );
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
$props = array_keys( TranslationAid::getTypes() );
Hooks::run( 'TranslateTranslationAids', [ &$props ] );
diff --git a/MLEB/Translate/api/ApiTranslationCheck.php b/MLEB/Translate/api/ApiTranslationCheck.php
index 656cb85f..1d7a8a12 100644
--- a/MLEB/Translate/api/ApiTranslationCheck.php
+++ b/MLEB/Translate/api/ApiTranslationCheck.php
@@ -57,7 +57,7 @@ class ApiTranslationCheck extends ApiBase {
}
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'title' => [
ApiBase::PARAM_TYPE => 'string',
diff --git a/MLEB/Translate/api/ApiTranslationReview.php b/MLEB/Translate/api/ApiTranslationReview.php
index d7d51ebe..fcdd7ffb 100644
--- a/MLEB/Translate/api/ApiTranslationReview.php
+++ b/MLEB/Translate/api/ApiTranslationReview.php
@@ -152,7 +152,7 @@ class ApiTranslationReview extends ApiBase {
return 'csrf';
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'revision' => [
ApiBase::PARAM_TYPE => 'integer',
diff --git a/MLEB/Translate/api/ApiTranslationStash.php b/MLEB/Translate/api/ApiTranslationStash.php
index 91d176a9..29bd0996 100644
--- a/MLEB/Translate/api/ApiTranslationStash.php
+++ b/MLEB/Translate/api/ApiTranslationStash.php
@@ -7,6 +7,9 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\TranslatorSandbox\StashedTranslation;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashStorage;
+
/**
* WebAPI module for storing translations for users who are in a sandbox.
* Access is controlled by hooks in TranslateSandbox class.
@@ -100,7 +103,7 @@ class ApiTranslationStash extends ApiBase {
return 'csrf';
}
- public function getAllowedParams() {
+ protected function getAllowedParams() {
return [
'subaction' => [
ApiBase::PARAM_TYPE => [ 'add', 'query' ],
diff --git a/MLEB/Translate/composer.json b/MLEB/Translate/composer.json
index 243054d2..f8200dbc 100644
--- a/MLEB/Translate/composer.json
+++ b/MLEB/Translate/composer.json
@@ -51,15 +51,15 @@
"require": {
"php": ">=7.2",
"composer/installers": ">=1.0.1",
- "mustangostang/spyc": "^0.6.3",
- "davefx/phplot": "6.2.1"
+ "mustangostang/spyc": "^0.6.3"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
"mediawiki/minus-x": "1.1.0",
"php-parallel-lint/php-console-highlighter": "0.5.0",
- "php-parallel-lint/php-parallel-lint": "1.2.0"
+ "php-parallel-lint/php-parallel-lint": "1.2.0",
+ "slevomat/coding-standard": "^6.4"
},
"suggest": {
"mediawiki/babel": "Users can easily indicate their language proficiency on their user page",
diff --git a/MLEB/Translate/data/group-yaml-schema.yaml b/MLEB/Translate/data/group-yaml-schema.yaml
index f6d26a64..68cea79f 100644
--- a/MLEB/Translate/data/group-yaml-schema.yaml
+++ b/MLEB/Translate/data/group-yaml-schema.yaml
@@ -34,6 +34,18 @@ root:
translatorCategory:
_type: text
_description: Name of the category for translators of this group
+ support:
+ _type: array
+ _description: Configuration for the ask for more information link
+ _children:
+ url:
+ _type: text
+ page:
+ _type: text
+ params:
+ _type: array
+ _children: []
+ _ignore_extra_keys: true
MANGLER:
_type: array
_children:
@@ -41,32 +53,20 @@ root:
_type: text
_not_empty: true
INSERTABLES:
- _type: choice
- _choices:
- 1:
- _type: prototype
- _prototype:
- _type: array
- _children:
- class:
- _type: text
- params:
- _type: choice
- _choices:
- 1:
- _type: array
- _children: []
- _ignore_extra_keys: true
- 2:
- _type: text
- 2:
- _type: array
- _children:
- class: # for supplying one class
- _type: text
- classes: # for supplying multiple
- _type: prototype
- _prototype:
+ _type: prototype
+ _prototype:
+ _type: array
+ _children:
+ class:
+ _type: text
+ params:
+ _type: choice
+ _choices:
+ 1:
+ _type: array
+ _children: []
+ _ignore_extra_keys: true
+ 2:
_type: text
VALIDATORS:
_type: prototype
diff --git a/MLEB/Translate/extension.json b/MLEB/Translate/extension.json
index 9b04d583..bb1d0641 100644
--- a/MLEB/Translate/extension.json
+++ b/MLEB/Translate/extension.json
@@ -9,12 +9,13 @@
"Abijeet Patro",
"..."
],
- "version": "2020-07-20 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "2021-06-01 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"url": "https://www.mediawiki.org/wiki/Extension:Translate",
"descriptionmsg": "translate-desc",
+ "namemsg": "translate-extensionname",
"license-name": "GPL-2.0-or-later",
"requires": {
- "MediaWiki": ">= 1.33.0",
+ "MediaWiki": ">= 1.34.0",
"extensions": {
"UniversalLanguageSelector": "*"
}
@@ -85,12 +86,11 @@
"AppleFFS": "ffs/AppleFFS.php",
"AppleInfoPlistFfs": "ffs/AppleInfoPlistFfs.php",
"ArrayFlattener": "utils/ArrayFlattener.php",
- "BaseValidatorTestCase": "tests/phpunit/unit/MessageValidator/Validators/BaseValidatorTestCase.php",
+ "BaseValidatorTestCase": "tests/phpunit/unit/Validation/Validators/BaseValidatorTestCase.php",
"CachedMessageGroupLoader": "messagegroups/loaders/CachedMessageGroupLoader.php",
"CachedMessageIndex": "utils/MessageIndex.php",
"CaighdeanWebService": "webservices/CaighdeanWebService.php",
"CDBMessageIndex": "utils/MessageIndex.php",
- "CombinedInsertablesSuggester": "insertables/CombinedInsertablesSuggester.php",
"CrossLanguageTranslationSearchQuery": "ttmserver/CrossLanguageTranslationSearchQuery.php",
"CurrentTranslationAid": "translationaids/CurrentTranslationAid.php",
"CxserverWebService": "webservices/CxserverWebService.php",
@@ -103,7 +103,6 @@
"ExternalMessageSourceStateImporter": "utils/ExternalMessageSourceStateImporter.php",
"FakeTTMServer": "ttmserver/FakeTTMServer.php",
"FatMessage": "Message.php",
- "FCFontFinder": "utils/FCFontFinder.php",
"FFS": "ffs/FFS.php",
"FileBasedMessageGroup": "messagegroups/FileBasedMessageGroup.php",
"FileBasedMessageGroupLoader": "messagegroups/loaders/FileBasedMessageGroupLoader.php",
@@ -111,23 +110,20 @@
"FuzzyLikeThis": "ttmserver/FuzzyLikeThis.php",
"GettextDocumentationAid": "translationaids/GettextDocumentationAid.php",
"GettextFFS": "ffs/GettextFFS.php",
+ "GettextParseException": "ffs/GettextParseException.php",
"GettextPluralException": "ffs/GettextPluralException.php",
"GoogleTranslateWebService": "webservices/GoogleTranslateWebService.php",
"HashMessageIndex": "utils/MessageIndex.php",
"HTMLJsSelectToInputField": "utils/HTMLJsSelectToInputField.php",
- "HtmlTagInsertablesSuggester": "insertables/HtmlTagInsertablesSuggester.php",
"IniFFS": "ffs/IniFFS.php",
"InOtherLanguagesAid": "translationaids/InOtherLanguagesAid.php",
- "Insertable": "insertables/Insertable.php",
"InsertablesAid": "translationaids/InsertablesAid.php",
- "InsertablesSuggester": "insertables/InsertablesSuggester.php",
"JavaFFS": "ffs/JavaFFS.php",
"JavaScriptFFS": "ffs/JavaScriptFFS.php",
"JsonFFS": "ffs/JsonFFS.php",
"JsSelectToInput": "utils/JsSelectToInput.php",
"MachineTranslationAid": "translationaids/MachineTranslationAid.php",
"MediaWikiExtensionMessageGroup": "messagegroups/MediaWikiExtensionMessageGroup.php",
- "MediaWikiInsertablesSuggester": "insertables/MediaWikiInsertablesSuggester.php",
"MessageChangeStorage": "utils/MessageChangeStorage.php",
"MessageCollection": "MessageCollection.php",
"MessageDefinitionAid": "translationaids/MessageDefinitionAid.php",
@@ -149,7 +145,6 @@
"MessageIndexException": "utils/MessageIndexException.php",
"MessageIndexRebuildJob": "utils/MessageIndexRebuildJob.php",
"MessageUpdateJob": "utils/MessageUpdateJob.php",
- "MessageValidator": "MessageValidator.php",
"MessageWebImporter": "utils/MessageWebImporter.php",
"MetaYamlSchemaExtender": "MetaYamlSchemaExtender.php",
"MicrosoftWebService": "webservices/MicrosoftWebService.php",
@@ -159,7 +154,6 @@
"MockTranslateValidator": "tests/phpunit/mocks/MockValidators.php",
"MockWikiMessageGroup": "tests/phpunit/mocks/MockWikiMessageGroup.php",
"MockWikiValidationMessageGroup": "tests/phpunit/mocks/MockWikiMessageGroup.php",
- "NumericalParameterInsertablesSuggester": "insertables/NumericalParameterInsertablesSuggester.php",
"PageTranslationHooks": "tag/PageTranslationHooks.php",
"PageTranslationLogFormatter": "tag/PageTranslationLogFormatter.php",
"PHPVariableLoader": "utils/PHPVariableLoader.php",
@@ -171,11 +165,9 @@
"ReadableTTMServer": "ttmserver/Interfaces.php",
"RecentAdditionsMessageGroup": "messagegroups/RecentAdditionsMessageGroup.php",
"RecentMessageGroup": "messagegroups/RecentMessageGroup.php",
- "RegexInsertablesSuggester": "insertables/RegexInsertablesSuggester.php",
"RemoteTTMServer": "ttmserver/RemoteTTMServer.php",
"RemoteTTMServerWebService": "webservices/RemoteTTMServerWebService.php",
"RESTBaseWebService": "webservices/RESTBaseWebService.php",
- "ReviewPerLanguageStats": "specials/SpecialTranslationStats.php",
"RevTag": "utils/RevTag.php",
"SandboxMessageGroup": "messagegroups/SandboxMessageGroup.php",
"SearchableTTMServer": "ttmserver/Interfaces.php",
@@ -186,7 +178,6 @@
"SpecialImportTranslations": "specials/SpecialImportTranslations.php",
"SpecialLanguageStats": "specials/SpecialLanguageStats.php",
"SpecialManageGroups": "specials/SpecialManageGroups.php",
- "SpecialManageTranslatorSandbox": "specials/SpecialManageTranslatorSandbox.php",
"SpecialMessageGroupStats": "specials/SpecialMessageGroupStats.php",
"SpecialPageMigration": "tag/SpecialPageMigration.php",
"SpecialPagePreparation": "tag/SpecialPagePreparation.php",
@@ -194,12 +185,9 @@
"SpecialPageTranslationDeletePage": "tag/SpecialPageTranslationDeletePage.php",
"SpecialPageTranslationMovePage": "tag/SpecialPageTranslationMovePage.php",
"SpecialSearchTranslations": "specials/SpecialSearchTranslations.php",
- "SpecialSupportedLanguages": "specials/SpecialSupportedLanguages.php",
"SpecialTranslate": "specials/SpecialTranslate.php",
"SpecialTranslations": "specials/SpecialTranslations.php",
- "SpecialTranslationStash": "specials/SpecialTranslationStash.php",
"SpecialTranslationStats": "specials/SpecialTranslationStats.php",
- "StashedTranslation": "stash/StashedTranslation.php",
"StatsBar": "utils/StatsBar.php",
"StatsTable": "utils/StatsTable.php",
"StringMangler": "stringmangler/StringMangler.php",
@@ -209,9 +197,7 @@
"TMessage": "Message.php",
"TPException": "tag/TPException.php",
"TPParse": "tag/TPParse.php",
- "TPSection": "tag/TPSection.php",
"TranslatablePage": "tag/TranslatablePage.php",
- "TranslatablePageInsertablesSuggester": "insertables/TranslatablePageInsertablesSuggester.php",
"TranslatablePageMessageGroupStore": "messagegroups/loaders/TranslatablePageMessageGroupStore.php",
"TranslatablePageMoveJob": "tag/TranslatablePageMoveJob.php",
"TranslatablePageTestTrait": "tests/phpunit/helpers/TranslatablePageTestTrait.php",
@@ -221,10 +207,8 @@
"TranslateHooks": "TranslateHooks.php",
"TranslateLogFormatter": "utils/TranslateLogFormatter.php",
"TranslateMetadata": "utils/TranslateMetadata.php",
- "TranslatePerLanguageStats": "specials/SpecialTranslationStats.php",
"TranslatePreferences": "utils/TranslatePreferences.php",
"TranslateRcFilter": "utils/TranslateRcFilter.php",
- "TranslateRegistrationStats": "specials/SpecialTranslationStats.php",
"TranslateRenderJob": "tag/TranslateRenderJob.php",
"TranslateSandbox": "utils/TranslateSandbox.php",
"TranslateSandboxEmailJob": "utils/TranslateSandboxEmailJob.php",
@@ -238,10 +222,7 @@
"TranslationHelpers": "utils/TranslationHelpers.php",
"TranslationQuery": "webservices/TranslationQuery.php",
"TranslationQueryResponse": "webservices/TranslationQueryResponse.php",
- "TranslationStashStorage": "stash/TranslationStashStorage.php",
"TranslationStats": "utils/TranslationStats.php",
- "TranslationStatsBase": "specials/SpecialTranslationStats.php",
- "TranslationStatsInterface": "specials/SpecialTranslationStats.php",
"TranslationsUpdateJob": "tag/TranslationsUpdateJob.php",
"TranslationWebService": "webservices/TranslationWebService.php",
"TranslationWebServiceConfigurationException": "webservices/TranslationWebServiceConfigurationException.php",
@@ -264,10 +245,16 @@
"YandexWebService": "webservices/YandexWebService.php"
},
"AutoloadNamespaces": {
+ "MediaWiki\\Extension\\Translate\\": "src/",
"MediaWiki\\Extensions\\Translate\\": "src/"
},
+ "TestAutoloadClasses": {
+ "MockCustomInsertableSuggester": "tests/phpunit/mocks/MockCustomInsertableSuggester.php",
+ "MockJsonUnserializableSubClass": "tests/phpunit/mocks/json/MockJsonUnserializableSubClass.php",
+ "MockJsonUnserializableSuperClass": "tests/phpunit/mocks/json/MockJsonUnserializableSuperClass.php"
+ },
"TestAutoloadNamespaces": {
- "MediaWiki\\Extensions\\Translate\\": "tests/phpunit/unit/"
+ "MediaWiki\\Extension\\Translate\\": "tests/phpunit/unit/"
},
"Hooks": {
"LoadExtensionSchemaUpdates": "TranslateHooks::schemaUpdates",
@@ -277,7 +264,6 @@
"EditPage::showEditForm:initial": "TranslateEditAddons::addTools",
"AlternateEdit": "TranslateEditAddons::suppressIntro",
"getUserPermissionsErrorsExpensive": "TranslateEditAddons::disallowLangTranslations",
- "EditPageBeforeEditButtons": "TranslateEditAddons::buttonHack",
"LanguageGetTranslatedLanguageNames": "TranslateHooks::translateMessageDocumentationLanguage",
"TranslateSupportedLanguages": "TranslateHooks::translateMessageDocumentationLanguage",
"ArticlePrepareTextForEdit": "TranslateEditAddons::disablePreSaveTransform",
@@ -319,7 +305,6 @@
"AdminLinks": "TranslateHooks::onAdminLinks",
"MergeAccountFromTo": "TranslateHooks::onMergeAccountFromTo",
"DeleteAccount": "TranslateHooks::onDeleteAccount",
- "AbuseFilter-filterAction": "TranslateHooks::onAbuseFilterAlterVariables",
"AbuseFilterAlterVariables": "TranslateHooks::onAbuseFilterAlterVariables",
"AbuseFilter-computeVariable": "TranslateHooks::onAbuseFilterComputeVariable",
"AbuseFilter-builder": "TranslateHooks::onAbuseFilterBuilder",
@@ -333,8 +318,24 @@
"MessageGroupStats": "SpecialMessageGroupStats",
"ImportTranslations": "SpecialImportTranslations",
"ExportTranslations": "SpecialExportTranslations",
- "ManageMessageGroups": "SpecialManageGroups",
- "SupportedLanguages": "SpecialSupportedLanguages",
+ "ManageMessageGroups": {
+ "class": "SpecialManageGroups",
+ "services": [
+ "ContentLanguage",
+ "NamespaceInfo",
+ "RevisionLookup",
+ "Translate:GroupSynchronizationCache"
+ ]
+ },
+ "SupportedLanguages": {
+ "class": "\\MediaWiki\\Extension\\Translate\\Statistics\\ActiveLanguagesSpecialPage",
+ "services": [
+ "MainConfig",
+ "Translate:TranslatorActivity",
+ "LanguageNameUtils",
+ "DBLoadBalancer"
+ ]
+ },
"AggregateGroups": "SpecialAggregateGroups",
"SearchTranslations": "SpecialSearchTranslations"
},
@@ -355,6 +356,13 @@
"translationaids": "ApiTranslationAids",
"translationreview": "ApiTranslationReview",
"translationcheck": "ApiTranslationCheck",
+ "translationstats": "\\MediaWiki\\Extension\\Translate\\Statistics\\QueryTranslationStatsActionApi",
+ "managegroupsynchronizationcache": {
+ "class": "\\MediaWiki\\Extension\\Translate\\Synchronization\\ManageGroupSynchronizationCacheActionApi",
+ "services": [
+ "Translate:GroupSynchronizationCache"
+ ]
+ },
"ttmserver": "ApiTTMServer",
"searchtranslations": "ApiSearchTranslations"
},
@@ -364,7 +372,7 @@
"MessageIndexRebuildJob": "MessageIndexRebuildJob",
"MessageUpdateJob": "MessageUpdateJob",
"TTMServerMessageUpdateJob": "TTMServerMessageUpdateJob",
- "UpdateTranslatorActivity": "\\MediaWiki\\Extensions\\Translate\\Statistics\\UpdateTranslatorActivityJob"
+ "UpdateTranslatorActivity": "\\MediaWiki\\Extension\\Translate\\Statistics\\UpdateTranslatorActivityJob"
},
"LogTypes": [
"translationreview"
@@ -408,7 +416,16 @@
]
},
"ext.translate.specialpages.styles": {
- "styles": "resources/css/ext.translate.special.translations.css",
+ "styles": [
+ "resources/css/ext.translate.special.aggregategroups.css",
+ "resources/css/ext.translate.special.managegroups.css",
+ "resources/css/ext.translate.special.pagemigration.css",
+ "resources/css/ext.translate.special.pagepreparation.css",
+ "resources/css/ext.translate.special.pagetranslation.css",
+ "resources/css/ext.translate.special.searchtranslations.css",
+ "resources/css/ext.translate.special.supportedlanguages.css",
+ "resources/css/ext.translate.special.translations.css"
+ ],
"targets": [
"desktop",
"mobile"
@@ -536,13 +553,6 @@
"mobile"
]
},
- "ext.translate.special.aggregategroups.styles": {
- "styles": "resources/css/ext.translate.special.aggregategroups.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
"ext.translate.special.languagestats": {
"scripts": "resources/js/ext.translate.special.languagestats.js",
"messages": [
@@ -556,15 +566,6 @@
"desktop"
]
},
- "ext.translate.special.managegroups.styles": {
- "styles": [
- "resources/css/ext.translate.special.managegroups.css"
- ],
- "targets": [
- "desktop",
- "mobile"
- ]
- },
"ext.translate.messagerenamedialog": {
"dependencies": [
"oojs-ui-core",
@@ -629,13 +630,6 @@
"mobile"
]
},
- "ext.translate.special.pagemigration.styles": {
- "styles": "resources/css/ext.translate.special.pagemigration.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
"ext.translate.special.pagepreparation": {
"scripts": "resources/js/ext.translate.special.pagepreparation.js",
"dependencies": [
@@ -659,20 +653,6 @@
"mobile"
]
},
- "ext.translate.special.pagepreparation.styles": {
- "styles": "resources/css/ext.translate.special.pagepreparation.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
- "ext.translate.special.pagetranslation.styles": {
- "styles": "resources/css/ext.translate.special.pagetranslation.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
"ext.translate.special.searchtranslations": {
"scripts": "resources/js/ext.translate.special.searchtranslations.js",
"dependencies": [
@@ -691,20 +671,6 @@
"mobile"
]
},
- "ext.translate.special.searchtranslations.styles": {
- "styles": "resources/css/ext.translate.special.searchtranslations.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
- "ext.translate.special.supportedlanguages": {
- "styles": "resources/css/ext.translate.special.supportedlanguages.css",
- "targets": [
- "desktop",
- "mobile"
- ]
- },
"ext.translate.special.translate": {
"scripts": [
"resources/js/ext.translate.workflowselector.js",
@@ -775,8 +741,11 @@
]
},
"ext.translate.special.translationstats": {
- "scripts": "resources/js/ext.translate.special.translationstats.js",
+ "packageFiles": [
+ "resources/js/ext.translate.special.translationstats.js"
+ ],
"dependencies": [
+ "ext.translate.translationstats.graphbuilder.js",
"mediawiki.widgets.datetime"
],
"targets": [
@@ -784,6 +753,51 @@
"mobile"
]
},
+ "ext.translate.translationstats.embedded": {
+ "packageFiles": [
+ "resources/js/ext.translate.translationstats.embedded.js"
+ ],
+ "dependencies": [
+ "ext.translate.translationstats.graphbuilder.js"
+ ],
+ "targets": [
+ "desktop",
+ "mobile"
+ ]
+ },
+ "ext.translate.translationstats.graphbuilder.js": {
+ "scripts": [
+ "resources/js/ext.translate.translationstats.graphbuilder.js",
+ "resources/lib/Chart.js/Chart.js"
+ ],
+ "dependencies": [
+ "mediawiki.api",
+ "mediawiki.language"
+ ],
+ "styles": [
+ "resources/lib/Chart.js/Chart.css",
+ "resources/css/ext.translate.translationstats.graphbuilder.less"
+ ],
+ "messages": [
+ "translate-statsf-count-edits",
+ "translate-statsf-count-users",
+ "translate-statsf-count-registrations",
+ "translate-statsf-count-reviews",
+ "translate-statsf-count-reviewers",
+ "translate-statsf-scale-months",
+ "translate-statsf-scale-weeks",
+ "translate-statsf-scale-days",
+ "translate-statsf-scale-hours",
+ "translate-statsf-unknown-error",
+ "translate-statsf-error-message",
+ "translate-statsf-graph-alt-text-info",
+ "translate-statsf-alt-text"
+ ],
+ "targets": [
+ "desktop",
+ "mobile"
+ ]
+ },
"ext.translate.statsbar": {
"styles": "resources/css/ext.translate.statsbar.css",
"scripts": "resources/js/ext.translate.statsbar.js",
@@ -950,7 +964,7 @@
"public": true
},
"TranslateCacheDirectory": {
- "value": "false",
+ "value": false,
"description": "Set location of cache files. Defaults to $wgCacheDirectory.",
"public": true
},
@@ -964,16 +978,6 @@
"description": "If you have lots of message groups, especially file based ones, and the message index rebuilding gets slow, set this to true to delay the rebuilding via JobQueue. This only makes sense if you have configured jobs to be processed outside of requests via cron or similar.",
"public": true
},
- "TranslatePHPlot": {
- "value": false,
- "description": "For Special:TranslationStats PHPlot is needed to produce graphs. Set this the location of phplot.php.",
- "public": true
- },
- "TranslatePHPlotFont": {
- "value": "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf",
- "description": "The default font for PHPlot for drawing text. Only used if the automatic best font selection fails. The automatic best font selector uses language code to call fc-match program. If you have open_basedir restriction or safe-mode, using the found font is likely to fail. In this case you need to change the code to use hard-coded font, or copy fonts to location PHP can access them, and make sure fc-match returns only those fonts.",
- "public": true
- },
"TranslateUseSandbox": {
"value": false,
"description": "Whether to allow users to sign up via a sandbox. Sandboxed users cannot do much until approved and thus they can be get rid of easily. This only works with MediaWiki 1.27 and newer, and only if registration is configured to not use account creation providers which give REDIRECT or UI responses or require any other field than the default username/password/email.",
@@ -1013,6 +1017,27 @@
"value": [],
"description": "Define various web services that provide translation suggestions.\n\nTranslation memories are documented in our main documentation. See https://www.mediawiki.org/wiki/Help:Extension:Translate/Translation_memories\n\nFor Apertium, you should get an API key. See http://wiki.apertium.org/wiki/Apertium_web_service\n\nYandex translation helper also provides langlimit option to limit total number of suggestions (set to 0 to get all possible translations) and langorder array to sort languages. Yandex translate engine is based on wordnet, generated from search index, so number of indexed websites should be a good heuristic to define the default language order.\n\nThe machine translation services are provided with the following information: server ip address; versions of MediaWiki and Translate extension; source text to translate; private API key if provided",
"public": true
+ },
+ "TranslateStatsProviders": {
+ "value": {
+ "edits": "MediaWiki\\Extension\\Translate\\Statistics\\TranslatePerLanguageStats",
+ "users": "MediaWiki\\Extension\\Translate\\Statistics\\TranslatePerLanguageStats",
+ "reviews": "MediaWiki\\Extension\\Translate\\Statistics\\ReviewPerLanguageStats",
+ "reviewers": "MediaWiki\\Extension\\Translate\\Statistics\\ReviewPerLanguageStats",
+ "registrations": "MediaWiki\\Extension\\Translate\\Statistics\\TranslateRegistrationStats"
+ },
+ "description": "Add, disable or overwrite default stats type providers.",
+ "public": true
+ },
+ "TranslateGroupSynchronizationCache": {
+ "value": false,
+ "description": "If true, enables the group synchronization cache that keeps track of FileBasedMessageGroups messages currently being processed via MessageUpdateJob",
+ "public": true
+ },
+ "TranslatePageMoveLimit": {
+ "value": 500,
+ "description": "If set, displays a warning and does not allow user to move translatable pages having more subpages than this value",
+ "public": true
}
},
"DefaultUserOptions": {
diff --git a/MLEB/Translate/ffs/AndroidXmlFFS.php b/MLEB/Translate/ffs/AndroidXmlFFS.php
index 82fd9cb1..1a721f08 100644
--- a/MLEB/Translate/ffs/AndroidXmlFFS.php
+++ b/MLEB/Translate/ffs/AndroidXmlFFS.php
@@ -75,9 +75,7 @@ class AndroidXmlFFS extends SimpleFFS {
}
protected function scrapeAuthors( $string ) {
- $match = [];
- preg_match( '~<!-- Authors:\n((?:\* .*\n)*)-->~', $string, $match );
- if ( !$match ) {
+ if ( !preg_match( '~<!-- Authors:\n((?:\* .*\n)*)-->~', $string, $match ) ) {
return [];
}
@@ -145,21 +143,29 @@ class AndroidXmlFFS extends SimpleFFS {
}
protected function writeReal( MessageCollection $collection ) {
- $template = '<?xml version="1.0" encoding="utf-8"?>';
+ global $wgTranslateDocumentationLanguageCode;
+
+ $collection->filter( 'hastranslation', false );
+ if ( count( $collection ) === 0 ) {
+ return '';
+ }
+
+ $template = '<?xml version="1.0" encoding="utf-8"?>';
$template .= $this->doAuthors( $collection );
$template .= '<resources></resources>';
$writer = new SimpleXMLElement( $template );
- $mangler = $this->group->getMangler();
- $collection->filter( 'hastranslation', false );
- if ( count( $collection ) === 0 ) {
- return '';
+ if ( $collection->getLanguage() === $wgTranslateDocumentationLanguageCode ) {
+ $writer->addAttribute(
+ 'tools:ignore',
+ 'all',
+ 'http://schemas.android.com/tools'
+ );
}
- /**
- * @var TMessage $m
- */
+ $mangler = $this->group->getMangler();
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$key = $mangler->unmangle( $key );
diff --git a/MLEB/Translate/ffs/AppleFFS.php b/MLEB/Translate/ffs/AppleFFS.php
index 6d50baca..1e118678 100644
--- a/MLEB/Translate/ffs/AppleFFS.php
+++ b/MLEB/Translate/ffs/AppleFFS.php
@@ -105,9 +105,7 @@ class AppleFFS extends SimpleFFS {
$output = '';
$mangler = $this->group->getMangler();
- /**
- * @var TMessage $m
- */
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$value = $m->translation();
$value = str_replace( TRANSLATE_FUZZY, '', $value );
diff --git a/MLEB/Translate/ffs/AppleInfoPlistFfs.php b/MLEB/Translate/ffs/AppleInfoPlistFfs.php
index 904c77e1..42ded4ae 100644
--- a/MLEB/Translate/ffs/AppleInfoPlistFfs.php
+++ b/MLEB/Translate/ffs/AppleInfoPlistFfs.php
@@ -1,4 +1,5 @@
<?php
+
/**
* AppleInfoPlistFfs extends the AppleFFS class and implements support for
* Apple InfoPlist .strings files.
diff --git a/MLEB/Translate/ffs/DtdFFS.php b/MLEB/Translate/ffs/DtdFFS.php
index 89c1b84a..d7c21568 100644
--- a/MLEB/Translate/ffs/DtdFFS.php
+++ b/MLEB/Translate/ffs/DtdFFS.php
@@ -59,9 +59,7 @@ class DtdFFS extends SimpleFFS {
$output = '';
$mangler = $this->group->getMangler();
- /**
- * @var TMessage $m
- */
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$key = $mangler->unmangle( $key );
$trans = $m->translation();
diff --git a/MLEB/Translate/ffs/FlatPhpFFS.php b/MLEB/Translate/ffs/FlatPhpFFS.php
index 997a4088..4620ba5a 100644
--- a/MLEB/Translate/ffs/FlatPhpFFS.php
+++ b/MLEB/Translate/ffs/FlatPhpFFS.php
@@ -65,9 +65,7 @@ class FlatPhpFFS extends SimpleFFS implements MetaYamlSchemaExtender {
$mangler = $this->group->getMangler();
- /**
- * @var TMessage $item
- */
+ /** @var TMessage $item */
foreach ( $collection as $item ) {
$key = $mangler->unmangle( $item->key() );
$key = stripcslashes( $key );
@@ -87,7 +85,7 @@ class FlatPhpFFS extends SimpleFFS implements MetaYamlSchemaExtender {
}
protected function doHeader( MessageCollection $collection ) {
- global $wgSitename, $wgTranslateDocumentationLanguageCode;
+ global $wgServer, $wgTranslateDocumentationLanguageCode;
$code = $collection->code;
$name = TranslateUtils::getLanguageName( $code );
@@ -105,7 +103,7 @@ class FlatPhpFFS extends SimpleFFS implements MetaYamlSchemaExtender {
$output = <<<PHP
/** $name ($native)
* $docu
- * To improve a translation please visit http://$wgSitename
+ * To improve a translation please visit $wgServer
*
* @ingroup Language
* @file
diff --git a/MLEB/Translate/ffs/GettextFFS.php b/MLEB/Translate/ffs/GettextFFS.php
index 9174349a..bdbbd0c5 100644
--- a/MLEB/Translate/ffs/GettextFFS.php
+++ b/MLEB/Translate/ffs/GettextFFS.php
@@ -9,7 +9,8 @@
* @file
*/
-use MediaWiki\Extensions\Translate\Utilities\GettextPlural;
+use MediaWiki\Extension\Translate\Utilities\GettextPlural;
+use MediaWiki\Logger\LoggerFactory;
/**
* New-style FFS class that implements support for gettext file format.
@@ -26,9 +27,7 @@ class GettextFFS extends SimpleFFS implements MetaYamlSchemaExtender {
protected $offlineMode = false;
- /**
- * @param bool $value
- */
+ /** @param bool $value */
public function setOfflineMode( $value ) {
$this->offlineMode = $value;
}
@@ -104,7 +103,8 @@ class GettextFFS extends SimpleFFS implements MetaYamlSchemaExtender {
$potmode = true;
}
} else {
- throw new MWException( "Gettext file header was not found:\n\n$data" );
+ $message = "Gettext file header was not found:\n\n$data";
+ throw new GettextParseException( $message );
}
$template = [];
@@ -358,7 +358,7 @@ class GettextFFS extends SimpleFFS implements MetaYamlSchemaExtender {
if ( strpos( $line, ':' ) === false ) {
error_log( __METHOD__ . ": $line" );
}
- list( $key, $value ) = explode( ':', $line, 2 );
+ [ $key, $value ] = explode( ':', $line, 2 );
$tags[trim( $key )] = trim( $value );
}
@@ -366,23 +366,26 @@ class GettextFFS extends SimpleFFS implements MetaYamlSchemaExtender {
}
protected function writeReal( MessageCollection $collection ) {
- $pot = $this->read( 'en' )['EXTRA'];
+ // FIXME: this should be the source language
+ $pot = $this->read( 'en' ) ?? [];
$code = $collection->code;
- $template = $this->read( $code )['EXTRA'];
- $pluralCount = false;
- $output = $this->doGettextHeader( $collection, $template );
+ $template = $this->read( $code ) ?? [];
+ $output = $this->doGettextHeader( $collection, $template['EXTRA'] ?? [] );
$pluralRule = GettextPlural::getPluralRule( $code );
if ( !$pluralRule ) {
$pluralRule = GettextPlural::getPluralRule( 'en' );
- error_log( "Missing plural rule for code $code" );
+ LoggerFactory::getInstance( 'Translate' )->warning(
+ "T235180: Missing Gettext plural rule for '{languagecode}'",
+ [ 'languagecode' => $code ]
+ );
}
$pluralCount = GettextPlural::getPluralCount( $pluralRule );
/** @var TMessage $m */
foreach ( $collection as $key => $m ) {
- $transTemplate = $template['TEMPLATE'][$key] ?? [];
- $potTemplate = $pot['TEMPLATE'][$key] ?? [];
+ $transTemplate = $template['EXTRA']['TEMPLATE'][$key] ?? [];
+ $potTemplate = $pot['EXTRA']['TEMPLATE'][$key] ?? [];
$output .= $this->formatMessageBlock( $key, $m, $transTemplate, $potTemplate, $pluralCount );
}
diff --git a/MLEB/Translate/ffs/GettextParseException.php b/MLEB/Translate/ffs/GettextParseException.php
new file mode 100644
index 00000000..9d840d63
--- /dev/null
+++ b/MLEB/Translate/ffs/GettextParseException.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * @author Michael Holloway
+ * @license GPL-2.0-or-later
+ * @file
+ */
+
+/**
+ * Exception thrown when a Gettext file could not be parsed, such as when missing required headers.
+ */
+class GettextParseException extends MWException {
+}
diff --git a/MLEB/Translate/ffs/IniFFS.php b/MLEB/Translate/ffs/IniFFS.php
index ab359df1..0c2591a4 100644
--- a/MLEB/Translate/ffs/IniFFS.php
+++ b/MLEB/Translate/ffs/IniFFS.php
@@ -17,17 +17,16 @@
*/
class IniFFS extends SimpleFFS {
public static function isValid( $data ) {
- $conf = [ 'BASIC' => [ 'class' => FileBasedMessageGroup::class, 'namespace' => 8 ] ];
- /**
- * @var FileBasedMessageGroup $group
- */
+ $conf = [
+ 'BASIC' => [ 'class' => FileBasedMessageGroup::class, 'namespace' => 8 ],
+ 'FILES' => []
+ ];
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $conf );
'@phan-var FileBasedMessageGroup $group';
- Wikimedia\suppressWarnings();
$ffs = new self( $group );
$parsed = $ffs->readFromVariable( $data );
- Wikimedia\restoreWarnings();
return (bool)count( $parsed['MESSAGES'] );
}
@@ -73,9 +72,7 @@ class IniFFS extends SimpleFFS {
$output = '';
$mangler = $this->group->getMangler();
- /**
- * @var $m TMessage
- */
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$value = $m->translation();
if ( $value === null ) {
diff --git a/MLEB/Translate/ffs/JavaFFS.php b/MLEB/Translate/ffs/JavaFFS.php
index 350f48f9..768a2716 100644
--- a/MLEB/Translate/ffs/JavaFFS.php
+++ b/MLEB/Translate/ffs/JavaFFS.php
@@ -20,9 +20,7 @@ class JavaFFS extends SimpleFFS implements MetaYamlSchemaExtender {
protected $keySeparator = '=';
- /**
- * @param FileBasedMessageGroup $group
- */
+ /** @param FileBasedMessageGroup $group */
public function __construct( FileBasedMessageGroup $group ) {
parent::__construct( $group );
@@ -105,9 +103,7 @@ class JavaFFS extends SimpleFFS implements MetaYamlSchemaExtender {
$output = '';
$mangler = $this->group->getMangler();
- /**
- * @var TMessage $m
- */
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$value = $m->translation();
$value = str_replace( TRANSLATE_FUZZY, '', $value );
diff --git a/MLEB/Translate/ffs/JavaScriptFFS.php b/MLEB/Translate/ffs/JavaScriptFFS.php
index 8cc56671..c8694d79 100644
--- a/MLEB/Translate/ffs/JavaScriptFFS.php
+++ b/MLEB/Translate/ffs/JavaScriptFFS.php
@@ -134,9 +134,7 @@ abstract class JavaScriptFFS extends SimpleFFS {
* Get and write messages.
*/
$body = '';
- /**
- * @var TMessage $message
- */
+ /** @var TMessage $message */
foreach ( $collection as $message ) {
if ( strlen( $message->translation() ) === 0 ) {
continue;
diff --git a/MLEB/Translate/ffs/JsonFFS.php b/MLEB/Translate/ffs/JsonFFS.php
index 70ea86ac..25ca3ec7 100644
--- a/MLEB/Translate/ffs/JsonFFS.php
+++ b/MLEB/Translate/ffs/JsonFFS.php
@@ -27,9 +27,7 @@ class JsonFFS extends SimpleFFS {
return is_array( FormatJson::decode( $data, /*as array*/true ) );
}
- /**
- * @param FileBasedMessageGroup $group
- */
+ /** @param FileBasedMessageGroup $group */
public function __construct( FileBasedMessageGroup $group ) {
parent::__construct( $group );
$this->flattener = $this->getFlattener();
@@ -88,9 +86,7 @@ class JsonFFS extends SimpleFFS {
$mangler = $this->group->getMangler();
- /**
- * @var $m TMessage
- */
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$value = $m->translation();
if ( $value === null ) {
diff --git a/MLEB/Translate/ffs/PremadeMediawikiExtensionGroups.php b/MLEB/Translate/ffs/PremadeMediawikiExtensionGroups.php
index b57a2148..6d0c495f 100644
--- a/MLEB/Translate/ffs/PremadeMediawikiExtensionGroups.php
+++ b/MLEB/Translate/ffs/PremadeMediawikiExtensionGroups.php
@@ -7,25 +7,23 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\MediaWikiInsertablesSuggester;
+
/**
* Class which handles special definition format for %MediaWiki extensions and skins.
*/
class PremadeMediawikiExtensionGroups {
/** @var bool */
protected $useConfigure = true;
-
/** @var string */
protected $idPrefix = 'ext-';
-
/** @var int */
protected $namespace = NS_MEDIAWIKI;
-
/**
* @var string
* @see __construct
*/
protected $path;
-
/**
* @var string
* @see __construct
@@ -157,7 +155,9 @@ class PremadeMediawikiExtensionGroups {
[ 'id' => 'MediaWikiPlural' ],
];
- $conf['INSERTABLES']['class'] = MediaWikiInsertablesSuggester::class;
+ $conf['INSERTABLES'] = [
+ [ 'class' => MediaWikiInsertablesSuggester::class ]
+ ];
if ( isset( $info['optional'] ) ) {
$conf['TAGS']['optional'] = $info['optional'];
diff --git a/MLEB/Translate/ffs/SimpleFFS.php b/MLEB/Translate/ffs/SimpleFFS.php
index 743444b9..ddc2e476 100644
--- a/MLEB/Translate/ffs/SimpleFFS.php
+++ b/MLEB/Translate/ffs/SimpleFFS.php
@@ -24,13 +24,9 @@ class SimpleFFS implements FFS {
return [];
}
- /**
- * @var FileBasedMessageGroup
- */
+ /** @var FileBasedMessageGroup */
protected $group;
-
protected $writePath;
-
/**
* Stores the FILES section of the YAML configuration,
* which can be accessed for extra FFS class specific options.
@@ -46,30 +42,22 @@ class SimpleFFS implements FFS {
$this->extra = $conf['FILES'];
}
- /**
- * @param FileBasedMessageGroup $group
- */
+ /** @param FileBasedMessageGroup $group */
public function setGroup( FileBasedMessageGroup $group ) {
$this->group = $group;
}
- /**
- * @return FileBasedMessageGroup
- */
+ /** @return FileBasedMessageGroup */
public function getGroup() {
return $this->group;
}
- /**
- * @param string $writePath
- */
+ /** @param string $writePath */
public function setWritePath( $writePath ) {
$this->writePath = $writePath;
}
- /**
- * @return string
- */
+ /** @return string */
public function getWritePath() {
return $this->writePath;
}
@@ -329,7 +317,7 @@ class SimpleFFS implements FFS {
}
/**
- * Remove blacklisted authors.
+ * Remove excluded authors.
*
* @param array $authors
* @param string $code
@@ -342,21 +330,21 @@ class SimpleFFS implements FFS {
foreach ( $authors as $i => $v ) {
$hash = "$groupId;$code;$v";
- $blacklisted = false;
+ $excluded = false;
foreach ( $wgTranslateAuthorBlacklist as $rule ) {
list( $type, $regex ) = $rule;
if ( preg_match( $regex, $hash ) ) {
if ( $type === 'white' ) {
- $blacklisted = false;
+ $excluded = false;
break;
} else {
- $blacklisted = true;
+ $excluded = true;
}
}
}
- if ( $blacklisted ) {
+ if ( $excluded ) {
unset( $authors[$i] );
}
}
diff --git a/MLEB/Translate/ffs/YamlFFS.php b/MLEB/Translate/ffs/YamlFFS.php
index 240dd08e..d48b74ec 100644
--- a/MLEB/Translate/ffs/YamlFFS.php
+++ b/MLEB/Translate/ffs/YamlFFS.php
@@ -11,9 +11,7 @@ class YamlFFS extends SimpleFFS implements MetaYamlSchemaExtender {
/** @var ArrayFlattener */
private $flattener;
- /**
- * @param FileBasedMessageGroup $group
- */
+ /** @param FileBasedMessageGroup $group */
public function __construct( FileBasedMessageGroup $group ) {
parent::__construct( $group );
$this->flattener = $this->getFlattener();
@@ -64,9 +62,8 @@ class YamlFFS extends SimpleFFS implements MetaYamlSchemaExtender {
$mangler = $this->group->getMangler();
$messages = [];
- /**
- * @var $m TMessage
- */
+
+ /** @var TMessage $m */
foreach ( $collection as $key => $m ) {
$key = $mangler->unmangle( $key );
$value = $m->translation();
diff --git a/MLEB/Translate/i18n/api/ar.json b/MLEB/Translate/i18n/api/ar.json
index aed14838..8e052970 100644
--- a/MLEB/Translate/i18n/api/ar.json
+++ b/MLEB/Translate/i18n/api/ar.json
@@ -23,7 +23,6 @@
"apihelp-groupreview-example-1": "علم على حالة الترجمة الألمانية لمجموعة الرسائل \"group-Example\" كجاهزة",
"apihelp-query+languagestats-description": "استعلم عن إحصاءات اللغة.",
"apihelp-query+languagestats-summary": "إحصائيات لغة الاستعلام.",
- "apihelp-query+languagestats-param-timelimit": "الوقت الأقصى لإمضائه في حساب الإحصاءات المفقودة. لو صفر، فقط النتائج المخزنة من البداية سيتم إرجاعها.",
"apihelp-query+languagestats-param-language": "كود اللغة.",
"apihelp-query+languagestats-example-1": "قائمة إحصاءات إكمال الترجمة للفنلندية",
"apihelp-query+messagecollection-description": "استعلم MessageCollection حول الترجمات.",
@@ -56,7 +55,6 @@
"apihelp-query+messagegroups-example-1": "أظهر مجموعات الرسائل",
"apihelp-query+messagegroupstats-description": "استعلم عن إحصاءات مجموعة الرسائل.",
"apihelp-query+messagegroupstats-summary": "استعلم عن مجموعة الرسائل.",
- "apihelp-query+messagegroupstats-param-timelimit": "الوقت الأقصى لإمضائه في حساب الإحصاءات المفقودة. لو صفر، فقط النتائج المخزنة من البداية سيتم إرجاعها.",
"apihelp-query+messagegroupstats-param-group": "معرف مجموعة الرسائل.",
"apihelp-query+messagegroupstats-example-1": "قائمة بإحصاءات إكمال الترجمة للمجموعة \"page-Example\"",
"apihelp-query+messagetranslations-description": "استعلم في كل الترجمات عن رسالة واحدة.",
diff --git a/MLEB/Translate/i18n/api/ast.json b/MLEB/Translate/i18n/api/ast.json
index 4a2bede9..379317f2 100644
--- a/MLEB/Translate/i18n/api/ast.json
+++ b/MLEB/Translate/i18n/api/ast.json
@@ -22,7 +22,6 @@
"apihelp-groupreview-example-1": "Marcar l'estáu de la traducción al alemán del grupu de mensaxes «grupu-Exemplu» como preparáu",
"apihelp-query+languagestats-description": "Consultar les estadístiques de llingua.",
"apihelp-query+languagestats-summary": "Consultar les estadístiques de llingua.",
- "apihelp-query+languagestats-param-timelimit": "Tiempu máximu pa pasar calculando les estadístiques que falten. Si ye cero, sólo se devuelven los resultaos guardaos en caché dende'l principiu.",
"apihelp-query+languagestats-param-language": "Códigu de llingua.",
"apihelp-query+languagestats-example-1": "Llista d'estadístiques de completáu de traducciones pal finés.",
"apihelp-query+messagecollection-description": "Consultar MessageCollection sobro les traducciones.",
@@ -49,7 +48,6 @@
"apihelp-query+messagegroups-example-1": "Amosar grupos de mensaxes",
"apihelp-query+messagegroupstats-description": "Consultar les estadístiques del grupu de mensaxes.",
"apihelp-query+messagegroupstats-summary": "Consultar les estadístiques del grupu de mensaxes.",
- "apihelp-query+messagegroupstats-param-timelimit": "Tiempu máximu pa pasar calculando les estadístiques que falten. Si ye cero, sólo se devuelven los resultaos guardaos en caché dende'l principiu.",
"apihelp-query+messagegroupstats-param-group": "ID del grupu de mensaxes.",
"apihelp-query+messagegroupstats-example-1": "Llista d'estadístiques d'acabamientu de traducciones pal grupu \"page-Example\"",
"apihelp-query+messagetranslations-description": "Consultar toles traducciones pa un únicu mensaxe.",
diff --git a/MLEB/Translate/i18n/api/ban.json b/MLEB/Translate/i18n/api/ban.json
new file mode 100644
index 00000000..c1d89aac
--- /dev/null
+++ b/MLEB/Translate/i18n/api/ban.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chinamoonroll"
+ ]
+ },
+ "apihelp-query+languagestats-description": "Statistik basa kuéri",
+ "apihelp-query+languagestats-summary": "Statistik basa kuéri"
+}
diff --git a/MLEB/Translate/i18n/api/bg.json b/MLEB/Translate/i18n/api/bg.json
index 2ce13a34..21e042d1 100644
--- a/MLEB/Translate/i18n/api/bg.json
+++ b/MLEB/Translate/i18n/api/bg.json
@@ -1,11 +1,15 @@
{
"@metadata": {
"authors": [
+ "MuratTheTurkish",
"StanProg",
"Vlad5250"
]
},
+ "apihelp-aggregategroups-description": "Управление на обобщените групи съобщения.\n\nМожете да добавяте и премахвате обобщени групи съобщения и да асоциирате или отделяте групи от съобщения от тях (една по една).",
"apihelp-aggregategroups-summary": "Управление на обобщени групи съобщения.",
+ "apihelp-aggregategroups-extended-description": "Можете да добавяте и премахвате обобщени групи съобщения и да асоциирате или отделяте групи от съобщения от тях (една по една).",
+ "apihelp-aggregategroups-param-do": "Какво да правим с обобщената група съобщения.",
"apihelp-aggregategroups-param-aggregategroup": "ID на обобщената група съобщения.",
"apihelp-aggregategroups-param-group": "ID на група съобщения.",
"apihelp-aggregategroups-param-groupname": "Название на обобщената групата съобщения.",
@@ -17,10 +21,23 @@
"apihelp-groupreview-param-language": "Езиков код.",
"apihelp-groupreview-param-state": "Новото състояние на групата.",
"apihelp-groupreview-example-1": "Отбелязване на състоянието на немския превод за групата съобщения „група-Пример“ като готов",
+ "apihelp-query+languagestats-description": "Статистика за езика на заявките.",
+ "apihelp-query+languagestats-summary": "Статистика за езика на заявките.",
"apihelp-query+languagestats-param-language": "Езиков код.",
+ "apihelp-query+languagestats-example-1": "Списък със статистически данни за завършване на превода за финландски",
+ "apihelp-query+messagecollection-description": "Заявка MessageCollection за преводите.",
+ "apihelp-query+managemessagegroups-summary": "Извличайте възможни преименувания на съобщение в група по време на импортиране",
+ "apihelp-query+managemessagegroups-description": "Извличайте възможни преименувания на съобщение в група по време на импортиране",
+ "apihelp-query+managemessagegroups-param-groupId": "Идентификатор на групата",
+ "apihelp-query+managemessagegroups-param-messageKey": "Ключ за съобщение",
+ "apihelp-query+managemessagegroups-param-changesetName": "Промяна на името на набора - по подразбиране / без надзор / Mediawiki и др.",
+ "apihelp-query+managemessagegroups-example-1": "Извлечете възможни преименувания за дадения ключ в дадената група.",
+ "apihelp-query+messagecollection-summary": "Заявка MessageCollection за преводите.",
"apihelp-query+messagecollection-param-group": "Група съобщения.",
"apihelp-query+messagecollection-param-language": "Езиков код.",
"apihelp-query+messagecollection-param-limit": "Колко съобщения да бъдат показани (след филтриране).",
+ "apihelp-query+messagecollection-param-offset": "Цяло число или отместване на клавиша за старт.",
+ "apihelp-query+messagecollection-param-filter": "Филтри за събиране на съобщения. Използвайте <kbd>!</kbd>, за да отречете състоянието. Например <kbd>!fuzzy</kbd> означава да се изброят само всички не-размити съобщения. Филтрите се прилагат в посочения ред.\n;fuzzy:Съобщения с размит етикет.\n;optional:Съобщения, които трябва да бъдат преведени само ако са необходими промени.\n;ignored:Съобщения, които никога не се превеждат.\n;hastranslation:Съобщения, които имат превод, независимо дали е размит или не.\n;translated:Съобщения, които имат превод, който не е размит.\n;changed:Съобщения, които са преведени или променени от последния износ.\n;reviewer&#58;N:Съобщения, където потребителският номер <kbd>N</kbd> е сред проверяващите.\n;last-translator&#58;N:Съобщения, където потребителският номер <kbd>N</kbd> е последният преводач.",
"apihelp-query+messagecollection-example-1": "Списък на поддържаните езици",
"apihelp-query+messagecollection-example-2": "Списък на задължителните дефиниции на съобщения за група „page-Example“",
"apihelp-query+messagecollection-example-4": "Повече информация за най-новите версии на превода за групата „page-Example“",
diff --git a/MLEB/Translate/i18n/api/bs.json b/MLEB/Translate/i18n/api/bs.json
index eaba88b9..1975725b 100644
--- a/MLEB/Translate/i18n/api/bs.json
+++ b/MLEB/Translate/i18n/api/bs.json
@@ -22,7 +22,6 @@
"apihelp-groupreview-example-1": "Označi stanje njemačkog prijevoda grupa poruka \"group-Example\" spremnim",
"apihelp-query+languagestats-description": "Upit jezičkih statistika.",
"apihelp-query+languagestats-summary": "Ispitaj jezičke statistike.",
- "apihelp-query+languagestats-param-timelimit": "Maksimalno vrijeme koje se može potrošiti na izračunavanje statistike koja nedostaje. Ako je nula, prikazat će se samo keširani rezultati od početka.",
"apihelp-query+languagestats-param-language": "Jezički kôd.",
"apihelp-query+languagestats-example-1": "Spisak statistika dovršenosti prijevoda na finski",
"apihelp-query+messagecollection-description": "Izvrši upit Zbirci podataka o prijevodima.",
@@ -49,7 +48,6 @@
"apihelp-query+messagegroups-example-1": "Prikaži grupe poruka",
"apihelp-query+messagegroupstats-description": "Ispitaj statistike grupa poruka.",
"apihelp-query+messagegroupstats-summary": "Ispitaj statistike grupa poruka.",
- "apihelp-query+messagegroupstats-param-timelimit": "Maksimalno vrijeme koje se može potrošiti na izračunavanje statistike koja nedostaje. Ako je nula, prikazat će se samo keširani rezultati od početka.",
"apihelp-query+messagegroupstats-param-group": "ID grupe poruka.",
"apihelp-query+messagegroupstats-example-1": "Spisak statistike dovršenosti prijevoda za grupu \"page-Example\"",
"apihelp-query+messagetranslations-description": "Ispitaj sve prijevode jedne poruke.",
diff --git a/MLEB/Translate/i18n/api/de.json b/MLEB/Translate/i18n/api/de.json
index 126c7d04..22fc7dd9 100644
--- a/MLEB/Translate/i18n/api/de.json
+++ b/MLEB/Translate/i18n/api/de.json
@@ -24,7 +24,6 @@
"apihelp-groupreview-example-1": "Markiere den Status der deutschen Übersetzung für die Nachrichtengruppe \"group-Example\" als fertig",
"apihelp-query+languagestats-description": "Ruft Sprachstatistiken ab.",
"apihelp-query+languagestats-summary": "Ruft Sprachstatistiken ab.",
- "apihelp-query+languagestats-param-timelimit": "Maximale Zeit für die Berechnung fehlender Statistiken. Wenn Null, werden nur die zwischengespeicherten Ergebnisse von Anfang an zurückgegeben.",
"apihelp-query+languagestats-param-language": "Sprachcode.",
"apihelp-query+languagestats-example-1": "Listet Übersetzungsvervollständigungsstatistiken für Finnisch auf.",
"apihelp-query+messagecollection-description": "Ruft die Nachrichtensammlung über Übersetzungen ab.",
diff --git a/MLEB/Translate/i18n/api/en.json b/MLEB/Translate/i18n/api/en.json
index 8fa3b063..da716d3d 100644
--- a/MLEB/Translate/i18n/api/en.json
+++ b/MLEB/Translate/i18n/api/en.json
@@ -20,7 +20,6 @@
"apihelp-groupreview-example-1": "Mark the state of the German translation for the message group \"group-Example\" as ready",
"apihelp-query+languagestats-description": "Query language stats.",
"apihelp-query+languagestats-summary": "Query language stats.",
- "apihelp-query+languagestats-param-timelimit": "Maximum time to spend calculating missing statistics. If zero, only the cached results from the beginning are returned.",
"apihelp-query+languagestats-param-language": "Language code.",
"apihelp-query+languagestats-example-1": "List of translation completion statistics for Finnish",
"apihelp-query+messagecollection-description": "Query MessageCollection about translations.",
@@ -53,7 +52,6 @@
"apihelp-query+messagegroups-example-1": "Show message groups",
"apihelp-query+messagegroupstats-description": "Query message group stats.",
"apihelp-query+messagegroupstats-summary": "Query message group stats.",
- "apihelp-query+messagegroupstats-param-timelimit": "Maximum time to spend calculating missing statistics. If zero, only the cached results from the beginning are returned.",
"apihelp-query+messagegroupstats-param-group": "Message group ID.",
"apihelp-query+messagegroupstats-example-1": "List of translation completion statistics for the group \"page-Example\"",
"apihelp-query+messagetranslations-description": "Query all translations for a single message.",
@@ -65,9 +63,14 @@
"apihelp-managemessagegroups-param-groupId": "Group Id",
"apihelp-managemessagegroups-param-renameMessageKey": "Target message key being renamed",
"apihelp-managemessagegroups-param-messageKey": "Replacement message key",
- "apihelp-managemessagegroups-param-operation": "The operation to be performed. Possible values - rename / new",
+ "apihelp-managemessagegroups-param-operation": "The operation to be performed. Possible values: rename / new",
"apihelp-managemessagegroups-param-changesetName": "Change set name - Default / Unattended / Mediawiki etc.",
"apihelp-managemessagegroups-param-changesetModified": "Unix timestamp of when the changeset was last modified. If the changeset has been modified after this the API will throw an error.",
+ "apihelp-managegroupsynchronizationcache-description": "Manage group synchronization cache.",
+ "apihelp-managegroupsynchronizationcache-summary": "Manage group synchronization cache.",
+ "apihelp-managegroupsynchronizationcache-param-operation": "The operation to be performed. Possible values: resolve",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "Message title being marked as resolved",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "Group Id of the message being resolved",
"apihelp-translatesandbox-description": "Signup and manage sandboxed users.",
"apihelp-translatesandbox-summary": "Signup and manage sandboxed users.",
"apihelp-translatesandbox-param-do": "What to do.",
@@ -119,6 +122,16 @@
"apihelp-translationcheck-summary": "Validate translations.",
"apihelp-translationcheck-param-title": "Page title with namespace and language code.",
"apihelp-translationcheck-param-translation": "The translation to validate.",
+ "apihelp-translationstats-description": "Fetch translation statistics related to translation edits, active translations, new users, translation reviews and reviewers.",
+ "apihelp-translationstats-summary": "Fetch translation statistics",
+ "apihelp-translationstats-param-count": "Type of statistics being requested",
+ "apihelp-translationstats-param-days": "Number of days to fetch statistics for",
+ "apihelp-translationstats-param-group": "List of groups to fetch statistics for.",
+ "apihelp-translationstats-param-language": "List of languages to fetch statistics for.",
+ "apihelp-translationstats-param-scale": "Scale of the translation statistics",
+ "apihelp-translationstats-param-start": "Starting date from which to fetch translation statistics. Defaults to current date minus the number of 'days'.",
+ "apihelp-translationstats-example-1": "Fetch edit count for the last 30 days, for all groups and languages",
+ "apihelp-translationstats-example-2": "Fetch edit count for the last 30 days, for languages English and French.",
"apierror-translate-changeset-modified": "The changeset has been modified by another user or process. Your changes cannot be saved as it might override their changes. Please refresh the page to see the latest changes.",
"apierror-translate-duplicateaggregategroup": "Message group already exists",
"apierror-translate-fuzzymessage": "Cannot review fuzzy translations",
@@ -148,5 +161,6 @@
"apierror-translate-rename-key-invalid": "Message keys passed for rename were not found in the list of changes for the source language.",
"apierror-translate-rename-state-invalid": "One of the message passed for rename should be newly added, and the other one deleted. Current states - addition: $1 and deletion: $2.",
"apiwarn-translate-alreadyreviewedbyyou": "Already marked as reviewed by you",
- "apiwarn-translate-language-disabled-source": "The source language of this group is $1. Please select another language to translate into."
+ "apiwarn-translate-language-disabled-source": "The source language of this group is $1. Please select another language to translate into.",
+ "apierror-translate-operation-error": "There was an error while processing the request. Error: $1"
}
diff --git a/MLEB/Translate/i18n/api/fi.json b/MLEB/Translate/i18n/api/fi.json
index 727a5f64..073ea49d 100644
--- a/MLEB/Translate/i18n/api/fi.json
+++ b/MLEB/Translate/i18n/api/fi.json
@@ -18,6 +18,8 @@
"apihelp-query+languagestats-description": "Hakee kielitilastoja.",
"apihelp-query+languagestats-param-language": "Kielikoodi.",
"apihelp-query+languagestats-example-1": "Luettelo käännösten kattavuustilastoista suomeksi",
+ "apihelp-query+managemessagegroups-param-groupId": "Ryhmätunnus",
+ "apihelp-query+managemessagegroups-param-messageKey": "Viestin avain",
"apihelp-query+messagecollection-param-group": "Viestiryhmä.",
"apihelp-query+messagecollection-param-language": "Kielikoodi.",
"apihelp-query+messagecollection-param-limit": "Kuinka monta viestiä näytetään (suotimien jälkeen).",
@@ -38,7 +40,9 @@
"apihelp-searchtranslations-param-sourcelanguage": "Lähdetekstin kielikoodi.",
"apihelp-searchtranslations-param-limit": "Tuloksen koko.",
"apihelp-searchtranslations-example-1": "Näytä käännökset kielelle.",
+ "apihelp-translationcheck-summary": "Vahvista käännökset.",
"apihelp-translationcheck-param-title": "Sivun otsikko nimiavaruudella ja kielikoodilla.",
+ "apihelp-translationcheck-param-translation": "Vahvistettavat käännökset.",
"apierror-translate-duplicateaggregategroup": "Viestiryhmä on jo olemassa",
"apierror-translate-invalidgroup": "Ryhmä ei ole olemassa tai se on virheellinen",
"apierror-translate-invalidlanguage": "Pyydetty kieli ei kelpaa.",
diff --git a/MLEB/Translate/i18n/api/fr.json b/MLEB/Translate/i18n/api/fr.json
index d8da903a..dfe3f826 100644
--- a/MLEB/Translate/i18n/api/fr.json
+++ b/MLEB/Translate/i18n/api/fr.json
@@ -34,7 +34,6 @@
"apihelp-groupreview-example-1": "Marquer l’état de la traduction allemande du groupe de messages « group-Example » comme prêt",
"apihelp-query+languagestats-description": "Demander les statistiques de langue.",
"apihelp-query+languagestats-summary": "Demander les statistiques de langue.",
- "apihelp-query+languagestats-param-timelimit": "Durée maximale de calcul des statistiques manquantes. Si elle vaut zéro, seuls les résultats mis en cache depuis le début sont retournés.",
"apihelp-query+languagestats-param-language": "Code de langue.",
"apihelp-query+languagestats-example-1": "Liste de statistiques des traductions terminées pour le finnois",
"apihelp-query+messagecollection-description": "Requête MessageCollection sur les traductions.",
@@ -57,7 +56,7 @@
"apihelp-query+messagecollection-example-4": "Plus d’informations sur les dernières révisions de traduction pour le groupe « page-Example »",
"apihelp-query+messagegroups-description": "Retourne des informations sur les groupes de messages.\n\nNotez que le paramètre <tt>uselang</tt> modifie la sortie des éléments qui dépendent de la langue.",
"apihelp-query+messagegroups-summary": "Renvoie des informations concernant les groupes de messages.",
- "apihelp-query+messagegroups-extended-description": "Soyez conscient que le paramètre <tt>uselang</tt> modifie la sortie des éléments qui dépendent de la langue.",
+ "apihelp-query+messagegroups-extended-description": "Soyez conscient que le paramètre uselang modifie la sortie des éléments qui dépendent de la langue.",
"apihelp-query+messagegroups-param-depth": "Lors de l’utilisation sous forme d’arbre, limiter la profondeur à ces différents niveaux. La valeur 0 signifie qu’aucun des sous-groupes n’est présenté. Si la limite est atteinte, la sortie inclut une valeur « groupcount » qui indique le nombre d’enfants directs.",
"apihelp-query+messagegroups-param-filter": "Seuls seront retournés les messages avec un ID correspondant à l’une ou plusieurs des entrées fournies (insensibles à la casse, séparées par des barres verticale (<tt>|</tt>), caractère générique <tt>*</tt>).",
"apihelp-query+messagegroups-param-format": "Dans la présentation sous forme d’arbre, les groupes de messages peuvent exister en plusieurs endroits de l’arborescence.",
@@ -67,7 +66,6 @@
"apihelp-query+messagegroups-example-1": "Affiche les groupes de messages",
"apihelp-query+messagegroupstats-description": "Demande de statistiques de groupe de messages.",
"apihelp-query+messagegroupstats-summary": "Demander les statistiques des groupes de messages.",
- "apihelp-query+messagegroupstats-param-timelimit": "Durée maximale pour calculer les statistiques manquantes. Si c’est zéro, seuls les résultats en cache depuis le début seront renvoyés.",
"apihelp-query+messagegroupstats-param-group": "Identifiant du groupe de messages.",
"apihelp-query+messagegroupstats-example-1": "Liste des statistiques d’achèvement des traductions pour le groupe « page-Example »",
"apihelp-query+messagetranslations-description": "Demande l’ensemble des traductions pour un seul message.",
@@ -79,9 +77,14 @@
"apihelp-managemessagegroups-param-groupId": "Id du groupe",
"apihelp-managemessagegroups-param-renameMessageKey": "Clef du message cible à renommer",
"apihelp-managemessagegroups-param-messageKey": "Clef du message de remplacement",
- "apihelp-managemessagegroups-param-operation": "L’opération à effectuer. Valeurs possibles : renommer / nouveau",
+ "apihelp-managemessagegroups-param-operation": "L’opération à effectuer. Valeurs possibles : renommer / nouveau",
"apihelp-managemessagegroups-param-changesetName": "Modifier le nom de l’ensemble : Défaut / Inattendu / MediaWiki / etc.",
"apihelp-managemessagegroups-param-changesetModified": "Horodatage Unix du moment où l’ensemble de modifications a été modifié en dernier. S’il a été modifié après cela, l’API lèvera une erreur.",
+ "apihelp-managegroupsynchronizationcache-description": "Gérer le cache de synchronisation des groupes.",
+ "apihelp-managegroupsynchronizationcache-summary": "Gérer le cache de synchronisation des groupes.",
+ "apihelp-managegroupsynchronizationcache-param-operation": "L’opération à effectuer. Valeurs possibles : résoudre",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "Titre du message en cours de marquage comme résolu",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "ID de groupe pour le message en cours de résolution",
"apihelp-translatesandbox-description": "Inscrivez-vous et gérez les utilisateurs du bac à sable.",
"apihelp-translatesandbox-summary": "Inscrivez-vous et gérez les utilisateurs du bac à sable.",
"apihelp-translatesandbox-param-do": "Que faire.",
@@ -133,6 +136,16 @@
"apihelp-translationcheck-summary": "Valider les traductions.",
"apihelp-translationcheck-param-title": "Titre de page avec espace de noms et code langue.",
"apihelp-translationcheck-param-translation": "La traduction à valider.",
+ "apihelp-translationstats-description": "Récupérer les statistiques de traduction liées aux modifications de traduction, aux traductions actives, aux nouveaux utilisateurs, aux relectures de traductions et aux relecteurs.",
+ "apihelp-translationstats-summary": "Récupérer les statistiques de traduction",
+ "apihelp-translationstats-param-count": "Type de statistiques demandées",
+ "apihelp-translationstats-param-days": "Nombre de jours pour lesquels récupérer les statistiques",
+ "apihelp-translationstats-param-group": "Liste des groupes pour lesquels récupérer les statistiques.",
+ "apihelp-translationstats-param-language": "Liste des langues pour lesquelles récupérer les statistiques.",
+ "apihelp-translationstats-param-scale": "Echelle des statistiques de traduction",
+ "apihelp-translationstats-param-start": "Date à partir de laquelle récupérer les statistiques de traduction. Par défaut, la date courante moins le nombre de 'jours'.",
+ "apihelp-translationstats-example-1": "Récupérer le nombre de modifications pour les 30 derniers jours, pour tous les groupes et toutes les langues",
+ "apihelp-translationstats-example-2": "Récupérer les nombres de modification pour les 30 derniers jours, pour les langues anglais et français.",
"apierror-translate-changeset-modified": "L’ensemble de modifications a été modifié par un autre utilisateur ou processus. Vos modifications ne peuvent pas être enregistrées car elles pourraient écraser les leurs. Veuille rafraîchir la page pour voir les dernières modifications.",
"apierror-translate-duplicateaggregategroup": "Le groupe de messages existe déjà",
"apierror-translate-fuzzymessage": "Impossible de relire des traductions floues ou approximatives (''fuzzy'')",
@@ -160,5 +173,6 @@
"apierror-translate-rename-key-invalid": "Les clefs de message passées pour renommage n’ont pas été trouvées dans la liste des modifications pour la langue source.",
"apierror-translate-rename-state-invalid": "Un des messages passés pour renommage devrait être nouvellement ajouté et l’autre supprimé. États actuels – ajout de : $1 et suppression de : $2.",
"apiwarn-translate-alreadyreviewedbyyou": "Déjà marqué comme ayant été relu par vous",
- "apiwarn-translate-language-disabled-source": "La langue source de ce groupe est $1. Veuillez sélectionner une autre langue vers laquelle traduire."
+ "apiwarn-translate-language-disabled-source": "La langue source de ce groupe est $1. Veuillez sélectionner une autre langue vers laquelle traduire.",
+ "apierror-translate-operation-error": "Une erreur est survenue lors du traitement de la requête. Erreur : $1"
}
diff --git a/MLEB/Translate/i18n/api/fy.json b/MLEB/Translate/i18n/api/fy.json
index 940cbd18..14f98145 100644
--- a/MLEB/Translate/i18n/api/fy.json
+++ b/MLEB/Translate/i18n/api/fy.json
@@ -1,14 +1,17 @@
{
"@metadata": {
"authors": [
+ "PiefPafPier",
"Robin van der Vliet",
"Robin0van0der0vliet"
]
},
- "apihelp-groupreview-param-group": "Berjochtgroep.",
+ "apihelp-groupreview-param-group": "Berjochtegroep.",
"apihelp-groupreview-param-language": "Taalkoade.",
"apihelp-query+languagestats-param-language": "Taalkoade.",
- "apihelp-query+messagecollection-param-group": "Berjochtgroep.",
+ "apihelp-query+messagecollection-param-group": "Berjochtegroep.",
"apihelp-query+messagecollection-param-language": "Taalkoade.",
- "apihelp-translationstash-param-subaction": "Hanneling."
+ "apihelp-translationstash-param-subaction": "Hanneling.",
+ "apierror-translate-language-disabled": "Oersetten yn it $1 is útskeakele.",
+ "apierror-translate-language-disabled-reason": "Oersetten yn it $1 is útskeakele: $2"
}
diff --git a/MLEB/Translate/i18n/api/gl.json b/MLEB/Translate/i18n/api/gl.json
index 1f642fe0..84146760 100644
--- a/MLEB/Translate/i18n/api/gl.json
+++ b/MLEB/Translate/i18n/api/gl.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "ArenaL5",
"Banjo",
"Elisardojm",
"Iváns",
@@ -23,7 +24,6 @@
"apihelp-groupreview-example-1": "Marcar o estado da tradución alemán do grupo de mensaxes \"grupo-Exemplo\" como listo",
"apihelp-query+languagestats-description": "Consultar estatísticas de idioma.",
"apihelp-query+languagestats-summary": "Consultar estatísticas de idioma.",
- "apihelp-query+languagestats-param-timelimit": "Tempo máximo para calcular as estatísticas que faltan. Se cero, só se devolven os resultados almacenados ó comezo.",
"apihelp-query+languagestats-param-language": "Código da lingua.",
"apihelp-query+languagestats-example-1": "Lista de estatíticas de traducións completadas en finés.",
"apihelp-query+messagecollection-description": "Consultar MessageCollection sobre traducións.",
@@ -49,7 +49,6 @@
"apihelp-query+messagegroups-example-1": "Amosar grupos de mensaxes",
"apihelp-query+messagegroupstats-description": "Consultar estatísticas do grupo de mensaxes.",
"apihelp-query+messagegroupstats-summary": "Consultar estatísticas do grupo de mensaxes.",
- "apihelp-query+messagegroupstats-param-timelimit": "Tempo máximo para calcular as estatísticas que faltan. Se cero, só se devolven os resultados almacenados ó comezo.",
"apihelp-query+messagegroupstats-param-group": "Identificador do grupo de mensaxes.",
"apihelp-query+messagegroupstats-example-1": "Lista de estatísticas de finalización de traducións para o grupo \"páxina-Exemplo\"",
"apihelp-query+messagetranslations-description": "Consultar todas as traducións para unha única mensaxe.",
@@ -113,7 +112,7 @@
"apierror-translate-invalidstate": "O estado solicitado non é válido.",
"apierror-translate-invalidlanguage": "A lingua solicitada non é válida.",
"apierror-translate-invalidupdate": "Actualización non válida",
- "apierror-translate-language-disabled": "A tradución a esta lingua está desactivada",
+ "apierror-translate-language-disabled": "A tradución a $1 está desactivada",
"apierror-translate-nodynamicgroups": "Aquí non están admitidos os grupos de mensaxes dinámicas",
"apierror-translate-nomessagefortitle": "O título non se corresponde cunha mensaxe traducible",
"apierror-translate-owntranslation": "Non pode revisar as súas traducións",
diff --git a/MLEB/Translate/i18n/api/he.json b/MLEB/Translate/i18n/api/he.json
index e53aba97..5f03a4f8 100644
--- a/MLEB/Translate/i18n/api/he.json
+++ b/MLEB/Translate/i18n/api/he.json
@@ -23,7 +23,6 @@
"apihelp-groupreview-example-1": "לסמן את המצב של התרגום לגרמנית של קבוצת ההודעות \"group-Example\" כמוכן",
"apihelp-query+languagestats-description": "לעשות שאילתה על סטטיסטיקות של שפה.",
"apihelp-query+languagestats-summary": "ביצוע שאילתה על סטטיסטיקות של שפה.",
- "apihelp-query+languagestats-param-timelimit": "הזמן המרבי שיוקדש לחישוב סטטיסטיקות חסרות. אם זה אפס, מוחזרות רק תוצאות מוטמנות מההתחלה.",
"apihelp-query+languagestats-param-language": "קוד השפה.",
"apihelp-query+languagestats-example-1": "רשימת סטטיסטיקות השלמות תרגומים עבור פינית",
"apihelp-query+messagecollection-description": "לעשות שאילתה ל־MessageCollection על תרגומים.",
@@ -49,14 +48,13 @@
"apihelp-query+messagegroups-extended-description": "יש לשים לב לכך שהפרמטר uselang משפיע על הפלט של החלקים התלויים בשפה.",
"apihelp-query+messagegroups-param-depth": "בעת שימוש בתסדיר עץ, להגביל את העומק למספר כזה של רמות. ערך 0 אומר שלא תוצג שום תת־קבוצה. כשמושגת ההגבלה, הפלט כולל ערך \"groupcount\", שמציין את מספר הילדים הישיר.",
"apihelp-query+messagegroups-param-filter": "להחזיר רק הודעות עם מזים שמתאימים לאחד מהקלטים שניתנו (אינו תלוי־רישיות, מופרד בתווי '|', תו־כול *).",
- "apihelp-query+messagegroups-param-format": "בתסדיר עץ קבוצות הודעות יכולות להתקיים במספר מקומות בעץ.",
+ "apihelp-query+messagegroups-param-format": "בתסדיר עץ קבוצות הודעות יכולות להתקיים במקומות מרובים בעץ.",
"apihelp-query+messagegroups-param-iconsize": "גודל מועדף של סמל קבוצה רשתי.",
"apihelp-query+messagegroups-param-prop": "איזה מידע על תרגום לקבל:\n;id:לכלול את המזהה של הקבוצה.\n;label:לכלול את התווית של הקבוצה.\n;description:לכלול את התיאור של הקבוצה.\n;class:לכלול את שם המחלקה של הקבוצה.\n;namespace:לכלול את מרחב השם של הקבוצה. לא כל הקבוצות שייכות למרחב שם אחד.\n;exists:לכלול את מאפיים הקיום המחושב עצמית של הקבוצה.\n;icon:לכלול את ה־URL־ים לסמל של הקבוצה.\n;priority:לכלול מצב עדיפות, כמו \"לא מומלץ\".\n;prioritylangs:לכלול שפות מועדפות. אם זה לא מוגדר, יוחזר false.\n;priorityforce:לכלול מצב עדיפות – האם השפות המועדפות כפויות.\n;workflowstates:לכלול את מצבי זרימת העבודה עבור קבוצת ההודעות.",
"apihelp-query+messagegroups-param-root": "בעת שימוש בתסדיר עץ, במקום להתחיל מהרמה העליונה, להתחיל מקבוצת ההודעות הנתונה, שצריכה להיות קבוצת הודעות משולבת. בעת שימוש בתסדיר שטוח רק הקבוצה שצוינה תוחזר.",
"apihelp-query+messagegroups-example-1": "להציג קבוצות הודעות",
"apihelp-query+messagegroupstats-description": "לעשות שאילתה של סטטיסטיקת קבוצת הודעות.",
"apihelp-query+messagegroupstats-summary": "לבצע שאילתה על סטטיסטיקות של קבוצת הודעות.",
- "apihelp-query+messagegroupstats-param-timelimit": "הזמן המרבי שיוקדש לחישוב סטטיסטיקות חסרות. אם זה אפס, מוחזרות רק תוצאות מוטמנות מההתחלה.",
"apihelp-query+messagegroupstats-param-group": "מזהה קבוצת הודעות.",
"apihelp-query+messagegroupstats-example-1": "רשימה של סטטיסטיקת השלמת תרגומים עבור הקבוצה \"page-Example\"",
"apihelp-query+messagetranslations-description": "שאילתה של כל התרגומים של הודעה אחת.",
@@ -68,10 +66,15 @@
"apihelp-managemessagegroups-param-groupId": "מזהה קבוצה",
"apihelp-managemessagegroups-param-renameMessageKey": "מפתח הודעת היעד ששמה משתנה",
"apihelp-managemessagegroups-param-messageKey": "מפתח ההודעה המחליפה",
- "apihelp-managemessagegroups-param-operation": "איזו פעולה לבצע. ערכים אפשריים – rename / new",
+ "apihelp-managemessagegroups-param-operation": "איזו פעולה לבצע. ערכים אפשריים: rename / new",
"apihelp-managemessagegroups-param-changesetName": "שינוי שם הערכה – ברירת מחדל / בלתי־מפוקח / מדיה־ויקי וכו'",
"apihelp-managemessagegroups-param-changesetModified": "חותם־זמן של יוניקס של מתי ערכת השינויים שונתה בפעם האחרונה. אם ערכת השינויים שונתה אחרי זה, ה־API יזרוק שגיאה.",
- "apihelp-translatesandbox-description": "רשיום וניהול משתמשים בארגז חול.",
+ "apihelp-managegroupsynchronizationcache-description": "ניהול מטמון סנכרון קבוצות.",
+ "apihelp-managegroupsynchronizationcache-summary": "ניהול מטמון סנכרון קבוצות.",
+ "apihelp-managegroupsynchronizationcache-param-operation": "איזו פעולה לבצע. ערכים אפשריים: resolve",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "כותרת ההודעה שמוסמנת בתור פתורה",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "מזהה הקבוצה של ההודעה שמסומנת בתור פתורה",
+ "apihelp-translatesandbox-description": "רישום וניהול משתמשים בארגז חול.",
"apihelp-translatesandbox-summary": "רישום וניהול משתמשים בארגז חול.",
"apihelp-translatesandbox-param-do": "מה לעשות.",
"apihelp-translatesandbox-param-userid": "מזהי משתמשים של המשתמשים המנוהלים. יש להשתם ב־0 בשביל יצירה.",
@@ -110,7 +113,7 @@
"apihelp-searchtranslations-param-query": "איזו מחרוזת לחפש.",
"apihelp-searchtranslations-param-sourcelanguage": "קוד השפה של טקסט המקור.",
"apihelp-searchtranslations-param-language": "קוד השפה לחיפוש מחרוזת.",
- "apihelp-searchtranslations-param-group": "מזהה הקבוצה לחיפוש המחרוזת.",
+ "apihelp-searchtranslations-param-group": "מזהה הקבוצה שבה צריך לחפש מחרוזת.",
"apihelp-searchtranslations-param-filter": "מסנן מצב תרגום הודעה.",
"apihelp-searchtranslations-param-match": "להתאים מילים כלשהם או את כל המילים.",
"apihelp-searchtranslations-param-case": "חיפוש תלוי־רישיות או לאו.",
@@ -122,6 +125,16 @@
"apihelp-translationcheck-summary": "אימות תרגומים.",
"apihelp-translationcheck-param-title": "שם הדף עם מרחב השם וקוד השפה.",
"apihelp-translationcheck-param-translation": "התרגום שיאומת.",
+ "apihelp-translationstats-description": "אחזור סטטיסטיקות תרגום שקשורות לעריכת תרגומים, תרגומים פעילים, משתמשים חדשים, סקירות תרגומים, וסוקרים.",
+ "apihelp-translationstats-summary": "אחזור סטטיסטיקת תרגום",
+ "apihelp-translationstats-param-count": "סוג הסטטיסטיקה המבוקשת",
+ "apihelp-translationstats-param-days": "מספר הימים שצריך לאחזר סטטיסטיקה עבורם",
+ "apihelp-translationstats-param-group": "רשימת הקבוצות שצריך לאחזר סטטיסטיקה עבורן.",
+ "apihelp-translationstats-param-language": "רשימת השפות שצריך לאחזר סטטיסטיקה עבורן.",
+ "apihelp-translationstats-param-scale": "סדר הגודל של סטטיסטיקות התרגום",
+ "apihelp-translationstats-param-start": "תאריך ההתחלה שאחזור סטטיסטיקות התרגום יתחיל ממנו. ברירת המחדל היא התאריך הנוכחי מינוס מספר ה־days.",
+ "apihelp-translationstats-example-1": "אחזור מניין העריכות עבור 30 הימים האחרונים, עבור כל הקבוצות והשפות",
+ "apihelp-translationstats-example-2": "אחזור מניין העריכות עבור 30 הימים האחרונים, עבור אנגלית וצרפתית.",
"apierror-translate-changeset-modified": "ערכת השינויים שונתה על־ידי משתמש או תהליך אחר. אי־אפשר לשמור את השינויים שלך כי הם יכולים לדרוס את השינויים שלהם. נא לרענן את הדף כדי לראות את השינויים האחרונים.",
"apierror-translate-duplicateaggregategroup": "קבוצת ההודעות כבר קיימת",
"apierror-translate-fuzzymessage": "לא ניתן לסקור תרגומים שאינם מעודכנים",
@@ -149,5 +162,6 @@
"apierror-translate-rename-key-invalid": "מפתח ההודעה שהועבר לשינוי שם לא נמצאו ברשימת השינויים עבור שפת המקור.",
"apierror-translate-rename-state-invalid": "אחת מההודעות שהועברו לשינוי שם אמורה להתווסף מחדש, והאחרת צריכה להימחק. מצבים נוכחיים – הוספה: $1 ומחיקה: $2.",
"apiwarn-translate-alreadyreviewedbyyou": "כבר סומנה בתור הודעה הודעה שנסקרה על־ידיך",
- "apiwarn-translate-language-disabled-source": "שפת המקור של הקבוצה הזאת היא $1. נא לבחור שפה אחרת לתרגום."
+ "apiwarn-translate-language-disabled-source": "שפת המקור של הקבוצה הזאת היא $1. נא לבחור שפה אחרת לתרגום.",
+ "apierror-translate-operation-error": "אירעה שגיאה בעת עיבוד הבקשה. שגיאה: $1"
}
diff --git a/MLEB/Translate/i18n/api/hi.json b/MLEB/Translate/i18n/api/hi.json
index 07c84af3..76950c2a 100644
--- a/MLEB/Translate/i18n/api/hi.json
+++ b/MLEB/Translate/i18n/api/hi.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Abijeet Patro",
"NehalDaveND",
"Sfic"
]
@@ -20,5 +21,6 @@
"apihelp-searchtranslations-param-limit": "परिणाम का आकार",
"apihelp-searchtranslations-example-1": "भाषा का अनुवाद दिखाएँ",
"apierror-translate-invalidupdate": "अमान्य अद्यतन",
+ "apierror-translate-sandbox-invalidppassword": "अवैध पासवर्ड",
"apierror-translate-unknownmessage": "अज्ञात संदेश"
}
diff --git a/MLEB/Translate/i18n/api/hu.json b/MLEB/Translate/i18n/api/hu.json
index c8e3009f..8d375845 100644
--- a/MLEB/Translate/i18n/api/hu.json
+++ b/MLEB/Translate/i18n/api/hu.json
@@ -19,7 +19,6 @@
"apihelp-groupreview-example-1": "A „group-Example” csoport német fordításának állapota késznek jelölése",
"apihelp-query+languagestats-description": "Nyelvi statisztika lekérdezése.",
"apihelp-query+languagestats-summary": "Nyelvi statisztika lekérdezése.",
- "apihelp-query+languagestats-param-timelimit": "Maximális idő, ami a hiányzó statisztikák kiszámításával tölthető. Ha nulla, csak a gyorsítótárazott eredményeket adja vissza az elejétől.",
"apihelp-query+languagestats-param-language": "Nyelvkód.",
"apihelp-query+languagestats-example-1": "A finn fordítások készültségi fokainak listája",
"apihelp-query+messagecollection-description": "MessageCollection lekérése a fordításokról.",
@@ -38,7 +37,6 @@
"apihelp-query+messagegroups-example-1": "Üzenetcsoportok megjelenítése",
"apihelp-query+messagegroupstats-description": "Üzenetcsoport-statisztika lekérdezése.",
"apihelp-query+messagegroupstats-summary": "Üzenetcsoport-statisztika lekérdezése.",
- "apihelp-query+messagegroupstats-param-timelimit": "Maximális idő, ami a hiányzó statisztikák kiszámításával tölthető. Ha nulla, csak a gyorsítótárazott eredményeket adja vissza az elejétől.",
"apihelp-query+messagegroupstats-param-group": "Üzenetcsoport azonosítója.",
"apihelp-query+messagetranslations-description": "Egy üzenet összes fordításának lekérdezése.",
"apihelp-query+messagetranslations-summary": "Egy üzenet összes fordításának lekérdezése.",
@@ -81,7 +79,7 @@
"apihelp-searchtranslations-param-limit": "Az eredmény mérete.",
"apihelp-searchtranslations-example-1": "Fordítások megjelenítése a nyelvre.",
"apihelp-searchtranslations-example-2": "Lefordítatlan üzenetek megjelenítése, amik illeszkednek a lekérdezésre a forrásnyelven.",
- "apihelp-translationcheck-description": "A megadott fordítás érvényesítése üzenet-ellenőrzőkkel.",
+ "apihelp-translationcheck-description": "A megadott fordítás érvényesítése a konfigurált üzenetérvényesítőkkel.",
"apihelp-translationcheck-summary": "Fordítások ellenőrzése.",
"apihelp-translationcheck-param-title": "Lapcím névtérrel és nyelvkóddal.",
"apihelp-translationcheck-param-translation": "Az érvényesítendő fordítás.",
diff --git a/MLEB/Translate/i18n/api/hyw.json b/MLEB/Translate/i18n/api/hyw.json
new file mode 100644
index 00000000..661e27cf
--- /dev/null
+++ b/MLEB/Translate/i18n/api/hyw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kareyac"
+ ]
+ },
+ "apihelp-translationstash-param-subaction": "Գործողություն"
+}
diff --git a/MLEB/Translate/i18n/api/ia.json b/MLEB/Translate/i18n/api/ia.json
index b526b613..8cb0f5b7 100644
--- a/MLEB/Translate/i18n/api/ia.json
+++ b/MLEB/Translate/i18n/api/ia.json
@@ -21,7 +21,6 @@
"apihelp-groupreview-example-1": "Marcar le stato del traduction in germano pro le gruppo de messages \"group-Example\" como preste",
"apihelp-query+languagestats-description": "Consultar statisticas de lingua.",
"apihelp-query+languagestats-summary": "Consultar statisticas de lingua.",
- "apihelp-query+languagestats-param-timelimit": "Maximo de tempore a usar pro calcular statisticas mancante. Si zero, essera retornate solmente le resultatos immagazinate in cache ab initio.",
"apihelp-query+languagestats-param-language": "Codice de lingua.",
"apihelp-query+languagestats-example-1": "Lista de statisticas de completion de traduction pro finnese",
"apihelp-query+messagecollection-description": "Consultar MessageCollection sur traductiones.",
diff --git a/MLEB/Translate/i18n/api/id.json b/MLEB/Translate/i18n/api/id.json
index a5188f30..9840951d 100644
--- a/MLEB/Translate/i18n/api/id.json
+++ b/MLEB/Translate/i18n/api/id.json
@@ -1,13 +1,113 @@
{
"@metadata": {
"authors": [
+ "Daud I.F. Argana",
"Gombang"
]
},
+ "apihelp-aggregategroups-summary": "Kelola kelompok pesan agregat.",
+ "apihelp-aggregategroups-param-aggregategroup": "ID kelompok pesan agregat.",
"apihelp-aggregategroups-param-group": "ID kelompok pesan.",
+ "apihelp-aggregategroups-param-groupname": "Nama kelompok pesan agregat.",
+ "apihelp-aggregategroups-param-groupdescription": "Deskripsi kelompok pesan agregat.",
"apihelp-groupreview-param-group": "Kelompok pesan.",
"apihelp-groupreview-param-language": "Kode bahasa.",
+ "apihelp-query+languagestats-description": "Statistik bahasa kueri.",
+ "apihelp-query+languagestats-summary": "Statistik bahasa kueri.",
"apihelp-query+languagestats-param-language": "Kode bahasa.",
+ "apihelp-query+languagestats-example-1": "Daftar statistik kelengkapan terjemahan untuk bahasa Finlandia",
+ "apihelp-query+messagecollection-description": "Kueri MessageCollection mengenai terjemahan.",
+ "apihelp-query+managemessagegroups-param-groupId": "Id kelompok",
+ "apihelp-query+managemessagegroups-param-messageKey": "Kunci pesan",
+ "apihelp-query+messagecollection-summary": "Kueri MessageCollection mengenai terjemahan.",
"apihelp-query+messagecollection-param-group": "Kelompok pesan.",
- "apihelp-query+messagecollection-param-language": "Kode bahasa."
+ "apihelp-query+messagecollection-param-language": "Kode bahasa.",
+ "apihelp-query+messagecollection-param-limit": "Berapa banyak pesan yang ditampilkan (setelah penyaringan).",
+ "apihelp-query+messagecollection-example-1": "Daftar bahasa yang didukung",
+ "apihelp-query+messagecollection-example-4": "Informasi lebih lanjut mengenai revisi terjemahan terkini untuk kelompok \"page-Example\"",
+ "apihelp-query+messagegroups-example-1": "Tampilkan kelompok pesan",
+ "apihelp-query+messagegroupstats-description": "Kueri statistik kelompok pesan.",
+ "apihelp-query+messagegroupstats-summary": "Kueri statistik kelompok pesan.",
+ "apihelp-query+messagegroupstats-param-group": "ID kelompok pesan.",
+ "apihelp-query+messagegroupstats-example-1": "Daftar statistik kelengkapan terjemahan untuk kelompok \"page-Example\"",
+ "apihelp-query+messagetranslations-description": "Kueri semua terjemahan untuk sebuah pesan.",
+ "apihelp-query+messagetranslations-summary": "Kueri semua terjemahan untuk sebuah pesan.",
+ "apihelp-query+messagetranslations-param-title": "Judul lengkap dari pesan yang diketahui.",
+ "apihelp-query+messagetranslations-example-1": "Daftar terjemahan di wiki untuk \"MediaWiki:January\"",
+ "apihelp-managemessagegroups-param-groupId": "Id kelompok",
+ "apihelp-managemessagegroups-param-renameMessageKey": "Kunci pesan tujuan yang diubah namanya",
+ "apihelp-managemessagegroups-param-messageKey": "Kunci pesan pengganti",
+ "apihelp-managemessagegroups-param-operation": "Operasi yang dialkukan. Nilai-nilai yang mungkin - rename / new",
+ "apihelp-translatesandbox-param-userid": "ID pengguna dari pengguna yang sedang dikelola. Gunakan 0 untuk pembuatan.",
+ "apihelp-translatesandbox-param-username": "Nama pengguna ketika membuat pengguna.",
+ "apihelp-translatesandbox-param-password": "Kata sandi ketika membuat pengguna.",
+ "apihelp-translatesandbox-param-email": "Surel ketika membuat pengguna.",
+ "apihelp-translationaids-description": "Kueri semua bantuan terjemahan.",
+ "apihelp-translationaids-summary": "Kueri semua bantuan terjemahan.",
+ "apihelp-translationaids-param-title": "Judul lengkap dari pesan yang diketahui.",
+ "apihelp-translationaids-param-group": "Kelompok pesan pemilik pesan tersebut. Jika kosong maka kelompok utama digunakan.",
+ "apihelp-translationaids-param-prop": "Pembantu terjemahan mana yang dimasukkan.",
+ "apihelp-translationaids-example-1": "Tampilkan bantuan untuk [[MediaWiki:January/fi]]",
+ "apihelp-translationreview-description": "Tandai terjemahan sebagai telah ditinjau.",
+ "apihelp-translationreview-summary": "Tandai terjemahan sebagai telah ditinjau.",
+ "apihelp-translationreview-param-revision": "Nomor revisi untuk ditinjau.",
+ "apihelp-translationreview-example-1": "Tinjau revisi 1",
+ "apihelp-translationstash-description": "Tambahkan terjemahan ke kotak pasir.",
+ "apihelp-translationstash-summary": "Tambahkan terjemahan ke kotak pasir.",
+ "apihelp-translationstash-param-subaction": "Tindakan.",
+ "apihelp-translationstash-param-title": "Judul halaman satuan terjemahan.",
+ "apihelp-translationstash-param-translation": "Terjemahan yang dibuat oleh pengguna.",
+ "apihelp-translationstash-param-metadata": "Objek JSON.",
+ "apihelp-translationstash-example-1": "Tambahakan terjemahan ke kotak pasir untuk [[MediaWiki:Jan/fi]]",
+ "apihelp-translationstash-example-2": "Kueri kotak pasir",
+ "apihelp-ttmserver-description": "Kueri saran dari memori terjemahan.",
+ "apihelp-ttmserver-summary": "Kueri saran dari memori terjemahan.",
+ "apihelp-ttmserver-param-service": "Layanan terjemahan tersedia mana yang digunakan.",
+ "apihelp-ttmserver-param-sourcelanguage": "Kode bahasa teks sumber.",
+ "apihelp-ttmserver-param-targetlanguage": "Kode bahasa saran.",
+ "apihelp-ttmserver-param-text": "Teks yang dicarikan saran",
+ "apihelp-ttmserver-example-1": "Dapatkan saran untuk menerjemahkan \"Help\" dari bahasa Inggris ke bahasa Finlandia",
+ "apihelp-searchtranslations-description": "Cari terjemahan.",
+ "apihelp-searchtranslations-summary": "Cari terjemahan.",
+ "apihelp-searchtranslations-param-service": "Layanan terjemahan tersedia mana yang digunakan.",
+ "apihelp-searchtranslations-param-query": "String yang dicari.",
+ "apihelp-searchtranslations-param-sourcelanguage": "Kode bahasa teks sumber.",
+ "apihelp-searchtranslations-param-language": "Kode bahasa tempat mencari string.",
+ "apihelp-searchtranslations-param-group": "ID kelompok tempat mencari string.",
+ "apihelp-searchtranslations-param-filter": "Filter status terjemahan pesan.",
+ "apihelp-searchtranslations-param-match": "Cocok dengan salah satu/semua kata pencarian.",
+ "apihelp-searchtranslations-param-case": "Pencarian (tidak) peka kapital.",
+ "apihelp-searchtranslations-param-limit": "Ukuran hasil.",
+ "apihelp-searchtranslations-example-1": "Tampilkan terjemahan untuk bahasanya.",
+ "apihelp-searchtranslations-example-2": "Tampilkan pesan tidak diterjemahkan yang cocok dengan kueri di bahasa sumber.",
+ "apihelp-translationcheck-summary": "Validasi terjemahan.",
+ "apihelp-translationcheck-param-title": "Judul halaman dengan ruang nama dan kode bahasa.",
+ "apihelp-translationcheck-param-translation": "Terjemahan yang divalidasi.",
+ "apihelp-translationstats-description": "Ambil statistik terjemahan yang berkaitan dengan suntingan terjemahan, terjemahan yang aktif, pengguna baru, tinjauan terjemahan dan peninjau.",
+ "apihelp-translationstats-summary": "Ambil statistik terjemahan",
+ "apihelp-translationstats-param-count": "Tipe statistik yang diminta",
+ "apihelp-translationstats-param-days": "Banyak hari yang diambil statistiknya",
+ "apihelp-translationstats-param-group": "Daftar kelompok yang diambil statistiknya.",
+ "apihelp-translationstats-param-language": "Daftar bahasa yang diambil statistiknya.",
+ "apihelp-translationstats-example-1": "Ambil banyak suntingan pada 30 hari terakhir, untuk semua kelompok dan bahasa",
+ "apihelp-translationstats-example-2": "Ambil banyak suntingan pada 30 hari terakhir, untuk bahasa Inggris dan Prancis.",
+ "apierror-translate-duplicateaggregategroup": "Kelompok pesan sudah ada",
+ "apierror-translate-groupreviewdisabled": "Tinjauan kelompok pesan tidak sedang digunakan.",
+ "apierror-translate-invalidaggregategroup": "Kelompok pesan agregat tidak valid",
+ "apierror-translate-invalidaggregategroupname": "Nama kelompok pesan agregat tidak valid",
+ "apierror-translate-invalidgroup": "Kelompok tidak ada atau tidak valid",
+ "apierror-translate-invalidlanguage": "Bahasa yang diminta tidak valid.",
+ "apierror-translate-invalidupdate": "Pembaruan tidak valid",
+ "apierror-translate-language-disabled": "Terjemahan ke $1 dimatikan.",
+ "apierror-translate-language-disabled-reason": "Terjemahan ke $1 dimatikan: $2",
+ "apierror-translate-nodynamicgroups": "Kelompok pesan dinamis tidak didukung di sini",
+ "apierror-translate-notranslationservices": "Tidak ada layanan terjemahan publik yang dikonfigurasi. Administrator wiki perlu mengatur <var>$wgTranslateTranslationServices</var> dengan benar sebelum fitur ini bisa digunakan.",
+ "apierror-translate-owntranslation": "Tidak bisa meninjau terjemahan sendiri",
+ "apierror-translate-sandboxdisabled": "Fitur kotak pasir tidak sedang digunakan",
+ "apierror-translate-sandbox-invalidppassword": "Kata sandi tidak valid",
+ "apierror-translate-smg-nochanges": "Tidak ada perubahan yang dapat diproses.",
+ "apierror-translate-unknownmessage": "Pesan tidak dikenal",
+ "apierror-translate-invalid-operation": "Operasi tidak valid: $1. Nilai-nilai yang valid - $2.",
+ "apiwarn-translate-alreadyreviewedbyyou": "Sudah ditandai sebagai tertinjau oleh Anda",
+ "apiwarn-translate-language-disabled-source": "Bahasa sumber dari kelompok ini adalah $1. Tolong pilih bahasa lain sebagai tujuan terjemahan."
}
diff --git a/MLEB/Translate/i18n/api/io.json b/MLEB/Translate/i18n/api/io.json
index 85305466..5cfff6ff 100644
--- a/MLEB/Translate/i18n/api/io.json
+++ b/MLEB/Translate/i18n/api/io.json
@@ -4,5 +4,6 @@
"Joao Xavier"
]
},
- "apihelp-groupreview-param-language": "Linguala kodexo."
+ "apihelp-groupreview-param-language": "Linguala kodexo.",
+ "apiwarn-translate-alreadyreviewedbyyou": "Vu ja indikis kom revizita"
}
diff --git a/MLEB/Translate/i18n/api/ksh.json b/MLEB/Translate/i18n/api/ksh.json
index 2ecca084..b3d83d11 100644
--- a/MLEB/Translate/i18n/api/ksh.json
+++ b/MLEB/Translate/i18n/api/ksh.json
@@ -17,7 +17,6 @@
"apihelp-groupreview-param-state": "Der neue Zohschtand för di Jropp.",
"apihelp-groupreview-example-1": "Makehr, dat de Jropp „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">group-Example</code>“ parraht för Deutsch wöhr.",
"apihelp-query+languagestats-description": "Frohch noh de Schtateßeke vun de Schprohche.",
- "apihelp-query+languagestats-param-timelimit": "De längste Zigg, di för et Berääschne vun zohsäzlejje Schtateßteke jebruch wähde darref. Wann se Noll es, kritt mer blohß ahle Dahte zerök, di alld em Schpeischer wohre.",
"apihelp-query+languagestats-param-language": "Et Shprohcheköözel.",
"apihelp-query+languagestats-example-1": "En Lesß met de Schtateßteke för Finnesch",
"apihelp-query+messagecollection-description": "Frohch noh de Övversäzonge en dä Jropp <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MessageCollection</code>.",
@@ -39,7 +38,6 @@
"apihelp-query+messagegroups-param-root": "Em Boumfommaht moß dat heh en Sammeljopp sin un doh vun bejennt de Leß.\nEm flache Fommahd wehd jenou di anjejovve Jropp ußjejovve.",
"apihelp-query+messagegroups-example-1": "Nohreeschtejroppe aanzeije",
"apihelp-query+messagegroupstats-description": "Frohch noh de Schtateßeke övver de Nohreeschtejroppe.",
- "apihelp-query+messagegroupstats-param-timelimit": "Di Zigg, di för e Ußrähschne vun fählende schtatestesche Dahte jenumme wähde sull. Noll livvert blohß Dahte, di ald doh sin.",
"apihelp-query+messagegroupstats-param-group": "Dä Nohreeschtejropp iehr Kännong.",
"apihelp-query+messagegroupstats-example-1": "Donn de Schtatesteke övver de fähdejje Övversäzonge vun dä Täxte un Nohreeschte en dä Jropp „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">page-Example</code>“ opleste. <!--\nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Bmessagecollection-example-4/ksh\n-->",
"apihelp-query+messagetranslations-description": "Frohch noh alle Övversäzonge för ene beschtemmpte Täx uddder en beschtemmpte Nohreesch.",
diff --git a/MLEB/Translate/i18n/api/lb.json b/MLEB/Translate/i18n/api/lb.json
index 1e6b6f1a..1fd082db 100644
--- a/MLEB/Translate/i18n/api/lb.json
+++ b/MLEB/Translate/i18n/api/lb.json
@@ -32,6 +32,7 @@
"apihelp-searchtranslations-example-1": "Iwwersetzunge fir d'Sprooch weisen.",
"apihelp-translationcheck-summary": "Iwwersetzunge validéieren.",
"apihelp-translationcheck-param-translation": "D'Iwweersetzung fir ze validéieren.",
+ "apihelp-translationstats-summary": "Statistike vun der Iwwersetzung ofruffen",
"apierror-translate-duplicateaggregategroup": "De Grupp vu Message gëtt et schonn",
"apierror-translate-fuzzymessage": "Fuzzy Iwwersetzunge kënnen net nogekuckt ginn",
"apierror-translate-invalidlanguage": "Déi gefrot Sprooch ass net valabel.",
diff --git a/MLEB/Translate/i18n/api/lv.json b/MLEB/Translate/i18n/api/lv.json
index 9b77597a..cef70065 100644
--- a/MLEB/Translate/i18n/api/lv.json
+++ b/MLEB/Translate/i18n/api/lv.json
@@ -5,6 +5,7 @@
]
},
"apihelp-aggregategroups-param-group": "Ziņojumu grupas ID.",
+ "apihelp-aggregategroups-example-1": "Piesaistīt grupu",
"apihelp-groupreview-param-group": "Ziņojumu grupa.",
"apihelp-groupreview-param-language": "Valodas kods.",
"apihelp-query+languagestats-param-language": "Valodas kods.",
diff --git a/MLEB/Translate/i18n/api/mk.json b/MLEB/Translate/i18n/api/mk.json
index 385a00f9..ae7f4f19 100644
--- a/MLEB/Translate/i18n/api/mk.json
+++ b/MLEB/Translate/i18n/api/mk.json
@@ -22,7 +22,6 @@
"apihelp-groupreview-example-1": "Означи ја состојбата на германскиот превод на групата пораки „група-Пример“ како готов",
"apihelp-query+languagestats-description": "Статистики за јазикот на барањето.",
"apihelp-query+languagestats-summary": "Статистики за јазикот на барањето.",
- "apihelp-query+languagestats-param-timelimit": "Највеќе време што може да се потроши за пресметување на отустните статистики. Ако е нула, ќе се даде само меѓускладираниот исход од почетокот.",
"apihelp-query+languagestats-param-language": "Јазичен код.",
"apihelp-query+languagestats-example-1": "Список на статистики за потполноста на преводите на фински",
"apihelp-query+messagecollection-description": "Побарај преводи од Збирка пораки",
@@ -55,7 +54,6 @@
"apihelp-query+messagegroups-example-1": "Прикажи групи пораки",
"apihelp-query+messagegroupstats-description": "Побарај статистики за група пораки.",
"apihelp-query+messagegroupstats-summary": "Побарај статистики за група пораки.",
- "apihelp-query+messagegroupstats-param-timelimit": "Највеќе време што може да се потроши за пресметување на отсутните статистики. Ако е нула, ќе се дадае само меѓускладираните исход од почетокот.",
"apihelp-query+messagegroupstats-param-group": "Назнака на групата пораки.",
"apihelp-query+messagegroupstats-example-1": "Список на статистики за потполност на преводите за групата „page-Example“",
"apihelp-query+messagetranslations-description": "Побарај ги сите преводи на една порака.",
@@ -67,9 +65,14 @@
"apihelp-managemessagegroups-param-groupId": "Назнака на групата",
"apihelp-managemessagegroups-param-renameMessageKey": "Клуч на целната порака што се преименува",
"apihelp-managemessagegroups-param-messageKey": "Клуч на пораката што заменува",
- "apihelp-managemessagegroups-param-operation": "Задачата што треба да се извшри. Можни вредности — преименувај / нова",
+ "apihelp-managemessagegroups-param-operation": "Задачата што треба да се изврши. Можни вредности: преименувај / нова",
"apihelp-managemessagegroups-param-changesetName": "Назив на промените — По основно / Незгрижена / МедијаВики итн.",
"apihelp-managemessagegroups-param-changesetModified": "Време и датум по Уникс на последната измена на промената. Ако е изменета по ова време, извршникот ќе даде грешка.",
+ "apihelp-managegroupsynchronizationcache-description": "Раководење со меѓускладот на групното усогласување.",
+ "apihelp-managegroupsynchronizationcache-summary": "Раководење со меѓускладот на групното усогласување.",
+ "apihelp-managegroupsynchronizationcache-param-operation": "Задачата што треба да се изврши. Можни вредности: реши",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "Насловот на пораката означена како решена",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "Групна назнака на пораката што се решава",
"apihelp-translatesandbox-description": "Зачленување и управување со корисници во песочникот.",
"apihelp-translatesandbox-summary": "Зачленување и управување со корисници во песочникот.",
"apihelp-translatesandbox-param-do": "Што да се прави.",
@@ -121,6 +124,16 @@
"apihelp-translationcheck-summary": "Потврди преводи.",
"apihelp-translationcheck-param-title": "Наслов на страницата со именски простор и јазичен код.",
"apihelp-translationcheck-param-translation": "Превод за потврда.",
+ "apihelp-translationstats-description": "Дај преводни статистики поврзани со преводните уредувања, активните преводи, новитре корисници, преводните оценувачи и оценувачите.",
+ "apihelp-translationstats-summary": "Дај преводни статистики",
+ "apihelp-translationstats-param-count": "Кој вид на статистика се бара",
+ "apihelp-translationstats-param-days": "За колку дена се бара статистика",
+ "apihelp-translationstats-param-group": "Список на групи за кои се бара статистика.",
+ "apihelp-translationstats-param-language": "Список на јазици за кои се бара статистика.",
+ "apihelp-translationstats-param-scale": "Размер на преводните статистики",
+ "apihelp-translationstats-param-start": "Од кој датум да почнува статистиката. По основно е денешниот датум минус бројот на „денови“.",
+ "apihelp-translationstats-example-1": "Дај број на уредувања во последните 30 дена за сите групи и јазици",
+ "apihelp-translationstats-example-2": "Дај број на уредувања во последните 30 дена за јазиците англиски и француски.",
"apierror-translate-changeset-modified": "Промените се изменети од друг корисник или постапка. Вашите промени не можат да се зачуваат бидејќи ќе ги заменат нив. Превчитајте ја страницата за да ги видите најновите промени.",
"apierror-translate-duplicateaggregategroup": "Групата пораки веќе постои",
"apierror-translate-fuzzymessage": "Не можете да проверувате застарени пораки",
@@ -148,5 +161,6 @@
"apierror-translate-rename-key-invalid": "Клучевите на пораките дадени за преименување не се пронајдени на списокот на промени за изворниот јазик.",
"apierror-translate-rename-state-invalid": "Една од пораките дадени за преименување треба да биде новододадена, а другата — избришана. Тековни состојби — додавање: $1 и бришење: $2.",
"apiwarn-translate-alreadyreviewedbyyou": "Веќе ја имате означено како проверена",
- "apiwarn-translate-language-disabled-source": "Изворниот јазик на оваа група е $1. Изберете на кој јазик сакате да преведувате."
+ "apiwarn-translate-language-disabled-source": "Изворниот јазик на оваа група е $1. Изберете на кој јазик сакате да преведувате.",
+ "apierror-translate-operation-error": "Се јави грешка при обработката на барањето. Грешка: $1"
}
diff --git a/MLEB/Translate/i18n/api/nb.json b/MLEB/Translate/i18n/api/nb.json
index 480b9256..b94fa989 100644
--- a/MLEB/Translate/i18n/api/nb.json
+++ b/MLEB/Translate/i18n/api/nb.json
@@ -22,7 +22,6 @@
"apihelp-groupreview-example-1": "Merk tilstanden for den tyske oversettelsen av meldingsgruppa «group-Example» som klar",
"apihelp-query+languagestats-description": "Spør om språkstatistikk.",
"apihelp-query+languagestats-summary": "Spør om språkstatistikk.",
- "apihelp-query+languagestats-param-timelimit": "Maksimal tid som skal brukes til å regne ut manglende statistikk. Om den er satt til null vil bare de mellomlagrede resultatene fra begynnelsen returneres.",
"apihelp-query+languagestats-param-language": "Språkkode.",
"apihelp-query+languagestats-example-1": "Liste over statistikk for fullførte oversettelser til finsk",
"apihelp-query+messagecollection-description": "Spør MessageCollection om oversettelser.",
@@ -37,7 +36,7 @@
"apihelp-query+messagecollection-param-language": "Språkkode.",
"apihelp-query+messagecollection-param-limit": "Hvor mange beskjeder som skal vises (etter filtrering).",
"apihelp-query+messagecollection-param-offset": "Heltall eller nøkkeloffset til å begynne med.",
- "apihelp-query+messagecollection-param-filter": "Filtre for beskjedsamlinger. Bruk <kbd>!</kbd> for å få motsatt av den gitte effekten. For eksempel vil betyr <kbd>!fuzzy</kbd> alle beskjeder som ikke er fuzzy. Filtre brukes i den ordren som blir gitt.\n;fuzzy:Beskjeder med fuzzy-tagg.\n;optional:Beskjeder som kun bør oversettes om det er nødvendig å endre dem.\n;ignored:Beskjeder som aldre oversettes.\n;hastranslation:Beskjeder som har en oversettelse uavhengig av om den er fuzzy eller ikke.\n;translated:Beskjeder som har en oversettelse som ikke er fuzzy.\n;changed:Beskjeder som har blitt oversatt eller endret siden forrige eksport.\n;reviewer&#58;N: Beskjeder der bruker nummer <kbd>N</kbd> er blant godkjennerne.\n;last-translator&#58;N:Beskjeder der bruker nummer <kbd>N</kbd> er siste oversetter.",
+ "apihelp-query+messagecollection-param-filter": "Filtre for beskjedsamlinger. Bruk <kbd>!</kbd> for å få motsatt av den gitte effekten. For eksempel betyr <kbd>!fuzzy</kbd> alle beskjeder som ikke er fuzzy. Filtre brukes i den rekkefølgen som blir gitt.\n;fuzzy:Beskjeder med fuzzy-tagg.\n;optional:Beskjeder som kun bør oversettes om det er nødvendig å endre dem.\n;ignored:Beskjeder som aldri oversettes.\n;hastranslation:Beskjeder som har en oversettelse uavhengig av om den er fuzzy eller ikke.\n;translated:Beskjeder som har en oversettelse som ikke er fuzzy.\n;changed:Beskjeder som har blitt oversatt eller endret siden forrige eksport.\n;reviewer&#58;N: Beskjeder der bruker nummer <kbd>N</kbd> er blant godkjennerne.\n;last-translator&#58;N:Beskjeder der bruker nummer <kbd>N</kbd> er siste oversetter.",
"apihelp-query+messagecollection-param-prop": "Hvilke egenskaper som skal hentes:\n;definition:Beskjeddefinisjonen.\n;translation:Den gjeldende oversettelsen (uten $1-streng om det er noen, bruk taggene for å sjekke utdaterte eller ugyldige oversettelser).\n;tags:Beskjedtagger, som optional, ignored og fuzzy.\n;properties:Beskjedegenskaper, som status, revision, last-translator. Kan variere mellom beskjeder.\n;revision:<span class=\"deprecated\">Foreldet!</span> Bruk $2prop=properties.",
"apihelp-query+messagecollection-example-1": "Liste over støttede språk",
"apihelp-query+messagecollection-example-2": "Liste over ikke-valgfrie beskjeddefinisjoner for gruppa «page-Example»",
@@ -55,7 +54,6 @@
"apihelp-query+messagegroups-example-1": "Vis beskjedgrupper",
"apihelp-query+messagegroupstats-description": "Kjør spørring på meldingsgruppestatistikk.",
"apihelp-query+messagegroupstats-summary": "Kjør spørring på meldingsgruppestatistikk.",
- "apihelp-query+messagegroupstats-param-timelimit": "Maksimal tid som skal brukes på å regne ut manglende statistikk. Om denne er satt til null vil bare de mellomlagrede resultatene fra begynnelsen returneres.",
"apihelp-query+messagegroupstats-param-group": "Meldingsgruppe-ID.",
"apihelp-query+messagegroupstats-example-1": "List opp oversettelsesfullføringsstatistikk for gruppa «page-Example»",
"apihelp-query+messagetranslations-description": "Spør om alle oversettelser av en enkelt beskjed.",
@@ -121,6 +119,16 @@
"apihelp-translationcheck-summary": "Valider oversettelser.",
"apihelp-translationcheck-param-title": "Sidetittel med navnerom og språkkode.",
"apihelp-translationcheck-param-translation": "Oversettelsen som skal valideres.",
+ "apihelp-translationstats-description": "Hent oversettelsesstatistikk som gjelder oversettelsesredigeringer, aktive oversettere, nye brukere og korrekturlesere.",
+ "apihelp-translationstats-summary": "Hent oversettelsesstatistikk",
+ "apihelp-translationstats-param-count": "Type statistikk som skal hentes",
+ "apihelp-translationstats-param-days": "Antall dager deg skal hentes statistikk for",
+ "apihelp-translationstats-param-group": "Liste over grupper det skal hentes statistikk for.",
+ "apihelp-translationstats-param-language": "Liste over språk det skal hentes stastikk for.",
+ "apihelp-translationstats-param-scale": "Skala for oversettelsesstatistikken",
+ "apihelp-translationstats-param-start": "Datoen det skal hentes oversettelsesstatistikk fra. Standard er nåværende dato minus antall «days».",
+ "apihelp-translationstats-example-1": "Hent antall redigeringer for de siste 30 dagene, for alle grupper og språk",
+ "apihelp-translationstats-example-2": "Hent antall redigeringer for de siste 30 dagene, for språkene engelsk og fransk.",
"apierror-translate-changeset-modified": "Endringssettet har blitt endret av en annen bruker eller prosess. Endringene dine kan ikke lagres siden det kan overskrive deres endringer. Oppdater siden for å se de siste endringene.",
"apierror-translate-duplicateaggregategroup": "Meldingsgruppa finnes allerede",
"apierror-translate-fuzzymessage": "Kan ikke vurdere foreldede oversettelser",
diff --git a/MLEB/Translate/i18n/api/pnb.json b/MLEB/Translate/i18n/api/pnb.json
new file mode 100644
index 00000000..c053be2c
--- /dev/null
+++ b/MLEB/Translate/i18n/api/pnb.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "apihelp-groupreview-param-language": "بولی کوڈ",
+ "apihelp-query+languagestats-description": "بولی کوڈ",
+ "apihelp-query+languagestats-param-language": "بولی کوڈ",
+ "apihelp-query+messagecollection-param-language": "بولی کوڈ"
+}
diff --git a/MLEB/Translate/i18n/api/pt-br.json b/MLEB/Translate/i18n/api/pt-br.json
index 218cb513..0597021d 100644
--- a/MLEB/Translate/i18n/api/pt-br.json
+++ b/MLEB/Translate/i18n/api/pt-br.json
@@ -3,6 +3,7 @@
"authors": [
"Dianakc",
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Felipe L. Ewald",
"Mordecool",
"TheEduGobi"
@@ -25,7 +26,6 @@
"apihelp-groupreview-example-1": "Marque o estado da tradução alemã para o grupo de mensagens \"group-Example\" como preparado",
"apihelp-query+languagestats-description": "Consultar estatísticas de idioma.",
"apihelp-query+languagestats-summary": "Consultar estatísticas de idioma.",
- "apihelp-query+languagestats-param-timelimit": "Tempo máximo para gastar no cálculo das estatísticas faltantes. Se zero, apenas os resultados em cache desde o início são retornados.",
"apihelp-query+languagestats-param-language": "Código da linguagem.",
"apihelp-query+languagestats-example-1": "Lista de estatísticas de conclusão de tradução para finlandês",
"apihelp-query+messagecollection-description": "Consultar MessageCollection sobre traduções.",
@@ -58,7 +58,6 @@
"apihelp-query+messagegroups-example-1": "Mostrar grupos de mensagens",
"apihelp-query+messagegroupstats-description": "Consultar estatísticas do grupo de mensagens.",
"apihelp-query+messagegroupstats-summary": "Consultar estatísticas do grupo de mensagens.",
- "apihelp-query+messagegroupstats-param-timelimit": "Tempo máximo para gastar no cálculo das estatísticas faltantes. Se zero, apenas os resultados em cache desde o início são retornados.",
"apihelp-query+messagegroupstats-param-group": "ID do grupo de mensagens.",
"apihelp-query+messagegroupstats-example-1": "Lista de estatísticas de conclusão de tradução para o grupo \"page-Example\"",
"apihelp-query+messagetranslations-description": "Consultar todas as traduções para uma única mensagem.",
@@ -70,7 +69,7 @@
"apihelp-managemessagegroups-param-groupId": "ID do grupo",
"apihelp-managemessagegroups-param-renameMessageKey": "Chave de mensagem de destino sendo renomeada",
"apihelp-managemessagegroups-param-messageKey": "Chave de mensagem de substituição",
- "apihelp-managemessagegroups-param-operation": "A operação a ser executada. Valores possíveis - renomear / novo",
+ "apihelp-managemessagegroups-param-operation": "A operação a ser executada. Valores possíveis: renomear / novo",
"apihelp-managemessagegroups-param-changesetName": "Alterar nome do conjunto - Padrão / Autônomo / Mediawiki etc.",
"apihelp-managemessagegroups-param-changesetModified": "Registro de data e hora do Unix de quando o conjunto de alterações foi modificado pela última vez. Se o conjunto de alterações tiver sido modificado depois disso, a API lançará um erro.",
"apihelp-translatesandbox-description": "Inscreva-se e gerencie usuários da sandbox.",
@@ -124,6 +123,16 @@
"apihelp-translationcheck-summary": "Validar traduções.",
"apihelp-translationcheck-param-title": "Título de página com espaço nominal e código de língua.",
"apihelp-translationcheck-param-translation": "A tradução para validar.",
+ "apihelp-translationstats-description": "Obtenha estatísticas de tradução relacionadas a edições de tradução, traduções ativas, novos usuários, revisões de tradução e revisores.",
+ "apihelp-translationstats-summary": "Obter estatísticas de tradução",
+ "apihelp-translationstats-param-count": "Tipo de estatística solicitada",
+ "apihelp-translationstats-param-days": "Número de dias para buscar estatísticas para",
+ "apihelp-translationstats-param-group": "Lista de grupos para os quais buscar estatísticas.",
+ "apihelp-translationstats-param-language": "Lista de idiomas para os quais buscar estatísticas.",
+ "apihelp-translationstats-param-scale": "Escala das estatísticas de tradução",
+ "apihelp-translationstats-param-start": "Data de início a partir da qual buscar estatísticas de tradução. O padrão é a data atual menos o número de 'dias'.",
+ "apihelp-translationstats-example-1": "Obter contagem de edições dos últimos 30 dias, para todos os grupos e idiomas",
+ "apihelp-translationstats-example-2": "Obtenha a contagem de edições dos últimos 30 dias, para os idiomas inglês e francês.",
"apierror-translate-changeset-modified": "O conjunto de alterações foi modificado por outro usuário ou processo. Suas alterações não podem ser salvas, pois podem substituir as alterações. Atualize a página para ver as alterações mais recentes.",
"apierror-translate-duplicateaggregategroup": "Grupo de mensagens já existe",
"apierror-translate-fuzzymessage": "Não é possível revisar as traduções imprecisas",
@@ -151,5 +160,6 @@
"apierror-translate-rename-key-invalid": "As chaves de mensagem transmitidas para renomear não foram encontradas na lista de alterações no idioma de origem.",
"apierror-translate-rename-state-invalid": "Uma das mensagens passadas para renomear deve ser adicionada recentemente e a outra excluída. Estados atuais - adição: $1 e exclusão: $2.",
"apiwarn-translate-alreadyreviewedbyyou": "Já marcado como revisado por você",
- "apiwarn-translate-language-disabled-source": "O idioma de origem deste grupo é $1. Selecione outro idioma, para a qual irá traduzir, por favor."
+ "apiwarn-translate-language-disabled-source": "O idioma de origem deste grupo é $1. Selecione outro idioma, para a qual irá traduzir, por favor.",
+ "apierror-translate-operation-error": "Ocorreu um erro ao processar o pedido. Erro: $1"
}
diff --git a/MLEB/Translate/i18n/api/pt.json b/MLEB/Translate/i18n/api/pt.json
index 9f315857..55711c99 100644
--- a/MLEB/Translate/i18n/api/pt.json
+++ b/MLEB/Translate/i18n/api/pt.json
@@ -25,7 +25,6 @@
"apihelp-groupreview-example-1": "Marcar o estado da tradução para alemão do grupo de mensagens \"group-Example\" como pronta",
"apihelp-query+languagestats-description": "Consultar estatísticas de línguas.",
"apihelp-query+languagestats-summary": "Consultar estatísticas de línguas.",
- "apihelp-query+languagestats-param-timelimit": "Máximo de tempo a usar para calcular estatísticas em falta. Se zero, só são devolvidos os resultados armazenados na ''cache'' desde o início.",
"apihelp-query+languagestats-param-language": "Código de língua.",
"apihelp-query+languagestats-example-1": "Lista das estatísticas de finalização de traduções para finlandês",
"apihelp-query+messagecollection-description": "Consultar MessageCollection sobre traduções.",
@@ -55,7 +54,6 @@
"apihelp-query+messagegroups-example-1": "Mostrar grupos de mensagens",
"apihelp-query+messagegroupstats-description": "Consultar estatísticas do grupo de mensagens.",
"apihelp-query+messagegroupstats-summary": "Consultar estatísticas do grupo de mensagens.",
- "apihelp-query+messagegroupstats-param-timelimit": "Máximo de tempo a usar para calcular estatísticas em falta. Se zero, só são devolvidos os resultados armazenados na ''cache'' desde o início.",
"apihelp-query+messagegroupstats-param-group": "Identificador do grupo de mensagens.",
"apihelp-query+messagegroupstats-example-1": "Lista das estatísticas de finalização de traduções para o grupo \"page-Example\"",
"apihelp-query+messagetranslations-description": "Consultar todas as traduções de uma única mensagem.",
diff --git a/MLEB/Translate/i18n/api/qqq.json b/MLEB/Translate/i18n/api/qqq.json
index d3273adf..b2d16937 100644
--- a/MLEB/Translate/i18n/api/qqq.json
+++ b/MLEB/Translate/i18n/api/qqq.json
@@ -1,12 +1,14 @@
{
"@metadata": {
"authors": [
+ "Abijeet Patro",
"Amire80",
"Liuxinyu970226",
"Nemo bis",
"Purodha",
"Raymond",
- "Robby"
+ "Robby",
+ "Umherirrender"
]
},
"apihelp-aggregategroups-description": "{{doc-apihelp-description|aggregategroups}}",
@@ -26,7 +28,6 @@
"apihelp-groupreview-example-1": "{{doc-apihelp-example|groupreview}}",
"apihelp-query+languagestats-description": "{{doc-apihelp-description|query+languagestats}}",
"apihelp-query+languagestats-summary": "{{doc-apihelp-summary|query+languagestats}}",
- "apihelp-query+languagestats-param-timelimit": "{{doc-apihelp-param|query+languagestats|timelimit}}",
"apihelp-query+languagestats-param-language": "{{doc-apihelp-param|query+languagestats|language}}\n{{Identical|Language code}}",
"apihelp-query+languagestats-example-1": "{{doc-apihelp-example|query+languagestats}}",
"apihelp-query+messagecollection-description": "{{doc-apihelp-description|query+messagecollection}}",
@@ -59,7 +60,6 @@
"apihelp-query+messagegroups-example-1": "{{doc-apihelp-example|query+messagegroups}}",
"apihelp-query+messagegroupstats-description": "{{doc-apihelp-description|query+messagegroupstats}}",
"apihelp-query+messagegroupstats-summary": "{{doc-apihelp-summary|query+messagegroupstats}}",
- "apihelp-query+messagegroupstats-param-timelimit": "{{doc-apihelp-param|query+messagegroupstats|timelimit}}",
"apihelp-query+messagegroupstats-param-group": "{{doc-apihelp-param|query+messagegroupstats|group}}",
"apihelp-query+messagegroupstats-example-1": "{{doc-apihelp-example|query+messagegroupstats}}",
"apihelp-query+messagetranslations-description": "{{doc-apihelp-description|query+messagetranslations}}",
@@ -74,6 +74,11 @@
"apihelp-managemessagegroups-param-operation": "{{doc-apihelp-param|managemessagegroups|operation}}",
"apihelp-managemessagegroups-param-changesetName": "{{doc-apihelp-param|managemessagegroups|changesetName}}",
"apihelp-managemessagegroups-param-changesetModified": "{{doc-apihelp-param|managemessagegroups|changesetModified}}",
+ "apihelp-managegroupsynchronizationcache-description": "{{doc-apihelp-description|managegroupsynchronizationcache}}",
+ "apihelp-managegroupsynchronizationcache-summary": "{{doc-apihelp-summary|managegroupsynchronizationcache}}",
+ "apihelp-managegroupsynchronizationcache-param-operation": "{{doc-apihelp-param|managegroupsynchronizationcache|operation}}",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "{{doc-apihelp-param|managegroupsynchronizationcache|messageTitle}}",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "{{doc-apihelp-param|managegroupsynchronizationcache|groupId}}",
"apihelp-translatesandbox-description": "{{doc-apihelp-description|translatesandbox}}",
"apihelp-translatesandbox-summary": "{{doc-apihelp-summary|translatesandbox}}",
"apihelp-translatesandbox-param-do": "{{doc-apihelp-param|translatesandbox|do}}",
@@ -125,13 +130,23 @@
"apihelp-translationcheck-summary": "{{doc-apihelp-summary|translationcheck}}",
"apihelp-translationcheck-param-title": "{{doc-apihelp-param|translationcheck|title}}",
"apihelp-translationcheck-param-translation": "{{doc-apihelp-param|translationcheck|translation}}",
+ "apihelp-translationstats-description": "{{doc-apihelp-description|translationstats}}",
+ "apihelp-translationstats-summary": "{{doc-apihelp-summary|translationstats}}",
+ "apihelp-translationstats-param-count": "{{doc-apihelp-param|translationstats|count}}",
+ "apihelp-translationstats-param-days": "{{doc-apihelp-param|translationstats|days}}",
+ "apihelp-translationstats-param-group": "{{doc-apihelp-param|translationstats|group}}",
+ "apihelp-translationstats-param-language": "{{doc-apihelp-param|translationstats|language}}",
+ "apihelp-translationstats-param-scale": "{{doc-apihelp-param|translationstats|scale}}\n\n\"Scale\" here refers to the time period - days, months.",
+ "apihelp-translationstats-param-start": "{{doc-apihelp-param|translationstats|start}}",
+ "apihelp-translationstats-example-1": "{{doc-apihelp-example|translationstats}}",
+ "apihelp-translationstats-example-2": "{{doc-apihelp-example|translationstats}}",
"apierror-translate-changeset-modified": "{{doc-apierror}}",
"apierror-translate-duplicateaggregategroup": "{{doc-apierror}}",
"apierror-translate-fuzzymessage": "{{doc-apierror}}",
"apierror-translate-groupreviewdisabled": "{{doc-apierror}}",
"apierror-translate-invalidaggregategroup": "{{doc-apierror}}",
"apierror-translate-invalidaggregategroupname": "{{doc-apierror}}",
- "apierror-translate-invalidfilter": "{{doc-apierror}}\n\nParameters:\n* $1 - Filter provided",
+ "apierror-translate-invalidfilter": "{{notranslate}}\n{{doc-apierror}}\n\nParameters:\n* $1 - Filter provided",
"apierror-translate-invalidgroup": "{{doc-apierror}}",
"apierror-translate-invalidstate": "{{doc-apierror}}",
"apierror-translate-invalidlanguage": "{{doc-apierror}}",
@@ -143,7 +158,7 @@
"apierror-translate-notranslationservices": "{{doc-apierror}}",
"apierror-translate-owntranslation": "{{doc-apierror}}",
"apierror-translate-sandboxdisabled": "{{doc-apierror}}",
- "apierror-translate-sandbox-invalidparam": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, probably in English",
+ "apierror-translate-sandbox-invalidparam": "{{notranslate}}\n{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, probably in English",
"apierror-translate-sandbox-invalidppassword": "{{doc-apierror}}",
"apierror-translate-smg-nochanges": "{{doc-apierror}}",
"apierror-translate-unknownmessage": "{{doc-apierror}}",
@@ -154,5 +169,6 @@
"apierror-translate-rename-key-invalid": "{{doc-apierror}}",
"apierror-translate-rename-state-invalid": "'{{doc-apierror}}\n\nParameters:\n* $1 - State of the message being added as the replacement.\n$2 - State of the message being replaced.",
"apiwarn-translate-alreadyreviewedbyyou": "{{doc-apierror}}",
- "apiwarn-translate-language-disabled-source": "{{doc-apierror}}\n\nParameters:\n* $1 - language name"
+ "apiwarn-translate-language-disabled-source": "{{doc-apierror}}\n\nParameters:\n* $1 - language name",
+ "apierror-translate-operation-error": "{{doc-apierror}}\n\nParameters:\n* $1 - exception message"
}
diff --git a/MLEB/Translate/i18n/api/ro.json b/MLEB/Translate/i18n/api/ro.json
new file mode 100644
index 00000000..973bd8cc
--- /dev/null
+++ b/MLEB/Translate/i18n/api/ro.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "NGC 54"
+ ]
+ },
+ "apihelp-query+messagecollection-example-1": "Lista limbilor suportate",
+ "apihelp-query+messagetranslations-example-1": "Lista traducerilor în wiki pentru „MediaWiki:January”",
+ "apihelp-searchtranslations-description": "Căutare traduceri.",
+ "apihelp-searchtranslations-summary": "Căutare traduceri.",
+ "apihelp-searchtranslations-param-limit": "Mărimea relutatului."
+}
diff --git a/MLEB/Translate/i18n/api/roa-tara.json b/MLEB/Translate/i18n/api/roa-tara.json
index 66a36d1e..0e8306ef 100644
--- a/MLEB/Translate/i18n/api/roa-tara.json
+++ b/MLEB/Translate/i18n/api/roa-tara.json
@@ -24,6 +24,8 @@
"apihelp-query+languagestats-param-language": "Codece d'a Lènghe.",
"apihelp-query+languagestats-example-1": "Elenghe de le statisteche de combletamende d'a traduzione pu finlandese",
"apihelp-query+messagecollection-description": "'Nderroghe MessageCollection sus a le traduziune.",
+ "apihelp-query+managemessagegroups-summary": "Pigghie le renomenaminde possibbele pe 'nu messàgge jndr'à 'nu gruppe durante le 'mbortaziune",
+ "apihelp-query+managemessagegroups-description": "Pigghie le renomenaminde possibbele pe 'nu messàgge jndr'à 'nu gruppe durante le 'mbortaziune",
"apihelp-query+managemessagegroups-param-groupId": "ID d'u gruppe",
"apihelp-query+managemessagegroups-param-messageKey": "Chiave d'u messàgge",
"apihelp-query+messagecollection-summary": "'Nderroghe MessageCollection sus a le traduziune.",
diff --git a/MLEB/Translate/i18n/api/ru.json b/MLEB/Translate/i18n/api/ru.json
index 3313f336..52a44e0f 100644
--- a/MLEB/Translate/i18n/api/ru.json
+++ b/MLEB/Translate/i18n/api/ru.json
@@ -31,7 +31,6 @@
"apihelp-groupreview-example-1": "Задать состояние немецкого перевода для группы сообщений «group-Example» как готовое",
"apihelp-query+languagestats-description": "Запросить статистику языка.",
"apihelp-query+languagestats-summary": "Запросить статистику языка.",
- "apihelp-query+languagestats-param-timelimit": "Максимальное время, которое следует затрачивать на подсчёт отсутствующей статистики. Если равно нулю, будут возвращены только кэшированные с самого начала результаты.",
"apihelp-query+languagestats-param-language": "Код языка.",
"apihelp-query+languagestats-example-1": "Список статистики завершённости перевода для финского.",
"apihelp-query+messagecollection-description": "Запросить MessageCollection о переводах.",
diff --git a/MLEB/Translate/i18n/api/sr-ec.json b/MLEB/Translate/i18n/api/sr-ec.json
index 1c82267a..fc1d8a5e 100644
--- a/MLEB/Translate/i18n/api/sr-ec.json
+++ b/MLEB/Translate/i18n/api/sr-ec.json
@@ -2,8 +2,24 @@
"@metadata": {
"authors": [
"Acamicamacaraca",
+ "BadDog",
"Obsuser"
]
},
- "apierror-translate-sandbox-invalidppassword": "Невалидна лозинка"
+ "apihelp-aggregategroups-param-group": "ID групе порука",
+ "apihelp-aggregategroups-param-groupname": "Име збирне групе порука",
+ "apihelp-aggregategroups-param-groupdescription": "Опис збирне групе порука",
+ "apihelp-aggregategroups-example-1": "Придруживање групи",
+ "apihelp-groupreview-param-group": "Група порука",
+ "apihelp-groupreview-param-language": "Кôд језика",
+ "apihelp-query+languagestats-description": "Статистика траженог језика",
+ "apihelp-query+languagestats-summary": "Статистика траженог језика",
+ "apihelp-query+languagestats-param-language": "Кôд језика",
+ "apihelp-managemessagegroups-param-groupId": "ID групе",
+ "apihelp-translationstash-param-subaction": "Радња",
+ "apierror-translate-sandbox-invalidppassword": "Невалидна лозинка",
+ "apierror-translate-smg-nochanges": "Нема измена за обраду.",
+ "apierror-translate-unknownmessage": "Непозната порука",
+ "apierror-translate-invalid-changeset-name": "Дато је неважеће име датотеке скупа измена — $1",
+ "apierror-translate-invalid-operation": "Неважећа вредност: $1. Важеће вредности: $2."
}
diff --git a/MLEB/Translate/i18n/api/sv.json b/MLEB/Translate/i18n/api/sv.json
index acd1a9ea..be5787fb 100644
--- a/MLEB/Translate/i18n/api/sv.json
+++ b/MLEB/Translate/i18n/api/sv.json
@@ -5,6 +5,7 @@
"Dan Koehl",
"Josve05a",
"Lokal Profil",
+ "Sabelöga",
"Victorsa",
"WikiPhoenix"
]
@@ -16,7 +17,7 @@
"apihelp-aggregategroups-example-1": "Associera en grupp",
"apihelp-groupreview-param-group": "Meddelandegrupp.",
"apihelp-groupreview-param-language": "Språkkod.",
- "apihelp-groupreview-example-1": "Markera gruppen \"group-Example\" som redo för tyska",
+ "apihelp-groupreview-example-1": "Markera statusen för den tyska översättningen av gruppen \"group-Example\" som redo",
"apihelp-query+languagestats-param-language": "Språkkod.",
"apihelp-query+managemessagegroups-param-groupId": "Grupp-ID",
"apihelp-query+managemessagegroups-param-messageKey": "Meddelandenyckel",
diff --git a/MLEB/Translate/i18n/api/sw.json b/MLEB/Translate/i18n/api/sw.json
new file mode 100644
index 00000000..f39c90df
--- /dev/null
+++ b/MLEB/Translate/i18n/api/sw.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Edwingudfriend"
+ ]
+ },
+ "apihelp-translationstats-description": "Leta takwimu za tafsiri zinazohusiana na ubadilishaji wa tafsiri, tafsiri inayotumika, watumiaji wapya, hakiki za tafsiri na wakaguzi.",
+ "apihelp-translationstats-summary": "Leta takwimu za tafsiri",
+ "apihelp-translationstats-param-count": "Aina ya takwimu zinazoombwa",
+ "apihelp-translationstats-param-days": "Idadi ya siku za kuleta takwimu za",
+ "apihelp-translationstats-param-group": "Orodha ya vikundi vya kuleta takwimu za.",
+ "apihelp-translationstats-param-language": "Orodha ya lugha za kuleta takwimu za.",
+ "apihelp-translationstats-param-scale": "Kiwango cha takwimu za tafsiri",
+ "apihelp-translationstats-param-start": "Tarehe ya kuanzia ambapo tutachukua takwimu za tafsiri. Chaguo-msingi hadi tarehe ya sasa ukiondoa idadi ya 'siku'.",
+ "apihelp-translationstats-example-1": "Leta hesabu ya hariri kwa siku 30 zilizopita, kwa vikundi na lugha zote",
+ "apihelp-translationstats-example-2": "Leta hesabu ya hariri kwa siku 30 zilizopita, kwa lugha za Kiingereza na Kifaransa."
+}
diff --git a/MLEB/Translate/i18n/api/tly.json b/MLEB/Translate/i18n/api/tly.json
new file mode 100644
index 00000000..84c21822
--- /dev/null
+++ b/MLEB/Translate/i18n/api/tly.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Patriot Kur"
+ ]
+ },
+ "apihelp-groupreview-param-group": "Nomə qrup.",
+ "apihelp-query+messagegroupstats-param-group": "Nomə qrup ID."
+}
diff --git a/MLEB/Translate/i18n/api/tr.json b/MLEB/Translate/i18n/api/tr.json
index a07d4149..d940605f 100644
--- a/MLEB/Translate/i18n/api/tr.json
+++ b/MLEB/Translate/i18n/api/tr.json
@@ -4,7 +4,9 @@
"Arystanbek",
"BaRaN6161 TURK",
"Hedda",
+ "MuratTheTurkish",
"Rapsar",
+ "SaldırganSincap",
"Sayginer",
"Vito Genovese"
]
@@ -26,7 +28,6 @@
"apihelp-groupreview-example-1": "\"group-Example\" mesaj grubunun Almanca çevirisinin durumunu hazır olarak işaretleyin.",
"apihelp-query+languagestats-description": "Sorgu dili istatistikleri.",
"apihelp-query+languagestats-summary": "Sorgu dili istatistikleri.",
- "apihelp-query+languagestats-param-timelimit": "Eksik istatistikleri hesaplamak için harcanan azami süre. Sıfırsa yalnızca önbelleğe alınan sonuçlar baştan getirilir.",
"apihelp-query+languagestats-param-language": "Dil kodu.",
"apihelp-query+languagestats-example-1": "Fince çeviri tamamlama istatistikleri listesi",
"apihelp-query+messagecollection-description": "Çevirilerle ilgili MessageCollection'ı sorgulayın.",
@@ -59,7 +60,6 @@
"apihelp-query+messagegroups-example-1": "Mesaj gruplarını göster",
"apihelp-query+messagegroupstats-description": "Sorgu mesajı grup istatistikleri.",
"apihelp-query+messagegroupstats-summary": "Sorgu mesajı grup istatistikleri.",
- "apihelp-query+messagegroupstats-param-timelimit": "Eksik istatistikleri hesaplamak için harcanan azami süre. Sıfırsa yalnızca önbelleğe alınan sonuçlar baştan getirilir.",
"apihelp-query+messagegroupstats-param-group": "Mesaj grup kimliği.",
"apihelp-query+messagegroupstats-example-1": "\"page-Example\" grubu için çeviri tamamlama istatistiklerinin listesi",
"apihelp-query+messagetranslations-description": "Tek bir mesaj için tüm çevirileri sorgulayın.",
@@ -71,9 +71,14 @@
"apihelp-managemessagegroups-param-groupId": "Grup Kimliği",
"apihelp-managemessagegroups-param-renameMessageKey": "Hedef mesaj anahtarı yeniden adlandırılıyor",
"apihelp-managemessagegroups-param-messageKey": "Yedek mesaj tuşu",
- "apihelp-managemessagegroups-param-operation": "Yapılacak işlem. Olası değerler - rename / new",
+ "apihelp-managemessagegroups-param-operation": "Yapılacak işlem. Olası değerler: rename / new",
"apihelp-managemessagegroups-param-changesetName": "Ayarlanan adı değiştir - Varsayılan / Katılımsız / Mediawiki vb.",
"apihelp-managemessagegroups-param-changesetModified": "Değişiklik kümesinin en son ne zaman değiştirildiğinin Unix zaman damgası. Değişiklik kümesi bundan sonra değiştirildiyse, API hata verir.",
+ "apihelp-managegroupsynchronizationcache-description": "Grup senkronizasyon önbelleğini yönetin.",
+ "apihelp-managegroupsynchronizationcache-summary": "Grup senkronizasyon önbelleğini yönetin.",
+ "apihelp-managegroupsynchronizationcache-param-operation": "Gerçekleştirilecek işlem. Olası değerler: resolve",
+ "apihelp-managegroupsynchronizationcache-param-messageTitle": "Çözüldü olarak işaretlenen mesaj başlığı",
+ "apihelp-managegroupsynchronizationcache-param-groupId": "Çözümlenen mesajın grup kimliği",
"apihelp-translatesandbox-description": "Üye olun ve sanal alan kullanıcılarını yönetin.",
"apihelp-translatesandbox-summary": "Deneme tahtası olan kullanıcılarını kaydedin ve yönetin.",
"apihelp-translatesandbox-param-do": "Ne yapmalı.",
@@ -125,6 +130,16 @@
"apihelp-translationcheck-summary": "Çevirileri doğrulayın.",
"apihelp-translationcheck-param-title": "Ad alanı ve dil kodu içeren sayfa başlığı.",
"apihelp-translationcheck-param-translation": "Doğrulanacak çeviri.",
+ "apihelp-translationstats-description": "Çeviri düzenlemeleri, etkin çeviriler, yeni kullanıcılar, çeviri incelemeleri ve inceleyiciler ile ilgili çeviri istatistiklerini alın.",
+ "apihelp-translationstats-summary": "Çeviri istatistiklerini getirin",
+ "apihelp-translationstats-param-count": "İstenen istatistik türü",
+ "apihelp-translationstats-param-days": "İstatistiklerin alınacağı gün sayısı",
+ "apihelp-translationstats-param-group": "İstatistiklerin alınacağı grupların listesi.",
+ "apihelp-translationstats-param-language": "İstatistiklerin alınacağı dillerin listesi.",
+ "apihelp-translationstats-param-scale": "Çeviri istatistiklerinin ölçeği",
+ "apihelp-translationstats-param-start": "Çeviri istatistiklerinin alınacağı başlangıç ​​tarihi. Mevcut tarih eksi 'gün' sayısıdır.",
+ "apihelp-translationstats-example-1": "Tüm gruplar ve diller için son 30 güne ait düzenleme sayısını getirin",
+ "apihelp-translationstats-example-2": "İngilizce ve Fransızca dilleri için son 30 güne ait düzenleme sayısını getir.",
"apierror-translate-changeset-modified": "Değişiklik kümesi başka bir kullanıcı veya işlem tarafından değiştirildi. Yaptığınız değişiklikler, değişikliklerini geçersiz kılabileceği için kaydedilemiyor. En son değişiklikleri görmek için lütfen sayfayı yenileyin.",
"apierror-translate-duplicateaggregategroup": "Mesaj grubu zaten var",
"apierror-translate-fuzzymessage": "Fuzzy çevirileri incelenemiyor",
@@ -152,5 +167,6 @@
"apierror-translate-rename-key-invalid": "Yeniden adlandırma için iletilen mesaj anahtarları, kaynak dil için yapılan değişiklikler listesinde bulunamadı.",
"apierror-translate-rename-state-invalid": "Yeniden adlandırma için iletilen iletilerden biri yeni eklenmeli ve diğeri silinmelidir. Mevcut durumlar - ek: $1 ve silme: $2.",
"apiwarn-translate-alreadyreviewedbyyou": "Zaten sizin tarafınızdan incelenmiş olarak işaretlendi",
- "apiwarn-translate-language-disabled-source": "Bu grubun kaynak dili $1. Lütfen çevrilecek başka bir dil seçin."
+ "apiwarn-translate-language-disabled-source": "Bu grubun kaynak dili $1. Lütfen çevrilecek başka bir dil seçin.",
+ "apierror-translate-operation-error": "İstek işlenirken bir hata oluştu. Hata: $1"
}
diff --git a/MLEB/Translate/i18n/api/uk.json b/MLEB/Translate/i18n/api/uk.json
index a1056e96..43618dea 100644
--- a/MLEB/Translate/i18n/api/uk.json
+++ b/MLEB/Translate/i18n/api/uk.json
@@ -25,7 +25,6 @@
"apihelp-groupreview-example-1": "Позначити стан німецького перекладу групи повідомлень «group-Example» як «готово»",
"apihelp-query+languagestats-description": "Запитати мовну статистику.",
"apihelp-query+languagestats-summary": "Запитати мовну статистику.",
- "apihelp-query+languagestats-param-timelimit": "Максимальний час, який витратити на обчислення пропущеної статистики. Якщо нуль, лише кешовані результати з початку буде повернено.",
"apihelp-query+languagestats-param-language": "Код мови.",
"apihelp-query+languagestats-example-1": "Перелічити статистику завершеності перекладу фінською",
"apihelp-query+messagecollection-description": "Запитати MessageCollection про переклади.",
@@ -58,7 +57,6 @@
"apihelp-query+messagegroups-example-1": "Показати групи повідомлень",
"apihelp-query+messagegroupstats-description": "Зробити запит на статистику групи повідомлень.",
"apihelp-query+messagegroupstats-summary": "Зробити запит на статистику групи повідомлень.",
- "apihelp-query+messagegroupstats-param-timelimit": "Максимальний час, який витратити на обчислення пропущеної статистики. Якщо нуль, лише кешовані результати з початку буде повернено.",
"apihelp-query+messagegroupstats-param-group": "Ідентифікатор групи повідомлень.",
"apihelp-query+messagegroupstats-example-1": "Список статистики завершеності перекладів для групи «page-Example»",
"apihelp-query+messagetranslations-description": "Зробити запит на всі переклади одного повідомлення.",
@@ -70,7 +68,7 @@
"apihelp-managemessagegroups-param-groupId": "Ідентифікатор групи",
"apihelp-managemessagegroups-param-renameMessageKey": "Ключ цільового повідомлення, перейменування якого здійснюється",
"apihelp-managemessagegroups-param-messageKey": "Заміна для ключа повідомлення",
- "apihelp-managemessagegroups-param-operation": "Операція, яку слід виконати. Можливі значення — перейменування / нове",
+ "apihelp-managemessagegroups-param-operation": "Операція, яку слід виконати. Можливі значення: rename / new",
"apihelp-managemessagegroups-param-changesetName": "Назва набору змін — Стандартно / Без змін / Mediawiki тощо.",
"apihelp-managemessagegroups-param-changesetModified": "Мітка часу Unix-формату, коли була остання модифікація набору змін. Якщо модифікація набору змін відбулася після цього, API видасть помилку.",
"apihelp-translatesandbox-description": "Зареєструватися й управляти користувачами в пісочниці.",
@@ -124,6 +122,16 @@
"apihelp-translationcheck-summary": "Перевірити переклади.",
"apihelp-translationcheck-param-title": "Назва сторінки з простором назв та кодом мови.",
"apihelp-translationcheck-param-translation": "Переклад, який слід перевірити.",
+ "apihelp-translationstats-description": "Отримати статистику перекладів, що стосується редагувань перекладів, активних перекладачів, нових користувачів, перевірок перегляду та перевяльників.",
+ "apihelp-translationstats-summary": "Отримати статистику перекладів",
+ "apihelp-translationstats-param-count": "Типи статистики, що підлягають запиту",
+ "apihelp-translationstats-param-days": "Число днів за які запитати статистику",
+ "apihelp-translationstats-param-group": "Перелік груп для яких запитати статистику.",
+ "apihelp-translationstats-param-language": "Перелік мов для яких запитати статистику.",
+ "apihelp-translationstats-param-scale": "Масштаб статистики перекладів",
+ "apihelp-translationstats-param-start": "Дата з починаючи з якої запитати статистику перекладів. За замовчуванням — поточна дата мінус число значення «days».",
+ "apihelp-translationstats-example-1": "Отримати число редагувань за останні 30 днів для всіх груп та мов",
+ "apihelp-translationstats-example-2": "Отримати число редагувань за останні 30 днів для англійської та французької мов.",
"apierror-translate-changeset-modified": "Набір змін модифіковано іншим користувачем чи процесом. Ваші зміни не можна зберегти, оскільки це може перезаписати їхні зміни. Будь ласка, перезавантажте сторінку, щоб побачити останні зміни.",
"apierror-translate-duplicateaggregategroup": "Група повідомлень вже існує",
"apierror-translate-fuzzymessage": "Не вдалося переглянути застарілі переклади",
diff --git a/MLEB/Translate/i18n/api/zh-hans.json b/MLEB/Translate/i18n/api/zh-hans.json
index c74bca75..d37525fd 100644
--- a/MLEB/Translate/i18n/api/zh-hans.json
+++ b/MLEB/Translate/i18n/api/zh-hans.json
@@ -25,7 +25,6 @@
"apihelp-groupreview-example-1": "将用于消息组“group-Example”的德语翻译状态标记为已就绪",
"apihelp-query+languagestats-description": "查询语言状态。",
"apihelp-query+languagestats-summary": "查询语言状态。",
- "apihelp-query+languagestats-param-timelimit": "花费在统计缺失信息上的最长时间。如果为零,立即返回缓存的结果。",
"apihelp-query+languagestats-param-language": "语言代码。",
"apihelp-query+languagestats-example-1": "芬兰语的翻译完成统计列表",
"apihelp-query+messagecollection-description": "查询有关翻译的MessageCollection。",
@@ -56,7 +55,6 @@
"apihelp-query+messagegroups-example-1": "显示信息组",
"apihelp-query+messagegroupstats-description": "查询信息组状态。",
"apihelp-query+messagegroupstats-summary": "查询信息组状态。",
- "apihelp-query+messagegroupstats-param-timelimit": "计算缺失统计所花费的最长时间。如果为零,则只有从开始起缓存的结果会被返回。",
"apihelp-query+messagegroupstats-param-group": "信息组ID。",
"apihelp-query+messagegroupstats-example-1": "用于“page-Example”组的翻译完成统计列表",
"apihelp-query+messagetranslations-description": "查询单个信息的所有翻译。",
diff --git a/MLEB/Translate/i18n/api/zh-hant.json b/MLEB/Translate/i18n/api/zh-hant.json
index 4247f98b..e6eb4ae2 100644
--- a/MLEB/Translate/i18n/api/zh-hant.json
+++ b/MLEB/Translate/i18n/api/zh-hant.json
@@ -23,7 +23,6 @@
"apihelp-groupreview-example-1": "標記訊息群組「group-Example」的德語翻譯狀態為就緒",
"apihelp-query+languagestats-description": "查詢語言統計。",
"apihelp-query+languagestats-summary": "查詢語言統計。",
- "apihelp-query+languagestats-param-timelimit": "花費計算遺失統計資料的最長時間。若為零,僅會回傳從起始快取的內容。",
"apihelp-query+languagestats-param-language": "語言代碼。",
"apihelp-query+languagestats-example-1": "芬蘭語的翻譯完成統計狀態清單",
"apihelp-query+messagecollection-description": "查詢有關翻譯的 MessageCollection。",
@@ -56,7 +55,6 @@
"apihelp-query+messagegroups-example-1": "顯示訊息群組",
"apihelp-query+messagegroupstats-description": "查詢訊息群組統計。",
"apihelp-query+messagegroupstats-summary": "查詢訊息群組統計。",
- "apihelp-query+messagegroupstats-param-timelimit": "花費計算遺失統計資料的最長時間。若為零,僅會回傳從起始快取的內容。",
"apihelp-query+messagegroupstats-param-group": "訊息群組 ID。",
"apihelp-query+messagegroupstats-example-1": "針對「page-Example」群組的翻譯完成度統計清單",
"apihelp-query+messagetranslations-description": "查詢單一訊息的所有翻譯。",
@@ -122,6 +120,16 @@
"apihelp-translationcheck-summary": "驗證翻譯。",
"apihelp-translationcheck-param-title": "帶有命名空間與語言代碼的頁面標題。",
"apihelp-translationcheck-param-translation": "要驗證的翻譯。",
+ "apihelp-translationstats-description": "取得與翻譯編輯、有效翻譯、新的使用者、翻譯審查與審查者相關的翻譯統計內容。",
+ "apihelp-translationstats-summary": "取得翻譯統計",
+ "apihelp-translationstats-param-count": "要求統計的類型",
+ "apihelp-translationstats-param-days": "要取得統計的天數",
+ "apihelp-translationstats-param-group": "要取得統計內容的群組清單。",
+ "apihelp-translationstats-param-language": "要取得統計內容的語言清單。",
+ "apihelp-translationstats-param-scale": "翻譯統計比例",
+ "apihelp-translationstats-param-start": "要取得翻譯統計的開始日期。預設為目前日期減去「天數」。",
+ "apihelp-translationstats-example-1": "取得所有群組與語言在最近 30 天的編輯計數",
+ "apihelp-translationstats-example-2": "取得英語與法語在最近 30 天的編輯計數",
"apierror-translate-changeset-modified": "變更集已被作者用戶或程序給變更。因您的變更可能會覆蓋掉它們的變更,所以無法保存。請重新整理頁面來查看最新一次的變更內容。",
"apierror-translate-duplicateaggregategroup": "訊息群組已存在",
"apierror-translate-fuzzymessage": "不能審查模糊翻譯",
diff --git a/MLEB/Translate/i18n/core/ace.json b/MLEB/Translate/i18n/core/ace.json
index 0c773d2c..e45f443e 100644
--- a/MLEB/Translate/i18n/core/ace.json
+++ b/MLEB/Translate/i18n/core/ace.json
@@ -36,10 +36,8 @@
"translate-ignored": "(hana peuhiröe)",
"translate-edit-title": "Peusaneut \"$1\"",
"translate-edit-definition": "Hareutoe peusan",
- "translate-edit-translation": "Teujeumah",
"translate-edit-contribute": "peuneugöt",
"translate-edit-information": "Hareutoe bhah peusan ($1)",
- "translate-edit-in-other-languages": "Peusan bak bahsa la'én",
"translate-manage-import-new": "Peusan barô $1",
"translate-documentation-language": "Dokumentasi peusan"
}
diff --git a/MLEB/Translate/i18n/core/af.json b/MLEB/Translate/i18n/core/af.json
index 4b054e1b..30eec4f3 100644
--- a/MLEB/Translate/i18n/core/af.json
+++ b/MLEB/Translate/i18n/core/af.json
@@ -42,11 +42,9 @@
"translate-ignored": "(geïgnoreer)",
"translate-edit-title": "Wysig \"$1\"",
"translate-edit-definition": "Boodskap se definisie",
- "translate-edit-translation": "Vertaling",
"translate-edit-contribute": "wysig",
"translate-edit-no-information": "''Die boodskap het geen dokumentasie nie.''\n''As u weet waar die boodskap gebruik word, kan u ander gebruikers help deur dokumentasie by te voeg.''",
"translate-edit-information": "Inligting oor boodskap ($1)",
- "translate-edit-in-other-languages": "Boodskap in ander tale",
"translate-edit-warnings": "Waarskuwings oor onvoltooide vertalings",
"translate-edit-tmmatch-source": "Bronteks vir vertaling: $1",
"translate-edit-tmmatch": "$1% ooreenkoms",
@@ -155,7 +153,6 @@
"supportedlanguages-recenttranslations": "onlangse vertalings",
"supportedlanguages-count": "$1 {{PLURAL:$1|taal|tale}} in totaal.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|wysiging|wysigings}} - laaste wysiging {{PLURAL:$3|gister|$3 dae gelede}}",
- "translate-save": "Stoor ($1)",
"translate-jssti-add": "Voeg by lys",
"managemessagegroups": "Beheer boodskapgroepe",
"translate-smg-notallowed": "U mag nie hierdie handeling uitvoer nie.",
@@ -188,13 +185,6 @@
"translate-import-err-no-such-file": "Die lêer <nowiki>$1</nowiki> bestaan nie of is nie na die bediener opgelaai nie.",
"translate-import-err-stale-group": "Die boodskapgroep waaraan die lêer behoort bestaan ​​nie.",
"translate-import-err-no-headers": "Die lêer bevat nie goed gevormde gettext soos deur die \"Translate\"-uitbreiding vereis word nie.\nDit is nie moontlik om die groep en taal uit die lêer te bepaal nie.",
- "translate-js-summary": "Samevatting:",
- "translate-js-save": "Stoor",
- "translate-js-next": "Stoor en open die volgende",
- "translate-js-skip": "Slaan oor en volgende",
- "translate-js-history": "Vertaalgeskiedenis",
- "translate-js-support": "Vra 'n vraag",
- "translate-js-support-title": "Vra vir hulp as daar nie genoeg inligting is om hierdie boodskap korrek te vertaal nie.",
"translate-js-support-unsaved-warning": "U het ongestoorde vertalings.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kode",
diff --git a/MLEB/Translate/i18n/core/aln.json b/MLEB/Translate/i18n/core/aln.json
index b37e7122..4e0b581b 100644
--- a/MLEB/Translate/i18n/core/aln.json
+++ b/MLEB/Translate/i18n/core/aln.json
@@ -27,7 +27,6 @@
"translate-edit-contribute": "kontribuoj",
"translate-edit-no-information": "''Ky mesazh nuk ka asnjë dokumentacion. Nëse ju e dini se ku apo se si ky mesazh është përdorur, ju mund të ndihmoni përkthyes të tjerë duke dokumentacionin në këtë mesazh.''",
"translate-edit-information": "Informacion rreth mesazh \"$2\" ($1)",
- "translate-edit-in-other-languages": "Mesazhi \"$1\" në gjuhë të tjera",
"translate-edit-warnings": "Paralajmërimet për përkthime të plota",
"translate-edit-tmmatch": "ndeshje $1%",
"translate-manage-import-diff": "Mesazhi $1 | Veprimi: $2",
diff --git a/MLEB/Translate/i18n/core/alt.json b/MLEB/Translate/i18n/core/alt.json
new file mode 100644
index 00000000..4ead02e6
--- /dev/null
+++ b/MLEB/Translate/i18n/core/alt.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Батыр Комдошев"
+ ]
+ },
+ "languagestats": "Тилдиҥ статистиказы",
+ "translate-documentation-language": "Јетирӱлердиҥ документациязы"
+}
diff --git a/MLEB/Translate/i18n/core/am.json b/MLEB/Translate/i18n/core/am.json
index d1d3099c..77773b89 100644
--- a/MLEB/Translate/i18n/core/am.json
+++ b/MLEB/Translate/i18n/core/am.json
@@ -21,7 +21,6 @@
"translate-edit-contribute": "ለመሣተፍ",
"translate-edit-no-information": "''ይኸው መልእክት ምንም መረጃ የለውም።\nመልዕክቱ በየት ወይም እንዴት እንደሚጠቀም ዕውቀት ካለዎ፣ መረጃ በመጨምር ሌሎች አስተርጓሚዎች ሊረዱ ይችላሉ።''",
"translate-edit-information": "መረጃ ስለዚሁ መልእክት ($1)",
- "translate-edit-in-other-languages": "መልዕክቱ በሌሎች ልሳናት",
"translate-sidebar-alltrans": "ይኸው መልዕክት በሌሎች ልሳናት",
"translate-language": "ቋንቋ"
}
diff --git a/MLEB/Translate/i18n/core/an.json b/MLEB/Translate/i18n/core/an.json
index 33447aea..786a573a 100644
--- a/MLEB/Translate/i18n/core/an.json
+++ b/MLEB/Translate/i18n/core/an.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Juanpabl"
+ "Juanpabl",
+ "Willtron"
]
},
"translate": "Traducir",
@@ -24,5 +25,5 @@
"translate-optional": "(opcional)",
"translate-ignored": "(no considerato)",
"translate-translations-fieldset-title": "Mensache",
- "translate-save": "Alzar($1)"
+ "translate-documentation-language": "Documentación d'o mensache"
}
diff --git a/MLEB/Translate/i18n/core/ang.json b/MLEB/Translate/i18n/core/ang.json
index 3368705d..d01e5bdf 100644
--- a/MLEB/Translate/i18n/core/ang.json
+++ b/MLEB/Translate/i18n/core/ang.json
@@ -1,8 +1,9 @@
{
"@metadata": {
"authors": [
- "Gott wisst"
+ "Gott wisst",
+ "Heahwrita"
]
},
- "translate-documentation-language": "Ǣrendgewrita amearcung"
+ "translate-documentation-language": "Ærendgewrita amearcung"
}
diff --git a/MLEB/Translate/i18n/core/ann.json b/MLEB/Translate/i18n/core/ann.json
new file mode 100644
index 00000000..865b45b4
--- /dev/null
+++ b/MLEB/Translate/i18n/core/ann.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Katelem"
+ ]
+ },
+ "translate-checks-replacement": "Sa $2 kpan̄asi $1"
+}
diff --git a/MLEB/Translate/i18n/core/ar.json b/MLEB/Translate/i18n/core/ar.json
index 98ccb743..d4b0a584 100644
--- a/MLEB/Translate/i18n/core/ar.json
+++ b/MLEB/Translate/i18n/core/ar.json
@@ -58,11 +58,9 @@
"translate-ignored": "(متجاهل)",
"translate-edit-title": "عدل \"$1\"",
"translate-edit-definition": "تعريف الرسالة",
- "translate-edit-translation": "الترجمة",
"translate-edit-contribute": "ساهم",
"translate-edit-no-information": "<em>ليس لهذه الرسالة توثيق.\nإذا كنت تعرف أين أو كيف تستخدم هذه الرسالة، يمكنك مساعدة المترجمين الآخرين بإضافة توثيق إلى هذه الرسالة.</em>",
"translate-edit-information": "معلومات عن الرسالة ($1)",
- "translate-edit-in-other-languages": "الرسالة بلغات أخرى",
"translate-edit-warnings": "التحذيرات الخاصة بالترجمات غير المكتملة",
"translate-edit-tmmatch-source": "نص المصدر للترجمة: $1",
"translate-edit-tmmatch": "$1% مطابقة",
@@ -209,7 +207,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|تعديل|تعديلات}} - آخر تعديل منذ $3 {{PLURAL:$3|يوم|أيام}}",
"abusefilter-edit-builder-vars-translate-source-text": "النص المصدر لوحدة الترجمة",
"abusefilter-edit-builder-vars-translate-target-language": "اللغة الهدف للترجمة",
- "translate-save": "حفظ ($1)",
"translate-jssti-add": "أضف إلى القائمة",
"managemessagegroups": "إدارة مجموعة الرسائل",
"translate-smg-notallowed": "غير مسموح لك بتنفيذ هذا التصرف.",
@@ -230,6 +227,8 @@
"translate-smg-rename-rename": "إضافة كإعادة تسمية ...",
"translate-smg-rename-dialog-title": "حدد إعادة تسمية مطابقة ل$1",
"translate-smg-changeset-modified": "تم تعديل مجموعة التغييرات بواسطة مستخدم أو عملية أخرى، لا يمكن حفظ تغييراتك لأنها قد تتجاوز تغييراتها، تُرجَى إعادة تحميل الصفحة لرؤية آخر التغييرات.",
+ "translate-smg-group-message-action-history": "تاريخ",
+ "translate-smg-group-message-message-other-langs": "اللغات الأخرى:",
"translate-manage-import-diff": "الرسالة $1 | الإجراءات: $2",
"translate-manage-import-new": "رسالة جديدة $1",
"translate-manage-import-deleted": "رسالة محذوفة $1",
@@ -260,13 +259,6 @@
"translate-import-err-no-such-file": "الملف <nowiki>$1</nowiki> غير موجود أو لم يرفع محليًا.",
"translate-import-err-stale-group": "مجموعة الرسائل المنتمية إلى هذا الملف غير موجود.",
"translate-import-err-no-headers": "الملف ليس ملف Gettext صحيح بصيغة امتداد الترجمة:\nغير قادر على تحديد المجموعة واللغة من مقدمة الملف.",
- "translate-js-summary": "ملخص:",
- "translate-js-save": "نشر",
- "translate-js-next": "انشر وافتح التالية",
- "translate-js-skip": "تخطَ إلى التالية",
- "translate-js-history": "تاريخ الترجمة",
- "translate-js-support": "اطرح سؤالا",
- "translate-js-support-title": "اطلب المساعدة إذا لم تكن لديك معلومات كافية لترجمة هذه الرسالة بشكل صحيح.",
"translate-js-support-unsaved-warning": "لديك ترجمات غير محفوظة.",
"translate-gs-pos": "الترتيب",
"translate-gs-code": "الرمز",
diff --git a/MLEB/Translate/i18n/core/arc.json b/MLEB/Translate/i18n/core/arc.json
index 158bf8a4..41c602a8 100644
--- a/MLEB/Translate/i18n/core/arc.json
+++ b/MLEB/Translate/i18n/core/arc.json
@@ -28,10 +28,8 @@
"translate-optional": "(ܨܒܝܢܝܐ)",
"translate-edit-title": "ܫܚܠܦ \"$1\"",
"translate-edit-definition": "ܬܘܚܡܐ ܕܐܓܪܬܐ",
- "translate-edit-translation": "ܬܘܪܓܡܐ",
"translate-edit-contribute": "ܫܘܬܦ",
"translate-edit-information": "ܝܕ̈ܥܬܐ ܥܠ ܦܐܬܐ ($1)",
- "translate-edit-in-other-languages": "ܐܓܪܬܐ ܒܠܫܢ̈ܐ ܐܚܪ̈ܢܐ",
"translate-edit-warnings": "ܙܘܗܪ̈ܐ ܥܠ ܬܘܪ̈ܓܡܐ ܠܐ ܓܡܝܪ̈ܐ",
"translate-edit-tmmatch": "$1% ܠܚܡܐ",
"translate-edit-askpermission": "ܫܩܘܠ ܦܣܣܐ",
@@ -70,17 +68,10 @@
"translate-ls-column-group": "ܟܢܘܫܬܐ ܕܐܓܪ̈ܬܐ",
"translate-mgs-pagename": "ܚܒܝܫܘܬ ܡܢܝܢܐ ܕܟܢܘܫܬܐ ܕܐܓܪ̈ܬܐ",
"supportedlanguages": "ܠܫܢ̈ܐ ܣܡܝܟ̈ܐ",
- "translate-save": "ܠܒܘܟ ($1)",
"translate-jssti-add": "ܐܘܣܦ ܠܡܟܬܒܘܬܐ",
"managemessagegroups": "ܕܒܘܪܝܐ ܕܟܢܘܫܬܐ ܕܐܓܪ̈ܬܐ",
"translate-manage-import-new": "ܐܓܪܬܐ ܚܕܬܐ $1",
"translate-manage-import-deleted": "ܐܓܪܬܐ ܫܝܦܬܐ $1",
- "translate-js-summary": "ܦܣܝܩܬ̈ܐ:",
- "translate-js-save": "ܠܒܘܟ",
- "translate-js-next": "ܠܒܘܟ ܘܦܬܘܚ ܕܒܬܪܗ",
- "translate-js-skip": "ܫܘܪ ܠܒܬܪܗ",
- "translate-js-history": "ܬܫܥܝܬܐ ܕܬܘܪܓܡܐ",
- "translate-js-support": "ܫܐܠ ܫܘܐܠܐ",
"translate-js-support-unsaved-warning": "ܐܝܬ ܠܟ ܬܘܪ̈ܓܡܐ ܠܐ ܠܒܝܟ̈ܐ.",
"translate-documentation-language": "ܐܓܪܬܐ ܕܐܫܛܪܘܬܐ",
"translate-searchprofile": "ܬܘܪ̈ܓܡܐ",
diff --git a/MLEB/Translate/i18n/core/arz.json b/MLEB/Translate/i18n/core/arz.json
index 87c5bd48..02105e82 100644
--- a/MLEB/Translate/i18n/core/arz.json
+++ b/MLEB/Translate/i18n/core/arz.json
@@ -34,7 +34,6 @@
"translate-edit-contribute": "ساهم",
"translate-edit-no-information": "''ليس لهذه الرساله توثيق.\nإذا كنت تعرف أين أو كيف يتم استخدام هذه الرساله، فيمكنك مساعده المترجمين الآخرين بإضافه توثيق إلى هذه الرساله.''",
"translate-edit-information": "معلومات عن الرساله ($1)",
- "translate-edit-in-other-languages": "الرساله بلغات تانيه",
"translate-edit-warnings": "التحذيرات حول الترجمات غير المكتملة",
"translate-edit-tmmatch-source": "نص المصدر للترجمه: $1",
"translate-edit-tmmatch": "$1% مطابقة",
@@ -108,7 +107,6 @@
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|مترجم|مترجمه}}|مترجمين}}: $1",
- "translate-save": "سييف ($1)",
"translate-jssti-add": "أضف إلى القائمة",
"translate-manage-import-diff": "الرساله $1 | الإجراءات: $2",
"translate-manage-import-new": "رساله جديده $1",
@@ -135,7 +133,6 @@
"translate-import-err-invalid-title": "اسم الملف المعطى <nowiki>$1</nowiki> غير صالح.",
"translate-import-err-no-such-file": "الملف <nowiki>$1</nowiki> غير موجود أو لم يرفع محليًا.",
"translate-import-err-no-headers": "الملف ليس ملف Gettext صحيح بصيغه امتداد الترجمة:\nغير قادر على تحديد المجموعه واللغه من مقدمه الملف.",
- "translate-js-save": "سييف",
"translate-gs-pos": "الترتيب",
"translate-gs-code": "الرمز",
"translate-gs-continent": "القارة",
diff --git a/MLEB/Translate/i18n/core/as.json b/MLEB/Translate/i18n/core/as.json
index 25e5579d..bf119308 100644
--- a/MLEB/Translate/i18n/core/as.json
+++ b/MLEB/Translate/i18n/core/as.json
@@ -42,10 +42,8 @@
"translate-ignored": "(উপেক্ষিত)",
"translate-edit-title": "\"$1\" সম্পাদন কৰক",
"translate-edit-definition": "বাৰ্তাৰ সংজ্ঞা",
- "translate-edit-translation": "ভাঙনি",
"translate-edit-contribute": "বৰঙণি",
"translate-edit-information": "বাৰ্তাটোৰৰ বিষয়ে সবিশেষ ($1)",
- "translate-edit-in-other-languages": "আন ভাষাত বাৰ্তা",
"translate-edit-warnings": "অসমাপ্ত ভাঙনিৰ বিষয়ে সতৰ্ক বানী",
"translate-edit-tmmatch-source": "অনুবাদৰ উৎস পাঠ্য: $1",
"translate-edit-tmmatch": "$1% ৰজিতা খাইছে",
@@ -67,6 +65,7 @@
"translate-stats-registrations": "পঞ্জীয়নসমূহ",
"translate-stats-reviews": "নিৰীক্ষকসকল",
"translate-stats-reviewers": "নিৰীক্ষকসকল",
+ "translate-statsf-options": "গ্ৰাফৰ বিকল্প",
"translate-statsf-start": "আৰম্ভৰ তাৰিখ:",
"translate-statsf-scale-months": "মাহ",
"translate-statsf-scale-weeks": "সপ্তাহ",
@@ -120,7 +119,6 @@
"supportedlanguages-recenttranslations": "শেহতীয়া ভাঙনিসমূহ",
"supportedlanguages-count": "$1 মুঠ {{PLURAL:$1|ভাষা}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|সম্পাদন}} - শেষ সম্পাদন $3 {{PLURAL:$3|দিন}} আগতে",
- "translate-save": "সাঁচি থওক ($1)",
"translate-jssti-add": "তালিকাত যোগ দিয়ক",
"managemessagegroups": "বাৰ্তা গোটৰ ব্যৱস্থাপনা",
"translate-smg-notallowed": "আপোনাক এই কাৰ্য কৰিবলৈ অনুমতি দিয়া নাই",
@@ -133,12 +131,6 @@
"translate-import-from-local": "স্থানীয় ফাইল আপল’ড:",
"translate-import-load": "ফাইল ল’ড কৰক",
"translate-import-err-dl-failed": "ফাইল অৰ্জন কৰা নহ'ল:\n$1",
- "translate-js-summary": "সাৰাংশ:",
- "translate-js-save": "সাঁচি থওক",
- "translate-js-next": "সাঁচক আৰু পৰৱৰ্তী বাৰ্তা খোলক",
- "translate-js-skip": "বাতিল কৰি পৱৱৰ্তী বাৰ্তালৈ যাওক",
- "translate-js-history": "ভাঙনিৰ খতিয়ান",
- "translate-js-support": "প্ৰশ্ন সোধক",
"translate-gs-code": "কোড",
"translate-gs-continent": "উপমহাদেশ",
"translate-gs-speakers": "বক্তা",
diff --git a/MLEB/Translate/i18n/core/ast.json b/MLEB/Translate/i18n/core/ast.json
index 878bb259..4e13268e 100644
--- a/MLEB/Translate/i18n/core/ast.json
+++ b/MLEB/Translate/i18n/core/ast.json
@@ -42,11 +42,9 @@
"translate-ignored": "(inoráu)",
"translate-edit-title": "Editar \"$1\"",
"translate-edit-definition": "Definición del mensaxe",
- "translate-edit-translation": "Traducción",
"translate-edit-contribute": "contribuyir",
"translate-edit-no-information": "<em>Esti mensaxe nun tien documentación. Si sabe ú o cómo s'usa esti mensaxe, pue ayudar a otros traductores amestando documentación a esti mensaxe.</em>",
"translate-edit-information": "Información tocante a esti mensaxe ($1)",
- "translate-edit-in-other-languages": "Mensaxe n'otres llingües",
"translate-edit-warnings": "Avisos sobre traducciones incompletes",
"translate-edit-tmmatch-source": "Testu orixinal de la traducción: $1",
"translate-edit-tmmatch": "$1 % de coincidencia",
@@ -193,7 +191,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|edición|ediciones}}; cabera edición hai $3 {{PLURAL:$3|día|díes}}",
"abusefilter-edit-builder-vars-translate-source-text": "Testu d'orixe de la unidá de traducción",
"abusefilter-edit-builder-vars-translate-target-language": "Llingua de destín de la traducción",
- "translate-save": "Guardar ($1)",
"translate-jssti-add": "Amestar a la llista",
"managemessagegroups": "Xestión de grupos de mensaxes",
"translate-smg-notallowed": "Nun tienes permisu pa executar esta aición.",
@@ -231,13 +228,6 @@
"translate-import-err-no-such-file": "El ficheru \"<nowiki>$1</nowiki>\" nun esiste o nun se xubió de mou llocal.",
"translate-import-err-stale-group": "El grupu de mensaxes al que pertenez esti ficheru nun esiste.",
"translate-import-err-no-headers": "El ficheru nun ye un ficheru Gettext bien formáu nel formatu d'estensión Translate:\nNun se puen determinar el grupu y la llingua a partir de les testeres del ficheru.",
- "translate-js-summary": "Resume:",
- "translate-js-save": "Guardar",
- "translate-js-next": "Guardar y abrir el siguiente",
- "translate-js-skip": "Saltar al siguiente",
- "translate-js-history": "Historial de traducciones",
- "translate-js-support": "Facer una entruga",
- "translate-js-support-title": "Pidir ayuda si nun hai información bastante pa traducir esti mensaxe correutamente.",
"translate-js-support-unsaved-warning": "Tienes traducciones ensin guardar.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Códigu",
diff --git a/MLEB/Translate/i18n/core/atj.json b/MLEB/Translate/i18n/core/atj.json
index 8f195404..b5c7d0d3 100644
--- a/MLEB/Translate/i18n/core/atj.json
+++ b/MLEB/Translate/i18n/core/atj.json
@@ -7,7 +7,6 @@
},
"translate-page-settings-legend": "Ke actain",
"translate-langstats-expand": "otamirota",
- "translate-js-summary": "Nosem:",
"translate-documentation-language": "E itatcitcikatek",
"tux-editor-page-mode": "Masinhikan",
"tux-message-filter-advanced-button": "Awocamec nantona",
diff --git a/MLEB/Translate/i18n/core/awa.json b/MLEB/Translate/i18n/core/awa.json
index a3a9a8da..64b65970 100644
--- a/MLEB/Translate/i18n/core/awa.json
+++ b/MLEB/Translate/i18n/core/awa.json
@@ -27,9 +27,7 @@
"translate-page-edit": "सम्पादन करा जाय",
"translate-edit-title": "सम्पादन \"$1\"",
"translate-edit-definition": "संदेश परिभाषा",
- "translate-edit-translation": "अनुवाद",
"translate-edit-contribute": "योगदान",
- "translate-edit-in-other-languages": "सनेशा दुसर भाषा मा",
"translate-pref-editassistlang": "सहायक भाषा:",
"translate-sidebar-alltrans": "दुसर भाषा में",
"translate-translations-count": "मिला {{PLURAL:$1|एक अनुबाद|$1 अनुबाद}}.",
@@ -44,7 +42,6 @@
"supportedlanguages-recenttranslations": "नँवा अनुवाद",
"supportedlanguages-count": "कुल $1 {{PLURAL:$1|भाषा|भाषा}} ।",
"translate-smg-rename-no-msg": "एक्कव संदेस नही मिला",
- "translate-js-skip": "छोड़यँ औ आगे जायँ",
"translate-documentation-language": "मैसेज डकुमेन्टेशन",
"translate-msggroupselector-search-all": "सगरौ",
"tux-tab-all": "सगरौ",
diff --git a/MLEB/Translate/i18n/core/az.json b/MLEB/Translate/i18n/core/az.json
index 96f55171..0687b66e 100644
--- a/MLEB/Translate/i18n/core/az.json
+++ b/MLEB/Translate/i18n/core/az.json
@@ -41,11 +41,9 @@
"translate-ignored": "(sayılmayan)",
"translate-edit-title": "Redaktə et \"$1\"",
"translate-edit-definition": "Mesaj təsviri",
- "translate-edit-translation": "Tərcümə",
"translate-edit-contribute": "töhfə ver",
"translate-edit-no-information": "<em>Bu mesajın təsviri yoxdur.\nƏgər bu mesajın harada və necə istifadə edildiyini bilirsinizsə, onda bu mesaj üçün bir sənədləşmə əlavə edərək digər tərcüməçilərə kömək ola bilərsiniz.</em>",
"translate-edit-information": "Mesaj haqqında məlumat(lar) ($1)",
- "translate-edit-in-other-languages": "Digər dillərdəki mesaj",
"translate-edit-warnings": "Yarımçıq tərcümələr haqqında xəbərdarlıqlar",
"translate-edit-tmmatch-source": "Tərcümə mənbəsi mətni: $1",
"translate-edit-tmmatch": "$1% oxşar",
@@ -136,7 +134,6 @@
"supportedlanguages-recenttranslations": "son tərcümələr",
"supportedlanguages-count": "Ümumi olaraq $1 {{PLURAL:$1|dil}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|redaktə}} - son redaktə $3 {{PLURAL:$3|gün}} əvvəl",
- "translate-save": "Saxla ($1)",
"translate-jssti-add": "Siyahıya əlavə et",
"managemessagegroups": "Mesaj qrupu idarəsi",
"translate-smg-notallowed": "Bu əməliyyatı yerinə yetirmək üçün icazəniz yoxdur.",
@@ -149,12 +146,6 @@
"translate-manage-import-new": "Yeni mesaj $1",
"translate-manage-import-deleted": "Silinmiş mesaj $1",
"translate-manage-action-ignore": "İqnor et",
- "translate-js-summary": "Açıqlama:",
- "translate-js-save": "Saxla",
- "translate-js-next": "Saxla və sonrakını aç",
- "translate-js-skip": "Sonrakına keç",
- "translate-js-history": "Tərcümə tarixi",
- "translate-js-support": "Sual ver",
"translate-gs-code": "Kod",
"translate-gs-score": "Hesab",
"translate-gs-multiple": "Çoxlu",
diff --git a/MLEB/Translate/i18n/core/azb.json b/MLEB/Translate/i18n/core/azb.json
index 5093154b..a01dd455 100644
--- a/MLEB/Translate/i18n/core/azb.json
+++ b/MLEB/Translate/i18n/core/azb.json
@@ -45,11 +45,9 @@
"translate-ignored": "(یوخ ساییلمیش)",
"translate-edit-title": "«$1»-ی دَییشدیر",
"translate-edit-definition": "مئساژ تانیتیمی",
- "translate-edit-translation": "چئویرمک",
"translate-edit-contribute": "چالیشماق",
"translate-edit-no-information": "''بو مئساژ اوچون سندلندیرمه یوخدور.''\n''اگر سیز بیلیرسیز بو مئساژ نئجه ایشلنیب‌دیر، بو مئساژی سندلندیرمک‌له، آیری ترجومه‌چیلره یاردیم ائده بیلرسیز.''",
"translate-edit-information": "مئساژ اوچون بیلگیلر ($1)",
- "translate-edit-in-other-languages": "مئساژ آیری دیل‌لرده",
"translate-edit-warnings": "قورتاریلمامیش چئویرمه‌لره گؤره ایخطار",
"translate-edit-tmmatch-source": "چئویرمک قایناق یازی‌سی: $1",
"translate-edit-tmmatch": "$1٪ تطبیق",
@@ -162,7 +160,6 @@
"supportedlanguages-recenttranslations": "سون چئویرمه‌لر",
"supportedlanguages-count": "توپلام‌دا {{PLURAL:$1|بیر|$1}} دیل.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|بیر|$2}} دَییشکلیک - سون دَییشیکلیک {{PLURAL:$3|بیر|$3}} گون قاباق",
- "translate-save": "قئید ائت ($1)",
"translate-jssti-add": "لیسته آرتیر",
"managemessagegroups": "مئساژ قروپ ایداره‌سی",
"translate-smg-notallowed": "سیز بو ایشی گؤرمگه ایجازه‌نیز یوخدور.",
@@ -193,13 +190,6 @@
"translate-import-err-no-such-file": "<nowiki>$1</nowiki> فایلی یوخدور یادا یئرلی یوکلنیلمه‌ییب‌دیر.",
"translate-import-err-stale-group": "بو فایل اونا عاید اولان مئساژ گروپو یوخدور.",
"translate-import-err-no-headers": "فایلین ترجومه اوزانتی فورمتینده دوزگون Gettext فورمو یوخدور.\nفایل باشلیقلاریندان دیل و مئساژ گروپونو بیلمک اولمور.",
- "translate-js-summary": "آچیقلاما:",
- "translate-js-save": "ذخیره ائت",
- "translate-js-next": "قئید ائت و سونراکینی آچ",
- "translate-js-skip": "سونراکینا آتلان",
- "translate-js-history": "چئویرمک گئچمیشی",
- "translate-js-support": "سورغو سوروش",
- "translate-js-support-title": "بو مئساژی دوزگون چئویرمک اوچون کیفایت قدر بیلگی اولماسا، یاردیم ایسته‌یین.",
"translate-js-support-unsaved-warning": "سیزین قئید ائدیلمه‌میش چئویرمه‌لرینیز واردیر.",
"translate-gs-pos": "یئر",
"translate-gs-code": "کود",
diff --git a/MLEB/Translate/i18n/core/ba.json b/MLEB/Translate/i18n/core/ba.json
index 12d55bbf..1b37b67c 100644
--- a/MLEB/Translate/i18n/core/ba.json
+++ b/MLEB/Translate/i18n/core/ba.json
@@ -33,11 +33,9 @@
"translate-ignored": "(иғтибарға алынмай)",
"translate-edit-title": "Мөхәрирләү \"$1\"",
"translate-edit-definition": "Яҙманың билдәләмәһе",
- "translate-edit-translation": "Тәржемә",
"translate-edit-contribute": "үҙгәртергә",
"translate-edit-no-information": "''Был яҙманың тасуирламаһы юҡ. Әгәр ҙә һеҙ был яҙманың ҡайҙа һәм нисек ҡулланылғанын белһәгеҙ, был яҙмаға тасуирлама өҫтәп, бүтән тәржемәселәргә ярҙам итә алаһығыҙ.''",
"translate-edit-information": "Яҙма тураһында мәғлүмәт ($1)",
- "translate-edit-in-other-languages": "Ошо яҙма башҡа телдәрҙә",
"translate-edit-warnings": "Тулы булмаған тәржемәләр тураһында иҫкәртеү",
"translate-edit-tmmatch": "$1% тап килеү",
"translate-use-suggestion": "Әлеге тәржемәнең тексын ошо күрһәтелгән менән алмаштырырға.",
@@ -116,7 +114,6 @@
"supportedlanguages-summary": "Был биттә {{SITENAME}} проектында ҡулланылған телдәр һәм был телдәр өҫтөндә эшләүсе тәржемәселәр исемлеге килтерелгән.\nӘгәр ниндәйҙер тел тураһында тулыраҡ мәғлүмәт алырға теләһәгеҙ, шул телдең порталы һылтанмаһына баҫығыҙ.\nБерәй тәржемәсе исеменә баҫһағыҙ, шул тәржемәсенең битенә эләгерһегеҙ.\n\nӘгәр ниндәй ҙә булһа тел исемлектә килтерелмәгән икән, һеҙ ошо телгә локалләштереүҙе \"[[Translating:Process|Яңы тел]]\" битендә башлай алаһығыҙ.\n\nӘгәр һеҙ ниндәй ҙә булһа телгә тәржемә итәһегеҙ һәм һеҙҙең исемегеҙ тәржемәселәр исемлегендә юҡ икән, зинһар, исемегеҙҙе был телдең [[:Category:Languages|порталында]] тәржемәселәр исемлегенә өҫтәгеҙ.\nҺеҙҙең көйләүҙәрегеҙҙәге тел порталына һылтанманы менюла табырға була.",
"supportedlanguages-translators": "{{PLURAL:$2|1=Тәржемәсе|Тәржемәселәр}}: $1",
"supportedlanguages-recenttranslations": "яңыраҡ эшләнгән тәржемәләр",
- "translate-save": "Һаҡларға ($1)",
"translate-jssti-add": "Исемлеккә өҫтәргә",
"managemessagegroups": "Яҙмалар төркөмдәре менән идара итеү",
"translate-manage-import-diff": "$1 яҙмаһы: $2",
@@ -145,11 +142,6 @@
"translate-import-err-no-such-file": "Файл <nowiki>$1</nowiki> юҡ йәки урында индерелмәгән.",
"translate-import-err-stale-group": "Был файлға ҡараған яҙмалар төркөмө юҡ.",
"translate-import-err-no-headers": "Файл —Translate киңәйеүе форматында дөрөҫ Gettext-файл түгел:\nФайлдың башлыҡтарынан төркөмдө һәм телде билдәләп булмай.",
- "translate-js-next": "Һаҡларға һәм сираттағыны асырға",
- "translate-js-skip": "Сираттағыға күсергә",
- "translate-js-history": "Тәржемә тарихы",
- "translate-js-support": "Һорау бирергә",
- "translate-js-support-title": "Был яҙманы дөрөҫ тәржемә итер өсөн мәғлүмәт етмәһә, ярҙам һорап мөрәжәғәт итегеҙ.",
"translate-gs-pos": "Урын",
"translate-gs-code": "Код",
"translate-gs-continent": "Донъя өлөшө",
diff --git a/MLEB/Translate/i18n/core/ban.json b/MLEB/Translate/i18n/core/ban.json
index cff8b491..4401d7f1 100644
--- a/MLEB/Translate/i18n/core/ban.json
+++ b/MLEB/Translate/i18n/core/ban.json
@@ -2,10 +2,12 @@
"@metadata": {
"authors": [
"Carma citrawati",
+ "Chinamoonroll",
"NoiX180"
]
},
"translate-taction-proofread": "Turéksa",
+ "translate-taction-lstats": "Statistik basa",
"translate-page-language": "Basa",
"translate-page-showing-all": "Ngédéngang $1 {{PLURAL:$1|séwala}}.",
"translate-next": "Kaca salanturnyané",
@@ -17,5 +19,7 @@
"translate-stats-reviews": "Turéksan",
"translate-stats-reviewers": "Sang nuréksa",
"translate-translations-fieldset-title": "Séwala",
+ "languagestats": "Statistik basa",
+ "languagestats-summary": "Kaca puniki nyinahang statistik panyalinan antuk sinamian seka séwala ring satunggil basa katentu.",
"translate-documentation-language": "Dokuméntasi séwala"
}
diff --git a/MLEB/Translate/i18n/core/bar.json b/MLEB/Translate/i18n/core/bar.json
index bf1e1384..13577d66 100644
--- a/MLEB/Translate/i18n/core/bar.json
+++ b/MLEB/Translate/i18n/core/bar.json
@@ -18,7 +18,6 @@
"translate-page-limit": "Limit",
"translate-submit": "Hoin",
"translate-edit-information": "Informazión zur da Systémnoochricht ($1)",
- "translate-edit-in-other-languages": "Systémnoochricht auf åndre Sproochen",
"translationstats": "Staatistiken zua d' Ywersétzungen",
"translate-sidebar-alltrans": "Auf åndre Sproochen",
"translations": "Olle Ywersetzungen",
@@ -26,8 +25,6 @@
"translate-langstats-expandall": "olle auskloppm",
"translate-language": "Sprooch",
"supportedlanguages-recenttranslations": "Aktuelle Ywersétzungen",
- "translate-js-history": "Ywersétzungsgschicht",
- "translate-js-support": "A Frog stön",
"translate-searchprofile": "Ywersétzungen",
"translate-searchprofile-tooltip": "Suach in Iwasetzunga",
"tux-editor-expand-tooltip": "Auskloppn",
diff --git a/MLEB/Translate/i18n/core/bci.json b/MLEB/Translate/i18n/core/bci.json
new file mode 100644
index 00000000..82b4cb56
--- /dev/null
+++ b/MLEB/Translate/i18n/core/bci.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kjeanclaude"
+ ]
+ },
+ "translate-documentation-language": "Ndè i sou floua"
+}
diff --git a/MLEB/Translate/i18n/core/be-tarask.json b/MLEB/Translate/i18n/core/be-tarask.json
index bcd7c60d..c0c29215 100644
--- a/MLEB/Translate/i18n/core/be-tarask.json
+++ b/MLEB/Translate/i18n/core/be-tarask.json
@@ -45,11 +45,9 @@
"translate-ignored": "(ігнараванае)",
"translate-edit-title": "Рэдагаваньне «$1»",
"translate-edit-definition": "Тэкст паведамленьня",
- "translate-edit-translation": "Пераклад",
"translate-edit-contribute": "рэдагаваць",
"translate-edit-no-information": "<em>Гэтае паведамленьне ня мае дакумэнтацыі.\nКалі Вы ведаеце, дзе ці як выкарыстоўваецца гэтае паведамленьне, то Вы можаце дапамагчы іншым перакладчыкам, дадаўшы дакумэнтацыю да гэтага паведамленьня.</em>",
"translate-edit-information": "Інфармацыя пра паведамленьне ($1)",
- "translate-edit-in-other-languages": "Паведамленьне на іншых мовах",
"translate-edit-warnings": "Папярэджаньне аб няпоўных перакладах",
"translate-edit-tmmatch-source": "Тэкст крыніцы перакладу: $1",
"translate-edit-tmmatch": "$1% супадзеньне",
@@ -168,7 +166,6 @@
"supportedlanguages-recenttranslations": "апошнія пераклады",
"supportedlanguages-count": "$1 {{PLURAL:$1|мова|мовы|моваў}} агулам.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}, апошняе — $3 {{PLURAL:$3|дзень|дні|дзён}} таму",
- "translate-save": "Апублікаваць ($1)",
"translate-jssti-add": "Дадаць у сьпіс",
"managemessagegroups": "Кіраваньне групамі паведамленьняў",
"translate-smg-notallowed": "Вам не дазволена выканаць гэтае дзеяньне.",
@@ -203,13 +200,6 @@
"translate-import-err-no-such-file": "Файл <nowiki>$1</nowiki> не існуе альбо не загружаны лякальна.",
"translate-import-err-stale-group": "Група паведамленьняў, да якой належыць гэты файл, не існуе.",
"translate-import-err-no-headers": "Файл не зьяўляецца слушным файлам Gettext у фармаце пашырэньня Translate:\nНемагчыма вызначыць групу і мову з загалоўку файла.",
- "translate-js-summary": "Апісаньне:",
- "translate-js-save": "Апублікаваць",
- "translate-js-next": "Апублікаваць і адкрыць наступнае",
- "translate-js-skip": "Адкрыць наступнае",
- "translate-js-history": "Гісторыя перакладу",
- "translate-js-support": "Задаць пытаньне",
- "translate-js-support-title": "Можаце задаць пытаньне, калі Вам бракуе інфармацыі пра кантэкст паведамленьня.",
"translate-js-support-unsaved-warning": "Вы маеце неапублікаваныя пераклады.",
"translate-gs-pos": "Пазыцыя",
"translate-gs-code": "Код",
diff --git a/MLEB/Translate/i18n/core/be.json b/MLEB/Translate/i18n/core/be.json
index e3b11c23..6f82477a 100644
--- a/MLEB/Translate/i18n/core/be.json
+++ b/MLEB/Translate/i18n/core/be.json
@@ -45,11 +45,9 @@
"translate-ignored": "(ігнаруемае)",
"translate-edit-title": "Правіць «$1»",
"translate-edit-definition": "Фармулёўка паведамлення",
- "translate-edit-translation": "Пераклад",
"translate-edit-contribute": "правіць",
"translate-edit-no-information": "<em>Гэта паведамленне не мае апісання. Калі вы ведаеце, дзе ці як гэта паведамленне выкарыстоўваецца, то можаце дапамагчы іншым перакладчыкам, дадаўшы да яго апісанне.</em>",
"translate-edit-information": "Інфармацыя пра паведамленне ($1)",
- "translate-edit-in-other-languages": "Паведамленне на іншых мовах",
"translate-edit-warnings": "Папярэджанні пра няпоўныя пераклады",
"translate-edit-tmmatch-source": "Тэкст зыходнага паведамлення для перакладу: $1",
"translate-edit-tmmatch": "$1% адпаведнасць",
@@ -122,12 +120,10 @@
"translate-total": "Паведамленні",
"translate-untranslated": "Неперакладзеныя",
"translate-mgs-column-language": "Мова",
- "supportedlanguages": "Падтрымліваюцца мовы",
- "supportedlanguages-summary": "На гэтай старонцы прыведзены спіс падтрымоўваных праектам {{SITENAME}} моў\nразам з імёнамі тых, хто тут працуе над перакладамі на гэтыя мовы.\nІмя перакладчыка адлюстроўваецца тым буйней, чым больш правак ён зрабіў.\nПа колер падкрэслення можна зразумець, наколькі даўно перакладчык апошні раз здзяйсняў тут якое-небудзь дзеянне.",
+ "supportedlanguages": "Падтрымваныя мовы",
+ "supportedlanguages-summary": "На старонцы паказаны спіс падтрымваных праектам {{SITENAME}} моў\nразам з імёнамі тых, хто тут працуе над перакладамі на гэтыя мовы.\nІмя перакладчыка адлюстроўваецца тым буйней, чым болей правак ён зрабіў.\nКолер падкрэслення дае зразумець як даўно перакладчык здзяйсняў тут што-небудзь.",
"supportedlanguages-count": "Усяго $1 {{PLURAL:$1|мова|мовы|моў}}.",
"abusefilter-edit-builder-vars-translate-source-text": "Зыходны тэкст элемента перакладу",
- "translate-js-support": "Задаць пытанне",
- "translate-js-support-title": "Звярніцеся за дапамогай, калі не хапае інфармацыі для правільнага перакладу гэтага паведамлення.",
"translate-documentation-language": "Дакументацыя паведамлення",
"translate-searchprofile": "Пераклады",
"translate-searchprofile-tooltip": "Шукаць ва ўсіх перакладах",
diff --git a/MLEB/Translate/i18n/core/bg.json b/MLEB/Translate/i18n/core/bg.json
index 51dc869e..cd0b7972 100644
--- a/MLEB/Translate/i18n/core/bg.json
+++ b/MLEB/Translate/i18n/core/bg.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"DCLXVI",
+ "Kareyac",
"ShockD",
"Spiritia",
"StanProg",
@@ -46,11 +47,9 @@
"translate-ignored": "(пренебрегнато)",
"translate-edit-title": "Редактиране на „$1“",
"translate-edit-definition": "Дефиниция на съобщението",
- "translate-edit-translation": "Превод",
"translate-edit-contribute": "принос",
"translate-edit-no-information": "<em>За това съобщение няма документация.\nАко знаете къде и как се използва, можете да помогнете на останалите преводачи, като добавите документация за съобщението.</em>",
"translate-edit-information": "Информация за съобщението ($1)",
- "translate-edit-in-other-languages": "Съобщението на други езици",
"translate-edit-warnings": "Предупреждения за непълни преводи",
"translate-edit-tmmatch-source": "Изходен текст за превода: $1",
"translate-edit-tmmatch": "$1% съвпадение",
@@ -169,7 +168,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|език|езици}} общо.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|редакция|редакции}} - последната преди $3 {{PLURAL:$3|ден|дни}}",
"abusefilter-edit-builder-vars-translate-source-text": "Изходен текст на преводната единица",
- "translate-save": "Публикуване ($1)",
"translate-jssti-add": "Добавяне към списъка",
"managemessagegroups": "Управление на групи съобщения",
"translate-smg-notallowed": "Не ви е позволено да извършите това действие.",
@@ -177,6 +175,7 @@
"translate-smg-submit": "Изпращане на промени за обработка",
"translate-smg-left": "Съдържание на съобщението в уикито",
"translate-smg-right": "Предстоящи промени",
+ "translate-smg-strong-sync-help": "Помощ",
"translate-manage-import-diff": "Съобщение $1 | Действия: $2",
"translate-manage-import-new": "Ново съобщение $1",
"translate-manage-import-deleted": "Изтрито съобщение $1",
@@ -196,12 +195,6 @@
"translate-import-err-invalid-title": "Посоченото име на файла <nowiki>$1</nowiki> е невалидно.",
"translate-import-err-no-such-file": "Файлът <nowiki>$1</nowiki> не съществува или не е бил качен локално.",
"translate-import-err-stale-group": "Файлът принадлежи на несъществуваща група съобщения.",
- "translate-js-summary": "Резюме:",
- "translate-js-save": "Публикуване",
- "translate-js-next": "Публикуване и отваряне на следващото",
- "translate-js-skip": "Направо към следващото",
- "translate-js-history": "История на превода",
- "translate-js-support": "Задаване на въпрос",
"translate-js-support-unsaved-warning": "Имате непубликувани преводи.",
"translate-gs-pos": "Място",
"translate-gs-code": "Код",
diff --git a/MLEB/Translate/i18n/core/bgn.json b/MLEB/Translate/i18n/core/bgn.json
index 2674ddfe..b6c21054 100644
--- a/MLEB/Translate/i18n/core/bgn.json
+++ b/MLEB/Translate/i18n/core/bgn.json
@@ -5,7 +5,6 @@
"Ibrahim khashrowdi"
]
},
- "translate-edit-in-other-languages": "ای پیام به دیگه زباناني تا",
"translate-sidebar-alltrans": "بِه دیگه زباناني تا",
"translate-documentation-language": "پیامی مستندان",
"translate-msggroupselector-search-all": "موچین",
diff --git a/MLEB/Translate/i18n/core/bho.json b/MLEB/Translate/i18n/core/bho.json
index 97e94f01..9ff93f97 100644
--- a/MLEB/Translate/i18n/core/bho.json
+++ b/MLEB/Translate/i18n/core/bho.json
@@ -34,9 +34,7 @@
"translate-page-description-legend": "ई समूह के बारे मे जानकारी",
"translate-page-edit": "सम्पादन करीं",
"translate-edit-definition": "संदेश परिभाषा",
- "translate-edit-translation": "अनुवाद",
"translate-edit-contribute": "योगदान करीं",
- "translate-edit-in-other-languages": "अन्य भाषा मे संदेश",
"translate-edit-tmmatch": "$1% मिलान",
"translate-use-suggestion": "ई सुझाव के संग ई अनुवाद के बदलीं",
"translate-edit-askpermission": "अनुमती खातिर अनुरोध करीं",
diff --git a/MLEB/Translate/i18n/core/bn.json b/MLEB/Translate/i18n/core/bn.json
index 0f875b73..ba9d74a1 100644
--- a/MLEB/Translate/i18n/core/bn.json
+++ b/MLEB/Translate/i18n/core/bn.json
@@ -7,6 +7,7 @@
"Bellayet",
"Gahori",
"Leemon2010",
+ "R4356th",
"Tauhid16",
"Zaheen",
"আজিজ",
@@ -15,6 +16,7 @@
},
"translate": "অনুবাদ",
"translate-extensionname": "অনুবাদ",
+ "translate-desc": "মিডিয়াউইকি এবং এর বাইরের অনুবাদের জন্য [[Special:Translate|বিশেষ পাতা]]",
"translate-taskui-export-to-file": "স্থানীয় ফরম্যাটে আমদানী করুন।",
"translate-taskui-export-as-po": "অফলাইন অনুবাদের জন্য আমদানী করুন",
"translate-taction-translate": "অনুবাদ",
@@ -34,8 +36,8 @@
"translate-page-limit-option": "পাতা প্রতি $1টি {{PLURAL:$1|বার্তা}}",
"translate-submit": "বের করো",
"translate-page-navigation-legend": "পরিভ্রমণ",
- "translate-page-showing": "$3 বার্তার মধ্যে $1 থেকে $2 বার্তা দেখান।",
- "translate-page-showing-all": "$1টি {{PLURAL:$1|বার্তা}} দেখাচ্ছে।",
+ "translate-page-showing": "$3টি বার্তার মধ্যে $1 থেকে $2টি বার্তা দেখানো হচ্ছে।",
+ "translate-page-showing-all": "$1টি {{PLURAL:$1|বার্তা}} দেখানো হচ্ছে।",
"translate-page-showing-none": "প্রদর্শনের জন্য কোন বার্তা নাই।",
"translate-next": "পরবর্তী পাতা",
"translate-prev": "পূর্ববর্তী পাতা",
@@ -46,11 +48,9 @@
"translate-ignored": "(উপেক্ষিত)",
"translate-edit-title": "\"$1\" সম্পাদনা করুন",
"translate-edit-definition": "বার্তার সংজ্ঞা",
- "translate-edit-translation": "অনুবাদ",
"translate-edit-contribute": "অবদান",
"translate-edit-no-information": "<em>এই বার্তাটির কোন নথি নেই।\nআপনি যদি জানেন এই বার্তাটি কোথায় বা কিভাবে ব্যবহার করা হয়েছে, আপনি এই বার্তায় নথি যোগ করে অন্যান্য অনুবাদকদের সাহায্য করতে পারেন।</em>",
"translate-edit-information": "বার্তা সম্পর্কে তথ্য ($1)",
- "translate-edit-in-other-languages": "অন্যান্য ভাষায় বার্তা",
"translate-edit-warnings": "অসম্পূর্ণ অনুবাদের ওপর সতর্কবার্তা",
"translate-edit-tmmatch-source": "অনুবাদের জন্য উৎস পাঠ্য: $1",
"translate-edit-tmmatch": "{{formatnum:$1}}% মিল রয়েছে",
@@ -119,6 +119,7 @@
"translate-tag-page-desc": "$3 ($4) থেকে [[$2|$1]] উইকি পাতার অনুবাদ।",
"translate-sidebar-alltrans": "অন্যান্য ভাষায়",
"translations": "সমস্ত অনুবাদ",
+ "translations-summary": "সমস্ত উপলব্ধ অনুবাদ দেখার জন্য নিচে একটি বার্তার নাম লিখুন।",
"translate-translations-no-message": "\"$1\" অনুবাদযোগ্য বার্তা নয়",
"translate-translations-none": "\"$1\"-এর জন্য কোন অনুবাদ নেই",
"translate-translations-count": "{{PLURAL:$1|একটি অনুবাদ|$1টি অনুবাদ}} পাওয়া গেছে।",
@@ -165,13 +166,19 @@
"supportedlanguages-count": "সর্বমোট $1টি {{PLURAL:$1|ভাষায়}}।",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|টি সম্পাদনা}} - সর্বশেষ সম্পাদনা $3 {{PLURAL:$3|দিন}} আগে",
"abusefilter-edit-builder-vars-translate-source-text": "অনুবাদ ইউনিটের উৎস পাঠ্য",
- "translate-save": "প্রকাশ করুন ($1)",
"translate-jssti-add": "তালিকায় যোগ করো",
"managemessagegroups": "বার্তা দল ব্যবস্থাপনা",
"translate-smg-notallowed": "আপনাকে এই কর্ম সঞ্চালনের অনুমতি দেওয়া হয়নি।",
"translate-smg-rename-select": "নির্বাচন করুন",
"translate-smg-rename-cancel": "বাতিল",
"translate-smg-rename-no-msg": "কোন বার্তা পাওয়া যায়নি।",
+ "translate-smg-strong-sync-help": "সাহায্য",
+ "translate-smg-group-message-action-history": "ইতিহাস",
+ "translate-smg-group-message-tag-outdated": "পুরাতন",
+ "translate-smg-group-message-tag-rename": "নামান্তর",
+ "translate-smg-group-message-message-content": "বিষয়বস্তু:",
+ "translate-smg-group-message-message-target": "লক্ষ্য:",
+ "translate-smg-group-message-message-other-langs": "অন্যান্য ভাষাসমূহ:",
"translate-manage-import-diff": "$1 বার্তা | কর্ম: $2",
"translate-manage-import-new": "নতুন বার্তা $1",
"translate-manage-import-deleted": "অপসারিত বার্তা $1",
@@ -186,12 +193,6 @@
"translate-import-from-local": "স্থানীয় পাতা আপলোড:",
"translate-import-load": "ফাইল লোড কর",
"translate-import-err-ul-failed": "ফাইল আপলোড ব্যর্থ হয়েছে",
- "translate-js-summary": "সারাংশ:",
- "translate-js-save": "প্রকাশ করুন",
- "translate-js-next": "প্রকাশ করুন ও পরবর্তী খুলুন",
- "translate-js-skip": "বাতিল ও পরবর্তী",
- "translate-js-history": "অনুবাদ ইতিহাস",
- "translate-js-support": "প্রশ্ন জিজ্ঞাসা করুন",
"translate-js-support-unsaved-warning": "আপনার অপ্রকাশিত অনুবাদ রয়েছে।",
"translate-gs-pos": "নং",
"translate-gs-code": "কোড",
@@ -302,7 +303,7 @@
"tux-editor-message-tools-show-editor": "উইকি সম্পাদকে দেখান",
"tux-editor-message-tools-history": "ইতিহাস",
"tux-editor-message-tools-delete": "অপসারণ",
- "tux-editor-message-tools-translations": "সমস্ত অনুবাদসমূহ",
+ "tux-editor-message-tools-translations": "সমস্ত অনুবাদ",
"tux-editor-message-tools-linktothis": "এই বার্তায় সংযোগ",
"tux-editor-loading": "লোড করা হচ্ছে...",
"tux-editor-loading-failed": "অনুবাদ সহায়তাগুলি লোড করা ব্যর্থ হয়েছে: $1",
diff --git a/MLEB/Translate/i18n/core/br.json b/MLEB/Translate/i18n/core/br.json
index 01eda1d4..d7b783b5 100644
--- a/MLEB/Translate/i18n/core/br.json
+++ b/MLEB/Translate/i18n/core/br.json
@@ -44,11 +44,9 @@
"translate-ignored": "(laosket a-gostez)",
"translate-edit-title": "Kemmañ \"$1\"",
"translate-edit-definition": "Termenadur ar gemennadenn",
- "translate-edit-translation": "Troidigezh",
"translate-edit-contribute": "kemer perzh",
"translate-edit-no-information": "''N'eus tamm titour ebet diwar-benn ar gemennadenn-mañ. Ma ouzit pelec'h pe benaos emañ da vezañ implijet e c'hallit harpañ troourien all en ur ouzhpennañ titouroù diwar he fenn.''",
"translate-edit-information": "Titouroù diwar-benn ar gemennadenn ($1)",
- "translate-edit-in-other-languages": "An hevelep kemennadenn e yezhoù all",
"translate-edit-warnings": "Kemennoù-diwall diwar-benn an troidigezhioù diglok",
"translate-edit-tmmatch-source": "Testenn orin da dreiñ : $1",
"translate-edit-tmmatch": "$1% kenglotañ",
@@ -176,7 +174,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|yezh|yezh}} en holl.",
"supportedlanguages-activity": "$1 : $2 {{PLURAL:$2|c'hemm|kemm}} - kemm diwezhañ $3 {{PLURAL:$3|devezh|devezh}} zo",
"translate-supportedlanguages-cached": "Krubuilhet eo bet an titouroù-mañ $1 zo.",
- "translate-save": "Enrollañ ($1)",
"translate-jssti-add": "Ouzhpennañ d'ar roll",
"managemessagegroups": "Merañ ar strollad kemennadennoù",
"translate-smg-notallowed": "N'oc'h ket aotreet da gas an oberiadenn-mañ da benn.",
@@ -212,13 +209,6 @@
"translate-import-err-no-such-file": "N'eus ket eus ar restr <nowiki>$1</nowiki> pe neuze n'eo ket bet enporzhiet ent lec'hel.",
"translate-import-err-stale-group": "Ar restr-mañ zo en ur strollad kemennadennoù n'eus ket anezhañ.",
"translate-import-err-no-headers": "N'eo ket ar restr ur restr ''Gettext'' stummet mat er furmad gortozet gant an astenn ''Translate'' :\nDibosupl eo didermeniñ ar strollad hag ar yezh adalek talbennoù ar restr.",
- "translate-js-summary": "Diverrañ :",
- "translate-js-save": "Enrollañ",
- "translate-js-next": "Enrollañ ha digeriñ an hini da-heul",
- "translate-js-skip": "Mont d'an hini da-heul",
- "translate-js-history": "Istor an droidigezh",
- "translate-js-support": "Sevel ur goulenn",
- "translate-js-support-title": "Goulennit un tamm skoazell ma vank titouroù evit treiñ ar gemennadenn-mañ evel m'eo dleet.",
"translate-js-support-unsaved-warning": "Chom a ra troidigezhioù n'int ket bet enrollet ganeoc'h.",
"translate-gs-pos": "Lec'h.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/bs.json b/MLEB/Translate/i18n/core/bs.json
index 2eef23e9..7c26a6f2 100644
--- a/MLEB/Translate/i18n/core/bs.json
+++ b/MLEB/Translate/i18n/core/bs.json
@@ -46,11 +46,9 @@
"translate-ignored": "(zanemareno)",
"translate-edit-title": "Uređivanje \"$1\"",
"translate-edit-definition": "Definicija poruke",
- "translate-edit-translation": "Prijevod",
"translate-edit-contribute": "doprinesi",
"translate-edit-no-information": "<em>Ova poruka nema pripadajuće dokumentacije.\nAko znate gdje ili kako se ova poruka koristi, možete pomoći drugim prevodiocima tako što ćete dodati dokumentaciju za ovu poruku.</em>",
"translate-edit-information": "Informacije o poruci ($1)",
- "translate-edit-in-other-languages": "Poruka na ostalim jezicima",
"translate-edit-warnings": "Upozorenja o nepotpunim prijevodima",
"translate-edit-tmmatch-source": "Izvorni tekst: $1",
"translate-edit-tmmatch": "$1% slaganja",
@@ -173,7 +171,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|jezik|jezika}} ukupno.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|izmjena|izmjene}} - posljednja izmjena prije $3 {{PLURAL:$3|dan|dana}}",
"abusefilter-edit-builder-vars-translate-source-text": "Izvorni tekst prevodilačke jedinice",
- "translate-save": "Spremi ($1)",
"translate-jssti-add": "Dodaj na spisak",
"managemessagegroups": "Upravljanje grupama poruka",
"translate-smg-notallowed": "Nije Vam dozvoljeno da izvršite ovu radnju.",
@@ -209,13 +206,6 @@
"translate-import-err-no-such-file": "Datoteka <nowiki>$1</nowiki> ne postoji ili nije postavljena lokalno.",
"translate-import-err-stale-group": "Grupa poruka kojoj ova datoteka pripada ne postoji.",
"translate-import-err-no-headers": "Datoteka nije dobro formiran Gettext datoteka u formatu proširenja Translate:\nNe mogu da odredim grupu i jezik iz zaglavlja datoteke.",
- "translate-js-summary": "Sažetak:",
- "translate-js-save": "Sačuvaj",
- "translate-js-next": "Spremi i idi na sljedeću",
- "translate-js-skip": "Pređi na sljedeću poruku",
- "translate-js-history": "Historija prijevoda",
- "translate-js-support": "Postavi pitanje",
- "translate-js-support-title": "Traži pomoć ako nema dovoljno informacija za pravilan prevod ove poruke.",
"translate-js-support-unsaved-warning": "Imate nesačuvanih prijevoda.",
"translate-gs-pos": "Mj.",
"translate-gs-code": "Kôd",
diff --git a/MLEB/Translate/i18n/core/ca.json b/MLEB/Translate/i18n/core/ca.json
index d1c52011..fc707d42 100644
--- a/MLEB/Translate/i18n/core/ca.json
+++ b/MLEB/Translate/i18n/core/ca.json
@@ -8,6 +8,7 @@
"Jmarchn",
"Jordi Roqué",
"Macofe",
+ "Mguix",
"Paucabot",
"Pginer",
"QuimGil",
@@ -55,11 +56,9 @@
"translate-ignored": "(ignorat)",
"translate-edit-title": "Edita «$1»",
"translate-edit-definition": "Definició del missatge",
- "translate-edit-translation": "Traducció",
"translate-edit-contribute": "contribuïu-hi",
"translate-edit-no-information": "<em>Aquest missatge no té documentació.\nSi sabeu on o com és usat aquest missatge podeu ajudar la resta de traductors afegint-hi la documentació.</em>",
"translate-edit-information": "Informació sobre el missatge ($1)",
- "translate-edit-in-other-languages": "El missatge en altres idiomes",
"translate-edit-warnings": "Avisos de traducció incompleta",
"translate-edit-tmmatch-source": "Text original de la traducció: $1",
"translate-edit-tmmatch": "coincidència del $1%",
@@ -120,7 +119,7 @@
"translate-statsf-intro": "Podeu generar estadístiques simples amb aquest formulari. Tots els valors tenen límit superior i inferior.",
"translate-statsf-options": "Opcions del gràfic",
"translate-statsf-width": "Amplada en píxels:",
- "translate-statsf-height": "Alçada en píxels:",
+ "translate-statsf-height": "Alçària en píxels:",
"translate-statsf-days": "Data d'inici:",
"translate-statsf-start": "Data d'inici:",
"translate-statsf-scale": "Granulació:",
@@ -191,7 +190,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|idioma|idiomes}} en total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|modificació|modificacions}}, la darrera va ser fa $3 {{PLURAL:$3|dia|dies}}",
"abusefilter-edit-builder-vars-translate-source-text": "Text font de la unitat de traducció",
- "translate-save": "Desa ($1)",
"translate-jssti-add": "Afegeix a la llista",
"managemessagegroups": "Gestió del grup de missatges",
"translate-smg-notallowed": "No teniu permís per dur a terme aquesta acció.",
@@ -240,13 +238,6 @@
"translate-import-err-no-such-file": "El fitxer <nowiki>$1</nowiki>no existeix o no s'ha carregat localment.",
"translate-import-err-stale-group": "El grup de missatges al qual aquest fitxer pertany no existeix.",
"translate-import-err-no-headers": "Aquest no és un fitxer Gettext ben formatat en el format d’extensió del Translate:\n\nNo s’ha pogut determinar el grup de missatges i l’idioma des dels encapçalaments.",
- "translate-js-summary": "Resum:",
- "translate-js-save": "Desa",
- "translate-js-next": "Desa i passa al següent",
- "translate-js-skip": "Salta al següent",
- "translate-js-history": "Historial de traducció",
- "translate-js-support": "Feu una pregunta",
- "translate-js-support-title": "Demaneu ajuda si trobeu que no hi ha prou informació per a traduir correctament aquest missatge.",
"translate-js-support-unsaved-warning": "Teniu traduccions no guardades.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Codi",
@@ -299,14 +290,14 @@
"tux-status-fuzzy": "Desfasat",
"tux-status-proofread": "Revisat",
"tux-status-translated": "Traduït",
- "tux-status-saving": "S’està desant…",
- "tux-status-unsaved": "No desat",
+ "tux-status-saving": "Publicant…",
+ "tux-status-unsaved": "No publicat",
"tux-save-unknown-error": "S'ha produït un error desconegut.",
"tux-editor-placeholder": "La vostra traducció",
"tux-editor-editsummary-placeholder": "Resum opcional",
"tux-editor-paste-original-button-label": "Enganxa el text original",
"tux-editor-discard-changes-button-label": "Descarta els canvis",
- "tux-editor-save-button-label": "Desa la traducció",
+ "tux-editor-save-button-label": "Publica la traducció",
"tux-editor-skip-button-label": "Vés al següent",
"tux-editor-cancel-button-label": "Cancel·la",
"tux-editor-confirm-button-label": "Confirma la traducció",
@@ -321,7 +312,7 @@
"tux-editor-tm-match": "coincidència del $1%",
"tux-notices-more": "{{PLURAL:$1|$1 més}}",
"tux-notices-hide": "amaga",
- "tux-editor-save-failed": "Error en desar la traducció : $1",
+ "tux-editor-save-failed": "Error en publicar la traducció : $1",
"tux-editor-n-uses": "utilitzat $1 {{PLURAL:$1|vegada|vegades}}",
"tux-editor-message-desc-more": "Mostra'n més",
"tux-editor-message-desc-less": "Mostra'n menys",
@@ -336,7 +327,7 @@
"tux-editor-outdated-notice": "Aquesta traducció potser necessita ser actualitzada.",
"tux-editor-outdated-notice-diff-link": "Mostra les diferències",
"tux-editor-doc-editor-placeholder": "Documetació del missatge",
- "tux-editor-doc-editor-save": "Guarda la documentació",
+ "tux-editor-doc-editor-save": "Publica la documentació",
"tux-editor-doc-editor-cancel": "Cancel·la",
"tux-messagetable-more-messages": "$1 {{PLURAL:$1|missatge|missatges}} més",
"tux-messagetable-loading-messages": "{{PLURAL:$1|S’està carregant el missatge|S’estan carregant els missatges}}…",
diff --git a/MLEB/Translate/i18n/core/ce.json b/MLEB/Translate/i18n/core/ce.json
index 009d9af2..dfc8b6fb 100644
--- a/MLEB/Translate/i18n/core/ce.json
+++ b/MLEB/Translate/i18n/core/ce.json
@@ -7,6 +7,7 @@
]
},
"translate": "Гоч",
+ "translate-extensionname": "Гочъян",
"translate-desc": "[[Special:Translate|Белхан агӀо]] MediaWiki гочян а, кхин программийн а",
"translate-taskui-export-to-file": "Шин форматехь экспорт",
"translate-taskui-export-as-po": "Оффлайн гочдаран экспорт",
@@ -30,6 +31,7 @@
"translate-page-showing": "Гайтина хаамаш $1 тӀера $2 кхаччалц ($3 чура).",
"translate-page-showing-all": "Ара баьккхина $1 {{PLURAL:$1|хаам}}.",
"translate-page-showing-none": "Гайта хаамаш бац.",
+ "translate-page-paging-links": "[ $1 ] [ $2 ]",
"translate-next": "рогӀера агӀо",
"translate-prev": "хьалхара агӀо",
"translate-page-description-legend": "Тобанах хаам",
@@ -39,13 +41,13 @@
"translate-ignored": "(игнорирян)",
"translate-edit-title": "Хийца «$1»",
"translate-edit-definition": "Хаам кепе балор",
- "translate-edit-translation": "Гоч",
"translate-edit-contribute": "нисъе",
"translate-edit-information": "Хаамах лаьцна ($1)",
- "translate-edit-in-other-languages": "Хаам кхечу меттанашкахь",
"translate-edit-warnings": "ДӀахаийтар кхочуш гоч йин ца хилар",
"translate-edit-tmmatch": "$1% цхьаьнадогӀуш",
"translate-edit-askpermission": "Бакъо яккха",
+ "exporttranslations": "Гочдарийн экспорт",
+ "translate-export-form-format": "Формат",
"translate-checks-parameters": "{{PLURAL:$2|1=Параметр лелош яц|Параметраш лелош яц}}:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|1=Евзаш йоцу параметр|Евзаш йоцу параметраш}}:\n<strong>$1</strong>",
"translate-checks-balance": "Елла а, дӀакъовла а {{PLURAL:$2|къовларш}} нийса яц:\n<strong><nowiki>$1</nowiki></strong>",
@@ -55,25 +57,32 @@
"translate-checks-plural-dupe": "МогӀан юьхьигехь <nowiki>{{PLURAL:}}</nowiki> цхьатерра шиъ дош ду, <nowiki>{{PLURAL:$1|пальто|пальто}} меттан</nowiki> <nowiki>{{PLURAL:$1|пальто}} яздича дика ду</nowiki>.",
"translate-pref-editassistlang": "ГӀоьнан меттанаш:",
"prefs-translate": "Гочдаран нисдар",
+ "right-translate-manage": "Хаамийн тобанийн урхалладар",
"action-translate-manage": "хаамийн тобанийн урхалладар",
"translate-rcfilters-translations": "Гочдарш",
"translate-rcfilters-translations-only-label": "Гочдарш",
+ "translate-rcfilters-translations-filter-label": "Гочдарш дац",
+ "translate-rcfilters-translations-filter-desc": "Гочдарш доцу, массо хийцамаш.",
+ "translate-rcfilters-translations-site-label": "Сайтан хаам",
+ "translate-rcfilters-translations-site-desc": "Сайтан хаамийн кастомизаци MediaWiki цӀерийн меттигехь.",
"translate-rc-translation-filter": "Литта гочдарш:",
"translate-rc-translation-filter-no": "Доза доцуш",
"translate-rc-translation-filter-only": "Гочдарш бен ма гайта",
"translate-rc-translation-filter-filter": "Къайладаха гочдарш",
- "translate-rc-translation-filter-site": "Сайтан системан хаамаш бен",
+ "translate-rc-translation-filter-site": "Сайтан системин хаамаш бен",
"translationstats": "Гочдаран статистика",
"translate-stats-edits": "Нисдарш",
"translate-stats-users": "Гочдархой",
"translate-stats-registrations": "ДӀаязбалар",
"translate-stats-reviews": "Талларш",
"translate-stats-reviewers": "Рецензенташ",
+ "translate-statsf-intro": "ХӀокху кепо шуна гӀо-дира ду бӀегӀийла график кхолла. Массо маьӀана кхолла мега лакхара а, лахара а доза.",
"translate-statsf-options": "Графика нисяр",
"translate-statsf-width": "Пикселшках шоралла:",
"translate-statsf-height": "Локхалла пикселшкахь:",
"translate-statsf-days": "Хан деношкахь:",
"translate-statsf-start": "ДӀадолалун терахь:",
+ "translate-statsf-scale": "Детализацин барам:",
"translate-statsf-scale-months": "Беттанаш",
"translate-statsf-scale-weeks": "КӀиранаш",
"translate-statsf-scale-days": "Денош",
@@ -111,9 +120,10 @@
"translate-ls-noempty": "Ма гайта юьззина гочянза хаамийн тобанаш",
"translate-language": "Мотт",
"translate-total": "Хаам",
- "translate-untranslated": "Гочянза",
+ "translate-untranslated": "Гочянзарш",
"translate-percentage-complete": "Кхочушдина",
- "translate-percentage-fuzzy": "Ширъелла",
+ "translate-percentage-fuzzy": "Ширъелларш",
+ "translate-percentage-proofread": "Теллинарш",
"translate-languagestats-overall": "Массо тобанийн чура хаамаш",
"translate-ls-submit": "Гайта статистика",
"translate-ls-column-group": "Хаамийн тоба",
@@ -127,19 +137,29 @@
"translate-mgs-totals": "Берриге меттанаш",
"translate-mgs-nothing": "Гучубаха хаамаш бац.",
"supportedlanguages": "Ловш долу меттанаш",
+ "supportedlanguages-portallink": "[$1] $2 — $3",
+ "supportedlanguages-portallink-nocldr": "[$1] $2",
+ "supportedlanguages-sqlite-error": "SQLite ловш яц",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Гочдархо}}|Гочдархой}}: $1",
"supportedlanguages-recenttranslations": "дукха хан йоццуш гоч динарш",
"supportedlanguages-count": "Бериг $1 {{PLURAL:$1|мотт}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|нисдар}} — тӀаьххьара нисдар $3 {{PLURAL:$3|де}} хьалха",
- "translate-save": "Ӏалашдан ($1)",
"translate-jssti-add": "ТӀетоха могӀан чу",
"managemessagegroups": "Хаамийн тобанийн урхалладар",
"translate-smg-notallowed": "Дешдерг дан хьона цало.",
"translate-smg-nochanges": "Кечбан хийцамаш бац.",
"translate-smg-submit": "ДӀабахьийта хийцамаш кечбан",
+ "translate-smg-left": "Викин хааман чулацам",
+ "translate-smg-rename-select": "Харжа",
+ "translate-smg-rename-cancel": "Юхаяккха",
+ "translate-smg-rename-no-msg": "Хаамаш цакарий.",
+ "translate-smg-rename-new": "ТӀетоха керланиг санна…",
+ "translate-smg-rename-rename": "ТӀетоха цӀе хийцинарг санна...",
+ "translate-smg-strong-sync-help": "ГӀо",
"translate-manage-import-new": "Керла хаам $1",
"translate-manage-action-import": "Импорт ян",
"translate-manage-action-ignore": "Тергал ца дан",
+ "translate-manage-action-rename": "ЦӀе хийца",
"translate-manage-submit": "Кхочушдé",
"translate-manage-import-ok": "Импортйина: $1",
"translate-manage-import-done": "Импортйина йаьлла!",
@@ -150,11 +170,6 @@
"translate-import-err-ul-failed": "Цатарло чуяккха файл",
"translate-import-err-invalid-title": "Билгалйина файлан цӀе <nowiki>$1</nowiki> нийса яц.",
"translate-import-err-no-such-file": "Файл <nowiki>$1</nowiki> яц я локалан чуяьккхина яц.",
- "translate-js-summary": "Цунах лаьцна:",
- "translate-js-save": "Ӏалашъян",
- "translate-js-next": "Ӏалашйина схьаелла рогӀераниг",
- "translate-js-history": "Гочан истори",
- "translate-js-support": "Хаттар далар",
"translate-js-support-unsaved-warning": "Ӏалашданза гочдарш ду.",
"translate-gs-pos": "Поз.",
"translate-gs-code": "Код",
@@ -172,8 +187,11 @@
"translate-search-nofilter": "Литтар доцуш",
"logentry-translationreview-group": "$1 {{GENDER:$2|хийцина}} «$3» агӀона гочдаран хьал $4 мотт «$6» → «$7»",
"group-translate-sandboxed": "ЧӀагӀбина гочдархой",
+ "translate-workflow-state-": "(яздина дац)",
+ "translate-workflowstatus": "Статус: $1",
"translate-workflow-set-doing": "ДӀахӀоттош ю...",
"translate-stats-workflow": "Статус",
+ "translate-workflowgroup-label": "Процессан статус",
"translate-dynagroup-recent-label": "Дукха хан йоццуш гоч динарш",
"translate-dynagroup-recent-desc": "ХӀокху тобан чохь гучу йолу дукха хан йоцуш гоч йина хӀокху меттан хаамаш.\n\nХӀара дӀахӀоттам пайдане бу хьажа.",
"translate-dynagroup-additions-label": "Дукху хан йоцуш тӀетоьхнарш",
@@ -217,7 +235,7 @@
"tux-editor-save-failed": "Ӏалашъян цаделира: $1",
"tux-editor-n-uses": "{{PLURAL:$1|лелина}} $1",
"tux-editor-message-desc-more": "Гайта мадарра",
- "tux-editor-message-desc-less": "Гайта компактни",
+ "tux-editor-message-desc-less": "Гайта компактан",
"tux-editor-clear-translated": "Къайлаяха гочйинарш",
"tux-editor-proofreading-mode": "Таллар",
"tux-editor-translate-mode": "МогӀа",
diff --git a/MLEB/Translate/i18n/core/ckb.json b/MLEB/Translate/i18n/core/ckb.json
index e51a3184..8e840e27 100644
--- a/MLEB/Translate/i18n/core/ckb.json
+++ b/MLEB/Translate/i18n/core/ckb.json
@@ -38,10 +38,8 @@
"translate-optional": "(دڵخوازانه‌)",
"translate-edit-title": "«$1» دەستکاری بکە",
"translate-edit-definition": "پێناسەی پەیام",
- "translate-edit-translation": "وەرگێڕان",
"translate-edit-contribute": "بەشداری بکە",
"translate-edit-information": "زانیاری سەبارت بە پەیام ($1)",
- "translate-edit-in-other-languages": "پەیام لە زمانەکانی تردا",
"translate-edit-warnings": "ئاگادارییەکان سەبارەت بە وەرگێڕانی ناتەواو",
"translate-edit-tmmatch": "$1% یەکسانی",
"translate-checks-parameters": "ئەم {{PLURAL:$2|پارامەترە بەکارنەھێنراوە|پارامەترانە بەکارنەھێنراون}} :\n<strong>$1</strong>",
@@ -101,17 +99,10 @@
"supportedlanguages-recenttranslations": "دوایین وەرگێڕانەکان",
"supportedlanguages-count": "$1 {{PLURAL:$1|زمان|زمانەکان}} بەگشتی.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|دەستکاری}} - دوایین دەستکاری $3 {{PLURAL:$3|ڕۆژ}} لەمە پێش",
- "translate-save": "بڵاویبکەرەوە ($1)",
"translate-jssti-add": "زیادکردن بۆ سەر لیست",
"translate-manage-import-diff": "پەیام $1 | کردارەکان: $2",
"translate-manage-import-new": "پەیامی نوێ $1",
"translate-manage-action-import": "هاوردن",
- "translate-js-summary": "پوختە:",
- "translate-js-save": "پاشەکەوتی بکە",
- "translate-js-next": "پاشەکەوتی بکە و دواتر بکەوە",
- "translate-js-skip": "باز ببە بۆ دواتر",
- "translate-js-history": "مێژووی وەرگێڕان",
- "translate-js-support": "پرسیار بکە",
"translate-gs-code": "کۆد",
"translate-gs-speakers": "قسەکەرەکان",
"translate-gs-total": "سەرجەم",
diff --git a/MLEB/Translate/i18n/core/cs.json b/MLEB/Translate/i18n/core/cs.json
index 9ec8f9b1..19ea3cdc 100644
--- a/MLEB/Translate/i18n/core/cs.json
+++ b/MLEB/Translate/i18n/core/cs.json
@@ -4,6 +4,7 @@
"Chmee2",
"Clon",
"Danny B.",
+ "Draceane",
"Dvorapa",
"Ilimanaq29",
"Li-sung",
@@ -52,11 +53,9 @@
"translate-ignored": "(ignorované)",
"translate-edit-title": "Editovat „$1“",
"translate-edit-definition": "Zdroj zprávy",
- "translate-edit-translation": "Překlad",
"translate-edit-contribute": "přispět",
"translate-edit-no-information": "<em>K této zprávě není dokumentace. Pokud víte, kde nebo jak se zpráva používá, můžete pomoci dalším překladatelům tím, že přidáte dokumentaci k této zprávě.</em>",
"translate-edit-information": "Informace o zprávě ($1)",
- "translate-edit-in-other-languages": "Zpráva v jiných jazycích",
"translate-edit-warnings": "Upozornění na neúplný překlad",
"translate-edit-tmmatch-source": "Zdrojový text překladu: $1",
"translate-edit-tmmatch": "$1% shoda",
@@ -162,6 +161,7 @@
"translate-untranslated": "Nepřeložené",
"translate-percentage-complete": "Dokončené",
"translate-percentage-fuzzy": "Zastaralé",
+ "translate-percentage-proofread": "Zkontrolované",
"translate-languagestats-overall": "Všechny skupiny zpráv dohromady",
"translate-ls-submit": "Zobrazit statistiky",
"translate-ls-column-group": "Skupina zpráv",
@@ -185,7 +185,6 @@
"supportedlanguages-count": "Celkem $1 {{PLURAL:$1|jazyk|jazyky|jazyků}}.",
"supportedlanguages-activity": "$1: $2 editace – poslední editace před $3 {{PLURAL:$3|dnem|dny}}",
"abusefilter-edit-builder-vars-translate-source-text": "Zdrojový text překladové jednotky",
- "translate-save": "Uložit ($1)",
"translate-jssti-add": "Přidat do seznamu",
"managemessagegroups": "Správa skupin zpráv",
"translate-smg-notallowed": "Nemáte právo provést tuto akci.",
@@ -221,13 +220,6 @@
"translate-import-err-no-such-file": "Soubor <nowiki>$1</nowiki> neexistuje nebo nebyl načten lokálně.",
"translate-import-err-stale-group": "Skupina zpráv, do které tento soubor patří, neexistuje.",
"translate-import-err-no-headers": "Soubor není platným souborem ve formátu Gettext pro rozšíření Translate:\nZ hlaviček souboru se nepodařilo skupinu zpráv a jazyk.",
- "translate-js-summary": "Shrnutí:",
- "translate-js-save": "Uložit",
- "translate-js-next": "Uložit a otevřít další",
- "translate-js-skip": "Přeskočit na další",
- "translate-js-history": "Historie překladů",
- "translate-js-support": "Položit dotaz",
- "translate-js-support-title": "Požádat o pomoc, pokud není k dispozici dostatek informací pro správný překlad této zprávy.",
"translate-js-support-unsaved-warning": "Máte neuložené překlady.",
"translate-gs-pos": "Poř.",
"translate-gs-code": "Kód",
diff --git a/MLEB/Translate/i18n/core/csb.json b/MLEB/Translate/i18n/core/csb.json
index ac4929cc..4f274394 100644
--- a/MLEB/Translate/i18n/core/csb.json
+++ b/MLEB/Translate/i18n/core/csb.json
@@ -5,7 +5,6 @@
]
},
"translate": "Dolmôczë",
- "translate-edit-in-other-languages": "Wiadło w jinych jãzëkach",
"translate-sidebar-alltrans": "W jinych jãzëkach",
"translate-documentation-language": "òpisënk wiadła"
}
diff --git a/MLEB/Translate/i18n/core/cy.json b/MLEB/Translate/i18n/core/cy.json
index 91345b55..f7d77829 100644
--- a/MLEB/Translate/i18n/core/cy.json
+++ b/MLEB/Translate/i18n/core/cy.json
@@ -40,11 +40,9 @@
"translate-ignored": "(anwybyddwyd)",
"translate-edit-title": "Golygu \"$1\"",
"translate-edit-definition": "Y neges wreiddiol",
- "translate-edit-translation": "Cyfieithiad",
"translate-edit-contribute": "cofnodi eglurhad",
"translate-edit-no-information": "<em>Nid oes unrhyw wybodaeth wedi ei chofnodi am y neges hon eto.\nOs ydych yn gwybod ymhle neu ym mha fodd y defnyddir y neges hon, gallwch hwyluso gwaith y cyfieithwyr drwy gofnodi eglurhad arni.</em>",
"translate-edit-information": "Gwybodaeth am y neges ($1)",
- "translate-edit-in-other-languages": "Y neges mewn ieithoedd eraill",
"translate-edit-warnings": "Rhybudd am gyfieithiad anghyflawn",
"translate-edit-tmmatch-source": "Y testun gwreiddiol i'w gyfieithu: $1",
"translate-edit-tmmatch": "yn cyd-fynd $1%",
@@ -145,7 +143,6 @@
"supportedlanguages-translators": "{{PLURAL:$2|Cyfieithydd|Cyfieithwyr}}: $1",
"supportedlanguages-recenttranslations": "chyfieithiadau diweddar",
"supportedlanguages-count": "Cynhelir $1 {{PLURAL:$1|iaith}} i gyd.",
- "translate-save": "Cadw ($1)",
"translate-jssti-add": "Ychwanegu at y rhestr",
"translate-manage-action-import": "Mewnforio",
"translate-manage-action-ignore": "Anwybyddu",
@@ -155,12 +152,6 @@
"translate-import-load": "Llwyther y ffeil",
"translate-import-err-dl-failed": "Heb allu nôl y ffeil:\n$1",
"translate-import-err-ul-failed": "Ni lwyddodd llwytho'r ffeil",
- "translate-js-summary": "Crynodeb:",
- "translate-js-save": "Cadw",
- "translate-js-next": "Cadwer ac agorer y nesaf",
- "translate-js-skip": "Neidio i'r nesaf",
- "translate-js-history": "Hynt y cyfieithu",
- "translate-js-support": "Ceisio cymorth",
"translate-js-support-unsaved-warning": "Mae gennych gyfieithiadau heb eu cadw",
"translate-gs-pos": "Safle",
"translate-gs-code": "Cod",
diff --git a/MLEB/Translate/i18n/core/da.json b/MLEB/Translate/i18n/core/da.json
index c7bb103b..4803a207 100644
--- a/MLEB/Translate/i18n/core/da.json
+++ b/MLEB/Translate/i18n/core/da.json
@@ -49,11 +49,9 @@
"translate-ignored": "(ignoreres)",
"translate-edit-title": "Rediger \"$1\"",
"translate-edit-definition": "Beskeden som skal oversættes",
- "translate-edit-translation": "Oversættelse",
"translate-edit-contribute": "bidrag",
"translate-edit-no-information": "<em>Denne besked har ingen dokumentation.\nHvis du ved hvor eller hvordan denne besked bruges, kan du hjælpe andre oversættere ved at tilføje dokumentation til beskeden.</em>",
"translate-edit-information": "Information om beskeden ($1)",
- "translate-edit-in-other-languages": "Beskeden på andre sprog",
"translate-edit-warnings": "Advarsler om ufuldstændige oversættelser",
"translate-edit-tmmatch-source": "Kildetekst til oversættelse: $1",
"translate-edit-tmmatch": "$1 % overensstemmelse",
@@ -171,7 +169,7 @@
"translate-mgs-totals": "Alle {{PLURAL:$1|sprog}} sammenlagt",
"translate-mgs-invalid-group": "Den angivne gruppe, $1, findes ikke.",
"translate-mgs-nothing": "Der er intet at vise for den ønskede statistik.",
- "supportedlanguages": "Understøttede sprog",
+ "supportedlanguages": "Aktive sprog",
"supportedlanguages-summary": "Denne side viser en liste over alle de sprog, der understøttes af {{SITENAME}},\nsammen med navnene på de oversættere, der arbejder på dette sprog.\n\nJo flere redigeringer, en oversætter har bidraget med, jo større skrift bruges til navnet.\nUnderstregningsfarven angiver, hvor nyligt en oversætter har været aktiv.",
"supportedlanguages-colorlegend": "Forklaring til farven: seneste oversættelse var for $1 dage siden.",
"supportedlanguages-sqlite-error": "SQLite understøttes ikke",
@@ -179,7 +177,6 @@
"supportedlanguages-recenttranslations": "seneste oversættelser",
"supportedlanguages-count": "$1 {{PLURAL:$1|sprog|sprog}} i alt.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|redigering|redigeringer}} - seneste redigering var for $3 {{PLURAL:$3|dag|dage}} siden",
- "translate-save": "Gem ($1)",
"translate-jssti-add": "Tilføj til listen",
"managemessagegroups": "Håndtering af beskedgrupper",
"translate-smg-notallowed": "Du har ikke tilladelse til at udføre denne handling.",
@@ -191,6 +188,10 @@
"translate-smg-right": "Indkommende ændringer",
"translate-smg-rename-select": "Vælg",
"translate-smg-rename-cancel": "Annullér",
+ "translate-smg-strong-sync-help": "Hjælp",
+ "translate-smg-group-message-action-history": "Historik",
+ "translate-smg-group-message-tag-rename": "Omdøb",
+ "translate-smg-loading": "Indlæser...",
"translate-manage-import-diff": "Besked $1 | Handlinger: $2",
"translate-manage-import-new": "Ny meddelelse $1",
"translate-manage-import-deleted": "Slettet meddelelse $1",
@@ -218,13 +219,6 @@
"translate-import-err-no-such-file": "Fil <nowiki>$1</nowiki> eksisterer ikke eller er ikke blevet uploadet lokalt.",
"translate-import-err-stale-group": "Beskedgruppen, som denne fil tilhører, findes ikke.",
"translate-import-err-no-headers": "Filen er ikke en velformateret Gettext-fil i Oversæt-udvidelsens format:\nKan ikke bestemme gruppe og sprog fra fil-headere.",
- "translate-js-summary": "Beskrivelse:",
- "translate-js-save": "Offentliggør",
- "translate-js-next": "Offentliggør og åben næste",
- "translate-js-skip": "Gå til næste",
- "translate-js-history": "Oversættelseshistorik",
- "translate-js-support": "Stil spørgsmål",
- "translate-js-support-title": "Spørg om hjælp, hvis der ikke er nok information til at oversætte denne besked korrekt.",
"translate-js-support-unsaved-warning": "Du har ikke-gemte oversættelser.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kode",
diff --git a/MLEB/Translate/i18n/core/dag.json b/MLEB/Translate/i18n/core/dag.json
new file mode 100644
index 00000000..b3ede89b
--- /dev/null
+++ b/MLEB/Translate/i18n/core/dag.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Achiri Bitamsimli",
+ "Alhaj Darajaati",
+ "Chirifo",
+ "Dnshitobu",
+ "Hidrash",
+ "Mo Yumzaa",
+ "Ruky Wunpini",
+ "Sir Amugi",
+ "Yakubu Fadilatu"
+ ]
+ },
+ "supportedlanguages": "Zuliya shaŋa din mali tumdi tuma.",
+ "translate-smg-group-with-error-summary": "$1{{PLURAL:$1|satarli/satara}}din mali gadama.",
+ "translate-smg-group-message-action-history": "Taarihi",
+ "translate-smg-group-message-tag-outdated": "Din lan kani",
+ "translate-smg-group-message-tag-rename": "Labi ti yuli",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Tag|Tags}}:",
+ "translate-smg-group-message-message-content": "Din bei dini",
+ "translate-smg-group-message-message-target": "Yuli nya",
+ "translate-smg-group-message-message-replacement": "Taɣibu",
+ "translate-smg-group-message-message-other-langs": "Bali shɛŋa din pahi:",
+ "translate-manage-source-message-not-found": "Lahibali gbunni kani",
+ "translate-documentation-language": "Satarili sabisɔŋ"
+}
diff --git a/MLEB/Translate/i18n/core/de.json b/MLEB/Translate/i18n/core/de.json
index 499cd855..e67522f7 100644
--- a/MLEB/Translate/i18n/core/de.json
+++ b/MLEB/Translate/i18n/core/de.json
@@ -60,11 +60,9 @@
"translate-ignored": "(ignoriert)",
"translate-edit-title": "„$1“ bearbeiten",
"translate-edit-definition": "Nachricht im Original",
- "translate-edit-translation": "Übersetzung",
"translate-edit-contribute": "bearbeiten",
"translate-edit-no-information": "<em>Zu dieser Nachricht ist keine Dokumentation vorhanden.\nSofern du weißt, wo und in welchem Zusammenhang sie genutzt wird, kannst du anderen Übersetzern bei ihrer Arbeit helfen, indem du eine Dokumentation hinzufügst.</em>",
"translate-edit-information": "Information zur Nachricht ($1)",
- "translate-edit-in-other-languages": "Nachricht in anderen Sprachen",
"translate-edit-warnings": "Warnungen zu unvollständigen Übersetzungen",
"translate-edit-tmmatch-source": "Übersetzungsquelltext: $1",
"translate-edit-tmmatch": "$1 % Übereinstimmung",
@@ -90,13 +88,13 @@
"translate-checks-gettext-plural-count": "<nowiki>{{PLURAL:GETTEXT|}}</nowiki> akzeptiert genau $1 {{PLURAL:$1|Pluralform|Pluralformen}}. Gegenwärtig {{PLURAL:$2|ist eine Pluralform|sind $2 Pluralformen}} angegeben.",
"translate-checks-smartformat-plural-missing": "Diese Übersetzung muss Plural in der Variable $1 verwenden.",
"translate-checks-smartformat-plural-unsupported": "Diese Nachricht unterstützt keinen Plural in der Variable $1.",
- "translate-checks-smartformat-plural-count": "Falsche Anzahl an Pluralformen in <strong>$3</strong>. Notwending {{PLURAL:$1|ist eine Pluralforme|sind $2 Pluralformen}}. Gegenwärtig {{PLURAL:$2|ist eine Pluralform|sind $2 Pluralformen}} vorhanden.",
+ "translate-checks-smartformat-plural-count": "Falsche Anzahl an Pluralformen in <strong>$3</strong>. Notwending {{PLURAL:$1|ist eine Pluralforme|sind $2 Pluralformen}}. Gegenwärtig {{PLURAL:$2|ist eine Pluralform|sind $2 Pluralformen}} vorhanden.",
"translate-checks-unicode-plural-missing": "Diese Übersetzung muss <nowiki>{{PLURAL|}}</nowiki> haben.",
"translate-checks-unicode-plural-unsupported": "Diese Nachricht unterstützt kein <nowiki>{{PLURAL|}}</nowiki>.",
"translate-checks-unicode-plural-invalid": "Pluralformen sollten als $1 definiert sein. Diese Übersetzung enthält $2.",
"translate-checks-pagename": "Der Namensraum weicht von dem in der Übersetzungsvorlage ab.",
"translate-checks-format": "Diese Übersetzung entspricht nicht der Übersetzungsvorlage oder enthält eine ungültige Syntax: $1",
- "translate-checks-escape": "{{PLURAL:$2|Das folgende Escape-Zeichen kann|Die folgenden Escape-Zeichen können}} versehentlich vorhanden sein: <strong>$1</strong>. {{PLURAL:$4|Ein gültiges Escape-Zeichen ist|Gültige Escape-Zeichen sind:}} $3.",
+ "translate-checks-escape": "{{PLURAL:$2|Das folgende Escape-Zeichen kann|Die folgenden Escape-Zeichen können}} versehentlich vorhanden sein: <strong>$1</strong>. {{PLURAL:$4|Ein gültiges Escape-Zeichen ist|Gültige Escape-Zeichen sind:}} $3.",
"translate-checks-parametersnotequal": "Die Parameteranzahl ist {{PLURAL:$1|$1}}, sollte aber {{PLURAL:$2|$2}} sein.",
"translate-checks-malformed": "<nowiki>$1</nowiki> ist formal ungültig.",
"translate-checks-fudforum-syntax": "Bitte benutze in diesem Projekt <nowiki>$1</nowiki> anstatt <nowiki>$2</nowiki>.",
@@ -158,6 +156,11 @@
"translate-statsf-language": "Komma-getrennte Liste der Sprachcodes:",
"translate-statsf-group": "Komma-getrennte Liste der Gruppencodes:",
"translate-statsf-submit": "Vorschau",
+ "translate-statsf-unknown-error": "Es ist ein unbekannter Fehler aufgetreten.",
+ "translate-statsf-error-message": "Beim Laden der Grafik gab es einen Fehler: $1",
+ "translate-statsf-graph-alt-text-info": "Textalternative für die Übersetzungsstatistik in der folgenden Datentabelle.",
+ "translate-statsf-alt-text": "Dies ist die Textalternative für die Übersetzungsstatistik.",
+ "translate-statsf-embed": "Code zum Einbetten des Übersetzungsstatistik-Graphen auf anderen Seiten.",
"translate-tag-page-desc": "Übersetzung der Wikiseite [[$2|$1]] von $3 ($4).",
"translate-sidebar-alltrans": "In anderen Sprachen",
"translations": "Alle Übersetzungen",
@@ -203,8 +206,8 @@
"translate-mgs-totals": "{{PLURAL:$1|Die gesamte Sprache|Alle $1 Sprachen zusammen}}",
"translate-mgs-invalid-group": "Die angegebene Nachrichtengruppe $1 ist nicht vorhanden.",
"translate-mgs-nothing": "Zu den angeforderten Statistiken gibt es keine anzuzeigenden Daten.",
- "supportedlanguages": "Unterstützte Sprachen",
- "supportedlanguages-summary": "Diese Seite zeigt eine Liste aller auf {{SITENAME}} unterstützen Sprachen, zusammen mit den Namen der Übersetzer, die an der jeweiligen Sprache mitgearbeitet haben.\nJe intensiver ein Übersetzer mitgearbeitet hat, desto größer wird sein Benutzername angezeigt.\nDie zur Unterstreichung des Benutzernamens genutzte Farbe zeigt an, wann der Übersetzer zuletzt aktiv mitgearbeitet hat.",
+ "supportedlanguages": "Aktive Sprachen",
+ "supportedlanguages-summary": "Diese Seite zeigt eine Liste aller auf {{SITENAME}} aktiven Sprachen, zusammen mit den Namen der Übersetzer, die an der jeweiligen Sprache mitgearbeitet haben.\nJe intensiver ein Übersetzer mitgearbeitet hat, desto größer wird sein Benutzername angezeigt.\nDie zur Unterstreichung des Benutzernamens genutzte Farbe zeigt an, wann der Übersetzer zuletzt aktiv mitgearbeitet hat.",
"supportedlanguages-colorlegend": "Legende zu den Farben: Letzte Übersetzung vor $1 Tagen.",
"supportedlanguages-sqlite-error": "SQLite wird nicht unterstützt",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Übersetzer|Übersetzerin}}|Übersetzer}}: $1",
@@ -214,7 +217,6 @@
"translate-supportedlanguages-cached": "Diese Informationen wurden vor $1 zwischengespeichert.",
"abusefilter-edit-builder-vars-translate-source-text": "Quelltext der Übersetzungseinheit",
"abusefilter-edit-builder-vars-translate-target-language": "Zielsprache für die Übersetzung",
- "translate-save": "Veröffentlichen ($1)",
"translate-jssti-add": "Zur Liste hinzufügen",
"managemessagegroups": "Nachrichtengruppenverwaltung",
"translate-smg-notallowed": "Du bist nicht berechtigt, diese Aktion durchzuführen.",
@@ -228,13 +230,31 @@
"translate-smg-right": "Eingegangene Änderungen",
"translate-smg-rename-select": "Auswählen",
"translate-smg-rename-cancel": "Abbrechen",
- "translate-smg-rename-search": "Nach passender Nachricht suchen ...",
+ "translate-smg-rename-search": "Nach passender Nachricht suchen …",
"translate-smg-rename-select-err": "Bitte eine Nachricht zum Umbenennen auswählen",
"translate-smg-rename-no-msg": "Keine Nachrichten gefunden.",
- "translate-smg-rename-new": "Hinzufügen als neu ...",
- "translate-smg-rename-rename": "Hinzufügen als Umbenennung von ...",
+ "translate-smg-rename-new": "Hinzufügen als neu …",
+ "translate-smg-rename-rename": "Hinzufügen als Umbenennung von …",
"translate-smg-rename-dialog-title": "Passende Umbenennung für $1 auswählen",
"translate-smg-changeset-modified": "Das Änderungsset wurde von einem anderen Benutzer oder Prozess geändert. Deine Änderungen können nicht veröffentlicht werden, da sie deren Änderungen möglicherweise überschreiben. Bitte lade die Seite neu, um die neuesten Änderungen zu sehen.",
+ "translate-smg-no-groups-in-sync": "Es sind derzeit keine Gruppen in Synchronisation",
+ "translate-smg-strong-sync-help": "Hilfe",
+ "translate-smg-groups-in-sync": "Gruppen, die derzeit synchronisiert werden",
+ "translate-smg-groups-in-sync-list": "Liste der Gruppen, die gerade im Hintergrund bearbeitet werden:",
+ "translate-smg-groups-with-error-title": "Gruppen, die bei der Synchronisation Fehler hatten",
+ "translate-smg-groups-with-error-desc": "Liste der Gruppen und ihrer Nachrichten, die bei der Synchronisierung Fehler hatten:",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|Meldung|Meldungen}} mit Fehlern:",
+ "translate-smg-group-message-action-history": "Versionsgeschichte",
+ "translate-smg-group-action-resolve": "Als erledigt markieren",
+ "translate-smg-group-message-tag-outdated": "Veraltet",
+ "translate-smg-group-message-tag-rename": "Umbenennen",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Tag|Tags}}:",
+ "translate-smg-group-message-message-content": "Inhalt:",
+ "translate-smg-group-message-message-target": "Ziel:",
+ "translate-smg-group-message-message-replacement": "Ersetzen:",
+ "translate-smg-group-message-message-other-langs": "Andere Sprachen:",
+ "translate-smg-loading": "Laden …",
+ "translate-smg-unknown-error": "Es ist ein unbekannter Fehler bei der Bearbeitung deiner Anfrage aufgetreten.",
"translate-manage-import-diff": "Nachricht $1 | Aktionen: $2",
"translate-manage-import-new": "Neue Nachricht $1",
"translate-manage-import-deleted": "Gelöschte Nachricht $1",
@@ -256,6 +276,9 @@
"translate-manage-intro-other": "Hier ist eine Liste von Übersetzungsänderungen der Sprache $1.\nBitte kontrolliere die Änderungen und wähle je eine Aktion, die du auf die Aktualisierungen anwenden möchtest.\nWenn du dich entscheidest, Änderungen zu ignorieren, ist diese Aktion nur vorübergehend.",
"translate-manage-import-ok": "Importiert: $1",
"translate-manage-import-done": "Import abgeschlossen!",
+ "translate-manage-empty-content": "Der Inhalt ist leer",
+ "translate-manage-key-reused": "Diese Systemnachricht existiert bereits im Wiki. Prüfe auf eine versehentliche Wiederverwendung eines alten Schlüssels.",
+ "translate-manage-source-message-not-found": "Nachrichten-Definition nicht gefunden",
"importtranslations": "Übersetzungen importieren",
"translate-import-from-local": "Lokale Datei hochladen:",
"translate-import-load": "Datei laden",
@@ -265,13 +288,6 @@
"translate-import-err-no-such-file": "Die Datei <nowiki>$1</nowiki> existiert nicht oder wurde nicht lokal hochgeladen.",
"translate-import-err-stale-group": "Die Nachrichtengruppe, der diese Datei zugeordnet wurde, ist nicht vorhanden.",
"translate-import-err-no-headers": "Die Datei ist keine Datei im Gettext-Format der Erweiterung „Translate“:\nDie Gruppen und Sprache konnte nicht aus dem Dateikopf ermittelt werden.",
- "translate-js-summary": "Zusammenfassung:",
- "translate-js-save": "Veröffentlichen",
- "translate-js-next": "Veröffentlichen und nächste öffnen",
- "translate-js-skip": "Weiter zur nächsten",
- "translate-js-history": "Übersetzungsgeschichte",
- "translate-js-support": "Frage stellen",
- "translate-js-support-title": "Frage nach Hilfe, sofern nicht ausreichend Informationen vorhanden sind, diese Nachricht richtig zu übersetzen.",
"translate-js-support-unsaved-warning": "Es sind nicht veröffentlichte Übersetzungen vorhanden.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/diq.json b/MLEB/Translate/i18n/core/diq.json
index 98e1e02c..d6c89d1e 100644
--- a/MLEB/Translate/i18n/core/diq.json
+++ b/MLEB/Translate/i18n/core/diq.json
@@ -49,11 +49,9 @@
"translate-ignored": "(Nê hesıbneyine)",
"translate-edit-title": "\"$1\"i bıvurne",
"translate-edit-definition": "Şınasnayışê mesaci",
- "translate-edit-translation": "Açarnayışi",
"translate-edit-contribute": "iştırak ke",
"translate-edit-no-information": "<em>''Wesiqay nê mesaci çıniya.\nŞıma ke zanê kamca ya zi senên no mesac gırweniyeno, şıma şenê tadaoğanê (açarnoğanê) binan rê qandê cıkerdışê wesiqa be nê mesaci ra peşti cı dê.</em>",
"translate-edit-information": "Heqa mesacê ($1) de melumat",
- "translate-edit-in-other-languages": "Tayna zıwanan dı mesaci",
"translate-edit-tmmatch-source": "Metınê çımey açarnayışi: $1",
"translate-edit-tmmatch": "Zey $1%",
"translate-use-suggestion": "Mewcud açarnayışi tewsiye ya bıvurnê",
@@ -71,8 +69,8 @@
"right-translate-import": "Şıma tadayışanê (çarnayışanê) teberê çerxi bıgêrê zerre (import kerê)",
"action-translate-import": "Şıma tadayışanê (çarnayışanê) teberê çerxi bıkırışê teber (ixrac kerê)",
"right-translate-messagereview": "Açarnayışan bıvinê",
- "translate-rcfilters-translations": "Açarnayışi",
- "translate-rcfilters-translations-only-label": "Açarnayışi",
+ "translate-rcfilters-translations": "Çarnayışi",
+ "translate-rcfilters-translations-only-label": "Çarnayışi",
"translate-rcfilters-translations-site-label": "Mesacê sitey",
"translate-rc-translation-filter": "Açarnayışê parzûni:",
"translate-rc-translation-filter-no": "Qırşê mekı",
@@ -100,12 +98,12 @@
"translate-statsf-count-edits": "Amarê vurnayışan:",
"translate-statsf-count-users": "Açarnayoğê aktifi",
"translate-statsf-count-registrations": "Kerbero newe",
- "translate-statsf-count-reviews": "Açarnayışi ercınayış",
+ "translate-statsf-count-reviews": "Çımraviyarnayışê çarnayışan",
"translate-statsf-count-reviewers": "Vênayoği",
"translate-statsf-submit": "Verasayış",
"translate-tag-page-desc": "Açarnayışê pela $3 ($4) ra [[$2|$1]] wiki",
"translate-sidebar-alltrans": "Zıwananê binan de",
- "translations": "Açarnayışi pêro",
+ "translations": "Çarnayışi pêro",
"translate-translations-fieldset-title": "Mesac",
"translate-translations-messagename": "Name:",
"translate-translations-project": "Proce:",
@@ -139,18 +137,20 @@
"translate-mgs-nocomplete": "Açarnayışê cı baş bıyaye zıwana mocnayış",
"translate-mgs-submit": "İstatistikan bımocne",
"translate-mgs-column-language": "Zıwan",
- "translate-mgs-totals": "Zıwani heme piya",
+ "translate-mgs-totals": "Pêroy cı $1 {{PLURAL:$1|zıwan|zıwani}}",
+ "translate-mgs-invalid-group": "Waziyaye gruba $1 çıniya",
+ "translate-mgs-nothing": "Waziyaye istatistikan rê mpcniyaye theba çıniyo",
"supportedlanguages": "Zıwanê ke peşti gırewta",
- "supportedlanguages-summary": "Ena perre lista zıwananê ke hetê {{SITENAME}}y ra qebul biy, be namanê çarnayoğan inan motnena. \nhem zi tewr vêşi iştirak kerdaye karbera goreya zoni rezkeno. \nAçarnayoğe ke namey cı gırdo ina zaf iştiraqkkerdo. \nNara ke ek namey cı bın de reng asena aktivi yana racbayeyi.",
+ "supportedlanguages-summary": "Ena per dı lista zıwananê ke hetê {{SITENAME}}y ra qebul biyaya be namanê çarnayoğan inan mısnena. \nHem zi tewr vêşi iştirak kerdaye karbera goreya zoni rêz keno. \nAçarnayoğe ke namey cı gırdo ina zaf iştırak kerdo. \nNara kı namey cı bın de reng asena se tewr peyên vurnayışi mısneno .",
"supportedlanguages-colorlegend": "Asengeya Renga: açarnayışo peyên verdê $1 roca biyo",
"supportedlanguages-sqlite-error": "SQLite nêpheştiyêno",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Açarnoğ}}|Açarnoği}}: $1",
"supportedlanguages-recenttranslations": "Tadayışê peyêni",
- "supportedlanguages-count": "Pêro piya $1 {{PLURAL:$1|zon|zoni}}",
+ "supportedlanguages-count": "Pêro $1 {{PLURAL:$1|zıwan|zıwani}}",
"supportedlanguages-activity": "$1: pêro piya $2 {{PLURAL:$2|vurnayış|vurnayışi}} - vurnayışo peyên $3 {{PLURAL:$3|roce|roci}} aver keriya",
+ "translate-supportedlanguages-cached": "Nê melumati $1 veri gêriyaye verhefıza",
"abusefilter-edit-builder-vars-translate-source-text": "Çımê metinê unitey açarnayışi",
"abusefilter-edit-builder-vars-translate-target-language": "Seba açarnayışi etiketê zıwani",
- "translate-save": "($1) qeyd ke",
"translate-jssti-add": "Listiy miyan fi",
"managemessagegroups": "Hetenayışê gruba mesacan",
"translate-smg-notallowed": "Semeda ena herketi rê icazeta sima cina.",
@@ -173,6 +173,7 @@
"translate-manage-action-fuzzy": "Açarnayışa azere kerê u kehan kerê",
"translate-manage-action-rename-fuzzy": "Açarnayışa reyna name kerê u kehan kerê",
"translate-manage-action-rename": "Babetna name ke",
+ "translate-manage-import-rename-summary": "Çımey teberiya reyna name biyo",
"translate-manage-submit": "Kay fi",
"translate-manage-import-ok": "Dekerdaye:$1",
"translate-manage-import-done": "Dekerdayış biyo temem",
@@ -181,13 +182,7 @@
"translate-import-load": "Dosya bar kı",
"translate-import-err-dl-failed": "Dosya niamiye :\n$1",
"translate-import-err-ul-failed": "Barkerdışê dosya nêbi",
- "translate-js-summary": "Xulasa:",
- "translate-js-save": "Qeyd ke",
- "translate-js-next": "Qeyd kerê u ravêrê bahdoyêni akerê",
- "translate-js-skip": "Ravêr peyêni",
- "translate-js-history": "Verorê çarnayışi",
- "translate-js-support": "Bıperse",
- "translate-js-support-unsaved-warning": "Şıma açarnayışê ho qeyd nêkerdê.",
+ "translate-js-support-unsaved-warning": "Şıma açarnayışê ho neşr nêkerdê.",
"translate-gs-pos": "Ca",
"translate-gs-code": "Kod",
"translate-gs-continent": "Qıta",
@@ -198,7 +193,7 @@
"translate-gs-total": "Pêro piya",
"translate-gs-avgscore": "Ort. skor",
"translate-documentation-language": "Pelekerdışê mesacan",
- "translate-searchprofile": "Açarnayışi",
+ "translate-searchprofile": "Çarnayışi",
"translate-searchprofile-tooltip": "Heme açarnayışan de cıgeyre",
"translate-searchprofile-note": "Pê [$1 vinayışê açarnayışi] ya zêde weçenegê cıgeyrayışê estê.",
"translate-search-languagefilter": "Gorey zıwani filtre ke:",
@@ -223,7 +218,7 @@
"translate-msggroupselector-search-all": "Pêro",
"translate-msggroupselector-search-recent": "Peyên",
"translate-msggroupselector-view-subprojects": "$1 {{PLURAL:$1|bıngrube|bıngrubi}}",
- "tux-languageselector": "Bıçarne era",
+ "tux-languageselector": "Tadê",
"tux-tab-all": "Pêro",
"tux-tab-untranslated": "Nêaçarniyaye",
"tux-tab-outdated": "Vêrde",
@@ -234,14 +229,14 @@
"tux-status-fuzzy": "Vêrde",
"tux-status-proofread": "Vêniya",
"tux-status-translated": "Açarniyaye",
- "tux-status-saving": "Qeyd beno...",
- "tux-status-unsaved": "Qeyd nêbiyo",
+ "tux-status-saving": "Weşaniyeno...",
+ "tux-status-unsaved": "nêweşinayayo",
"tux-save-unknown-error": "Yew xetay ke nêşınasiyena biye.",
"tux-editor-placeholder": "Açarnayışê şıma",
"tux-editor-editsummary-placeholder": "Xulasaya hesabiyayiye",
"tux-editor-paste-original-button-label": "Çıme metini pırone",
"tux-editor-discard-changes-button-label": "Vurriyayışan vece",
- "tux-editor-save-button-label": "Açarnayışi qeyd ke",
+ "tux-editor-save-button-label": "Açarnayışi neşr ke",
"tux-editor-skip-button-label": "Ravêr peyêni",
"tux-editor-cancel-button-label": "Bıtexelne",
"tux-editor-confirm-button-label": "Açarnayışi tesdiq ke",
@@ -271,7 +266,7 @@
"tux-editor-outdated-notice": "Rocanebiyayışê nê açarnayışi beno ke lazım bo.",
"tux-editor-outdated-notice-diff-link": "Ferqi bıvin",
"tux-editor-doc-editor-placeholder": "Pelekerdışê mesacan",
- "tux-editor-doc-editor-save": "Dokumani qeyd ke",
+ "tux-editor-doc-editor-save": "Dokumani neşr ke",
"tux-editor-doc-editor-cancel": "Bıtexelne",
"tux-messagetable-more-messages": "$1 tayêna {{PLURAL:$1|mesac|mesaci}}",
"tux-messagetable-loading-messages": "{{PLURAL:$1|Mesac bar beno|Mesaci bar benê}}...",
@@ -302,11 +297,11 @@
"tux-editor-message-tools-show-editor": "Wiki-Editor de bımocne",
"tux-editor-message-tools-history": "Tarix",
"tux-editor-message-tools-delete": "Bestere",
- "tux-editor-message-tools-translations": "Açarnayışi pêro",
+ "tux-editor-message-tools-translations": "Çarnayışi pêro",
"tux-editor-message-tools-linktothis": "Gıreyê nê mesaci",
"tux-editor-loading": "Bar beno...",
"tux-editor-loading-failed": "Pheştigerê açarnayışi bar nêbiyê :$1",
- "translate-search-more-languages-info": "$1 deha {{PLURAL:$1|zon|zoni}}",
+ "translate-search-more-languages-info": "Vêşi $1 {{PLURAL:$1|zıwan|zıwani}}",
"translate-statsbar-tooltip": "%$1 açarneya, %$2 weyneya",
"translate-statsbar-tooltip-with-fuzzy": "$1% açarneya, $2% weyneya, $3% kehano",
"translate-search-more-groups-info": "$1 tayêna {{PLURAL:$1|grube|grubi}}",
diff --git a/MLEB/Translate/i18n/core/dsb.json b/MLEB/Translate/i18n/core/dsb.json
index b0027852..a9edcef8 100644
--- a/MLEB/Translate/i18n/core/dsb.json
+++ b/MLEB/Translate/i18n/core/dsb.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ignorěrowany)",
"translate-edit-title": "„$1“ wobźěłaś",
"translate-edit-definition": "Definicija powěsći",
- "translate-edit-translation": "Pśełožk",
"translate-edit-contribute": "pśinosowaś",
"translate-edit-no-information": "<em>Toś ta powěsć njama dokumentaciju. Jolic wěš, źož abo kak toś ta powěsć se wužywa, móžoš drugim pśełožowarjam pomagaś, z tym až dokumentaciju k toś tej powěsći pśidawaš.</em>",
"translate-edit-information": "Informacije wó powěsći ($1)",
- "translate-edit-in-other-languages": "Powěsć w drugich rěcach",
"translate-edit-warnings": "Warnowanja wó njedopołnych pśełožkach",
"translate-edit-tmmatch-source": "Žrědłowy tekst pśełožka: $1",
"translate-edit-tmmatch": "$1 % makanja",
@@ -158,7 +156,6 @@
"supportedlanguages-recenttranslations": "nejnowše pśełožki",
"supportedlanguages-count": "$1 {{PLURAL:$1|rěc|rěcy|rěcy|rěcow}} dogromady.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|změna|změnje|změny|změnow}} - slědna změna pśed $3 {{PLURAL:$3|dnjom|dnjoma|dnjami|dnjami}}",
- "translate-save": "Składowaś ($1)",
"translate-jssti-add": "Lisćinje pśidaś",
"managemessagegroups": "Zastojanje kupkow powěźeńkow",
"translate-smg-notallowed": "Njesmějoš toś tu akciju wuwjasć.",
@@ -194,13 +191,6 @@
"translate-import-err-no-such-file": "Dataja <nowiki>$1</nowiki> njeeksistěrujo abo jnejo se lokalnje nagrała.",
"translate-import-err-stale-group": "Kupka powěźeńkow, ku kótarejž toś ta dataja słuša, njeeksistěrujo.",
"translate-import-err-no-headers": "Dataja mjejp derje wuformowana dataja gettext we formaśe pśełožowańskego formata:\nNjemóžno kupku a rěc z datajowych głowow zwěsćiś.",
- "translate-js-summary": "Zespominanje:",
- "translate-js-save": "Składowaś",
- "translate-js-next": "Pśiducu powěźeńku składowaś a wocyniś",
- "translate-js-skip": "K pśiducej powěźeńce skócyś",
- "translate-js-history": "Pśełožowańska historija",
- "translate-js-support": "Pšašaś se",
- "translate-js-support-title": "Pšos wó pomoc, jolic njejo dosć informacijow, aby se toś ta powěźeńka pšawje pśełožyła.",
"translate-js-support-unsaved-warning": "Maš njeskłaźone pśełožki.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/dty.json b/MLEB/Translate/i18n/core/dty.json
index f7b27829..1cd31248 100644
--- a/MLEB/Translate/i18n/core/dty.json
+++ b/MLEB/Translate/i18n/core/dty.json
@@ -8,7 +8,6 @@
},
"translate-edit-no-information": "<em>यै रैबारको दस्तावेजीकरण नाइथिन।\nयदि तम यो सन्देश काँ और कस्याँ प्रयोग अरीन्छ भण्णेइ कुरडी जाणन्छौ भँण्या तम येइ सन्देश को दस्तावेजीकरण थपीबर और अनुवादकअन लाई मद्दत अरी सकन्छौ।</em>",
"translate-edit-information": "($1) रैबारका बारेमी जानकारी",
- "translate-edit-in-other-languages": "रैबार अन्य भाषाहरूमी",
"translate-stats-edits": "सम्पादनहरू",
"translate-stats-users": "अनुवादकहरू",
"translate-statsf-count-users": "सक्रिय अनुवादकहरू",
diff --git a/MLEB/Translate/i18n/core/ee.json b/MLEB/Translate/i18n/core/ee.json
index 355eba93..865f2481 100644
--- a/MLEB/Translate/i18n/core/ee.json
+++ b/MLEB/Translate/i18n/core/ee.json
@@ -15,7 +15,6 @@
"translate-prev": "Axa si do ŋgɔ",
"translate-page-edit": " trɔ asi le eŋu",
"translate-edit-title": "Trɔ asi le \"$1\" ŋu",
- "translate-edit-in-other-languages": "Du le gbe bubuwo me",
"translate-edit-tmmatch": "$1% sɔsɔme",
"translate-rc-translation-filter-no": "Megawɔ trɔtrɔ aɖeke o",
"translate-rc-translation-filter-only": "Fia gɔmeɖeɖewo ko",
@@ -39,7 +38,6 @@
"translate-total": "Duwo",
"translate-percentage-fuzzy": "Enu vayi",
"supportedlanguages-recenttranslations": "gɔmeɖeɖe yeyewo",
- "translate-save": "Dzra ($1) ɖo",
"translate-manage-import-new": "Du yeye $1",
"translate-manage-submit": "Wɔe",
"translate-manage-import-done": "Wo wɔ wokatã vɔ!"
diff --git a/MLEB/Translate/i18n/core/el.json b/MLEB/Translate/i18n/core/el.json
index 1c0e02c5..355ced70 100644
--- a/MLEB/Translate/i18n/core/el.json
+++ b/MLEB/Translate/i18n/core/el.json
@@ -12,6 +12,7 @@
"KATRINE1992",
"KATRINE1993",
"Lou",
+ "NikosLikomitros",
"Nikosgranturismogt",
"Norhorn",
"Omnipaedista",
@@ -55,11 +56,9 @@
"translate-ignored": "(αγνοημένα)",
"translate-edit-title": "Επεξεργασία «$1»",
"translate-edit-definition": "Ορισμός μηνύματος",
- "translate-edit-translation": "Μετάφραση",
"translate-edit-contribute": "συμβάλλετε",
"translate-edit-no-information": "<em>Αυτό το μήνυμα δεν έχει τεκμηρίωση. \nΑν γνωρίζετε πού ή πώς χρησιμοποιείται αυτό το μήνυμα, μπορείτε να βοηθήσετε άλλους μεταφραστές προσθέτοντας τεκμηρίωση σε αυτό.</em>",
"translate-edit-information": "Πληροφορίες σχετικά με το μήνυμα ($1)",
- "translate-edit-in-other-languages": "Μήνυμα σε άλλες γλώσσες",
"translate-edit-warnings": "Προειδοποιήσεις για ημιτελείς μεταφράσεις",
"translate-edit-tmmatch-source": "Πηγαίο κείμενο μετάφρασης: $1",
"translate-edit-tmmatch": "$1% αντιστοίχιση",
@@ -191,7 +190,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|επεξεργασία|επεξεργασίες}} - τελευταία επεξεργασία $3 {{PLURAL:$3|day|days}} πριν",
"abusefilter-edit-builder-vars-translate-source-text": "Αρχικό κείμενο μεταφραστικής ενότητας",
"abusefilter-edit-builder-vars-translate-target-language": "Γλώσσα στόχος για μετάφραση",
- "translate-save": "Αποθήκευση ($1)",
"translate-jssti-add": "Προσθήκη στην λίστα",
"managemessagegroups": "Διαχείριση ομάδας μηνυμάτων",
"translate-smg-notallowed": "Δεν σας επιτρέπεται να εκτελέσετε αυτήν την ενέργεια.",
@@ -230,13 +228,6 @@
"translate-import-err-no-such-file": "Το αρχείο <nowiki>$1</nowiki> δεν υπάρχει ή δεν έχει φορτωθεί τοπικά.",
"translate-import-err-stale-group": "Η ομάδα μηνυμάτων στην οποία ανήκει αυτό το αρχείο δεν υπάρχει.",
"translate-import-err-no-headers": "Το αρχείο δεν είναι ένα σωστά σχηματισμένο αρχείο τύπου Gettext στη μορφή που αναγνωρίζει η επέκταση Translate:\nΑδύνατος ο προσδιορισμός ομάδας μηνυμάτων και γλώσσας από την κεφαλίδα του αρχείου.",
- "translate-js-summary": "Σύνοψη:",
- "translate-js-save": "Αποθήκευση",
- "translate-js-next": "Δημοσίευση και άνοιγμα του επόμενου",
- "translate-js-skip": "Μετάβαση στο επόμενο",
- "translate-js-history": "Ιστορικό μετάφρασης",
- "translate-js-support": "Κάντε ερώτηση",
- "translate-js-support-title": "Ζητήστε βοήθεια εάν δεν υπάρχουν αρκετές πληροφορίες για να μεταφράστει σωστά αυτό το μήνυμα.",
"translate-js-support-unsaved-warning": "Έχετε μη αποθηκευμένες μεταφράσεις.",
"translate-gs-pos": "Θέση",
"translate-gs-code": "Κωδικός",
diff --git a/MLEB/Translate/i18n/core/en-gb.json b/MLEB/Translate/i18n/core/en-gb.json
index 5d585e86..4776b7bf 100644
--- a/MLEB/Translate/i18n/core/en-gb.json
+++ b/MLEB/Translate/i18n/core/en-gb.json
@@ -3,11 +3,12 @@
"authors": [
"Chase me ladies, I'm the Cavalry",
"Lloffiwr",
+ "Samwilson",
"Shirayuki",
"Thehelpfulone"
]
},
- "supportedlanguages-summary": "This page shows a list of all languages supported by {{SITENAME}},\ntogether with the names of the translators working on that language.\nA translator's name appears larger, the more edits the translator has contributed.\nThe colour of an underline indicates how recently a translator has been active here.",
+ "supportedlanguages-summary": "This page shows a list of active languages in {{SITENAME}},\ntogether with the names of the translators working on that language.\nA translator's name appears larger, the more edits the translator has contributed.\nThe colour of an underline indicates how recently a translator has been active here.",
"supportedlanguages-colorlegend": "Legend for the colour: Last translation $1 days ago.",
"translate-documentation-language": "Message documentation",
"tux-empty-list-translated": "No translated messages"
diff --git a/MLEB/Translate/i18n/core/en.json b/MLEB/Translate/i18n/core/en.json
index c5c67457..6e93f657 100644
--- a/MLEB/Translate/i18n/core/en.json
+++ b/MLEB/Translate/i18n/core/en.json
@@ -45,11 +45,9 @@
"translate-ignored": "(ignored)",
"translate-edit-title": "Edit \"$1\"",
"translate-edit-definition": "Message definition",
- "translate-edit-translation": "Translation",
"translate-edit-contribute": "contribute",
"translate-edit-no-information": "<em>This message has no documentation.\nIf you know where or how this message is used, you can help other translators by adding documentation to this message.</em>",
"translate-edit-information": "Information about message ($1)",
- "translate-edit-in-other-languages": "Message in other languages",
"translate-edit-warnings": "Warnings about incomplete translations",
"translate-edit-tmmatch-source": "Translation source text: $1",
"translate-edit-tmmatch": "$1% match",
@@ -143,6 +141,11 @@
"translate-statsf-language": "Comma-separated list of language codes:",
"translate-statsf-group": "Comma-separated list of group codes:",
"translate-statsf-submit": "Preview",
+ "translate-statsf-unknown-error": "An unknown error has occurred.",
+ "translate-statsf-error-message": "There was an error while loading the graph: $1",
+ "translate-statsf-graph-alt-text-info": "Text alternative for the translation statistics is in the data table below.",
+ "translate-statsf-alt-text": "This is the text alternative for the translation statistics.",
+ "translate-statsf-embed": "Code to embed the translation stats graph on other pages.",
"translate-tag-page-desc": "Translation of the wiki page [[$2|$1]] from $3 ($4).",
"translate-sidebar-alltrans": "In other languages",
"translations": "All translations",
@@ -188,8 +191,8 @@
"translate-mgs-totals": "All $1 {{PLURAL:$1|language|languages}} together",
"translate-mgs-invalid-group": "The specified group $1 does not exist.",
"translate-mgs-nothing": "Nothing to show for requested statistics.",
- "supportedlanguages": "Supported languages",
- "supportedlanguages-summary": "This page shows a list of all languages supported by {{SITENAME}},\ntogether with the names of the translators working on that language.\nA translator's name appears larger, the more edits the translator has contributed.\nThe color of an underline indicates how recently a translator has been active here.",
+ "supportedlanguages": "Active languages",
+ "supportedlanguages-summary": "This page shows a list of active languages in {{SITENAME}},\ntogether with the names of the translators working on that language.\nA translator's name appears larger, the more edits the translator has contributed.\nThe color of an underline indicates how recently a translator has been active here.",
"supportedlanguages-colorlegend": "Legend for the color: Last translation $1 days ago.",
"supportedlanguages-localsummary": "",
"supportedlanguages-portallink": "[$1] $2 - $3",
@@ -202,7 +205,6 @@
"translate-supportedlanguages-cached": "This information was cached $1 ago.",
"abusefilter-edit-builder-vars-translate-source-text": "Source text of translation unit",
"abusefilter-edit-builder-vars-translate-target-language": "Target language for translation",
- "translate-save": "Publish ($1)",
"translate-jssti-add": "Add to list",
"managemessagegroups": "Message group management",
"translate-smg-notallowed": "You are not allowed to execute this action.",
@@ -223,6 +225,24 @@
"translate-smg-rename-rename": "Add as rename of...",
"translate-smg-rename-dialog-title": "Select matching rename for $1",
"translate-smg-changeset-modified": "The changeset has been modified by another user or process. Your changes cannot be published as it might override their changes. Please reload the page to see the latest changes.",
+ "translate-smg-no-groups-in-sync": "There are no groups currently in synchronization",
+ "translate-smg-strong-sync-help": "Help",
+ "translate-smg-groups-in-sync": "Groups currently in synchronization",
+ "translate-smg-groups-in-sync-list": "List of groups currently being processed in the background:",
+ "translate-smg-groups-with-error-title": "Groups that had errors during synchronization",
+ "translate-smg-groups-with-error-desc": "List of groups and their messages that had errors during synchronization:",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|message|messages}} with errors:",
+ "translate-smg-group-message-action-history": "History",
+ "translate-smg-group-action-resolve": "Mark as resolved",
+ "translate-smg-group-message-tag-outdated": "Outdated",
+ "translate-smg-group-message-tag-rename": "Rename",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Tag|Tags}}:",
+ "translate-smg-group-message-message-content": "Content:",
+ "translate-smg-group-message-message-target": "Target:",
+ "translate-smg-group-message-message-replacement": "Replacement:",
+ "translate-smg-group-message-message-other-langs": "Other languages:",
+ "translate-smg-loading": "Loading...",
+ "translate-smg-unknown-error": "There was an unknown error while processing your request.",
"translate-manage-import-diff": "Message $1 | Actions: $2",
"translate-manage-import-new": "New message $1",
"translate-manage-import-deleted": "Deleted message $1",
@@ -244,6 +264,9 @@
"translate-manage-intro-other": "Below is list of translation changes in the language $1.\nPlease review the changes and choose an action you want to take for each update.\nIf you choose to ignore changes, this action is only temporary.",
"translate-manage-import-ok": "Imported: $1",
"translate-manage-import-done": "Import complete!",
+ "translate-manage-empty-content": "Content is empty",
+ "translate-manage-key-reused": "This message already exists in the wiki. Check for an accidental re-use of an old key.",
+ "translate-manage-source-message-not-found": "Message definition not found",
"importtranslations": "Import translations",
"translate-import-from-local": "Local file upload:",
"translate-import-load": "Load file",
@@ -253,13 +276,6 @@
"translate-import-err-no-such-file": "File <nowiki>$1</nowiki> does not exist or has not been uploaded locally.",
"translate-import-err-stale-group": "The message group this file belongs to does not exist.",
"translate-import-err-no-headers": "File is not a well formed Gettext file in Translate extension format:\nUnable to determine message group and language from file headers.",
- "translate-js-summary": "Summary:",
- "translate-js-save": "Publish",
- "translate-js-next": "Publish and open next",
- "translate-js-skip": "Skip to next",
- "translate-js-history": "Translation history",
- "translate-js-support": "Ask question",
- "translate-js-support-title": "Ask for help if there is not enough information to translate this message correctly.",
"translate-js-support-unsaved-warning": "You have unpublished translations.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/eo.json b/MLEB/Translate/i18n/core/eo.json
index 010232fb..c680be8b 100644
--- a/MLEB/Translate/i18n/core/eo.json
+++ b/MLEB/Translate/i18n/core/eo.json
@@ -55,11 +55,9 @@
"translate-ignored": "(ignorata)",
"translate-edit-title": "Redakti \"$1\"",
"translate-edit-definition": "Mesaĝa difino",
- "translate-edit-translation": "Tradukado",
"translate-edit-contribute": "kontribui",
"translate-edit-no-information": "<em>Ĉi tiu mesaĝo ne havas dokumentadon. Se vi scias, kie aŭ kiel ĉi tiu mesaĝo estas uzata, vi povas helpi al aliaj tradukantoj aldonante dokumentadon al ĉi tiu mesaĝo.</em>",
"translate-edit-information": "Informo pri la mesaĝo ($1)",
- "translate-edit-in-other-languages": "Mesaĝo en aliaj lingvoj",
"translate-edit-warnings": "Avertoj pri nekompletaj tradukoj",
"translate-edit-tmmatch-source": "Tradukfontateksto: $1",
"translate-edit-tmmatch": "$1% kongrueco",
@@ -191,7 +189,6 @@
"supportedlanguages-count": "Sume $1 {{PLURAL:$1|lingvo|lingvoj}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|redakto|redaktoj}} - lasta redakto antaŭ $3 {{PLURAL:$3|tago|tagoj}}",
"abusefilter-edit-builder-vars-translate-source-text": "Fonta teksto de traduka unuo",
- "translate-save": "Konservi ($1)",
"translate-jssti-add": "Aldoni al listo",
"managemessagegroups": "Administrado de mesaĝgrupoj",
"translate-smg-notallowed": "Vi ne rajtas plenumi ĉi tiun agon.",
@@ -227,13 +224,6 @@
"translate-import-err-no-such-file": "La dosiero <nowiki>$1</nowiki> ne ekzistas aŭ ne estis ŝargita ĉi-loke.",
"translate-import-err-stale-group": "La mesaĝgrupo al kiu apartenas ĉi tiu dosiero ne ekzistas.",
"translate-import-err-no-headers": "La dosiero estas ne bone formita Gettext-dosiero en la formato de la Traduk-etendaĵo:\nneeblas decidi grupon kaj lingvon el dosierkapo.",
- "translate-js-summary": "Resumo:",
- "translate-js-save": "Konservi",
- "translate-js-next": "Konservi kaj malfermi la sekvan",
- "translate-js-skip": "Salti al la sekva",
- "translate-js-history": "Traduka historio",
- "translate-js-support": "Fari demandon",
- "translate-js-support-title": "Petu helpon se ne estas sufiĉe da informoj por ĝuste traduki ĉi tiun mesaĝon.",
"translate-js-support-unsaved-warning": "Ekzistas nekonservitaj tradukoj.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Kodo",
diff --git a/MLEB/Translate/i18n/core/es.json b/MLEB/Translate/i18n/core/es.json
index ebb9b360..aaefb78d 100644
--- a/MLEB/Translate/i18n/core/es.json
+++ b/MLEB/Translate/i18n/core/es.json
@@ -24,8 +24,10 @@
"Locos epraix",
"Macofe",
"MarcoAurelio",
+ "MarleneR329",
"Ovruni",
"Pertile",
+ "Rodney Araujo",
"Sanbec",
"Tempestas",
"Tiberius1701",
@@ -36,7 +38,7 @@
},
"translate": "Traducir",
"translate-desc": "[[Special:Translate|Página especial]] para traducir el software MediaWiki y otras extensiones",
- "translate-fuzzybot-desc": "Esta es una cuenta especial del sistema usada por la [https://www.mediawiki.org/wiki/Extension:Translate extensión de traducción] para realizar tareas de mantenimiento en las traducciones.\nEsta cuenta es parte del software de MediaWiki y no pertenece a ningún usuario.",
+ "translate-fuzzybot-desc": "Esta es una cuenta especial del sistema usada por la [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Translate extensión de traducción] para realizar tareas de mantenimiento en las traducciones.\nEsta cuenta es parte del software de MediaWiki y no pertenece a ningún usuario.",
"translate-taskui-export-to-file": "Exportar en formato nativo",
"translate-taskui-export-as-po": "Exportar para traducir sin conexión",
"translate-taction-translate": "Traducir",
@@ -69,11 +71,9 @@
"translate-ignored": "(ignorado)",
"translate-edit-title": "Editar «$1»",
"translate-edit-definition": "Definición del mensaje",
- "translate-edit-translation": "Traducción",
"translate-edit-contribute": "contribuir",
"translate-edit-no-information": "<em>Este mensaje no tiene documentación.\nSi sabes dónde o cómo se usa este mensaje, puedes ayudar a los otros traductores añadiendo documentación a este mensaje.</em>",
"translate-edit-information": "Información acerca del mensaje ($1)",
- "translate-edit-in-other-languages": "Mensaje en otros idiomas",
"translate-edit-warnings": "Advertencias acerca de traducciones incompletas",
"translate-edit-tmmatch-source": "Texto fuente para la traducción: $1",
"translate-edit-tmmatch": "$1 % de coincidencia",
@@ -152,6 +152,9 @@
"translate-statsf-language": "Lista de códigos de idioma separados por comas:",
"translate-statsf-group": "Lista de códigos de grupo separados por comas:",
"translate-statsf-submit": "Vista previa",
+ "translate-statsf-unknown-error": "Se produjo un error desconocido.",
+ "translate-statsf-alt-text": "Esta es la alternativa de texto de las estadísticas de traducción.",
+ "translate-statsf-embed": "Código para incrustar el gráfico de estadísticas de traducción en otras páginas.",
"translate-tag-page-desc": "Traducción de la página wiki [[$2|$1]] del $3 ($4).",
"translate-sidebar-alltrans": "En otros idiomas",
"translations": "Todas las traducciones",
@@ -207,7 +210,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|edición|ediciones}}, última edición hace $3 {{PLURAL:$3|día|días}}",
"translate-supportedlanguages-cached": "Esta información se prealmacenó hace $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Texto de origen de la unidad de traducción",
- "translate-save": "Publicar ($1)",
"translate-jssti-add": "Añadir a la lista",
"managemessagegroups": "Gestión de grupos de mensajes",
"translate-smg-notallowed": "No estás autorizado a ejecutar esta acción.",
@@ -225,6 +227,9 @@
"translate-smg-rename-rename": "Añadir como cambio de nombre de…",
"translate-smg-rename-dialog-title": "Elige un renombramiento correspondiente para $1",
"translate-smg-changeset-modified": "El conjunto de cambios ha sido modificado por otro usuario o proceso. Tus cambios no se pueden guardar ya que podrían anular tus cambios. Vuelve a cargar la página para ver los últimos cambios.",
+ "translate-smg-no-groups-in-sync": "No hay ningún grupo actualmente en sincronización",
+ "translate-smg-strong-sync-help": "Ayuda",
+ "translate-smg-groups-in-sync": "Grupos actualmente en sincronización",
"translate-manage-import-diff": "Mensaje $1 | Acciones: $2",
"translate-manage-import-new": "Nuevo mensaje $1",
"translate-manage-import-deleted": "Mensaje $1 borrado",
@@ -255,13 +260,6 @@
"translate-import-err-no-such-file": "El archivo <nowiki>$1</nowiki> no existe o no ha sido subido localmente.",
"translate-import-err-stale-group": "El grupo de mensajes al que pertenece este archivo no existe.",
"translate-import-err-no-headers": "Este no es un archivo Gettext bien formado en el formato de extensión Translate:\nNo se puede determinar el grupo y el idioma a partir de las cabeceras del archivo.",
- "translate-js-summary": "Resumen:",
- "translate-js-save": "Publicar",
- "translate-js-next": "Publicar y abrir el siguiente",
- "translate-js-skip": "Ir al siguiente",
- "translate-js-history": "Historial de traducción",
- "translate-js-support": "Pregunta",
- "translate-js-support-title": "Pide ayuda si no hay suficiente información para traducir este mensaje correctamente.",
"translate-js-support-unsaved-warning": "Tienes traducciones sin publicar.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Código",
diff --git a/MLEB/Translate/i18n/core/et.json b/MLEB/Translate/i18n/core/et.json
index 3b32fe9b..d6f794ea 100644
--- a/MLEB/Translate/i18n/core/et.json
+++ b/MLEB/Translate/i18n/core/et.json
@@ -41,11 +41,9 @@
"translate-ignored": "(eiratud)",
"translate-edit-title": "Redigeeri sõnumit \"$1\"",
"translate-edit-definition": "Sõnumi kuju",
- "translate-edit-translation": "Tõlge",
"translate-edit-contribute": "täienda",
"translate-edit-no-information": "<em>Sellel sõnumil pole dokumentatsiooni.\nKui tead, kus seda sõnumit kasutatakse, saad dokumentatsiooni lisamisega teisi tõlkijaid aidata.</em>",
"translate-edit-information": "Selle sõnumi teave ($1)",
- "translate-edit-in-other-languages": "Sõnum teistes keeltes",
"translate-edit-warnings": "Hoiatused puuduliku tõlke kohta",
"translate-edit-tmmatch-source": "Tõlke alliktekst: $1",
"translate-edit-tmmatch": "Vastavus: $1%",
@@ -159,15 +157,14 @@
"translate-mgs-totals": "{{PLURAL:$1|Ühes keeles|Kõigis $1 keeles}} kokku",
"translate-mgs-invalid-group": "Määratud rühma $1 pole.",
"translate-mgs-nothing": "Soovitud näitajate kohta pole midagi näidata.",
- "supportedlanguages": "Toetatud keeled",
- "supportedlanguages-summary": "Siin leheküljel on toodud kõik keeled, mida {{SITENAME}} toetab\nja neis keeltes kaastööd tegevate tõlkijate nimed.\nMida suurem on tõlkija nimi, seda rohkem muudatusi on ta teinud.\nAllkriipsu värvus näitab, kui hiljuti on tõlkija siin kaastööd teinud.",
+ "supportedlanguages": "Aktiivsed keeled",
+ "supportedlanguages-summary": "Siin leheküljel on toodud kõik keeled, mida {{SITENAME}} aktiivselt toetab\nja neis keeltes kaastööd tegevate tõlkijate nimed.\nMida suurem on tõlkija nimi, seda rohkem muudatusi on ta teinud.\nAllkriipsu värvus näitab, kui hiljuti on tõlkija siin kaastööd teinud.",
"supportedlanguages-colorlegend": "Värvuslegend: Viimane tõlge $1 päeva tagasi.",
"supportedlanguages-portallink": "[$1] $2 – $3",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Tõlkija}}|Tõlkijad}}: $1",
"supportedlanguages-recenttranslations": "viimased tõlked",
"supportedlanguages-count": "Kokku {{PLURAL:$1|üks keel|$1 keelt}}.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|Üks muudatus|$2 muudatust}} – viimane muudatus {{PLURAL:$3|eile|$3 päeva tagasi}}",
- "translate-save": "Avalda ($1)",
"translate-jssti-add": "Lisa loetellu",
"managemessagegroups": "Sõnumirühmade haldamine",
"translate-smg-notallowed": "Sul pole lubatud seda toimingut sooritada.",
@@ -199,13 +196,6 @@
"translate-import-err-invalid-title": "Toodud failinimi <nowiki>$1</nowiki> oli vigane.",
"translate-import-err-no-such-file": "Faili <nowiki>$1</nowiki> pole või see on üles laaditud kohalikku vikisse.",
"translate-import-err-stale-group": "Sõnumirühma, kuhu see fail kuulub, pole.",
- "translate-js-summary": "Resümee:",
- "translate-js-save": "Avalda",
- "translate-js-next": "Avalda ja ava järgmine",
- "translate-js-skip": "Jäta vahele",
- "translate-js-history": "Tõlkimisajalugu",
- "translate-js-support": "Esita küsimus",
- "translate-js-support-title": "Esita küsimus, kui teave selle sõnumi kohta on õigesti tõlkimiseks puudulik.",
"translate-js-support-unsaved-warning": "Osa tõlkeid on avaldamata.",
"translate-gs-pos": "Koht",
"translate-gs-code": "Kood",
@@ -325,5 +315,6 @@
"translate-statsbar-tooltip": "$1% tõlgitud, $2% ülevaadatud",
"translate-statsbar-tooltip-with-fuzzy": "$1% tõlgitud, $2% ülevaadatud, $3% iganenud",
"translate-search-more-groups-info": "Veel $1 {{PLURAL:$1|rühm|rühma}}",
- "tux-nojs": "See tööriist ei tööta ilma JavaScriptita. JavaScript on keelatud, see ei toiminud või selle brauseri tugi puudub."
+ "tux-nojs": "See tööriist ei tööta ilma JavaScriptita. JavaScript on keelatud, see ei toiminud või selle brauseri tugi puudub.",
+ "specialpages-group-translation": "Tõlkimine"
}
diff --git a/MLEB/Translate/i18n/core/eu.json b/MLEB/Translate/i18n/core/eu.json
index 7dba4ca4..b6f56429 100644
--- a/MLEB/Translate/i18n/core/eu.json
+++ b/MLEB/Translate/i18n/core/eu.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ignoratua)",
"translate-edit-title": "\"$1\" aldatu",
"translate-edit-definition": "Mezuaren definizioa",
- "translate-edit-translation": "Itzulpena",
"translate-edit-contribute": "lagundu",
"translate-edit-no-information": "''Mezu honek ez du dokumentaziorik.''\n''Mezu hau non erabiltzen den badakizu, beste itzultzaileei lagundu dezakezu mezu honen dokumentazioa gehituz.''",
"translate-edit-information": "Mezuari buruzko informazioa ($1)",
- "translate-edit-in-other-languages": "Mezua beste hizkuntzetan",
"translate-edit-warnings": "Bukatu gabeko itzulpenei buruzko oharrak",
"translate-edit-tmmatch": "$1% bilaketa",
"translate-edit-askpermission": "Baimena lortu",
@@ -124,7 +122,6 @@
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Translator}}|Itzultzaileak}}: $1",
"supportedlanguages-recenttranslations": "azken itzulpenak",
"supportedlanguages-count": "{{PLURAL:$1|Hizkutza bat|$1 hizkuntza}} guztira.",
- "translate-save": "Gorde ($1)",
"translate-jssti-add": "Zerrendara gehitu",
"translate-manage-import-diff": "Mezua $1 | Ekintzak: $2",
"translate-manage-import-new": "Mezu berria $1",
@@ -137,12 +134,6 @@
"translate-manage-import-done": "Inportazioa egina!",
"importtranslations": "Itzulpenak inportatu",
"translate-import-load": "Fitxategia kargatu",
- "translate-js-summary": "Laburpena:",
- "translate-js-save": "Gorde",
- "translate-js-next": "Gorde eta hurrengoa ireki",
- "translate-js-skip": "Hurrengora salto egin",
- "translate-js-history": "Itzulpenen historia",
- "translate-js-support": "Galdera egin",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kodea",
"translate-gs-continent": "Kontinentea",
diff --git a/MLEB/Translate/i18n/core/fa.json b/MLEB/Translate/i18n/core/fa.json
index e58e22e6..b5999027 100644
--- a/MLEB/Translate/i18n/core/fa.json
+++ b/MLEB/Translate/i18n/core/fa.json
@@ -60,11 +60,9 @@
"translate-ignored": "(نادیده گرفته شده)",
"translate-edit-title": "ویرایش «$1»",
"translate-edit-definition": "تعریف پیغام",
- "translate-edit-translation": "ترجمه",
"translate-edit-contribute": "مشارکت",
"translate-edit-no-information": "<em>این پیغام دارای مستندات نیست.\n''اگر می‌دانید که این پیغام چگونه یا در کجا استفاده می‌شود، می‌توانید با اضافه کردن مستندات به دیگر ترجمه‌کنندگان کمک کنید.</em>",
"translate-edit-information": "اطلاعات در مورد این پیغام ($1)",
- "translate-edit-in-other-languages": "همین پیغام در دیگر زبان‌ها",
"translate-edit-warnings": "هشدار در مورد ترجمه‌های ناکامل",
"translate-edit-tmmatch-source": "متن منبع ترجمه: $1",
"translate-edit-tmmatch": "$1٪ مطابقت",
@@ -193,7 +191,6 @@
"supportedlanguages-count": "در مجموع $1 {{PLURAL:$1|زبان|زبان}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|ویرایش|ویرایش}} - آخرین ویرایش $3 {{PLURAL:$3|روز|روز}} قبل",
"abusefilter-edit-builder-vars-translate-source-text": "متن مبدأ واحد ترجمه",
- "translate-save": "ذخیره ($1)",
"translate-jssti-add": "افزودن به فهرست",
"managemessagegroups": "مدیریت گروه‌های پیغام",
"translate-smg-notallowed": "شما مجاز به انجام این عمل نیستید.",
@@ -233,13 +230,6 @@
"translate-import-err-no-such-file": "پرونده <nowiki>$1</nowiki> وجود ندارد یا به طور محلی بارگذاری نشده است.",
"translate-import-err-stale-group": "گروه پیغامی که این پرونده به آن تعلق دارد وجود ندارد.",
"translate-import-err-no-headers": "پرونده دارای قالب مناسب Gettext برای افزونهٔ ترجمه نیست:\nشناسایی گروه پیغام و زبان از سرایندهای پرونده ممکن نبود.",
- "translate-js-summary": "خلاصه:",
- "translate-js-save": "ذخیره",
- "translate-js-next": "ذخیره و بازکردن بعدی",
- "translate-js-skip": "پرش به بعدی",
- "translate-js-history": "تاریخچهٔ ترجمه",
- "translate-js-support": "پرسش سؤال",
- "translate-js-support-title": "اگر اطلاعات کافی برای ترجمهٔ درست این پیغام موجود نیست، سوال بپرسید.",
"translate-js-support-unsaved-warning": "شما ترجمه‌های ذخیره‌نشده دارید.",
"translate-gs-pos": "موقعیت",
"translate-gs-code": "کد",
diff --git a/MLEB/Translate/i18n/core/ff.json b/MLEB/Translate/i18n/core/ff.json
index 5b9457c7..c9125c48 100644
--- a/MLEB/Translate/i18n/core/ff.json
+++ b/MLEB/Translate/i18n/core/ff.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Ibrahima"
+ "Ibrahima",
+ "Ibrahima Malal Sarr"
]
},
"translate-documentation-language": "Famminorde ɓatakuru"
diff --git a/MLEB/Translate/i18n/core/fi.json b/MLEB/Translate/i18n/core/fi.json
index e3f0699d..89942aaf 100644
--- a/MLEB/Translate/i18n/core/fi.json
+++ b/MLEB/Translate/i18n/core/fi.json
@@ -6,6 +6,8 @@
"Centerlink",
"Cimon Avaro",
"Crt",
+ "Joquliina",
+ "Mediawikitranslator",
"Mobe",
"Nedergard",
"Nike",
@@ -18,13 +20,14 @@
"Usp",
"VezonThunder",
"Vililikku",
+ "Yupik",
"ZeiP"
]
},
"translate": "Käännä",
"translate-extensionname": "Käännä",
"translate-desc": "[[Special:Translate|Toimintosivu]] MediaWikin kääntämiseen ja muutakin.",
- "translate-fuzzybot-desc": "Tämä on erityinen järjestelmätili jota MediaWikin [https://www.mediawiki.org/wiki/Extension:Translate Translate-laajennus] käyttää käännösten ylläpitoon.\nTämä tili on osa MediaWiki-ohjelmistoa ja sitä ei omista mikään käyttäjä.",
+ "translate-fuzzybot-desc": "Tämä on erityinen järjestelmätili jota MediaWikin [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Translate Translate-laajennus] käyttää käännösten ylläpitoon.\nTämä tili on osa MediaWiki-ohjelmistoa ja sitä ei omista mikään käyttäjä.",
"translate-taskui-export-to-file": "Vie perusmuodossa",
"translate-taskui-export-as-po": "Vie off-line kääntämiseen soveltuvassa muodossa",
"translate-taction-translate": "Käännä",
@@ -57,11 +60,9 @@
"translate-ignored": "(ei-käännettävä)",
"translate-edit-title": "Muokkaa sivua $1",
"translate-edit-definition": "Viestin määritelmä",
- "translate-edit-translation": "Käännös",
"translate-edit-contribute": "auta dokumentoinnissa",
"translate-edit-no-information": "<em>Tätä viestiä ei ole dokumentoitu.\nJos tiedät missä tai miten tätä viestiä käytetään, voit auttaa muita kääntäjiä lisäämällä kommentteja tähän viestiin.</em>",
"translate-edit-information": "Tietoja viestistä ($1)",
- "translate-edit-in-other-languages": "Viesti muilla kielillä",
"translate-edit-warnings": "Varoitukset virheellisestä käännöksestä",
"translate-edit-tmmatch-source": "Käännöksen lähdeteksti: $1",
"translate-edit-tmmatch": "Vastaavuus $1%",
@@ -91,7 +92,7 @@
"translate-checks-unicode-plural-invalid": "Monikkomuodot tulee antaa muodossa $1. Nyt ne ovat muodossa $2.",
"translate-checks-pagename": "Nimiavaruus ei ole sama kuin viestin määritelmässä",
"translate-checks-format": "Tämä käännös ei noudata alkuperäistä tekstiä tai sillä on virheellinen syntaksi: $1",
- "translate-checks-escape": "Seuraavat escape-merkkijonot saattavat olla tahattomia: <strong>$1</strong>",
+ "translate-checks-escape": "{{PLURAL:$2|Seuraava escape-merkki saattaa olla tahaton|Seuraavat escape-merkit saattavat olla tahattomia}}: <strong>$1</strong> {{PLURAL:$4|Kelvollinen escape-merkki on|Kelvolliset escape-merkit ovat:}} $3.",
"translate-checks-parametersnotequal": "Käännöksessä pitäisi olla {{PLURAL:$2|yksi muuttuja|$2 muuttujaa}}, mutta vain {{PLURAL:$1|yksi muuttuja|$1 muuttujaa}} löydettiin.",
"translate-checks-malformed": "<nowiki>$1</nowiki> ei ole hyvinmuotoiltu.",
"translate-checks-fudforum-syntax": "Käytä merkinnän <nowiki>$1</nowiki> sijasta merkintää <nowiki>$2</nowiki> tässä hankkeessa.",
@@ -139,16 +140,16 @@
"translate-statsf-days": "Aikaväli päivissä",
"translate-statsf-start": "Aloituspäivämäärä",
"translate-statsf-scale": "Mittaustarkkuus",
- "translate-statsf-scale-months": "kuukausia",
- "translate-statsf-scale-weeks": "viikkoja",
- "translate-statsf-scale-days": "päiviä",
- "translate-statsf-scale-hours": "tunteja",
+ "translate-statsf-scale-months": "kuukausi",
+ "translate-statsf-scale-weeks": "viikko",
+ "translate-statsf-scale-days": "päivä",
+ "translate-statsf-scale-hours": "tunti",
"translate-statsf-count": "Mittaussuure",
"translate-statsf-count-edits": "muokkaukset",
"translate-statsf-count-users": "aktiiviset kääntäjät",
"translate-statsf-count-registrations": "uudet käyttäjät",
- "translate-statsf-count-reviews": "käännösten hyväksymisiä",
- "translate-statsf-count-reviewers": "oikolukijoita",
+ "translate-statsf-count-reviews": "käännösten hyväksymiset",
+ "translate-statsf-count-reviewers": "oikolukijat",
"translate-statsf-language": "Pilkuin erotettu lista kielikoodeista",
"translate-statsf-group": "Pilkuin erotettu lista ryhmäkoodeista",
"translate-statsf-submit": "Esikatselu",
@@ -197,7 +198,7 @@
"translate-mgs-totals": "Kaikki $1 {{PLURAL:$1|kieltä}} yhdessä",
"translate-mgs-invalid-group": "Määritettyä ryhmää $1 ei ole.",
"translate-mgs-nothing": "Pyydetyille tilastoille ei löydy tuloksia.",
- "supportedlanguages": "Tuetut kielet",
+ "supportedlanguages": "Aktiiviset kielet",
"supportedlanguages-summary": "Tällä sivulla luetellaan kaikki kielet, joita {{SITENAME}} tukee, sekä kaikki näillä kielillä työskentelevät kääntäjät.\nKääntäjän nimi on sitä suurempi, mitä enemmän hän on tehnyt käännöksiä.\nAlleviivauksen väri kertoo, milloin kääntäjä on viimeksi kääntänyt täällä.",
"supportedlanguages-colorlegend": "Värin selitys: Viimeinen käännös $1 päivää sitten.",
"supportedlanguages-sqlite-error": "SQLite ei ole tuettu",
@@ -207,7 +208,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|muokkaus|muokkausta}} - viimeinen muokkaus $3 {{PLURAL:$3|päivä|päivää}} sitten",
"translate-supportedlanguages-cached": "Nämä tiedot ovat välimuistista, joka luotiin $1 sitten.",
"abusefilter-edit-builder-vars-translate-source-text": "Käännösyksikön lähdeteksti",
- "translate-save": "Tallenna ($1)",
"translate-jssti-add": "Lisää listaan",
"managemessagegroups": "Viestiryhmien hallinta",
"translate-smg-notallowed": "Sinulla ei ole oikeuksia suorittaa tätä toimintoa.",
@@ -221,6 +221,12 @@
"translate-smg-rename-cancel": "Peruuta",
"translate-smg-rename-no-msg": "Viestejä ei löytynyt.",
"translate-smg-rename-new": "Lisää uutena...",
+ "translate-smg-group-message-action-history": "Historia",
+ "translate-smg-group-message-tag-outdated": "Vanhentunut",
+ "translate-smg-group-message-tag-rename": "Nimeä uudelleen",
+ "translate-smg-group-message-message-content": "Sisältö:",
+ "translate-smg-group-message-message-target": "Kohde:",
+ "translate-smg-group-message-message-other-langs": "Muut kielet:",
"translate-manage-import-diff": "Viesti $1 | Toiminnot: $2",
"translate-manage-import-new": "Uusi viesti $1",
"translate-manage-import-deleted": "Poistettu viesti $1",
@@ -240,6 +246,7 @@
"translate-manage-intro-other": "Alla on luettelo kielen $1 käännösmuutoksista.\nTarkista muutokset ja valitse toiminto, jonka haluat tehdä jokaiselle käännökselle.\nJos valitset muutosten ohittamisen, toimintoa ei tallenneta.",
"translate-manage-import-ok": "Tuotu: $1",
"translate-manage-import-done": "Tuonti valmis.",
+ "translate-manage-source-message-not-found": "Viestin määritelmää ei löytnyt",
"importtranslations": "Käännösten tuonti",
"translate-import-from-local": "Paikallinen tiedosto",
"translate-import-load": "Tallenna tiedosto",
@@ -249,14 +256,7 @@
"translate-import-err-no-such-file": "Tiedostoa <nowiki>$1</nowiki> ei ole tai sitä ei ole tallennettu paikallisesti.",
"translate-import-err-stale-group": "Tämä tiedosto kuuluu viestiryhmään, jota ei ole olemassa.",
"translate-import-err-no-headers": "Tiedosto ei ole kelvollisesti muotoiltu Gettext-tiedosto Translate-laajennoksen käyttämässä muodossa:\nViestiryhmä- ja kielitietoja ei löytynyt tiedoston otsakkeesta.",
- "translate-js-summary": "Yhteenveto:",
- "translate-js-save": "Tallenna",
- "translate-js-next": "Tallenna ja avaa seuraava",
- "translate-js-skip": "Hyppää seuraavaan",
- "translate-js-history": "Käännöshistoria",
- "translate-js-support": "Kysy kysymys",
- "translate-js-support-title": "Pyydä apua, jos olemassa olevien tietojen avulla viestiä ei voi kääntää oikein.",
- "translate-js-support-unsaved-warning": "Kaikkia käännöksiä ei ole tallennettu.",
+ "translate-js-support-unsaved-warning": "Kaikkia käännöksiä ei ole julkaistu.",
"translate-gs-pos": "Sij.",
"translate-gs-code": "Koodi",
"translate-gs-continent": "Maanosa",
@@ -298,7 +298,7 @@
"translate-msggroupselector-search-all": "Kaikki",
"translate-msggroupselector-search-recent": "Äskettäiset",
"translate-msggroupselector-view-subprojects": "$1 {{PLURAL:$1|alaryhmä|alaryhmää}}",
- "tux-languageselector": "Kieli",
+ "tux-languageselector": "Kohdekieli:",
"tux-tab-all": "Kaikki",
"tux-tab-untranslated": "Kääntämättömät",
"tux-tab-outdated": "Vanhentuneet",
@@ -309,14 +309,14 @@
"tux-status-fuzzy": "Vanhentunut",
"tux-status-proofread": "Oikoluettu",
"tux-status-translated": "Käännetty",
- "tux-status-saving": "Tallennetaan...",
- "tux-status-unsaved": "Tallentamaton",
+ "tux-status-saving": "Julkaistaan...",
+ "tux-status-unsaved": "Julkaisematon",
"tux-save-unknown-error": "Tapahtui tuntematon virhe.",
"tux-editor-placeholder": "Käännös",
"tux-editor-editsummary-placeholder": "Valinnainen yhteenveto",
"tux-editor-paste-original-button-label": "Liitä lähdeteksti",
"tux-editor-discard-changes-button-label": "Hylkää muutokset",
- "tux-editor-save-button-label": "Tallenna käännös",
+ "tux-editor-save-button-label": "Julkaise käännös",
"tux-editor-skip-button-label": "Hyppää seuraavaan",
"tux-editor-cancel-button-label": "Peru",
"tux-editor-confirm-button-label": "Hyväksy käännös",
@@ -331,7 +331,7 @@
"tux-editor-tm-match": "Vastaavuus $1%",
"tux-notices-more": "{{PLURAL:$1|$1 muuta}}",
"tux-notices-hide": "piilota",
- "tux-editor-save-failed": "Käännöksen tallentaminen epäonnistui: $1",
+ "tux-editor-save-failed": "Käännöksen julkaiseminen epäonnistui: $1",
"tux-editor-n-uses": "$1 {{PLURAL:$1|käyttökerta|käyttökertaa}}",
"tux-editor-message-desc-more": "Näytä lisää",
"tux-editor-message-desc-less": "Näytä vähemmän",
@@ -346,7 +346,7 @@
"tux-editor-outdated-notice": "Tämä viesti saattaa tarvita päivittämistä.",
"tux-editor-outdated-notice-diff-link": "Näytä muutokset",
"tux-editor-doc-editor-placeholder": "Ohjeistus",
- "tux-editor-doc-editor-save": "Tallenna ohjeistus",
+ "tux-editor-doc-editor-save": "Julkaise ohjeistus",
"tux-editor-doc-editor-cancel": "Peru",
"tux-messagetable-more-messages": "$1 {{PLURAL:$1|viesti|viestiä}} lisää",
"tux-messagetable-loading-messages": "Ladataan {{PLURAL:$1|viestiä|viestejä}}...",
diff --git a/MLEB/Translate/i18n/core/fit.json b/MLEB/Translate/i18n/core/fit.json
index 1bf6faa9..040d1156 100644
--- a/MLEB/Translate/i18n/core/fit.json
+++ b/MLEB/Translate/i18n/core/fit.json
@@ -30,10 +30,8 @@
"translate-page-edit": "mookkaa",
"translate-optional": "(vapa)",
"translate-edit-title": "Mookkaa \"$1\"",
- "translate-edit-translation": "Käänös",
"translate-edit-contribute": "avusta tokymentoinnissa",
"translate-edit-no-information": "<em>Tätä viestiä ei ole tokymentoitu.\nJos tiiät missä tai miten tätä viestiä käytethään, voit auttaa muita kääntäjiä lissäämällä kommentteja tähän viestiin.</em>",
- "translate-edit-in-other-languages": "Viesti muila kielilä",
"translate-edit-tmmatch-source": "Käänöksen läheteksti: $1",
"translate-use-suggestion": "Korvaa nykynen käänös tällä ehotuksella.",
"translate-edit-nopermission": "Viestien kääntämisheen tarvithaan käänösoikeuet.",
@@ -127,7 +125,6 @@
"supportedlanguages-recenttranslations": "verekset käänökset",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|mookkaus|mookkausta}} - viimeinen mookkaus $3 {{PLURAL:$3|päivä|päivää}} sitten",
"abusefilter-edit-builder-vars-translate-source-text": "Käännösyksikön läheteksti",
- "translate-save": "Säästä ($1)",
"translate-jssti-add": "Lissää listaan",
"managemessagegroups": "Viestijoukkojen hallinta",
"translate-smg-submit": "Lähätä muutokset käsiteltäviksi",
@@ -153,12 +150,6 @@
"translate-import-err-no-such-file": "Fiiliä <nowiki>$1</nowiki> ei ole tai sitä ei ole säästetty paikallisesti.",
"translate-import-err-stale-group": "Tämä fiili kuuluu viestijoukkoon, jota ei ole olemassa.",
"translate-import-err-no-headers": "Fiili ei ole kelvollisesti muotoiltu Gettext-fiili Translate-laajennoksen käyttämässä muodossa:\nViestijoukko- ja kielitietoja ei löytynyt fiilin otsakkeesta.",
- "translate-js-summary": "Yhteenveto:",
- "translate-js-save": "Säästä",
- "translate-js-next": "Säästä ja aukase seuraava",
- "translate-js-skip": "Hyppää seuraavhaan",
- "translate-js-history": "Käänöshistuuria",
- "translate-js-support-title": "Pyyä apua, jos olemassa olevien tietojen avulla viestiä ei voi kääntää oikein.",
"translate-js-support-unsaved-warning": "Kaikkia käänöksiä ei ole säästetty.",
"translate-gs-code": "Kooti",
"translate-documentation-language": "käänöstokymenttasuuni",
diff --git a/MLEB/Translate/i18n/core/fo.json b/MLEB/Translate/i18n/core/fo.json
index a00451f9..fb03e72f 100644
--- a/MLEB/Translate/i18n/core/fo.json
+++ b/MLEB/Translate/i18n/core/fo.json
@@ -36,11 +36,9 @@
"translate-optional": "(valfrítt)",
"translate-ignored": "(síggj burtur frá)",
"translate-edit-title": "Rætta \"$1\"",
- "translate-edit-translation": "Týðing",
"translate-edit-contribute": "verð við",
"translate-edit-no-information": "''Hesi boðini hava onga dokumentasjón.''\n''Um tú veitst hvar ella hvussu hesi boðini verða nýtt, so kanst tú hjálpa øðrum týðarum við at viðleggja dokumentasjón til hesi boðini.''",
"translate-edit-information": "Kunning um boð ($1)",
- "translate-edit-in-other-languages": "Boðini á øðrum málum",
"translate-edit-warnings": "Ávaring um ófullfíggjaðar týðingar",
"translate-edit-tmmatch-source": "Keldutekstur til týðingar: $1",
"translate-edit-tmmatch": "$1% samsvar",
@@ -147,7 +145,6 @@
"supportedlanguages-recenttranslations": "seinastu týðingar",
"supportedlanguages-count": "$1 {{PLURAL:$1|mál}} tilsamans.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|rætting|rættingar}} - seinasta rætting var fyri $3 {{PLURAL:$3|dagur|dagar}} síðan",
- "translate-save": "Goym ($1)",
"translate-jssti-add": "Legg til listan",
"managemessagegroups": "Stýring av boðbólkum",
"translate-smg-notallowed": "Tú hevur ikki loyvi til at útføra hesa handling.",
@@ -168,13 +165,6 @@
"translate-import-err-invalid-title": "Fílunavnið <nowiki>$1</nowiki> var ógyldugt.",
"translate-import-err-no-such-file": "Fílan <nowiki>$1</nowiki> er ikki til ella er ikki løgd út lokalt.",
"translate-import-err-stale-group": "Boðbólkurin sum henda fílan hoyrir til er ikki til.",
- "translate-js-summary": "Samandráttur:",
- "translate-js-save": "Goym",
- "translate-js-next": "Goym og lat upp næsta",
- "translate-js-skip": "Loyp um og far til næsta",
- "translate-js-history": "Týðingarsøgan",
- "translate-js-support": "Spyr ein spurning",
- "translate-js-support-title": "Bið um hjálp um tað ikki er nokk av kunning til at týða hesi boðini rætt.",
"translate-js-support-unsaved-warning": "Tú hevur ikki-goymdar týðingar.",
"translate-gs-code": "Kota",
"translate-gs-continent": "Kontinent",
diff --git a/MLEB/Translate/i18n/core/fr.json b/MLEB/Translate/i18n/core/fr.json
index d6338005..368b8923 100644
--- a/MLEB/Translate/i18n/core/fr.json
+++ b/MLEB/Translate/i18n/core/fr.json
@@ -10,6 +10,7 @@
"Dereckson",
"Dr Brains",
"Epok",
+ "Florian COLLIN",
"Gomoko",
"Grondin",
"Guillom",
@@ -80,11 +81,9 @@
"translate-ignored": "(ignoré)",
"translate-edit-title": "Modifier « $1 »",
"translate-edit-definition": "Définition du message",
- "translate-edit-translation": "Traduction",
"translate-edit-contribute": "contribuer",
"translate-edit-no-information": "<em>Ce message n’est pas documenté.\nSi vous savez où ou comment il est utilisé, vous pouvez aider les autres traducteurs en créant sa documentation.</em>",
"translate-edit-information": "Informations concernant le message ($1)",
- "translate-edit-in-other-languages": "Message dans d’autres langues",
"translate-edit-warnings": "Avertissements sur les traductions incomplètes",
"translate-edit-tmmatch-source": "Texte source de la traduction : $1",
"translate-edit-tmmatch": "$1 % de correspondance",
@@ -178,6 +177,11 @@
"translate-statsf-language": "Liste de codes de langues séparés par des virgules :",
"translate-statsf-group": "Liste de codes de groupes séparés par des virgules :",
"translate-statsf-submit": "Prévisualiser",
+ "translate-statsf-unknown-error": "Une erreur inconnue s’est produite.",
+ "translate-statsf-error-message": "Il y a eu une erreur en chargeant le graphe : $1",
+ "translate-statsf-graph-alt-text-info": "Le texte alternatif pour les statistiques de traduction est dans la table de données ci-dessous.",
+ "translate-statsf-alt-text": "Ceci est le texte alternatif pour les statistiques de traduction.",
+ "translate-statsf-embed": "Code pour inclure le graphique des statistiques de traduction dans d’autres pages.",
"translate-tag-page-desc": "Traduction de la page wiki [[$2|$1]] depuis $3 ($4).",
"translate-sidebar-alltrans": "Dans les autres langues",
"translations": "Toutes les traductions",
@@ -223,8 +227,8 @@
"translate-mgs-totals": "Ensemble de{{PLURAL:$1||s}} $1 langue{{PLURAL:$1||s}}",
"translate-mgs-invalid-group": "Le groupe spécifié $1 n’existe pas.",
"translate-mgs-nothing": "Rien à afficher pour les statistiques demandées.",
- "supportedlanguages": "Langues prises en charge",
- "supportedlanguages-summary": "Cette page affiche une liste de toutes les langues prises en charge par {{SITENAME}}, avec les noms des traducteurs qui travaillent dans cette langue.\nLe nom d’un traducteur apparaît en plus gros en fonction du nombre de modifications auxquelles il a contribué.\nLa couleur du soulignement indique si le traducteur a été actif ici récemment.",
+ "supportedlanguages": "Langues actives",
+ "supportedlanguages-summary": "Cette page affiche une liste des langues actives sur {{SITENAME}}, avec les noms des traducteurs qui travaillent dans cette langue.\nLe nom d’un traducteur apparaît en plus gros en fonction du nombre de modifications auxquelles il a contribué.\nLa couleur du soulignement indique si le traducteur a été actif ici récemment.",
"supportedlanguages-colorlegend": "Légende pour la couleur : dernière traduction il y a $1 jours.",
"supportedlanguages-portallink": "[$1] $2 – $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -236,7 +240,6 @@
"translate-supportedlanguages-cached": "Cette information a été mise en cache il y a $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Texte source de l’unité de traduction",
"abusefilter-edit-builder-vars-translate-target-language": "Langue cible pour la traduction",
- "translate-save": "Publier ($1)",
"translate-jssti-add": "Ajouter à la liste",
"managemessagegroups": "Gestion des groupes de messages",
"translate-smg-notallowed": "Vous n’êtes pas autorisé à effectuer cette action.",
@@ -257,6 +260,24 @@
"translate-smg-rename-rename": "Ajouter comme renommage de...",
"translate-smg-rename-dialog-title": "Sélectionner le renommage correspondant pour $1",
"translate-smg-changeset-modified": "L’ensemble des modifications a été modifié par un autre utilisateur ou processus. Vos modifications ne peuvent pas être publiées car elles pourraient écraser ses modifications. Veuillez recharger la page pour voir les dernières modifications.",
+ "translate-smg-no-groups-in-sync": "Il n’y a actuellement aucun groupe en synchronisation",
+ "translate-smg-strong-sync-help": "Aide",
+ "translate-smg-groups-in-sync": "Groupes actuellement en synchronisation",
+ "translate-smg-groups-in-sync-list": "Liste des groupes actuellement traités en tâche de fond :",
+ "translate-smg-groups-with-error-title": "Groupes qui ont eu des erreurs lors de la synchronisation",
+ "translate-smg-groups-with-error-desc": "Liste des groupes et de leurs messages qui ont eu des erreurs lors de la synchronisation :",
+ "translate-smg-group-with-error-summary": "$1 message{{PLURAL:$1||s}} avec des erreurs :",
+ "translate-smg-group-message-action-history": "Historique",
+ "translate-smg-group-action-resolve": "Marquer comme résolu",
+ "translate-smg-group-message-tag-outdated": "Périmé",
+ "translate-smg-group-message-tag-rename": "Renommer",
+ "translate-smg-group-message-tag-label": "Balise{{PLURAL:$1||s}} :",
+ "translate-smg-group-message-message-content": "Contenu :",
+ "translate-smg-group-message-message-target": "Cible :",
+ "translate-smg-group-message-message-replacement": "Remplacement :",
+ "translate-smg-group-message-message-other-langs": "Autres langues :",
+ "translate-smg-loading": "Chargement en cours...",
+ "translate-smg-unknown-error": "Une erreur est survenue lors du traitement de votre requête.",
"translate-manage-import-diff": "Message $1 | Actions : $2",
"translate-manage-import-new": "Nouveau message $1",
"translate-manage-import-deleted": "Message $1 supprimé",
@@ -278,6 +299,9 @@
"translate-manage-intro-other": "Ci-dessous figure une liste des modifications dans la langue $1.\nRelisez les modifications et choisissez une action à effectuer pour chacune.\nSi vous décidez d’ignorer les modifications, cette action ne sera que temporaire.",
"translate-manage-import-ok": "Importé : $1",
"translate-manage-import-done": "Import terminé !",
+ "translate-manage-empty-content": "Le contenu est vide",
+ "translate-manage-key-reused": "Ce message existe déjà dans le wiki. Recherchez une réutilisation accidentelle d’une ancienne clé.",
+ "translate-manage-source-message-not-found": "Définition du message non trouvée",
"importtranslations": "Importer les traductions",
"translate-import-from-local": "Importer un fichier local :",
"translate-import-load": "Charger le fichier",
@@ -287,13 +311,6 @@
"translate-import-err-no-such-file": "Le fichier « <nowiki>$1</nowiki> » n’existe pas ou n’a pas été importé localement.",
"translate-import-err-stale-group": "Le groupe de messages auquel ce fichier appartient n’existe pas.",
"translate-import-err-no-headers": "Le fichier n’est pas un fichier ''Gettext'' bien formé dans le format attendu par l’extension ''Translate'' :\nil est impossible de déterminer le groupe et la langue depuis les entêtes du fichier.",
- "translate-js-summary": "Résumé :",
- "translate-js-save": "Publier",
- "translate-js-next": "Publier et ouvrir le suivant",
- "translate-js-skip": "Aller au suivant",
- "translate-js-history": "Historique de traduction",
- "translate-js-support": "Poser une question",
- "translate-js-support-title": "Demandez de l’aide s’il n’y a pas suffisamment d’informations pour traduire ce message correctement.",
"translate-js-support-unsaved-warning": "Vous avez des traductions non publiées.",
"translate-gs-pos": "Rang",
"translate-gs-code": "Code",
@@ -387,7 +404,7 @@
"tux-editor-doc-editor-save": "Publier la documentation",
"tux-editor-doc-editor-cancel": "Annuler",
"tux-messagetable-more-messages": "$1 message{{PLURAL:$1||s}} de plus",
- "tux-messagetable-loading-messages": "Chargement {{PLURAL:$1|du message|de $1 messages}}...",
+ "tux-messagetable-loading-messages": "Chargement {{PLURAL:$1|du message|de $1 messages}} en cours...",
"tux-message-filter-placeholder": "Filtrer la liste",
"tux-message-filter-result": "{{PLURAL:$1|0=Aucun résultat trouvé|1=Un résultat trouvé|$1 résultats trouvés}} pour « $2 »",
"tux-message-filter-advanced-button": "Recherche avancée",
diff --git a/MLEB/Translate/i18n/core/frp.json b/MLEB/Translate/i18n/core/frp.json
index 1d3b9089..0ef3cc5f 100644
--- a/MLEB/Translate/i18n/core/frp.json
+++ b/MLEB/Translate/i18n/core/frp.json
@@ -39,11 +39,9 @@
"translate-ignored": "(ignorâ)",
"translate-edit-title": "Changiér « $1 »",
"translate-edit-definition": "Dèfinicion du mèssâjo",
- "translate-edit-translation": "Traduccion",
"translate-edit-contribute": "édiér",
"translate-edit-no-information": "''Ceti mèssâjo est pas documentâ.''\n''Se vos sâde yô ou ben coment il est empleyê, vos pouede édiér los ôtros traductors en fassent la documentacion de ceti mèssâjo.''",
"translate-edit-information": "Enformacions sur lo mèssâjo ($1)",
- "translate-edit-in-other-languages": "Mèssâjo dens d’ôtres lengoues",
"translate-edit-warnings": "Avèrtissements sur les traduccions encomplètes",
"translate-edit-tmmatch-source": "Tèxto sôrsa de la traduccion : $1",
"translate-edit-tmmatch": "$1 % de corrèspondance",
@@ -154,7 +152,6 @@
"supportedlanguages-recenttranslations": "novèles traduccions",
"supportedlanguages-count": "En tot $1 lengou{{PLURAL:$1|a|es}}.",
"supportedlanguages-activity": "$1 : $2 changement{{PLURAL:$2||s}} - dèrriér changement cen fât $3 jorn{{PLURAL:$3||s}}",
- "translate-save": "Sôvar ($1)",
"translate-jssti-add": "Apondre a la lista",
"managemessagegroups": "Administracion du groupo des mèssâjos",
"translate-smg-notallowed": "Vos éte pas ôtorisâ a fâre cel’accion.",
@@ -188,13 +185,6 @@
"translate-import-err-no-such-file": "Lo fichiér <nowiki>$1</nowiki> ègziste pas ou ben il est pas étâ importâ localament.",
"translate-import-err-stale-group": "Lo groupo de mèssâjos uquint cél fichiér apartint ègziste pas.",
"translate-import-err-no-headers": "Lo fichiér est pas un fichiér ''gettext'' bien formâ dens lo format atendu per l’èxtension ''Translate'' :\no est empossiblo de dètèrmenar lo groupo et la lengoua dês los en-tétes du fichiér.",
- "translate-js-summary": "Rèsumâ :",
- "translate-js-save": "Encartar",
- "translate-js-next": "Encartar et pués uvrir celi d’aprés",
- "translate-js-skip": "Alar a celi d’aprés",
- "translate-js-history": "Historico de traduccion",
- "translate-js-support": "Posar na quèstion",
- "translate-js-support-title": "Demandâd d’éde s’y at pas prod d’enformacions por traduire cél mèssâjo coment fôt.",
"translate-js-support-unsaved-warning": "Vos avéd des traduccions pas encartâyes.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/frr.json b/MLEB/Translate/i18n/core/frr.json
index 6106beb1..5a1e946a 100644
--- a/MLEB/Translate/i18n/core/frr.json
+++ b/MLEB/Translate/i18n/core/frr.json
@@ -10,6 +10,5 @@
"translate-percentage-fuzzy": "Ual",
"translate-languagestats-overall": "Böödsköölen tuup",
"translate-ls-column-group": "Skööl faan süsteembööden",
- "translate-js-support": "Fraag stel",
"translate-documentation-language": "Noorachten-dokumentatjuun"
}
diff --git a/MLEB/Translate/i18n/core/fur.json b/MLEB/Translate/i18n/core/fur.json
index 7695b2a6..55417aa9 100644
--- a/MLEB/Translate/i18n/core/fur.json
+++ b/MLEB/Translate/i18n/core/fur.json
@@ -31,11 +31,9 @@
"translate-ignored": "(ignorât)",
"translate-edit-title": "Cambie \"$1\"",
"translate-edit-definition": "Definizion dal messaç",
- "translate-edit-translation": "Traduzion",
"translate-edit-contribute": "contribuìs",
"translate-edit-no-information": "''Chest messaç nol à documentazion.''\n''Se tu sâs dulà o cemût chest messaç al è doprât, tu puedis judâ altris tradutôrs zontant alc come documentazion a chest messaç.''",
"translate-edit-information": "Informazions sul messaç ($1)",
- "translate-edit-in-other-languages": "Il messaç in altris lenghis",
"translate-edit-warnings": "Avîs su lis traduzions no completis",
"translate-edit-tmmatch": "corispuint al $1%",
"translate-edit-nopermission": "Ti coventin i dirits di traduzion par tradusi i messaçs.",
@@ -105,7 +103,6 @@
"supportedlanguages-recenttranslations": "traduzions recentis",
"supportedlanguages-count": "$1 {{PLURAL:$1|lenghe|lenghis}} in dut.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|cambiament|cambiaments}} - ultin cambiament $3 {{PLURAL:$3|zornade|zornadis}} indaûr",
- "translate-save": "Salve ($1)",
"translate-jssti-add": "Zonte ae liste",
"translate-manage-import-diff": "Messaç $1 | Azions: $2",
"translate-manage-import-new": "Gnûf messaç $1",
@@ -113,12 +110,6 @@
"translate-manage-action-ignore": "Ignore",
"importtranslations": "Impuarte traduzions",
"translate-import-load": "Cjame file",
- "translate-js-summary": "Somari:",
- "translate-js-save": "Salve",
- "translate-js-next": "Salve e passe al prossim",
- "translate-js-skip": "Passe al prossim",
- "translate-js-history": "Storic de traduzion",
- "translate-js-support": "Fâs une domande",
"translate-js-support-unsaved-warning": "Tu âs traduzions no salvadis.",
"translate-gs-code": "Codiç",
"translate-gs-continent": "Continent",
diff --git a/MLEB/Translate/i18n/core/fy.json b/MLEB/Translate/i18n/core/fy.json
index 70bfa6a8..5c096a4e 100644
--- a/MLEB/Translate/i18n/core/fy.json
+++ b/MLEB/Translate/i18n/core/fy.json
@@ -9,7 +9,9 @@
]
},
"translate": "Oersette",
+ "translate-extensionname": "Oersette",
"translate-desc": "[[Special:Translate|Bysûndere side]] foar it oersetten fan MediaWiki en mear",
+ "translate-fuzzybot-desc": "Dit is in spesjaal systeemakkount, brûkt troch de [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Translate oersetútwreiding] fan MediaWiki om oersettings te ûnderhâlden.\nDit akkount is part fan 'e MediaWiki-programmatuer, en it heart net ta oan in meidogger.",
"translate-taskui-export-to-file": "Eksportearje yn eigen formaat",
"translate-taskui-export-as-po": "Eksportearje foar offline oersetten",
"translate-taction-translate": "Oersette",
@@ -22,21 +24,84 @@
"translate-page-no-such-group": "De opjûne groep is ûnjildich.",
"translate-page-disabled": "Oersettings nei dizze taal yn dizze groep binne útskeakele.\nReden:\n\n<em>$1</em>",
"translate-language-disabled": "Oersetten nei dizze taal is útskeakele.",
- "translate-page-settings-legend": "Ynstellingen",
+ "translate-page-settings-legend": "Ynstellings",
"translate-page-group": "Groep",
"translate-page-language": "Taal",
+ "translate-page-limit": "Beheining",
"translate-page-limit-option": "$1 {{PLURAL:$1|berjocht|berjochten}} de side",
"translate-submit": "Ophelje",
"translate-page-navigation-legend": "Navigaasje",
- "translate-next": "Folgjende side",
+ "translate-page-showing": "De berjochten $1 o/m $2 fan $3 werjûn.",
+ "translate-page-showing-all": "$1 {{PLURAL:$1|berjocht|berjochten}} werjûn.",
+ "translate-page-showing-none": "Gjin berjochten wer te jaan.",
+ "translate-next": "Side fierder",
+ "translate-prev": "Side werom",
+ "translate-page-description-legend": "Ynformaasje oer de groep",
+ "translate-page-description-hasoptional": "Dizze berjochtegroep befettet opsjonele berjochten.\nOpsjonele berjochten moatte inkeld oerset wurde at jo taal bysûndere easken stelt,\nlykas gjin spaasjes brûken of eigennammen transliterearjen. $1",
+ "translate-page-description-hasoptional-open": "Opsjonele berjochten werjaan.",
"translate-page-edit": "bewurkje",
"translate-optional": "(opsjoneel)",
+ "translate-ignored": "(negearre)",
"translate-edit-title": "\"$1\" bewurkje",
- "translate-edit-translation": "Oersetting",
+ "translate-edit-definition": "Grûntekst",
+ "translate-edit-contribute": "bydrage",
+ "translate-edit-no-information": "<em>Dit berjocht hat gjin dokumintaasje.\nAt jo witte wêr't of hoe't dit berjocht brûkt wurdt, kinne jo oare oersetters helpe troch dokumintaasje oan dit berjocht ta te heakjen.</em>",
+ "translate-edit-information": "Ynformaasje oer it berjocht ($1)",
+ "translate-edit-warnings": "Warskôgings oer ûnfolsleine oersettings",
+ "translate-edit-tmmatch-source": "Grûntekst oersetting: $1",
+ "translate-edit-tmmatch": "$1% oerienkomst",
+ "translate-use-suggestion": "De oersetting fan no ferfange troch dizze suggestje.",
+ "translate-edit-nopermission": "Jo binne oersettersrjochten nedich om berjochten oersette te kinnen.",
+ "translate-edit-askpermission": "Tastimming krije",
+ "exporttranslations": "Oersettings eksportearje",
+ "translate-export-form-format": "Formaat",
+ "translate-export-invalid-format": "Graach in jildich formaat oanjaan.",
+ "translate-export-not-supported": "Oersettings eksportearjen wurdt net stipe.",
+ "translate-export-format-notsupported": "It oanjûne eksportformaat wurdt net stipe troch de berjochtegroep.",
+ "translate-export-group-too-large": "De keazen berjochtegroep is te grut. Kies in berjochtegroep dy't minder as $1 {{PLURAL:$1|berjocht|berjochten}} hat of gean by oersettingsbehear te riede.",
+ "translate-checks-parameters": "De neikommende {{PLURAL:$2|parameter is|parameters binne}} net brûkt:\n<strong>$1</strong>",
+ "translate-checks-parameters-unknown": "De neikommende {{PLURAL:$2|parameter is|parameters binne}} net witten:\n<strong>$1</strong>",
+ "translate-checks-balance": "Der is in ûneven tal heakjes fan {{PLURAL:$2|it type|de typen}}:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-links": "De neikommende {{PLURAL:$2|keppeling jout|$2 keppelings jouwe}} swierrichheden:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-links-missing": "De neikommende {{PLURAL:$2|keppeling mist|$2 keppelings misse}}:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-plural": "De grûntekst brûkt <nowiki>{{PLURAL:}}</nowiki> mar de oersetting net.",
+ "translate-checks-plural-forms": "<nowiki>{{PLURAL:}}</nowiki> jout {{PLURAL:$1|ien foarm|$1 foarmen}}, mar der {{PLURAL:$2|wurdt inkeld ien|wurde $2}} stipe (útsein de foarmen 0= en 1=).",
+ "translate-checks-plural-dupe": "<nowiki>{{PLURAL:}}</nowiki> hat likense foarmen oan 'e ein. <nowiki>{{PLURAL:$1|skiep|skiep}}</nowiki> moat skreaun wurde as <nowiki>{{PLURAL:$1|skiep}}</nowiki>.",
+ "translate-checks-gettext-plural-missing": "Dizze oersetting moat <nowiki>{{PLURAL:GETTEXT|}}</nowiki> hawwe.",
+ "translate-checks-gettext-plural-unsupported": "Dit berjocht stipet <nowiki>{{PLURAL:GETTEXT|}}</nowiki> net.",
+ "translate-checks-gettext-plural-count": "<nowiki>{{PLURAL:GETTEXT|}}</nowiki> freget krekt $1 {{PLURAL:$1|meartalsfoarm|meartalsfoarmen}}. $2 {{PLURAL:$2|meartalsfoarm is|meartalsfoarmen binne}} no opjûn.",
+ "translate-checks-smartformat-plural-missing": "Dizze oersetting moat meartal by fariabele $1 hawwe.",
+ "translate-checks-smartformat-plural-unsupported": "Dit berjocht stipet meartal by fariabele $1 net.",
+ "translate-checks-smartformat-plural-count": "Ferkeard tal meartalsfoarmen yn <strong>$3</strong>. It moat der $1 hawwe. $2 {{PLURAL:$2|meartalsfoarm is|meartalsfoarmen binne}} no opjûn.",
+ "translate-checks-unicode-plural-missing": "Dizze oersetting moat <nowiki>{{PLURAL|}}</nowiki> hawwe.",
+ "translate-checks-unicode-plural-unsupported": "Dit berjocht stipet <nowiki>{{PLURAL|}}</nowiki> net.",
+ "translate-checks-unicode-plural-invalid": "Meartalsfoarmen moatte skreaun wurde as $1. Dizze oersetting befettet $2.",
+ "translate-checks-pagename": "De nammeromte ferskilt fan 'e grûntekst",
+ "translate-checks-format": "Dizze oersetting folget de grûntekst net of hat ûnjildige syntaks: $1",
+ "translate-checks-escape": "{{PLURAL:$2|It neikommende ûntsnappingsteken kin|De neikommende ûntsnappingstekens kinne}} ûnbedoeld wêze: <strong>$1</strong>. {{PLURAL:$4|In jildich ûntsnappingsteken is|Jildige ûntsnappingstekens binne:}} $3.",
+ "translate-checks-parametersnotequal": "It tal parameters is {{PLURAL:$1|$1}}; moat {{PLURAL:$2|$2}} wêze.",
+ "translate-checks-malformed": "<nowiki>$1</nowiki> hat in misse foarm.",
+ "translate-checks-fudforum-syntax": "Brûk yn dit projekt <nowiki>$1</nowiki> yn stee fan <nowiki>$2</nowiki>.",
+ "translate-checks-newline-missing-start": "Der {{PLURAL:$1|mist|misse}} $1 nijrigel-{{PLURAL:$1|teken|tekens}} oan it begjin fan 'e oersetting.",
+ "translate-checks-newline-missing-end": "Der {{PLURAL:$1|mist|misse}} $1 nijrigel-{{PLURAL:$1|teken|tekens}} oan 'e ein fan 'e oersetting.",
+ "translate-checks-newline-extra-start": "Der {{PLURAL:$1|is|binne}} $1 ekstra nijrigel-{{PLURAL:$1|teken|tekens}} oan it begjin fan 'e oersetting.",
+ "translate-checks-newline-extra-end": "Der {{PLURAL:$1|is|binne}} $1 ekstra nijrigel-{{PLURAL:$1|teken|tekens}} oan 'e ein fan 'e oersetting.",
+ "translate-checks-value-not-present": "De oersetting moat lyk wêze oan {{PLURAL:$1|1=|ien fan 'e neikommende wearden:}} $1.",
+ "translate-checks-replacement": "Brûk $2 yn stee fan $1.",
"translate-pref-editassistlang": "Stypjende talen:",
"prefs-translate": "Oersetopsjes",
- "translate-pref-editassistlang-help": "List fan taalkoades, skaat mei komma's.\nBerjochtoersettings yn dizze talen wurde werjûn, at jo mei oersetten dwaande binne.\nDe standert talelist wurdt bepaald troch jó taal.",
+ "translate-pref-editassistlang-help": "List fan taalkoades, skaat mei komma's.\nBerjochtoersettings yn dy talen, wurde werjûn at jo mei oersetten dwaande binne.\nDe standert talelist wurdt bepaald troch jó taal.",
+ "translate-pref-editassistlang-bad": "Unjildige taalkoade yn 'e list:\n<nowiki>$1</nowiki>.",
+ "right-translate": "Yn de oersetomjouwing bewurkjen",
+ "action-translate": "yn de oersetomjouwing te bewurkjen",
+ "right-translate-manage": "Berjochtegroepen behearen",
+ "action-translate-manage": "berjochtegroepen te behearen",
+ "right-translate-import": "Offline oersettings ymportearjen",
+ "action-translate-import": "offline oersettings te ymportearjen",
"right-translate-messagereview": "Oersettings hifkjen",
+ "action-translate-messagereview": "oersettings te hifkjen",
+ "right-translate-groupreview": "De wurkstreamstatus fan berjochtegroepen feroarjen",
+ "action-translate-groupreview": "de wurkstreamstatus fan berjochtegroepen te feroarjen",
"translate-rcfilters-translations": "Oersettings",
"translate-rcfilters-translations-only-label": "Oersettings",
"translate-rcfilters-translations-only-desc": "Wizigings oan oersette siden.",
@@ -44,43 +109,193 @@
"translate-rcfilters-translations-filter-desc": "Alle wizigings dy't gjin oersettings binne.",
"translate-rcfilters-translations-site-label": "Systeemberjochten",
"translate-rcfilters-translations-site-desc": "Oanpassings fan websteeberjochten yn de MediaWiki-nammeromte.",
- "translate-rc-translation-filter": "Oersettings filterje",
+ "translate-rc-translation-filter": "Oersettings filterje:",
"translate-rc-translation-filter-no": "Neat dwaan",
"translate-rc-translation-filter-only": "Allinne oersettings",
"translate-rc-translation-filter-filter": "Oersettings weilitte",
"translate-rc-translation-filter-site": "Allinne lokale systeemberjochten",
+ "translationstats": "Oersetstatistiken",
+ "translate-stats-edits": "Bewurkings",
"translate-stats-users": "Oersetters",
+ "translate-stats-registrations": "Ynskriuwings",
+ "translate-stats-reviews": "Hifkings",
+ "translate-stats-reviewers": "Hifkers",
+ "translate-statsf-intro": "Mei dit formulier kinne jo ienfâldige statistiken generearje.\nAlle wearden hawwe boppe- en ûndergrinzen.",
+ "translate-statsf-options": "Grafykopsjes",
+ "translate-statsf-width": "Breedte yn pixels:",
+ "translate-statsf-height": "Hichte yn pixels:",
+ "translate-statsf-days": "Tiidsperioade yn dagen:",
+ "translate-statsf-start": "Begjindatum:",
+ "translate-statsf-scale": "Granulariteit:",
"translate-statsf-scale-months": "Moannen",
"translate-statsf-scale-weeks": "Wiken",
"translate-statsf-scale-days": "Dagen",
"translate-statsf-scale-hours": "Oeren",
+ "translate-statsf-count": "Mjitting:",
+ "translate-statsf-count-edits": "Tal bewurkings",
+ "translate-statsf-count-users": "Aktive oersetters",
+ "translate-statsf-count-registrations": "Nije meidoggers",
+ "translate-statsf-count-reviews": "Oersethifkings",
+ "translate-statsf-count-reviewers": "Hifkers",
"translate-statsf-language": "List fan taalkoades, skaat mei komma's:",
+ "translate-statsf-group": "List fan groepkoades, skaat mei komma's:",
+ "translate-statsf-submit": "Proefbyld",
+ "translate-statsf-unknown-error": "In ûnbekende flater die him foar.",
+ "translate-statsf-error-message": "Der gong wat mis mei it laden fan 'e grafyk: $1",
+ "translate-statsf-graph-alt-text-info": "It tekstalternatyf foar de oersetstatistiken stiet hjirûnder yn 'e datatabel.",
+ "translate-statsf-alt-text": "Dit is it tekstalternatyf foar de oersetstatistiken.",
+ "translate-statsf-embed": "Koade om de grafyk mei oersetstatistiken op oare siden yn te sluten.",
+ "translate-tag-page-desc": "Oersetting fan 'e wikiside [[$2|$1]] fan $3 ($4).",
+ "translate-sidebar-alltrans": "Yn oare talen",
+ "translations": "Alle oersettings",
+ "translations-summary": "Typ hjirûnder in berjochtnamme, om alle beskikbere oersettings sjen te litten.",
+ "translate-translations-no-message": "\"$1\" is gjin oersetber berjocht",
+ "translate-translations-none": "Der binne gjin oersettings foar \"$1\"",
+ "translate-translations-count": "{{PLURAL:$1|Ien oersetting|$1 oersettings}} fûn.",
+ "translate-translations-fieldset-title": "Berjocht",
"translate-translations-messagename": "Namme:",
"translate-translations-project": "Projekt:",
+ "translate-translations-including-no-param": "Graach in jildige berjochtnamme as subside-parameter opjaan",
+ "translate-translations-history-short": "s",
"languagestats": "Taalstatistiken",
+ "languagestats-summary": "Dizze side lit foar in taal de oersetstatistiken fan alle berjochtegroepen sjen.",
+ "messagegroupstats-summary": "Dizze side lit de berjochtegroepstatistiken sjen.",
+ "languagestats-stats-for": "Oersetstatistiken foar $1 ($2).",
+ "languagestats-recenttranslations": "koartlyn oerset",
+ "translate-langstats-incomplete": "Guon fan 'e statistiken op dizze side binne ûnfolslein. Graach werlade om mear gegevens te krijen.",
+ "translate-langstats-expand": "útklappe",
+ "translate-langstats-collapse": "ynklappe",
+ "translate-langstats-expandall": "alles útklappe",
+ "translate-langstats-collapseall": "alles ynklappe",
"translate-language-code": "Taalkoade",
"translate-language-code-field-name": "Taalkoade:",
+ "translate-suppress-complete": "Folslein oersette berjochtegroepen weilitte",
+ "translate-ls-noempty": "Folslein ûnoersette berjochtegroepen weilitte",
"translate-language": "Taal",
+ "translate-total": "Berjochten",
"translate-untranslated": "Unoerset",
+ "translate-percentage-complete": "Folsleinens",
"translate-percentage-fuzzy": "Ferâldere",
+ "translate-percentage-proofread": "Hifke",
+ "translate-languagestats-overall": "Al de berjochtegroepen byinoar",
+ "translate-ls-submit": "Statistiken werjaan",
"translate-ls-column-group": "Berjochtegroep",
"translate-mgs-pagename": "Berjochtegroepstatistiken",
+ "translate-mgs-fieldset": "Werjeftefoarkarren",
"translate-mgs-group": "Berjochtegroep:",
+ "translate-mgs-nocomplete": "Folslein oersette talen weilitte",
+ "translate-mgs-noempty": "Folslein ûnoersette talen weilitte",
+ "translate-mgs-submit": "Statistiken werjaan",
"translate-mgs-column-language": "Taal",
+ "translate-mgs-totals": "{{PLURAL:$1|Byinoar 1 taal|Al de $1 talen byinoar}}",
+ "translate-mgs-invalid-group": "De opjûne groep $1 bestiet net.",
+ "translate-mgs-nothing": "Neat wer te jaan foar de opfrege statistiken.",
+ "supportedlanguages": "Stipe talen",
+ "supportedlanguages-summary": "Dizze side lit in list fan alle talen sjen dy't stipe wurde troch {{GRAMMAR:lidw|{{SITENAME}}}},\ntegearre mei de nammen fan 'e oersetters foar in beskate taal (nei de klik).\nHoe grutter de namme derút springt, hoe mear bydragen de oersetter levere hat.\nDe kleur fan 'e ûnderstreking jout oan, hoe lang lyn de oersetter warber west hat.",
+ "supportedlanguages-colorlegend": "Leginda foar de kleur: Lêste oersetting $1 dagen lyn.",
+ "supportedlanguages-sqlite-error": "SQLite wurdt net stipe",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Oersetter|Oersetster}}|Oersetters}}: $1",
- "translate-save": "Bewarje ($1)",
+ "supportedlanguages-recenttranslations": "koartlyn oerset",
+ "supportedlanguages-count": "$1 {{PLURAL:$1|taal|talen}} yn totaal.",
+ "supportedlanguages-activity": "$1: $2 {{PLURAL:$2|bewurking|bewurkings}} - lêste bewurking $3 {{PLURAL:$3|dei|dagen}} lyn",
+ "translate-supportedlanguages-cached": "Dizze ynformaasje út 'e oerslach is fan $1 lyn.",
+ "abusefilter-edit-builder-vars-translate-source-text": "Grûntekst fan oersetienheid",
+ "abusefilter-edit-builder-vars-translate-target-language": "Doeltaal fan oersetting",
"translate-jssti-add": "Oan list taheakje",
- "translate-js-save": "Bewarje",
- "translate-js-support": "Fraach stelle",
+ "managemessagegroups": "Berjochtegroepbehear",
+ "translate-smg-notallowed": "It is jo net tastien en fier dizze hanneling út.",
+ "translate-smg-nochanges": "Der binne gjin wizigings te ferwurkjen.",
+ "translate-smg-submit": "Wizigings ta ferwurking yntsjinje",
+ "translate-smg-submitted": "De grûnteksten binne bywurke. Wizigings wurde op 'e eftergrûn ferwurke.",
+ "translate-smg-submitted-with-failure": "{{PLURAL:$1|Grûntekst|Grûnteksten}} bywurkjen mislearre foar de neikommende {{PLURAL:$1|groep|groepen}} - $2. $3",
+ "translate-smg-submitted-others-processing": "De grûnteksten foar oare groepen wurde op 'e eftergrûn ferwurke.",
+ "translate-smg-more": "Der binne noch mear wizigings te ferwurkjen nei it yntsjinjen fan dit.",
+ "translate-smg-left": "Berjochtynhâld yn 'e wiki",
+ "translate-smg-right": "Ynkommende wizigings",
+ "translate-smg-rename-select": "Selektearje",
+ "translate-smg-rename-cancel": "Annulearje",
+ "translate-smg-rename-search": "Byhearrend berjocht sykje ...",
+ "translate-smg-rename-select-err": "Graach in berjocht ta omneaming selektearje",
+ "translate-smg-rename-no-msg": "Gjin berjochten fûn.",
+ "translate-smg-rename-new": "Taheakje as nij ...",
+ "translate-smg-rename-rename": "Taheakje as omneaming fan ...",
+ "translate-smg-rename-dialog-title": "Omneaming hearrend by $1 selektearje",
+ "translate-smg-changeset-modified": "De wizigingsset is oanpast troch in oare meidogger of proses. Jo wizigings kinne net fêstlein wurde, om't se dy oare teneate dwaan kinne. Graach de side werlade om de lêste feroarings te besjen.",
+ "translate-smg-no-groups-in-sync": "Der binne no gjin groepen yn syngronisaasje",
+ "translate-smg-strong-sync-help": "Help",
+ "translate-smg-groups-in-sync": "Groepen no yn syngronisaasje",
+ "translate-smg-groups-in-sync-list": "List fan groepen dy't no op 'e eftergrûn ferwurke wurde:",
+ "translate-manage-import-diff": "Berjocht $1 | Hannelings: $2",
+ "translate-manage-import-new": "Nij berjocht $1",
+ "translate-manage-import-deleted": "Wiske berjocht $1",
+ "translate-manage-action-import": "Ymportearje",
+ "translate-manage-action-conflict": "Ymportearje en 'fuzzy' merkbite",
+ "translate-manage-action-ignore": "Negearje",
+ "translate-manage-action-fuzzy": "Ymportearje en oersettings 'fuzzy' merkbite",
+ "translate-manage-action-rename-fuzzy": "Omneame en oersettings 'fuzzy' merkbite",
+ "translate-manage-action-rename": "Omneame",
+ "translate-manage-action-ignore-change": "Oersettingswiziging negearje",
+ "translate-manage-nochanges": "Der binne gjin feroarings yn 'e grûnteksten foar dizze groep.",
+ "translate-manage-nochanges-other": "Der binne gjin feroarings foar dizze taal.\nBrûk de ferwizing hjirûnder en gean werom nei de werjefte fan groepsgegevens.",
+ "translate-manage-inconsistent": "Ynkonsistinsje yn 'e oanfraach ûntdutsen.\nGraach neisjen ta ferbettering en nochris besykje.\nBysûnderheden: $1.",
+ "translate-manage-toolong": "Oer de maksimumferwurkingstiid fan $1 {{PLURAL:$1|sekonde|sekonden}} hinne.\nGraach it formulier op 'e nij yntsjinje om fierder te ferwurkjen.",
+ "translate-manage-import-summary": "Nije ferzje ymportearre fan boarne om utens",
+ "translate-manage-import-rename-summary": "Omneamd yn boarne om utens",
+ "translate-manage-conflict-summary": "Nije ferzje ymportearre fan boarne om utens.\nGraach neisjen.",
+ "translate-manage-submit": "Utfiere",
+ "translate-manage-intro-other": "Hjirûnder stiet in list fan oersettingswizigings yn 'e taal $1.\nSjoch de wizigings nei, en kies foar alle nije ferzjes de hanneling dy't jo útfiere wolle.\nAt jo kieze om wizigings te negearjen, dan jildt dat inkeld tydlik foar no.",
+ "translate-manage-import-ok": "Ymportearre: $1",
+ "translate-manage-import-done": "Ymport slagge!",
+ "importtranslations": "Oersettings ymportearje",
+ "translate-import-from-local": "Opladen lokaal bestân:",
+ "translate-import-load": "Bestân lade",
+ "translate-import-err-dl-failed": "Bestân opheljen mislearre:\n$1",
+ "translate-import-err-ul-failed": "Bestân opladen mislearre",
+ "translate-import-err-invalid-title": "De opjûne bestânsnamme <nowiki>$1</nowiki> is ûnjildich.",
+ "translate-import-err-no-such-file": "It bestân <nowiki>$1</nowiki> bestiet net of is net lokaal opladen.",
+ "translate-import-err-stale-group": "De berjochtegroep dêr't dat bestân ta heart bestiet net.",
+ "translate-import-err-no-headers": "Dat is gjin goed Gettext-bestân yn it formaat fan 'e oersetútwreiding:\nKin de berjochtegroep en taal net fêststelle út 'e bestânskoppen.",
+ "translate-js-support-unsaved-warning": "Jo hawwe net-bewarre oersettings.",
+ "translate-gs-pos": "Plak",
"translate-gs-code": "Koade",
- "translate-gs-continent": "Kontinent",
+ "translate-gs-continent": "Wrâlddiel",
+ "translate-gs-speakers": "Sprekkers",
+ "translate-gs-score": "Skoare",
+ "translate-gs-multiple": "Ferskate",
+ "translate-gs-count": "Tal",
+ "translate-gs-total": "Totaal",
+ "translate-gs-avgscore": "Middelskoare",
"translate-documentation-language": "Berjochtdokumintaasje",
"translate-searchprofile": "Oersettings",
+ "translate-searchprofile-tooltip": "Alle oersettings trochsykje",
+ "translate-searchprofile-note": "Mear sykopsjes binne beskikber mei [$1 de sykfunksje foar oersettings].",
+ "translate-search-languagefilter": "Taalfilter:",
+ "translate-search-nofilter": "Net filterje",
"log-name-translationreview": "Oersettingshifkloch",
+ "log-description-translationreview": "Loch fan alle hifkings oangeande oersettings en berjochtegroepen.",
"logentry-translationreview-message": "$1 {{GENDER:$2|hat}} de oersetting $3 hifke",
+ "logentry-translationreview-group": "$1 {{GENDER:$2|hat}} fan 'e oersettings $4 fan $3, de status feroare fan $6 yn $7",
+ "group-translate-sandboxed": "Net-goedkarde oersetters",
+ "group-translate-sandboxed-member": "net-goedkarde {{GENDER:$1|oersetter|oersetster}}",
+ "right-translate-sandboxmanage": "Sânbakmeidoggers behearen",
+ "action-translate-sandboxmanage": "sânbakmeidoggers te behearen",
+ "right-translate-sandboxaction": "Witelisthannelings fan sânbakmeidoggers útfieren",
+ "action-translate-sandboxaction": "witelisthannelings fan sânbakmeidoggers út te fieren",
+ "translate-workflow-state-": "(net ynsteld)",
+ "translate-workflowstatus": "Status: $1",
+ "translate-workflow-set-doing": "Ynstellen ...",
+ "translate-workflow-autocreated-summary": "Automatysk oanmakke side foar wurkstreamstatus $1",
+ "translate-stats-workflow": "Status",
+ "translate-workflowgroup-label": "Wurkstreamstatussen",
+ "translate-workflowgroup-desc": "Dizze berjochtegroep lit de statussen fan 'e oersetwurkstream sjen.\nDe statussen wurde definiearre yn 'e konfiguraasjefariabele $wgTranslateWorkflowStates.",
+ "translate-dynagroup-recent-label": "Koartlyn oerset",
+ "translate-dynagroup-recent-desc": "Dizze berjochtegroep lit al de oersettings nei dizze taal fan okkerdeis sjen.\nBenammen brûkber foar it hifkwurk.",
+ "translate-dynagroup-additions-label": "Koartlyn taheakke",
+ "translate-dynagroup-additions-desc": "Dizze berjochtegroep lit de nije en feroare berjochten sjen.",
"translate-msggroupselector-projects": "Berjochtegroep",
"translate-msggroupselector-search-placeholder": "Groepen sykje",
"translate-msggroupselector-search-all": "Alles",
+ "translate-msggroupselector-search-recent": "Koartlyn",
"translate-msggroupselector-view-subprojects": "$1 {{PLURAL:$1|subgroep|subgroepen}}",
"tux-languageselector": "Oersette nei",
"tux-tab-all": "Alles",
@@ -91,22 +306,63 @@
"tux-edit": "Bewurkje",
"tux-status-optional": "Opsjoneel",
"tux-status-fuzzy": "Ferâldere",
+ "tux-status-proofread": "Hifke",
"tux-status-translated": "Oerset",
+ "tux-status-saving": "Bewarjen ...",
+ "tux-status-unsaved": "Net bewarre",
+ "tux-save-unknown-error": "In ûnbekende flater die him foar.",
+ "tux-editor-placeholder": "Jo oersetting",
+ "tux-editor-editsummary-placeholder": "Gearfetting opsjoneel",
+ "tux-editor-paste-original-button-label": "Grûntekst plakke",
+ "tux-editor-discard-changes-button-label": "Wizigings fuortsmite",
"tux-editor-save-button-label": "Oersetting bewarje",
+ "tux-editor-skip-button-label": "Oerslaan en fierder",
"tux-editor-cancel-button-label": "Annulearje",
- "tux-editor-proofread-button-label": "As hifke markearje",
- "tux-notices-more": "{{PLURAL:$1|$1 mear}}",
+ "tux-editor-confirm-button-label": "Oersetting befêstigje",
+ "tux-editor-proofread-button-label": "As hifke merkbite",
+ "tux-editor-shortcut-info": "Druk \"$1\" ta befêstiging en folgjend berjocht, \"$2\" is oerslaan, \"$4\" gearfetting jaan, of hâld \"$3\" yndrukt foar oare fluchtoetsen.",
+ "tux-editor-edit-desc": "Dokumintaasje bewurkje",
+ "tux-editor-add-desc": "Dokumintaasje taheakje",
+ "tux-editor-suggestions-title": "Suggestjes",
+ "tux-editor-in-other-languages": "Yn oare talen",
+ "tux-editor-need-more-help": "Mear help nedich?",
+ "tux-editor-ask-help": "Freegje mear ynformaasje",
+ "tux-editor-tm-match": "$1% oerienkomst",
+ "tux-notices-more": "{{PLURAL:$1|noch $1}}",
+ "tux-notices-hide": "ferbergje",
+ "tux-editor-save-failed": "Oersetting bewarjen mislearre: $1",
+ "tux-editor-n-uses": "$1 {{PLURAL:$1|kear}} brûkt",
+ "tux-editor-message-desc-more": "Mear sjen",
+ "tux-editor-message-desc-less": "Minder sjen",
"tux-editor-clear-translated": "Oerset ferbergje",
"tux-editor-proofreading-mode": "Hifkje",
"tux-editor-translate-mode": "List",
"tux-editor-proofreading-hide-own-translations": "Jo oersettings ferbergje",
"tux-editor-proofreading-show-own-translations": "Jo oersettings werjaan",
- "tux-proofread-action-tooltip": "As hifke markearje",
+ "tux-proofread-action-tooltip": "As hifke merkbite",
"tux-proofread-edit-label": "Bewurkje",
"tux-editor-page-mode": "Side",
+ "tux-editor-outdated-notice": "Dizze oersetting moat faaks bywurke wurde.",
+ "tux-editor-outdated-notice-diff-link": "Ferskillen werjaan",
+ "tux-editor-doc-editor-placeholder": "Berjochtdokumintaasje",
+ "tux-editor-doc-editor-save": "Dokumintaasje bewarje",
"tux-editor-doc-editor-cancel": "Annulearje",
+ "tux-messagetable-more-messages": "Noch $1 {{PLURAL:$1|berjocht|berjochten}}",
+ "tux-messagetable-loading-messages": "{{PLURAL:$1|Berjocht|Berjochten}} laden ...",
"tux-message-filter-placeholder": "List filterje",
+ "tux-message-filter-result": "$1 {{PLURAL:$1|treffer|treffers}} fûn foar \"$2\"",
+ "tux-message-filter-advanced-button": "Utwreidich sykje",
"tux-message-filter-optional-messages-label": "Opsjonele berjochten",
+ "tux-proofread-translated-by-self": "Oerset troch jo",
+ "tux-empty-list-all": "Dizze berjochtegroep is leech",
+ "tux-empty-list-all-guide": "Selektearje in oare berjochtegroep om oer te setten",
+ "tux-translate-page-no-such-group": "<strong>De oanjûne groep bestiet net.</strong> Selektearje in oare berjochtegroep.",
+ "tux-empty-list-translated": "Gjin oersette berjochten",
+ "tux-empty-list-translated-guide": "Jo kinne helpe mei oersetten",
+ "tux-empty-list-translated-action": "Oersette",
+ "tux-empty-no-messages-to-display": "Gjin berjochten wer te jaan.",
+ "tux-empty-there-are-optional": "Der binne opsjonele berjochten dy't net yn 'e list werjûn wurde",
+ "tux-empty-show-optional-messages": "Opsjonele berjochten werjaan",
"tux-empty-no-outdated-messages": "Gjin ferâldere berjochten",
"tux-empty-nothing-to-proofread": "Neat te hifkjen",
"tux-empty-you-can-help-providing": "Jo kinne helpe troch nije oersettings te jaan",
@@ -117,8 +373,21 @@
"tux-empty-list-other-action": "Oersettings hifkje",
"tux-empty-list-other-link": "Alle berjochten werjaan",
"tux-editor-close-tooltip": "Slute",
+ "tux-editor-expand-tooltip": "Utklappe",
+ "tux-editor-collapse-tooltip": "Ynklappe",
+ "tux-editor-message-tools-show-editor": "Yn wikibewurker werjaan",
"tux-editor-message-tools-history": "Skiednis",
- "tux-editor-message-tools-delete": "Fuortsmite",
+ "tux-editor-message-tools-delete": "Wiskje",
+ "tux-editor-message-tools-translations": "Alle oersettings",
+ "tux-editor-message-tools-linktothis": "Keppeling nei dit berjocht",
+ "tux-editor-loading": "Laden ...",
+ "tux-editor-loading-failed": "Laden fan oersethelpmiddels mislearre: $1",
+ "translate-search-more-languages-info": "Noch $1 {{PLURAL:$1|taal|talen}}",
"translate-statsbar-tooltip": "$1% oerset, $2% hifke",
- "translate-statsbar-tooltip-with-fuzzy": "$1% oerset, $2% hifke, $3% ferâldere"
+ "translate-statsbar-tooltip-with-fuzzy": "$1% oerset, $2% hifke, $3% ferâldere",
+ "translate-search-more-groups-info": "Noch $1 {{PLURAL:$1|groep|groepen}}",
+ "translate-syntax-error": "De oersetting befettet syntaksflaters",
+ "tux-session-expired": "Jo binne net mear ynlogd. Meld jo oan yn in oar tabblêd. Of meitsje oars in kopy fan 'e net-bewarre oersettings, meld jo oan, gean werom nei dizze side en fier jo oersettings wer yn.",
+ "tux-nojs": "Dit ark wurket net sûnder JavaScript. JavaScript is útskeakele, makket flaters, of dizze webblêder wurdt net stipe.",
+ "specialpages-group-translation": "Oersetten"
}
diff --git a/MLEB/Translate/i18n/core/ga.json b/MLEB/Translate/i18n/core/ga.json
index 283bf471..b31f51b7 100644
--- a/MLEB/Translate/i18n/core/ga.json
+++ b/MLEB/Translate/i18n/core/ga.json
@@ -13,13 +13,10 @@
"translate-page-language": "Teanga",
"translate-submit": "Faigh",
"translate-page-navigation-legend": "Nascleanúint",
- "translate-edit-in-other-languages": "Teachtaireacht \"$1\" i dteangacha eile",
"translate-statsf-scale-days": "Lae",
"translate-statsf-scale-hours": "Uaire",
"translate-statsf-submit": "Réamhamharc",
"translate-translations-fieldset-title": "Teachtaireacht",
"translate-translations-messagename": "Ainm:",
- "translate-language": "Teanga",
- "translate-js-summary": "Achoimre:",
- "translate-js-save": "Sábháil"
+ "translate-language": "Teanga"
}
diff --git a/MLEB/Translate/i18n/core/gcr.json b/MLEB/Translate/i18n/core/gcr.json
index 1604022b..bff13ad9 100644
--- a/MLEB/Translate/i18n/core/gcr.json
+++ b/MLEB/Translate/i18n/core/gcr.json
@@ -5,7 +5,6 @@
"Léon973"
]
},
- "translate-edit-translation": "Anmòrfrézaj",
"translate-edit-contribute": "kontribiyé",
"translate-manage-import-new": "Mésaj nòv $1",
"translate-documentation-language": "Dokimantasyon di mésaj",
diff --git a/MLEB/Translate/i18n/core/gl.json b/MLEB/Translate/i18n/core/gl.json
index 8ff1e310..0b4c9f78 100644
--- a/MLEB/Translate/i18n/core/gl.json
+++ b/MLEB/Translate/i18n/core/gl.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Alma",
+ "ArenaL5",
"Banjo",
"Elisardojm",
"Fitoschido",
@@ -46,11 +47,9 @@
"translate-ignored": "(ignorado)",
"translate-edit-title": "Editar \"$1\"",
"translate-edit-definition": "Definición da mensaxe",
- "translate-edit-translation": "Tradución",
"translate-edit-contribute": "contribuír",
"translate-edit-no-information": "<em>Esta mensaxe non ten documentación.\nSe sabe onde ou como se usa esta mensaxe, pode axudar aos outros tradutores engadíndolle datos.</em>",
"translate-edit-information": "Información acerca da mensaxe ($1)",
- "translate-edit-in-other-languages": "Mensaxe noutras linguas",
"translate-edit-warnings": "Avisos acerca de traducións incompletas",
"translate-edit-tmmatch-source": "Texto fonte da tradución: $1",
"translate-edit-tmmatch": "$1% de coincidencia",
@@ -179,7 +178,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|lingua|linguas}} en total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|edición|edicións}}; última edición hai $3 {{PLURAL:$3|día|días}}",
"abusefilter-edit-builder-vars-translate-source-text": "Texto de orixe da unidade de traducción",
- "translate-save": "Gardar ($1)",
"translate-jssti-add": "Engadir á lista",
"managemessagegroups": "Xestión dos grupos de mensaxes",
"translate-smg-notallowed": "Non che está permitido facer esta acción.",
@@ -215,14 +213,7 @@
"translate-import-err-no-such-file": "O ficheiro \"<nowiki>$1</nowiki>\" non existe ou non foi cargado localmente.",
"translate-import-err-stale-group": "O grupo de mensaxes ao que pertence este ficheiro non existe.",
"translate-import-err-no-headers": "O ficheiro non é un ficheiro Gettext ben formado co formato da extensión Translate:\nnon se poden determinar o grupo e a lingua a partir das cabeceiras do ficheiro.",
- "translate-js-summary": "Resumo:",
- "translate-js-save": "Gardar",
- "translate-js-next": "Gardar e abrir a seguinte",
- "translate-js-skip": "Pasar á seguinte",
- "translate-js-history": "Historial de tradución",
- "translate-js-support": "Facer unha pregunta",
- "translate-js-support-title": "Pida axuda se non dispón de información suficiente para traducir a mensaxe correctamente.",
- "translate-js-support-unsaved-warning": "Ten algunha tradución sen gardar.",
+ "translate-js-support-unsaved-warning": "Ten algunha tradución sen publicar.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Código",
"translate-gs-continent": "Continente",
@@ -275,14 +266,14 @@
"tux-status-fuzzy": "Anticuada",
"tux-status-proofread": "Revisada",
"tux-status-translated": "Traducida",
- "tux-status-saving": "Gardando...",
- "tux-status-unsaved": "Sen gardar",
+ "tux-status-saving": "Publicando...",
+ "tux-status-unsaved": "Sen publicar",
"tux-save-unknown-error": "Houbo un erro descoñecido.",
"tux-editor-placeholder": "A súa tradución",
"tux-editor-editsummary-placeholder": "Resumo opcional",
"tux-editor-paste-original-button-label": "Pegar o texto fonte",
"tux-editor-discard-changes-button-label": "Descartar as modificacións",
- "tux-editor-save-button-label": "Gardar a tradución",
+ "tux-editor-save-button-label": "Publicar a tradución",
"tux-editor-skip-button-label": "Pasar á seguinte",
"tux-editor-cancel-button-label": "Cancelar",
"tux-editor-confirm-button-label": "Confirmar a tradución",
@@ -297,7 +288,7 @@
"tux-editor-tm-match": "$1% de coincidencia",
"tux-notices-more": "{{PLURAL:$1|$1 máis}}",
"tux-notices-hide": "agochar",
- "tux-editor-save-failed": "Houbo un erro ao gardar a tradución: $1",
+ "tux-editor-save-failed": "Houbo un erro ao publicar a tradución: $1",
"tux-editor-n-uses": "utilizada $1 {{PLURAL:$1|vez|veces}}",
"tux-editor-message-desc-more": "Ollar máis",
"tux-editor-message-desc-less": "Ollar menos",
@@ -312,7 +303,7 @@
"tux-editor-outdated-notice": "Esta tradución pode necesitar unha actualización.",
"tux-editor-outdated-notice-diff-link": "Amosar as diferenzas",
"tux-editor-doc-editor-placeholder": "Documentación da mensaxe",
- "tux-editor-doc-editor-save": "Gardar a documentación",
+ "tux-editor-doc-editor-save": "Publicar a documentación",
"tux-editor-doc-editor-cancel": "Cancelar",
"tux-messagetable-more-messages": "$1 {{PLURAL:$1|mensaxe|mensaxes}} máis",
"tux-messagetable-loading-messages": "Cargando {{PLURAL:$1|a mensaxe|as mensaxes}}...",
diff --git a/MLEB/Translate/i18n/core/gld.json b/MLEB/Translate/i18n/core/gld.json
new file mode 100644
index 00000000..82c9629f
--- /dev/null
+++ b/MLEB/Translate/i18n/core/gld.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "RFScott"
+ ]
+ },
+ "supportedlanguages": "Активнай хэсэсэл",
+ "translate-smg-group-message-tag-rename": "Гисурэгувури",
+ "translate-manage-source-message-not-found": "Гисурэмбэ - тэй хай? Эчиэ ба̄рапу",
+ "translate-documentation-language": "Бичхэсэлбэ"
+}
diff --git a/MLEB/Translate/i18n/core/grc.json b/MLEB/Translate/i18n/core/grc.json
index f2f02040..8bcfd108 100644
--- a/MLEB/Translate/i18n/core/grc.json
+++ b/MLEB/Translate/i18n/core/grc.json
@@ -20,7 +20,6 @@
"translate-optional": "(προαιρετικόν)",
"translate-ignored": "(ἠγνοημένη)",
"translate-edit-contribute": "συμβάλλειν",
- "translate-edit-in-other-languages": "Τὸ μήνυμα \"$1\" ἀλλογλωσσιστί",
"translate-rc-translation-filter-no": "Ἀπραξία",
"translate-stats-edits": "Μεταγραφαί",
"translate-stats-users": "Μεταγλωττισταί",
@@ -45,6 +44,5 @@
"translate-percentage-complete": "Πλήρωσις",
"translate-percentage-fuzzy": "Ἀπηρχαιωμένη",
"translate-mgs-column-language": "Γλῶττα",
- "translate-save": "Γράφειν ($1)",
"translate-documentation-language": "Τεκμηρίωσις μηνύματος"
}
diff --git a/MLEB/Translate/i18n/core/gsw.json b/MLEB/Translate/i18n/core/gsw.json
index d427a767..528b2db2 100644
--- a/MLEB/Translate/i18n/core/gsw.json
+++ b/MLEB/Translate/i18n/core/gsw.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ignoriert)",
"translate-edit-title": "„$1“ bearbeite",
"translate-edit-definition": "Syschtemnochricht im Original",
- "translate-edit-translation": "Ibersetzig",
"translate-edit-contribute": "bearbeite",
"translate-edit-no-information": "''Die Syschtemnochricht het no kei Dokumentation. Wänn Du weisch, wu un in welem Zämmehang si bruucht wird, no chasch andere Ibersetzer hälfe, wänn Du ne Dokumentation zuefiegsch.''",
"translate-edit-information": "Information iber d Syschtemnochricht ($1)",
- "translate-edit-in-other-languages": "Syschtemnochricht in andere Sproche",
"translate-edit-warnings": "Warnig iber uuvollständigi Ibersetzige",
"translate-edit-tmmatch-source": "Ibersetzigsquälltext: $1",
"translate-edit-tmmatch": "$1% Ibereinstimmig",
@@ -158,7 +156,6 @@
"supportedlanguages-recenttranslations": "Aktuälli Ibersetzige",
"supportedlanguages-count": "Insgsamt $1 {{PLURAL:$1|Sprooch|Sprooche}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|Bearbeitig|Bearbeitige}} - letschti Bearbeitig vor $3 {{PLURAL:$3|Daag|Dääg}}",
- "translate-save": "Spychere ($1)",
"translate-jssti-add": "Zue dr Lischt zuefiege",
"managemessagegroups": "Nochrichtegruppeverwaltig",
"translate-smg-notallowed": "Du derfsch die Aktion nit uusfiere",
@@ -193,13 +190,6 @@
"translate-import-err-no-such-file": "D Datei <nowiki>$1</nowiki> git s nit oder isch nit lokal uffeglade wore.",
"translate-import-err-stale-group": "D Nochrichtegruppe, wu die Datei zuegordnet woren isch, git s nit.",
"translate-import-err-no-headers": "D Datei isch kei Datei im Gettext-Format vu dr Erwyterig „Translate“:\nD Gruppen un Sproche hän nit us em Dateichopf chenne ermittlet wäre.",
- "translate-js-summary": "Zämmefassig:",
- "translate-js-save": "Spychere",
- "translate-js-next": "Spychere un di negscht ufmache",
- "translate-js-skip": "Ibergumpe zue dr negschte",
- "translate-js-history": "Ibersetzigsgschicht",
- "translate-js-support": "Frog stelle",
- "translate-js-support-title": "Frog no Hilf, wänn s nit gnue Informatione git go die Nochricht richtig ibersetze.",
"translate-js-support-unsaved-warning": "S het nit gspychereti Ibersetzige.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/gu.json b/MLEB/Translate/i18n/core/gu.json
index 5f6e6501..44d981de 100644
--- a/MLEB/Translate/i18n/core/gu.json
+++ b/MLEB/Translate/i18n/core/gu.json
@@ -39,11 +39,9 @@
"translate-ignored": "ઉપેક્ષીત",
"translate-edit-title": "\"$1\" સંપાદન કરો",
"translate-edit-definition": "સંદેશ વ્યાખ્યા",
- "translate-edit-translation": "ભાષાંતર",
"translate-edit-contribute": "યોગદાન",
"translate-edit-no-information": "<em>આ સંદેશામાં દસ્તાવેજ નથી.\n\nજો તમે જાણતા હો કે ક્યાં અને કેવી રીતે આ સંદેશો વપરાયો છે, તો તમે આ સંદેશામાં દસ્તાવેજ ઉમેરી અને અન્ય ભાષાંતરકારોને મદદ કરી શકો છો.</em>",
"translate-edit-information": "સંદેશા વિશે માહિતી ($1)",
- "translate-edit-in-other-languages": "અન્ય ભાષાઓમાં સંદેશો",
"translate-edit-warnings": "અધુરા ભાષાંતરો વિશે ચેતવણી",
"translate-edit-tmmatch-source": "ભાષાંતર સ્ત્રોત લખાણ: $1",
"translate-edit-tmmatch": "$1% મેળ",
@@ -93,7 +91,7 @@
"translate-statsf-language": "અલ્પવિરામ વિભાજીત ભાષાસંહિતાઓની યાદી:",
"translate-statsf-group": "અલ્પવિરામ વિભાજીત સમુદાય સંહિતાઓની યાદી:",
"translate-statsf-submit": "પૂર્વદર્શન",
- "translate-tag-page-desc": "વિકિ પાનાં [[$2|$1]]નું $3 ($4)થી ભાષાંતર.",
+ "translate-tag-page-desc": "વિકિ પાના [[$2|$1]]નું $3 ($4)થી ભાષાંતર.",
"translate-sidebar-alltrans": "બીજી ભાષાઓમાં",
"translations": "બધાં ભાષાંતરો",
"translate-translations-fieldset-title": "સંદેશ",
@@ -122,7 +120,6 @@
"translate-mgs-column-language": "ભાષા",
"supportedlanguages": "આધારિત ભાષાઓ",
"supportedlanguages-recenttranslations": "તાજેતરનાં ભાષાંતરો",
- "translate-save": "સાચવો ($1)",
"translate-jssti-add": "સૂચિમાં ઉમેરો",
"translate-manage-import-new": "નવા સંદેશો $1",
"translate-manage-import-deleted": "દૂર કરેલ સંદેશ $1",
@@ -131,8 +128,6 @@
"importtranslations": "ભાષાંતરો આયાત કરો",
"translate-import-from-local": "સ્થાનિક ફાઇલ અપલોડ કરો:",
"translate-import-load": "ફાઇલ લાવો",
- "translate-js-save": "સાચવો",
- "translate-js-support": "પ્રશ્ન પૂછો",
"translate-gs-code": "નાકો",
"translate-gs-continent": "સામગ્રી",
"translate-gs-speakers": "વક્તાઓ",
diff --git a/MLEB/Translate/i18n/core/guc.json b/MLEB/Translate/i18n/core/guc.json
new file mode 100644
index 00000000..4070d9e4
--- /dev/null
+++ b/MLEB/Translate/i18n/core/guc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Leonfd1992"
+ ]
+ },
+ "translate-documentation-language": "Kanüliamaakalu süpülajana pütchi"
+}
diff --git a/MLEB/Translate/i18n/core/guw.json b/MLEB/Translate/i18n/core/guw.json
new file mode 100644
index 00000000..f48c1d37
--- /dev/null
+++ b/MLEB/Translate/i18n/core/guw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Samatics"
+ ]
+ },
+ "translate-smg-strong-sync-help": "Alọgọ"
+}
diff --git a/MLEB/Translate/i18n/core/gv.json b/MLEB/Translate/i18n/core/gv.json
index 391db643..98025077 100644
--- a/MLEB/Translate/i18n/core/gv.json
+++ b/MLEB/Translate/i18n/core/gv.json
@@ -8,6 +8,5 @@
"translate": "Dy hyndaa",
"translate-page-group": "Possan",
"translate-page-language": "Çhengey",
- "translate-page-limit": "Jeoraght",
- "translate-edit-in-other-languages": "Çhaghteraght ayns çhengaghyn elley"
+ "translate-page-limit": "Jeoraght"
}
diff --git a/MLEB/Translate/i18n/core/he.json b/MLEB/Translate/i18n/core/he.json
index 67ae17ec..315d19ed 100644
--- a/MLEB/Translate/i18n/core/he.json
+++ b/MLEB/Translate/i18n/core/he.json
@@ -11,6 +11,7 @@
"Shirayuki",
"Steeve815",
"YaronSh",
+ "דגש",
"דגש חזק",
"חיים",
"ערן",
@@ -52,11 +53,9 @@
"translate-ignored": "(לא לתרגום)",
"translate-edit-title": "עריכת \"$1\"",
"translate-edit-definition": "הגדרת ההודעה",
- "translate-edit-translation": "תרגום",
"translate-edit-contribute": "לתרום תיעוד",
"translate-edit-no-information": "<em>להודעה זו אין תיעוד.\nאם ידוע לך היכן או כיצד משתמשים בהודעה הזאת, באפשרותך לעזור למתרגמים אחרים באמצעות הוספת תיעוד להודעה זו.</em>",
"translate-edit-information": "מידע על ההודעה ($1)",
- "translate-edit-in-other-languages": "ההודעה בשפות אחרות",
"translate-edit-warnings": "אזהרות על תרגומים חלקיים",
"translate-edit-tmmatch-source": "טקסט המקור של התרגום: $1",
"translate-edit-tmmatch": "רמת התאמה: $1%",
@@ -150,7 +149,12 @@
"translate-statsf-language": "רשימת קודי שפה (מופרדים בפסיק):",
"translate-statsf-group": "רשימת קודי קבוצות (מופרדים בפסיק):",
"translate-statsf-submit": "תצוגה מקדימה",
- "translate-tag-page-desc": "תרגום של דף הוויקי [[$2|$1]] מ־$3 ($4).",
+ "translate-statsf-unknown-error": "אירעה שגיאה בלתי־ידועה.",
+ "translate-statsf-error-message": "אירעה שגיאה בעת טעינת התרשים: $1",
+ "translate-statsf-graph-alt-text-info": "טקסט חלופי לסטטיסטיקת התרגום בטבלת הנתונים להלן.",
+ "translate-statsf-alt-text": "זה הטקסט החלופי לסטטיסטיקות התרגום.",
+ "translate-statsf-embed": "קוד לשיבוץ בתרשים סטטיסטיקות התרגום בדפים אחרים.",
+ "translate-tag-page-desc": "תרגום של דף הוויקי [[$2|$1]] מ{{GRAMMAR:תחילית|$3}} ($4).",
"translate-sidebar-alltrans": "בשפות אחרות",
"translations": "כל התרגומים",
"translations-summary": "הקלידו את שם ההודעה להלן כדי להציג את כל התרגומים הזמינים.",
@@ -163,7 +167,7 @@
"translate-translations-including-no-param": "אנא ציינו שם הודעה תקין בפרמטר של דף המשנה",
"translate-translations-history-short": "ג״ק",
"languagestats": "סטטיסטיקת השפה",
- "languagestats-summary": "דף זה מציג את סטטיסטיקת התרגומים עבור כל קבוצות ההודעות של שפה.",
+ "languagestats-summary": "הדף הזה מציג את סטטיסטיקת תרגומים עבור כל קבוצות ההודעות של שפה.",
"messagegroupstats-summary": "הדף הזה מציג סטטיסטיקות של קבוצות הודעות.",
"languagestats-stats-for": "סטטיסטיקות תרגום עבור $1 ($2).",
"languagestats-recenttranslations": "תרגומים אחרונים",
@@ -195,8 +199,8 @@
"translate-mgs-totals": "{{PLURAL:$1|שפה אחת|כל $1 השפות ביחד}}",
"translate-mgs-invalid-group": "הקבוצה $1 אינה קיימת.",
"translate-mgs-nothing": "אין מה להראות עבור הסטטיסטיקות המבוקשות.",
- "supportedlanguages": "שפות נתמכות",
- "supportedlanguages-summary": "הדף הזה מציג רשימה של כל השפות שהאתר {{SITENAME}} תומך בהן,\nעם שמות של מתרגמים שעובדים על אותן השפות.\nגודל שם המתרגם יחסי למספר העריכות שלו.\nצבע הקו התחתי מראה כמה זמן המתרגם פעיל כאן.",
+ "supportedlanguages": "שפות פעילות",
+ "supportedlanguages-summary": "הדף הזה מציג רשימה של השפות הפעילות בהאתר {{SITENAME}},\nעם שמות של מתרגמים שעובדים על אותן השפות.\nגודל שם המתרגם יחסי למספר העריכות שלו.\nצבע הקו התחתי מראה כמה זמן המתרגם פעיל כאן.",
"supportedlanguages-colorlegend": "מקרא לצבעים: תרגום אחרון לפני $1 ימים",
"supportedlanguages-sqlite-error": "אין תמיכה ב־SQLite",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|מתרגם|מתרגמת}}|מתרגמים}}: $1",
@@ -206,7 +210,6 @@
"translate-supportedlanguages-cached": "המידע הזה נשמר במטמון לפני $1.",
"abusefilter-edit-builder-vars-translate-source-text": "טקסט המקור של יחידת התרגום",
"abusefilter-edit-builder-vars-translate-target-language": "שפת היעד לתרגום",
- "translate-save": "פרסום ($1)",
"translate-jssti-add": "הוספה לרשימה",
"managemessagegroups": "ניהול קבוצות הודעות",
"translate-smg-notallowed": "אין לך הרשאה לבצע פעולה זו.",
@@ -227,6 +230,24 @@
"translate-smg-rename-rename": "להוסיף בתור שינוי שם של...",
"translate-smg-rename-dialog-title": "להציג שינוי שם מתאים עבור $1",
"translate-smg-changeset-modified": "ערכת השינויים שונתה על־ידי משתמש או תהליך אחר. השינויים שלך אינם יכולים להתפרסם כי הם יכולים לדרוס את השינויים שלהם. נא לרענן את הדף כדי לראות את השינויים האחרונים.",
+ "translate-smg-no-groups-in-sync": "אין קבוצות שמסתנכרנות כעת",
+ "translate-smg-strong-sync-help": "עזרה",
+ "translate-smg-groups-in-sync": "קבוצות שמסתנכרנות כעת",
+ "translate-smg-groups-in-sync-list": "רשימת קבוצות שמעובדות ברקע כעת:",
+ "translate-smg-groups-with-error-title": "קבוצות שהיו בהן שגיאות בעת סנכרון",
+ "translate-smg-groups-with-error-desc": "רשימת קבוצות והודעות שהיו בהן שגיאות בעת סנכרון:",
+ "translate-smg-group-with-error-summary": "{{PLURAL:$1|הודעה אחת|$1 הודעות}} עם שגיאות:",
+ "translate-smg-group-message-action-history": "היסטוריה",
+ "translate-smg-group-action-resolve": "סימון הבעיה כפתורה",
+ "translate-smg-group-message-tag-outdated": "לא עדכניות",
+ "translate-smg-group-message-tag-rename": "שינוי שם",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|תג|תגים}}",
+ "translate-smg-group-message-message-content": "תוכן:",
+ "translate-smg-group-message-message-target": "יעד:",
+ "translate-smg-group-message-message-replacement": "החלפה:",
+ "translate-smg-group-message-message-other-langs": "שפות אחרות:",
+ "translate-smg-loading": "בטעינה...",
+ "translate-smg-unknown-error": "אירעה שגיאה לא ידועה בעת עיבוד בקשתך.",
"translate-manage-import-diff": "הודעה $1 | פעולות: $2",
"translate-manage-import-new": "הודעה חדשה $1",
"translate-manage-import-deleted": "הודעה שנמחקה $1",
@@ -238,16 +259,19 @@
"translate-manage-action-rename": "שינוי שם",
"translate-manage-action-ignore-change": "להתעלם משינוי התרגום",
"translate-manage-nochanges": "אין שינויים להגדרות ההודעות עבור קבוצה זו.",
- "translate-manage-nochanges-other": "אין שינויים עבור השפה הזאת.\nהשתמשו בקישור למטה כדי לחוזר לתצוגת פרטי קבוצה.",
- "translate-manage-inconsistent": "התגלתה חוסר עקביות בבקשה.\nנא לבדוק את השינויים ולנסות שוב.\nפרטים: $1",
+ "translate-manage-nochanges-other": "לא היו שינויים עבור השפה הזאת.\nהשתמשו בקישור למטה כדי לחזור לתצוגת פרטי קבוצה.",
+ "translate-manage-inconsistent": "התגלה חוסר־עקביות בבקשה.\nנא לבדוק את השינויים ולנסות שוב.\nפרטים: $1",
"translate-manage-toolong": "זמן העיבוד המרבי של {{PLURAL:$1|שנייה אחת|$1 שניות}} תם.\nנא לשלוח מחדש את הטופס כדי להמשיך בעיבודו.",
"translate-manage-import-summary": "יבוא גרסה חדשה ממקור חיצוני",
"translate-manage-import-rename-summary": "השם שוּנה במקור חיצוני",
"translate-manage-conflict-summary": "מייבא גרסה חדשה ממקור חיצוני.\nנא לבדוק.",
"translate-manage-submit": "הפעלה",
- "translate-manage-intro-other": "להלן רשימה של שינויי תרגום ב$1.\nנא לסקור את השינויים ולבחור את הפעולה שברצונך לעשות עבור כל תרגום.\nהתעלמות מהשינויים תגרום לכך שהם יידרסו בייצוא הבא.",
+ "translate-manage-intro-other": "להלן רשימה של שינויי תרגום ב$1.\nנא לסקור את השינויים ולבחור את הפעולה שברצונך לעשות עבור כל עדכון.\nהתעלמות מהשינויים תגרום לכך שהפעולה הזאת תהיה רק זמנית.",
"translate-manage-import-ok": "יובא: $1",
"translate-manage-import-done": "היבוא בוצע!",
+ "translate-manage-empty-content": "התוכן ריק",
+ "translate-manage-key-reused": "ההודעה הזאת כבר קיימת בוויקי. נא לבדוק אם נעשה שימוש חוזר במפתח ישן.",
+ "translate-manage-source-message-not-found": "הגדרת ההודעה לא נמצאה",
"importtranslations": "יבוא תרגומים",
"translate-import-from-local": "העלאת קובץ מקומי:",
"translate-import-load": "טעינת קובץ",
@@ -256,14 +280,7 @@
"translate-import-err-invalid-title": "שם הקובץ שצוין, <nowiki>$1</nowiki>, אינו תקין.",
"translate-import-err-no-such-file": "הקובץ <nowiki>$1</nowiki> אינו קיים או שהוא לא הועלה באופן מקומי.",
"translate-import-err-stale-group": "קבוצת ההודעות שהקובץ הזה שייך אליה אינה קיימת.",
- "translate-import-err-no-headers": "הקובץ זה אינו קובץ Gettext תקין בתסדיר שתואם להרחבת התרגום:\nלא ניתן לקבוע אץ הקבוצה ואת השפה מכותרות הקובץ.",
- "translate-js-summary": "תקציר:",
- "translate-js-save": "פרסום",
- "translate-js-next": "לפרסם ולפתוח את ההודעה הבאה",
- "translate-js-skip": "מעבר להודעה הבאה",
- "translate-js-history": "היסטוריית התרגום",
- "translate-js-support": "לשאול שאלה",
- "translate-js-support-title": "לבקש עזרה אם אין מספיק מידע לתרגום נכון של ההודעה הזאת.",
+ "translate-import-err-no-headers": "הקובץ זה אינו קובץ Gettext תקין בתסדיר שתואם להרחבה Translate:\nלא ניתן לקבוע את קבוצ ההודעות ואת השפה מכותרי הקובץ.",
"translate-js-support-unsaved-warning": "יש לך תרגומים שלא התפרסמו.",
"translate-gs-pos": "מקום",
"translate-gs-code": "קוד",
@@ -329,7 +346,7 @@
"tux-editor-cancel-button-label": "ביטול",
"tux-editor-confirm-button-label": "אישור תרגום",
"tux-editor-proofread-button-label": "לסמן שהתרגום נסקר",
- "tux-editor-shortcut-info": "אפשר ללחוץ על \"$1\" לאישור ומעבר להודעה הבאה, \"$2\" למעבר להודעה הבאה, \"$4\" לכתיבת תקציר או להחזיק \"$3\" להצגת קיצורים אחרים.",
+ "tux-editor-shortcut-info": "{{GENDER:|לחץ|לחצי}} על \"$1\" לאישור ומעבר להודעה הבאה, \"$2\" למעבר להודעה הבאה, \"$4\" לכתיבת תקציר או {{GENDER:|החזק|החזיקי}} \"$3\" להצגת קיצורים אחרים.",
"tux-editor-edit-desc": "עריכת תיעוד",
"tux-editor-add-desc": "הוספת תיעוד",
"tux-editor-suggestions-title": "הצעות",
@@ -393,7 +410,7 @@
"tux-editor-loading-failed": "טעינת עזרי תרגום לא עבדה: $1",
"translate-search-more-languages-info": "עוד {{PLURAL:$1|שפה אחת|$1 שפות}}",
"translate-statsbar-tooltip": "$1% תורגם, $2% נסקר",
- "translate-statsbar-tooltip-with-fuzzy": "$1% תורגם, $2% נסקר, $3% דורש סקירה",
+ "translate-statsbar-tooltip-with-fuzzy": "$1% מתורגמות, $2% בדוקות, $3% לא מעודכנות",
"translate-search-more-groups-info": "עוד {{PLURAL:$1|קבוצה אחת|$1 קבוצות}}",
"translate-syntax-error": "התרגום מכיל שגיאות תחביר",
"tux-session-expired": "אינך נמצא בחשבון עוד. נא להיכנס בלשונית אחרת. לחלופין, יש להעתיק תרגומים שלא נשמרו, להיכנס, לחזור לדף הזה, ולהזין שוב את התרגומים שלך.",
diff --git a/MLEB/Translate/i18n/core/hi.json b/MLEB/Translate/i18n/core/hi.json
index 8ee92909..6da703b6 100644
--- a/MLEB/Translate/i18n/core/hi.json
+++ b/MLEB/Translate/i18n/core/hi.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Abijeet Patro",
"Amire80",
"Ansumang",
"Ashishbhatnagar72",
@@ -38,10 +39,8 @@
"translate-ignored": "(अवगणित)",
"translate-edit-title": "सम्पादन \"$1\"",
"translate-edit-definition": "संदेश व्याख्या",
- "translate-edit-translation": "अनुवाद",
"translate-edit-contribute": "योगदान",
"translate-edit-information": "संदेश ($1) के बारे में जानकारी",
- "translate-edit-in-other-languages": "संदेश अन्य भाषा में",
"translate-edit-tmmatch": "$1% मैच",
"translate-edit-askpermission": "अनुमति लें",
"translate-export-form-format": "प्रारूप",
@@ -51,6 +50,8 @@
"translate-pref-editassistlang": "सहायक भाषा:",
"prefs-translate": "अनुवाद विकल्प",
"right-translate-messagereview": "अनुवाद समीक्षा",
+ "translate-rcfilters-translations": "अनुवाद",
+ "translate-rcfilters-translations-only-label": "अनुवाद",
"translate-rc-translation-filter": "अनुवाद फ़िल्टर करें:",
"translate-rc-translation-filter-no": "कुछ न करें",
"translate-rc-translation-filter-only": "केवल अनुवाद दिखाएँ",
@@ -115,25 +116,21 @@
"supportedlanguages-recenttranslations": "हाल में हुए अनुवाद",
"supportedlanguages-count": "$1 {{PLURAL:$1|भाषा|भाषाएँ}} कुल ।",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|सम्पादन|सम्पादन}} - शेष सम्पादन $3 {{PLURAL:$3|दिन|दिन}} पेहले",
- "translate-save": "सहेजें ($1)",
"translate-jssti-add": "सूची में जोड़ें",
+ "translate-smg-rename-select": "चुनें",
+ "translate-smg-rename-cancel": "रद्द करें",
+ "translate-smg-strong-sync-help": "सहायता",
"translate-manage-import-diff": "संदेश $1 | क्रियाएँ: $2",
"translate-manage-import-new": "नये सन्देश $1",
"translate-manage-action-import": "आयात",
"translate-manage-action-conflict": "आयात और फजी",
"translate-manage-action-ignore": "उपेक्षा",
+ "translate-manage-action-rename": "नाम बदलें",
"translate-manage-import-done": "आयात पूर्ण!",
"importtranslations": "अनुवाद आयात करें",
"translate-import-from-local": "स्थानीय फ़ाइल अपलोड:",
"translate-import-load": "लोड़ फ़ाइल",
"translate-import-err-ul-failed": "फ़ाइल अपलोड विफल रहा",
- "translate-js-summary": "सारांश:",
- "translate-js-save": "सहेजें",
- "translate-js-next": "सहेजें और अगले सन्देश-कुंजी खोलें",
- "translate-js-skip": "त्यागें और अगली सन्देश-कुंजी खोलें",
- "translate-js-history": "अनुवाद इतिहास",
- "translate-js-support": "सवाल पूछें",
- "translate-js-support-title": "कृपया मदद मांगें अगर इस सन्देश के अनुवाद में कोई जानकारी की कमी हो तो",
"translate-js-support-unsaved-warning": "आपके पास बिना सहेजे गये अनुवाद हैं।",
"translate-gs-code": "कोड",
"translate-gs-continent": "महाद्वीप",
diff --git a/MLEB/Translate/i18n/core/hr.json b/MLEB/Translate/i18n/core/hr.json
index e63a4ca0..18d0d816 100644
--- a/MLEB/Translate/i18n/core/hr.json
+++ b/MLEB/Translate/i18n/core/hr.json
@@ -4,6 +4,7 @@
"Bugoslav",
"Dalibor Bosits",
"Dnik",
+ "Eleassar",
"Ex13",
"MaGa",
"Neptune, the Mystic",
@@ -47,11 +48,9 @@
"translate-ignored": "(zanemareno)",
"translate-edit-title": "Uredi \"$1\"",
"translate-edit-definition": "Definicija poruke",
- "translate-edit-translation": "Prijevod",
"translate-edit-contribute": "dodaj",
"translate-edit-no-information": "<em>Ova poruka nema dokumentacije. Ako znate gdje ili kako se koristi poruka, možete pomoći drugim prevoditeljima dodavajući dokumentaciju ovoj poruci.</em>",
"translate-edit-information": "Informacije o poruci ($1)",
- "translate-edit-in-other-languages": "Poruka na ostalim jezicima",
"translate-edit-warnings": "Upozorenja o nepotpunim prijevodima",
"translate-edit-tmmatch-source": "Izvorni tekst: $1",
"translate-edit-tmmatch": "$1% podudarnosti",
@@ -181,7 +180,6 @@
"translate-supportedlanguages-cached": "Ova informacija nalazila se u međuspremniku prije: $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Izvorni tekst prijevodne jedinice",
"abusefilter-edit-builder-vars-translate-target-language": "Željeni jezik za prevođenje",
- "translate-save": "Objavi ($1)",
"translate-jssti-add": "Dodaj na popis",
"managemessagegroups": "Upravljanje skupinom poruka",
"translate-smg-notallowed": "Nije Vam dopušteno izvršiti ovu radnju.",
@@ -220,13 +218,6 @@
"translate-import-load": "Učitaj datoteku",
"translate-import-err-ul-failed": "Postavljanje datoteke nije uspjelo",
"translate-import-err-invalid-title": "Navedeno ime datoteke <nowiki>$1</nowiki> nije bilo valjano.",
- "translate-js-summary": "Sažetak:",
- "translate-js-save": "Objavi",
- "translate-js-next": "Objavi i otvori sljedeću",
- "translate-js-skip": "Prijeđi na sljedeću poruku",
- "translate-js-history": "Povijest prijevoda",
- "translate-js-support": "Postavi pitanje",
- "translate-js-support-title": "Zatražite pomoć ako nemate dovoljno informacija za ispravan prijevod ove poruke.",
"translate-js-support-unsaved-warning": "Imate neobjavljenih prijevoda.",
"translate-gs-pos": "Mj.",
"translate-gs-code": "Kôd",
diff --git a/MLEB/Translate/i18n/core/hrx.json b/MLEB/Translate/i18n/core/hrx.json
new file mode 100644
index 00000000..92ff4ec8
--- /dev/null
+++ b/MLEB/Translate/i18n/core/hrx.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iohanen"
+ ]
+ },
+ "translate-documentation-language": "Nochrichtedokumentation"
+}
diff --git a/MLEB/Translate/i18n/core/hsb.json b/MLEB/Translate/i18n/core/hsb.json
index d23937ff..a28a36b4 100644
--- a/MLEB/Translate/i18n/core/hsb.json
+++ b/MLEB/Translate/i18n/core/hsb.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ignorowany)",
"translate-edit-title": "\"$1\" wobdźěłać",
"translate-edit-definition": "Definicija zdźělenki",
- "translate-edit-translation": "Přełožk",
"translate-edit-contribute": "přinošować",
"translate-edit-no-information": "<em>Tuta zdźělenka dokumentaciju nima, Jeli wěš, hdźež abo kak so tuta zdźělenka wužiwa, móžeš druhim přełožowarjam pomhać přidawajo dokumentaciju k tutej zdźělence.</em>'",
"translate-edit-information": "Informacije wo zdźělence ($1)",
- "translate-edit-in-other-languages": "Zdźělenka w druhich rěčach",
"translate-edit-warnings": "Warnowanja wo njedospołnych přełožkach",
"translate-edit-tmmatch-source": "Žórłowy tekst přełožka: $1",
"translate-edit-tmmatch": "$1 % wotpowědowanja",
@@ -161,7 +159,6 @@
"supportedlanguages-recenttranslations": "najnowše přełožki",
"supportedlanguages-count": "$1 {{PLURAL:$1|rěč|rěči|rěče|rěčow}} w cyłku.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|změna|změnje|změny|změnow}} - poslednja změna před $3 {{PLURAL:$3|dnjom|dnjomaj|dnjemi|dnjemi}}",
- "translate-save": "Składować ($1)",
"translate-jssti-add": "Lisćinje přidać",
"managemessagegroups": "Zrjadowanje zdźělenskich skupinow",
"translate-smg-notallowed": "Njesměš tutu akciju wuwjesć.",
@@ -197,13 +194,6 @@
"translate-import-err-no-such-file": "Dataja <nowiki>$1</nowiki> njeeksistuje abo njeje so lokalnje nahrała.",
"translate-import-err-stale-group": "Skupina powěsćow, ke kotrejž tuta dataja słuša, njeeksistuje.",
"translate-import-err-no-headers": "Dataja derje sformowana dataja Gettext we formaće rozšěrjenje \"Translate\" njeje:\nNjeje móžno skupinu a rěč z hłowy dataje zwěsćić.",
- "translate-js-summary": "Zjeće:",
- "translate-js-save": "Składować",
- "translate-js-next": "Přichodnu powěsć składować a wočinić",
- "translate-js-skip": "K přichodnej powěsći skočić",
- "translate-js-history": "Přełožowanska historija",
- "translate-js-support": "Prašeć so",
- "translate-js-support-title": "Poproš wo pomoc, jeli dosć informacijow njeje, zo by so tuta powěsć prawje přełožiła.",
"translate-js-support-unsaved-warning": "Maš njeskładowane přełožki.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/ht.json b/MLEB/Translate/i18n/core/ht.json
index 256cd7de..f6de94f8 100644
--- a/MLEB/Translate/i18n/core/ht.json
+++ b/MLEB/Translate/i18n/core/ht.json
@@ -34,7 +34,6 @@
"translate-edit-contribute": "kontribiye",
"translate-edit-no-information": "''Mesaj sa pa dokimante.\nSi w konnen ki kote mesaj sa itilize, ou kapab ede lòt tradiktè lè ou ajoute dokimantasyon pou mesaj sa.''",
"translate-edit-information": "Enfòmasyon sou mesaj \"$2\" ($1)",
- "translate-edit-in-other-languages": "Mesaj nan lòt lang yo",
"translate-edit-warnings": "Avètisman sou tradiksyon ki pa konplete yo",
"translate-edit-tmmatch": "$1% korespondans",
"translate-use-suggestion": "Mete sijesyon sa a nan zòn tradiksyon a. L ap ranplase tout kontni aktyèl.",
@@ -114,7 +113,6 @@
"supportedlanguages-summary": "Paj sa a montre yon lis tout lang ki sipòte pa {{SITENAME}}, ansanm ak non tradiktè yo ki ap travay nan lang sa yo.\nSi nou ta renmen konn pi plis sou yon lang, klike sou lyen pou paj prensipal lang sa a.\nSi ou klike sou non yon tradiktè, w ap jwenn paj itilizatè li.\n\nSi yon lang pa parèt nan lis, ou kapab gade \"[[Translating:Process|nouvèl lang]]\" pou ou konnen ki jan ou fè pou komanse yon pwojè lokalizasyon pou li.\n\nSi ou tradui vè yon lang epi non ou pa nan lis tradiktè pou lang sa, tanpri ajoute l nan [[:Category:Languages|paj prensipal]].\nGade meni a pou jwenn lyen pou paj prensipal lang ou prefere a.",
"supportedlanguages-translators": "{{PLURAL:$2|Tradiktè|Tradiktè yo}}: $1",
"supportedlanguages-recenttranslations": "dènye tradiksyon yo",
- "translate-save": "Anrejistre ($1)",
"translate-jssti-add": "Ajoute nan lis",
"managemessagegroups": "Jesyon gwoup mesaj",
"translate-manage-import-diff": "Mesaj: $1 | Aksyon yo: $2",
@@ -142,9 +140,6 @@
"translate-import-err-invalid-title": "Non fichye <nowiki>$1</nowiki> pa bon.",
"translate-import-err-no-such-file": "Fichye <nowiki>$1</nowiki> pa egziste oubyen pa t chaje localman.",
"translate-import-err-no-headers": "Fichye sa pa byen fòme nan fòma Gettext pou ekstansyon tradiksyon:\nPa kapab detèmine gwoup ak lang depi tèt fichye.",
- "translate-js-next": "Anrejistre epi ouvri swivan.",
- "translate-js-skip": "Sote ale nan swivan",
- "translate-js-history": "Istorik tradiksyon",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kòd",
"translate-gs-continent": "Kontinan",
diff --git a/MLEB/Translate/i18n/core/hu.json b/MLEB/Translate/i18n/core/hu.json
index abc1eb81..d280ed6c 100644
--- a/MLEB/Translate/i18n/core/hu.json
+++ b/MLEB/Translate/i18n/core/hu.json
@@ -8,6 +8,7 @@
"Dani",
"Dj",
"Glanthor Reviol",
+ "Hanna Tardos",
"Misibacsi",
"Máté",
"Tacsipacsi",
@@ -17,7 +18,7 @@
},
"translate": "Fordítás",
"translate-desc": "[[Special:Translate|Speciális lap]] a MediaWiki és más projektek fordítására",
- "translate-fuzzybot-desc": "Ez egy speciális rendszerfiók, amit a MediaWiki [https://www.mediawiki.org/wiki/Extension:Translate Translate kiterjesztése] használ a fordítások karbantartásához.\nEz a fiók a MediaWiki szoftver része, és nem tulajdonosa egyetlen felhasználó sem.",
+ "translate-fuzzybot-desc": "Ez egy speciális rendszerfiók, amit a MediaWiki [https://www.mediawiki.org/wiki/Extension:Translate/hu Translate kiterjesztése] használ a fordítások karbantartásához.\nEz a fiók a MediaWiki szoftver része, és nem tulajdonosa egyetlen felhasználó sem.",
"translate-taskui-export-to-file": "Exportálás natív formátumban",
"translate-taskui-export-as-po": "Exportálás offline fordításhoz",
"translate-taction-translate": "Fordítás",
@@ -50,11 +51,9 @@
"translate-ignored": "(figyelmen kívül hagyva)",
"translate-edit-title": "„$1” szerkesztése",
"translate-edit-definition": "Alapértelmezett érték",
- "translate-edit-translation": "Fordítás",
"translate-edit-contribute": "szerkesztés",
"translate-edit-no-information": "''Ehhez az üzenethez még nincs leírás. Ha tudod, hogy hol vagy hogyan jelenik meg, segítheted a többi fordítót az üzenet dokumentálásával.''",
"translate-edit-information": "Információk az üzenetről ($1)",
- "translate-edit-in-other-languages": "Az üzenet más nyelveken",
"translate-edit-warnings": "Hiányosságok a fordításban",
"translate-edit-tmmatch-source": "Fordítási forrás szöveg: $1",
"translate-edit-tmmatch": "$1%-os egyezés",
@@ -66,6 +65,7 @@
"translate-export-invalid-format": "Adj meg egy érvényes formátumot.",
"translate-export-not-supported": "A fordítások exportálása nem támogatott.",
"translate-export-format-notsupported": "A megadott exportálási formátumot nem támogatja ez az üzenetcsoport.",
+ "translate-export-group-too-large": "A kiválasztott üzenetcsoport túl nagy. Válassz egy olyan üzenetcsoportot, ami kevesebb mint $1 üzenetet tartalmaz, vagy lépj kapcsolatba egy fordítási adminisztrátorral tanácsért.",
"translate-checks-parameters": "A következő {{PLURAL:$2|paraméter nincs|paraméterek nincsenek}} használva:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "A következő {{PLURAL:$2|paraméter ismeretlen|paraméterek ismeretlenek}}:\n<strong>$1</strong>",
"translate-checks-balance": "Nem egyenlő számban vannak használva a nyitó és záró {{PLURAL:$2|zárójelek|zárójelek}}:\n<strong><nowiki>$1</nowiki></strong>",
@@ -76,10 +76,15 @@
"translate-checks-plural-dupe": "<nowiki>A {{PLURAL:}} dupla formákat kap a végén. A $1 {{PLURAL:$1|kutya|kutya}} $1 kutya formában írandó (és még véletlenül se $1 {{PLURAL:$1|kutya|kutyák}}-ként, az felér a magyar nyelv elpusztításával :)</nowiki><!-- nyafog a smiley: tessék, itt van még egy (-->!)<nowiki>, ha az üzenetben nincs előtte szám, akkor {{PLURAL:$1|kutya|kutya}} helyett {{PLURAL:$1|kutya|kutyák}}, amennyiben máshogy megjelenik szám előtte, akkor {{PLURAL:$1|kutya}} kell.</nowiki>",
"translate-checks-pagename": "A névtér nem egyezik meg a definícióval",
"translate-checks-format": "A fordítás nem felel meg a definíciónak, vagy érvénytelen a szintaxisa: $1",
- "translate-checks-escape": "A következő escape-ek valószínűleg véletlenül történtek: <strong>$1</strong>",
+ "translate-checks-escape": "A következő {{PLURAL:$2|escape-karakter|escape-karakterek}} valószínűleg véletlenül {{PLURAL:$2|került|kerültek}} az üzenetbe: <strong>$1</strong>. {{PLURAL:$4|Egy érvényes escape-karakter a következő|Érvényes escape-karakterek például a következők}}: $3.",
"translate-checks-parametersnotequal": "A paraméterek száma a szükséges {{PLURAL:$1|$1}} helyett {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> hibás formátumú.",
"translate-checks-fudforum-syntax": "Használj <nowiki>$1</nowiki> formát <nowiki>$2</nowiki> helyett ebben a projektben.",
+ "translate-checks-newline-missing-start": "A fordítás elején hiányzik $1 újsor karakter.",
+ "translate-checks-newline-missing-end": "A fordítás végén hiányzik $1 újsor karakter.",
+ "translate-checks-newline-extra-start": "A fordítás elején $1 extra újsor karakter van.",
+ "translate-checks-newline-extra-end": "A fordítás végén $1 extra újsor karakter van.",
+ "translate-checks-replacement": "$1 helyett használd a következőt: $2.",
"translate-pref-editassistlang": "Segédnyelvek:",
"prefs-translate": "Fordítási beállítások",
"translate-pref-editassistlang-help": "Nyelvkódok vesszővel elválasztott listája.\nAz üzenetek fordításai ezeken a nyelveken jelennek meg, amikor fordítasz.\nA nyelvek alapértelmezett listája a nyelvedtől függ.",
@@ -132,6 +137,11 @@
"translate-statsf-language": "Nyelvkódok, vesszővel elválasztva:",
"translate-statsf-group": "Csoportkódok, vesszővel elválasztva:",
"translate-statsf-submit": "Előnézet",
+ "translate-statsf-unknown-error": "Ismeretlen hiba történt.",
+ "translate-statsf-error-message": "Hiba történt a $1 grafikon betöltése közben",
+ "translate-statsf-graph-alt-text-info": "A fordítási statisztikák szöveges alternatívája az alábbi adattáblában található.",
+ "translate-statsf-alt-text": "Fordítási statisztikák szöveges alternatívája.",
+ "translate-statsf-embed": "Kód a fordítási statisztikákat mutató ábra más oldalakra való beágyaázásához.",
"translate-tag-page-desc": "A(z) [[$2|$1]] lap fordítása $3 ($4) nyelvről",
"translate-sidebar-alltrans": "Más nyelveken",
"translations": "Minden fordítás",
@@ -177,7 +187,7 @@
"translate-mgs-totals": "Mind a(z) $1 nyelv együtt",
"translate-mgs-invalid-group": "A megadott $1 csoport nem létezik.",
"translate-mgs-nothing": "Nincs megjeleníthető statisztika.",
- "supportedlanguages": "Támogatott nyelvek",
+ "supportedlanguages": "Aktív nyelvek",
"supportedlanguages-summary": "Ezen a lapon megtalálható a {{SITENAME}} által támogatott összes nyelv, a nyelven dolgozó fordítók neveivel együtt.\n\nEgy fordító minél többet fordított, a neve annál nagyobb betűkkel jelenik meg. Az aláhúzás színe jelzi, hogy az adott fordító legutóbb mikor volt aktív.",
"supportedlanguages-colorlegend": "A színek jelentése: a legutóbbi fordítást $1 napja végezte.",
"supportedlanguages-sqlite-error": "Az SQLite nem támogatott",
@@ -186,13 +196,15 @@
"supportedlanguages-count": "Összesen {{PLURAL:$1|egy|$1}} nyelv.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|egy|$2}} szerkesztés, a legutóbb {{PLURAL:$3|egy|$3}} napja szerkesztett",
"abusefilter-edit-builder-vars-translate-source-text": "A fordítási egység forrásszövege",
- "translate-save": "Mentés ($1)",
+ "abusefilter-edit-builder-vars-translate-target-language": "A fordítás célnyelve",
"translate-jssti-add": "Hozzáadás a listához",
"managemessagegroups": "Üzenetcsoportok karbantartása",
"translate-smg-notallowed": "Ezt a tevékenységet nem hajthatod végre.",
"translate-smg-nochanges": "Nincsenek feldolgozandó változtatások.",
"translate-smg-submit": "Változtatások elküldése feldolgozásra",
"translate-smg-submitted": "Az üzenet definíciók frissítése megtörtént. A változások a háttérben kerülnek feldolgozásra.",
+ "translate-smg-submitted-with-failure": "A következő {{PLURAL:$1|csoport üzenetdefiníciójának|csoportok üzenetdefinícióinak}} frissítése sikertelen: $2. $3",
+ "translate-smg-submitted-others-processing": "A többi csoport üzenetdefinícióinak feldolgozása folyik a háttérben.",
"translate-smg-more": "További feldolgozandó változtatások lesznek ezen módosítások elküldése után.",
"translate-smg-left": "Üzenet tartalom wikiben",
"translate-smg-right": "Bejövő változtatások",
@@ -201,6 +213,14 @@
"translate-smg-rename-select-err": "Válassz ki egy átnevezendő üzenetet",
"translate-smg-rename-no-msg": "Nem találhatók üzenetek.",
"translate-smg-rename-new": "Hozzáadás újként…",
+ "translate-smg-changeset-modified": "A változáscsomagot egy másik felhasználó vagy folyamat módosította, így nem lehet közzétenni a módosításaidat, mert felülírnák azokat. Töltsd újra a lapot a legfrissebb változások megtekintéséhez.",
+ "translate-smg-strong-sync-help": "Súgó",
+ "translate-smg-group-message-action-history": "Történelem",
+ "translate-smg-group-message-tag-outdated": "Elavult",
+ "translate-smg-group-message-tag-rename": "Átnevezés",
+ "translate-smg-group-message-message-content": "Tartalom:",
+ "translate-smg-group-message-message-replacement": "Csere:",
+ "translate-smg-group-message-message-other-langs": "További nyelvek:",
"translate-manage-import-diff": "Üzenet: $1 | Műveletek: $2",
"translate-manage-import-new": "Új üzenet: $1",
"translate-manage-import-deleted": "Törölt üzenet: $1",
@@ -231,14 +251,7 @@
"translate-import-err-no-such-file": "A(z) <nowiki>$1</nowiki> fájl nem létezik vagy nem helyben lett feltöltve.",
"translate-import-err-stale-group": "A fájlhoz tartozó üzenetcsoport nem létezik.",
"translate-import-err-no-headers": "A fájl nem egy jól formázott Gettext-fájl a Translate-kiterjesztés formátumával:\nnem sikerült meghatározni a csoportot és a nyelvet a fájl fejlécéből.",
- "translate-js-summary": "Összefoglaló:",
- "translate-js-save": "Mentés",
- "translate-js-next": "Mentés és a következő megnyitása",
- "translate-js-skip": "Ugrás a következőre",
- "translate-js-history": "Fordítási előzmények",
- "translate-js-support": "Kérdés feltevése",
- "translate-js-support-title": "Itt kérhetsz segítséget, ha nincs elegendő információd egy üzenet megfelelő lefordításához.",
- "translate-js-support-unsaved-warning": "Mentetlen fordításaid vannak.",
+ "translate-js-support-unsaved-warning": "Közzé nem tett fordításaid vannak.",
"translate-gs-pos": "Hely",
"translate-gs-code": "Kód",
"translate-gs-continent": "Kontinens",
@@ -291,14 +304,14 @@
"tux-status-fuzzy": "Elavult",
"tux-status-proofread": "Ellenőrizve",
"tux-status-translated": "Lefordítva",
- "tux-status-saving": "Mentés…",
- "tux-status-unsaved": "Nincs mentve",
+ "tux-status-saving": "Közzététel…",
+ "tux-status-unsaved": "Nincs közzétéve",
"tux-save-unknown-error": "Ismeretlen hiba történt.",
"tux-editor-placeholder": "A te fordításod",
"tux-editor-editsummary-placeholder": "Opcionális összefoglaló",
"tux-editor-paste-original-button-label": "Forrásszöveg beillesztése",
"tux-editor-discard-changes-button-label": "Változtatások elvetése",
- "tux-editor-save-button-label": "Fordítás elmentése",
+ "tux-editor-save-button-label": "Fordítás közzététele",
"tux-editor-skip-button-label": "Továbblépés a következőre",
"tux-editor-cancel-button-label": "Mégse",
"tux-editor-confirm-button-label": "Fordítás megerősítése",
@@ -313,7 +326,7 @@
"tux-editor-tm-match": "$1%-os egyezés",
"tux-notices-more": "$1 további",
"tux-notices-hide": "elrejtés",
- "tux-editor-save-failed": "A fordítás elmentése sikertelen: $1",
+ "tux-editor-save-failed": "A fordítás közzététele sikertelen: $1",
"tux-editor-n-uses": "$1 használat",
"tux-editor-message-desc-more": "Több",
"tux-editor-message-desc-less": "Kevesebb",
@@ -328,7 +341,7 @@
"tux-editor-outdated-notice": "A fordítást lehet, hogy frissíteni kell.",
"tux-editor-outdated-notice-diff-link": "Változtatások megjelenítése",
"tux-editor-doc-editor-placeholder": "Üzenetdokumentáció",
- "tux-editor-doc-editor-save": "Dokumentáció mentése",
+ "tux-editor-doc-editor-save": "Dokumentáció közzététele",
"tux-editor-doc-editor-cancel": "Mégse",
"tux-messagetable-more-messages": "$1 további üzenet",
"tux-messagetable-loading-messages": "{{PLURAL:$1|Üzenet|Üzenetek}} betöltése…",
diff --git a/MLEB/Translate/i18n/core/hy.json b/MLEB/Translate/i18n/core/hy.json
index 031dff2c..62c72a76 100644
--- a/MLEB/Translate/i18n/core/hy.json
+++ b/MLEB/Translate/i18n/core/hy.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "23artashes",
"Beko",
"Chaojoker",
"Kareyac",
@@ -11,12 +12,32 @@
"translate": "Թարգմանություն",
"translate-taction-translate": "Թարգմանություն",
"translate-taction-proofread": "Սրբագրել",
- "translate-edit-translation": "Թարգմանություն",
+ "translate-page-group": "Խումբ",
+ "translate-page-language": "Լեզու",
+ "translate-page-limit": "Սահմանափակում",
+ "translate-page-navigation-legend": "Նավարկություն",
+ "translate-next": "Հաջորդ էջ",
+ "translate-prev": "Նախորդ էջ",
+ "translate-page-edit": "խմբագրել",
+ "translate-edit-title": "Խմբագրել \"$1\"",
+ "translate-export-form-format": "Ձևաչափ",
+ "translate-rcfilters-translations": "Թարգմանություններ",
+ "translate-rcfilters-translations-only-label": "Թարգմանություններ",
+ "translate-stats-edits": "Խմբագրումներ",
+ "translate-stats-users": "Թարգմանիչներ",
+ "translate-statsf-count-registrations": "Նոր մասնակիցներ",
"translate-sidebar-alltrans": "Այլ լեզուներով",
+ "translate-translations-fieldset-title": "Հաղորդագրություն",
+ "translate-translations-project": "Նախագիծ",
"translate-smg-rename-select": "Ընտրել",
"translate-smg-rename-cancel": "Չեղարկել",
+ "translate-smg-strong-sync-help": "Օգնություն",
+ "translate-smg-group-message-message-other-langs": "Այլ լեզուներ",
+ "translate-smg-loading": "Բեռնվում է…",
"translate-manage-import-new": "Նոր Հաղորդագրություն $1",
"translate-manage-action-rename": "Վերանվանել",
- "translate-js-save": "Հրապարակել",
- "translate-documentation-language": "Հաղորդագրության փաստաթղթեր"
+ "translate-documentation-language": "Հաղորդագրության փաստաթղթեր",
+ "tux-editor-cancel-button-label": "Չեղարկել",
+ "tux-editor-doc-editor-cancel": "Չեղարկել",
+ "tux-editor-close-tooltip": "Փակել"
}
diff --git a/MLEB/Translate/i18n/core/hyw.json b/MLEB/Translate/i18n/core/hyw.json
index ba60336c..2a748451 100644
--- a/MLEB/Translate/i18n/core/hyw.json
+++ b/MLEB/Translate/i18n/core/hyw.json
@@ -3,7 +3,8 @@
"authors": [
"ArmenBakkalian",
"Azniv Stepanian",
- "Kareyac"
+ "Kareyac",
+ "Շահէն"
]
},
"translate": "Թարգմանութիւն",
@@ -17,7 +18,6 @@
"translate-next": "Յաջորդ էջը",
"translate-prev": "Նախորդ էջը",
"translate-page-edit": "Խմբագրել",
- "translate-edit-translation": "Թարգմանութիւն",
"translate-export-form-format": "Ձեւաւորել",
"translate-rcfilters-translations": "Թարգմանութիւններ",
"translate-stats-edits": "Խմբագրումներ",
@@ -28,5 +28,7 @@
"translate-statsf-scale-hours": "Ժամեր",
"translate-statsf-submit": "Կանխաստուգել",
"translate-smg-rename-cancel": "Չեղարկել",
- "translate-documentation-language": "Հաղորդագրութեան փաստագրութիւն"
+ "translate-smg-strong-sync-help": "Օգնութիւն",
+ "translate-documentation-language": "Հաղորդագրութեան փաստագրութիւն",
+ "tux-editor-translate-mode": "Ցանկ"
}
diff --git a/MLEB/Translate/i18n/core/ia.json b/MLEB/Translate/i18n/core/ia.json
index 39055155..df107ad3 100644
--- a/MLEB/Translate/i18n/core/ia.json
+++ b/MLEB/Translate/i18n/core/ia.json
@@ -38,11 +38,9 @@
"translate-ignored": "(ignorate)",
"translate-edit-title": "Modificar \"$1\"",
"translate-edit-definition": "Definition del message",
- "translate-edit-translation": "Traduction",
"translate-edit-contribute": "contribuer",
"translate-edit-no-information": "<em>Iste message non ha documentation.\nSi tu sape ubi o como iste message es usate, tu pote adjutar le altere traductores per adder documentation a iste message.</em>",
"translate-edit-information": "Information super le message ($1)",
- "translate-edit-in-other-languages": "Iste message in altere linguas",
"translate-edit-warnings": "Advertimentos super traductiones incomplete",
"translate-edit-tmmatch-source": "Texto fonte pro traduction: $1",
"translate-edit-tmmatch": "$1% de correspondentia",
@@ -144,7 +142,7 @@
"translate-language-code": "Codice de lingua",
"translate-language-code-field-name": "Codice de lingua:",
"translate-suppress-complete": "Celar le gruppos de messages completemente traducite",
- "translate-ls-noempty": "Supprimer gruppos de messages completemente sin traduction",
+ "translate-ls-noempty": "Celar le gruppos de messages completemente sin traduction",
"translate-language": "Lingua",
"translate-total": "Messages",
"translate-untranslated": "Non traducite",
@@ -163,15 +161,14 @@
"translate-mgs-totals": "$1 {{PLURAL:$1|lingua|linguas}} in total",
"translate-mgs-invalid-group": "Le gruppo specificate, \"$1\", non existe.",
"translate-mgs-nothing": "Nihil a monstrar pro le statisticas requestate.",
- "supportedlanguages": "Linguas supportate",
- "supportedlanguages-summary": "Iste pagina presenta un lista de tote le linguas supportate per {{SITENAME}}, con le nomines del traductores laborante a iste lingua.\nLe nomine de un traductor appare tanto plus grande, quanto plus modificationes le traductor ha contribuite.\nLe color de un tracto de sublineamento indica quante tempore ha passate post le ultime activitate de un traductor.",
+ "supportedlanguages": "Linguas active",
+ "supportedlanguages-summary": "Iste pagina presenta un lista de linguas active in {{SITENAME}}, con le nomines del traductores laborante a iste lingua.\nLe nomine de un traductor appare tanto plus grande, quanto plus modificationes le traductor ha contribuite.\nLe color de un tracto de sublineamento indica quante tempore ha passate post le ultime activitate de un traductor.",
"supportedlanguages-colorlegend": "Legenda pro le colores: Ultime traduction $1 dies retro.",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Traductor|Traductrice}}|Traductores}}: $1",
"supportedlanguages-recenttranslations": "traductiones recente",
"supportedlanguages-count": "$1 {{PLURAL:$1|lingua|linguas}} in total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|modification|modificationes}} - ultime modification $3 {{PLURAL:$3|die|dies}} retro",
"abusefilter-edit-builder-vars-translate-source-text": "Texto original del unitate de traduction",
- "translate-save": "Salveguardar ($1)",
"translate-jssti-add": "Adder al lista",
"managemessagegroups": "Gestion de gruppos de messages",
"translate-smg-notallowed": "Tu non ha le permission de exequer iste action.",
@@ -207,14 +204,7 @@
"translate-import-err-no-such-file": "Le file <nowiki>$1</nowiki> non existe o non ha essite incargate localmente.",
"translate-import-err-stale-group": "Le gruppo de messages al qual iste file pertine non existe.",
"translate-import-err-no-headers": "Le file non es un file Gettext ben formate in le formato del extension Translate:\nNon pote determinar le gruppo e lingua ex le capites del file.",
- "translate-js-summary": "Summario:",
- "translate-js-save": "Salveguardar",
- "translate-js-next": "Salveguardar e aperir le sequente",
- "translate-js-skip": "Saltar al sequente",
- "translate-js-history": "Historia del traduction",
- "translate-js-support": "Poner question",
- "translate-js-support-title": "Demandar adjuta si il non ha sufficiente informationes pro traducer iste message correctemente.",
- "translate-js-support-unsaved-warning": "Tu ha traductiones non salveguardate.",
+ "translate-js-support-unsaved-warning": "Tu ha traductiones non publicate.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Codice",
"translate-gs-continent": "Continente",
@@ -267,14 +257,14 @@
"tux-status-fuzzy": "Obsolete",
"tux-status-proofread": "Revidite",
"tux-status-translated": "Traducite",
- "tux-status-saving": "Salveguarda…",
- "tux-status-unsaved": "Non salveguardate",
+ "tux-status-saving": "Publica...",
+ "tux-status-unsaved": "Non publicate",
"tux-save-unknown-error": "Un error incognite ha occurrite.",
"tux-editor-placeholder": "Tu traduction",
"tux-editor-editsummary-placeholder": "Summario facultative",
"tux-editor-paste-original-button-label": "Collar texto original",
"tux-editor-discard-changes-button-label": "Abandonar modificationes",
- "tux-editor-save-button-label": "Salveguardar traduction",
+ "tux-editor-save-button-label": "Publicar traduction",
"tux-editor-skip-button-label": "Saltar al sequente",
"tux-editor-cancel-button-label": "Cancellar",
"tux-editor-confirm-button-label": "Confirmar traduction",
@@ -289,7 +279,7 @@
"tux-editor-tm-match": "$1% corresponde",
"tux-notices-more": "$1 {{PLURAL:$1|altere|alteres}}",
"tux-notices-hide": "celar",
- "tux-editor-save-failed": "Error durante le salveguarda del traduction: $1",
+ "tux-editor-save-failed": "Error durante le publication del traduction: $1",
"tux-editor-n-uses": "usate $1 {{PLURAL:$1|vice|vices}}",
"tux-editor-message-desc-more": "Vider plus",
"tux-editor-message-desc-less": "Vider minus",
@@ -304,7 +294,7 @@
"tux-editor-outdated-notice": "Iste traduction debe possibilemente esser actualisate.",
"tux-editor-outdated-notice-diff-link": "Monstrar differentias",
"tux-editor-doc-editor-placeholder": "Documentation del message",
- "tux-editor-doc-editor-save": "Salveguardar documentation",
+ "tux-editor-doc-editor-save": "Publicar documentation",
"tux-editor-doc-editor-cancel": "Cancellar",
"tux-messagetable-more-messages": "$1 altere {{PLURAL:$1|message|messages}}",
"tux-messagetable-loading-messages": "Carga $1 {{PLURAL:$1|message|messages}}...",
diff --git a/MLEB/Translate/i18n/core/id.json b/MLEB/Translate/i18n/core/id.json
index e71bc7ef..2133142f 100644
--- a/MLEB/Translate/i18n/core/id.json
+++ b/MLEB/Translate/i18n/core/id.json
@@ -3,6 +3,7 @@
"authors": [
"Anakmalaysia",
"Bennylin",
+ "Daud I.F. Argana",
"Farras",
"Ilham151096",
"Irwangatot",
@@ -20,7 +21,7 @@
},
"translate": "Terjemahkan",
"translate-desc": "[[Special:Translate|Halaman istimewa]] untuk menerjemahkan MediaWiki dan lain-lain",
- "translate-fuzzybot-desc": "Ini adalah akun sistem khusus yang digunakan oleh [https://www.mediawiki.org/wiki/Extension:Translate ekstensi Terjemahan] MediaWiki untuk mengelola terjemahan. Akun ini adalah bagian dari perangkat lunak MediaWiki dan tidak dimiliki oleh pengguna mana pun.",
+ "translate-fuzzybot-desc": "Ini adalah akun sistem khusus yang digunakan oleh [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Translate ekstensi Terjemahan] MediaWiki untuk mengelola terjemahan. Akun ini adalah bagian dari perangkat lunak MediaWiki dan tidak dimiliki oleh pengguna mana pun.",
"translate-taskui-export-to-file": "Ekspor dalam format asli",
"translate-taskui-export-as-po": "Ekspor untuk terjemahan luring",
"translate-taction-translate": "Terjemahkan",
@@ -54,11 +55,9 @@
"translate-ignored": "(diabaikan)",
"translate-edit-title": "Sunting \"$1\"",
"translate-edit-definition": "Definisi pesan",
- "translate-edit-translation": "Terjemahan",
"translate-edit-contribute": "berkontribusi",
"translate-edit-no-information": "<em>Pesan ini tidak memiliki dokumentasi.\nJika Anda mengetahui di mana dan bagaimana pesan ini digunakan, Anda dapat membantu penerjemah lain dengan menambahkan dokumentasi untuk pesan ini.</em>",
"translate-edit-information": "Informasi mengenai pesan ($1)",
- "translate-edit-in-other-languages": "Pesan dalam bahasa lain",
"translate-edit-warnings": "Peringatan mengenai terjemahan yang tak lengkap",
"translate-edit-tmmatch-source": "Teks sumber terjemahan: $1",
"translate-edit-tmmatch": "$1% sesuai",
@@ -70,6 +69,7 @@
"translate-export-invalid-format": "Silakan tentukan format yang sah.",
"translate-export-not-supported": "Ekspor terjemahan tidak didukung.",
"translate-export-format-notsupported": "Format ekspor yang diinginkan tidak didukung oleh kelompok pesan ini.",
+ "translate-export-group-too-large": "Kelompok pesan yang dipilih terlalu besar. Tolong pilih kelompok pesan yang memiliki lebih sedikir dari $1 {{PLURAL:$1|pesan}} atau hubungi admin terjemahan untuk nasihat.",
"translate-checks-parameters": "{{PLURAL:$2|Parameter|Parameter}} berikut ini tidak digunakan:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|Parameter|Parameter}} berikut ini tidak dikenali:\n<strong>$1</strong>",
"translate-checks-balance": "Terdapat {{PLURAL:$2|tanda kurung|tanda kurung}} dengan jumlah yang tidak sama:\n<strong><nowiki>$1</nowiki></strong>",
@@ -78,17 +78,33 @@
"translate-checks-plural": "Definisi menggunakan <nowiki>{{PLURAL:}}</nowiki> namun terjemahannya tidak menggunakannya.",
"translate-checks-plural-forms": "<nowiki>{{PLURAL:}}</nowiki> diberikan {{PLURAL:$1|satu bentukan|$1 bentukan}}, namun {{PLURAL:$2|hanya ada satu bentukan|sebenarnya ada $2 buah bentuk}} yang didukung (selain bentukan 0= dan 1=).",
"translate-checks-plural-dupe": "<nowiki>{{PLURAL:}}</nowiki> memiliki bentukan yang sama di akhir. <nowiki>{{PLURAL:$1|sheep|sheep}}</nowiki> seharusnya ditulis menjadi <nowiki>{{PLURAL:$1|sheep}}</nowiki>.",
+ "translate-checks-gettext-plural-missing": "Terjemahan ini harus memiliki <nowiki>{{PLURAL:GETTEXT|}}</nowiki>.",
+ "translate-checks-gettext-plural-unsupported": "Pesan ini tidak mendukung <nowiki>{{PLURAL:GETTEXT|}}</nowiki>.",
+ "translate-checks-gettext-plural-count": "<nowiki>{{PLURAL:GETTEXT|}}</nowiki> menerima tepat $1 {{PLURAL:$1|bentuk jamak}}. Saat ini diberikan $2 {{PLURAL:$2|bentuk jamak}}.",
+ "translate-checks-smartformat-plural-missing": "Terjemahan ini harus memiliki kata jamak di variabel $1.",
+ "translate-checks-smartformat-plural-unsupported": "Pesan ini tidak mendukung kata jamak di variabel $1.",
+ "translate-checks-smartformat-plural-count": "Banyak bentuk jamak yang salah di <strong>$3</strong>. Markah tersebut harus memiliki $1 {{PLURAL:$1|bentuk jamak}}. Saat ini diberikan $2 {{PLURAL:$2|bentuk jamak}}.",
+ "translate-checks-unicode-plural-missing": "Terjemahan ini harus memiliki <nowiki>{{PLURAL|}}</nowiki>.",
+ "translate-checks-unicode-plural-unsupported": "Pesan ini tidak mendukung <nowiki>{{PLURAL|}}</nowiki>.",
+ "translate-checks-unicode-plural-invalid": "Bentuk jamak seharusnya didefinisikan sebagai $1. Terjemahan ini mengandung $2.",
"translate-checks-pagename": "Ruang nama berubah dari definisinya",
"translate-checks-format": "Terjemahan ini tidak mengikuti definisi atau memiliki sintaks yang tidak sah: $1",
- "translate-checks-escape": "''Escape'' berikut mungkin tidak disengaja: <strong>$1</strong>",
+ "translate-checks-escape": "{{PLURAL:$2|Karakter|Karakter-karakter}} ''escape'' berikut mungkin tidak disengaja: <strong>$1</strong>. {{PLURAL:$4|Karakter ''escape'' yang valid adalah|Karakter-karakter ''escape'' yang valid adalah:}} $3.",
"translate-checks-parametersnotequal": "Terdapat {{PLURAL:$1|$1}} parameter; seharusnya ada {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "Bentukan <nowiki>$1</nowiki> salah.",
"translate-checks-fudforum-syntax": "Gunakan <nowiki>$1</nowiki> bukan <nowiki>$2</nowiki> pada proyek ini.",
+ "translate-checks-newline-missing-start": "{{PLURAL:$1|Terdapat}} $1 {{PLURAL:$1|karakter|karakter-karakter}} garis baru yang hilang di awal terjemahan.",
+ "translate-checks-newline-missing-end": "{{PLURAL:$1|Terdapat}} $1 {{PLURAL:$1|karakter|karakter-karakter}} garis baru yang hilang di akhir terjemahan.",
+ "translate-checks-newline-extra-start": "{{PLURAL:$1|Terdapat}} $1 {{PLURAL:$1|karakter|karakter-karakter}} garis baru yang berlebih di awal terjemahan.",
+ "translate-checks-newline-extra-end": "{{PLURAL:$1|Terdapat}} $1 {{PLURAL:$1|karakter|karakter-karakter}} garis baru yang berlebih di akhir terjemahan.",
+ "translate-checks-value-not-present": "Terjemahannya harus sama dengan {{PLURAL:$1|1=|salah satu dari nilai-nilai berikut:}} $1.",
+ "translate-checks-replacement": "Gunakan $2 bukannya $1.",
"translate-pref-editassistlang": "Bahasa penunjang:",
"prefs-translate": "Opsi terjemahan",
"translate-pref-editassistlang-help": "Daftar kode bahasa dipisahkan koma.\nTerjemahan pesan dalam bahasa ini ditampilkan saat Anda menerjemahkan.\nDaftar bahasa baku tergantung pada bahasa Anda.",
"translate-pref-editassistlang-bad": "Kode bahasa tidak sah pada daftar:\n<nowiki>$1</nowiki>.",
"right-translate": "Menyunting menggunakan antarmuka penerjemahan",
+ "action-translate": "menyunting menggunakan antarmuka penerjemahan",
"right-translate-manage": "Mengelola kelompok pesan",
"action-translate-manage": "mengelola kelompok pesan",
"right-translate-import": "Mengimpor terjemahan luring",
@@ -135,6 +151,8 @@
"translate-statsf-language": "Daftar kode bahasa dipisahkan koma:",
"translate-statsf-group": "Daftar kode kelompok dipisahkan koma:",
"translate-statsf-submit": "Pratayang",
+ "translate-statsf-unknown-error": "Terjadi galat tidak dikenal.",
+ "translate-statsf-error-message": "Terjadi kesalahan ketika memuat grafik: $1",
"translate-tag-page-desc": "Terjemahan dari halaman wiki [[$2|$1]] dalam bahasa $3 ($4).",
"translate-sidebar-alltrans": "Dalam bahasa lain",
"translations": "Semua terjemahan",
@@ -190,29 +208,44 @@
"supportedlanguages-recenttranslations": "terjemahan terkini",
"supportedlanguages-count": "Ada $1 {{PLURAL:$1|bahasa|bahasa}} totalnya.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|suntingan|suntingan}} - suntingan terakhir $3 {{PLURAL:$3|hari|hari}} yang lalu",
+ "translate-supportedlanguages-cached": "Informasi ini ditembolok $1 yang lalu.",
"abusefilter-edit-builder-vars-translate-source-text": "Teks sumber satuan terjemahan",
- "translate-save": "Simpan ($1)",
+ "abusefilter-edit-builder-vars-translate-target-language": "Bahasa tujuan penerjemahan",
"translate-jssti-add": "Tambah ke daftar",
"managemessagegroups": "Pengelolaan kelompok pesan",
"translate-smg-notallowed": "Anda tidak diperbolehkan untuk melakukan tindakan ini.",
"translate-smg-nochanges": "Tidak ada perubahan yang dapat diproses.",
"translate-smg-submit": "Kirim perubahan untuk diproses",
"translate-smg-submitted": "Definisi pesan telah diperbarui. Perubahan sedang diproses di latar.",
+ "translate-smg-submitted-with-failure": "Memperbarui {{PLURAL:$1|definisi}} pesan gagal untuk {{PLURAL:$1|kelompok|kelompok-kelompok}} berikut - $2. $3",
+ "translate-smg-submitted-others-processing": "Definisi pesan untuk kelompok lainnya sedang diproses di latar belakang.",
"translate-smg-more": "Akan ada perubahan lainnya untuk diproses setelah mengirimkan perubahan ini.",
"translate-smg-left": "Konten pesan di wiki",
"translate-smg-right": "Perubahan baru",
+ "translate-smg-rename-select": "Pilih",
+ "translate-smg-rename-cancel": "Batal",
+ "translate-smg-rename-search": "Mencari pesan yang cocok...",
+ "translate-smg-rename-select-err": "Tolong pilih pesan yang mau diganti namanya",
+ "translate-smg-rename-no-msg": "Tidak ditemukan pesan.",
+ "translate-smg-rename-new": "Tambahkan sebagai ... baru",
+ "translate-smg-rename-rename": "Tambahkan sebagai nama baru dari ...",
+ "translate-smg-rename-dialog-title": "Pilih nama baru yang cocok untuk $1",
"translate-manage-import-diff": "Pesan $1 | Tindakan: $2",
"translate-manage-import-new": "Pesan baru $1",
"translate-manage-import-deleted": "Pesan $1 terhapus",
"translate-manage-action-import": "Impor",
"translate-manage-action-conflict": "Impor dan tandai perlu diulas",
"translate-manage-action-ignore": "Abaikan",
- "translate-manage-action-fuzzy": "Impor dan tandai perlu diulas terjemahan",
+ "translate-manage-action-fuzzy": "Impor dan tandai terjemahan perlu ditinjau",
+ "translate-manage-action-rename-fuzzy": "Ubah nama dan tandai terjemahan perlu ditinjau",
+ "translate-manage-action-rename": "Ubah nama",
+ "translate-manage-action-ignore-change": "Abaikan perubahan terjemahan",
"translate-manage-nochanges": "Tidak ada perubahan pada definisi pesan untuk kelompok ini.",
"translate-manage-nochanges-other": "Tidak ada perubahan pada bahasa ini.\nGunakan pranala berikut untuk kembali ke tampilan rincian kelompok.",
"translate-manage-inconsistent": "Ketidakkonsistenan terdeteksi pada permintaan.\nPeriksa ulang perubahan lalu coba kembali.\nRincian: $1.",
"translate-manage-toolong": "Waktu proses maksimum $1 {{PLURAL:$1|detik}} telah terlampaui.\nMohon kirimkan kembali formulir untuk melanjutkan proses.",
"translate-manage-import-summary": "Mengimpor versi baru dari sumber eksternal",
+ "translate-manage-import-rename-summary": "Diubah namanya di sumber eksternal",
"translate-manage-conflict-summary": "Mengimpor versi baru dari sumber eksternal.\nTolong diperiksa.",
"translate-manage-submit": "Jalankan",
"translate-manage-intro-other": "Di bawah ini adalah daftar perubahan terjemahan dalam bahasa $1.\nSilakan tinjau perubahan ini dan pilih tindakan yang ingin Anda lakukan untuk setiap perubahannya.\nJika Anda memilih untuk tidak mengabaikan perubahan, tindakan ini hanya bersifat sementara.",
@@ -227,14 +260,7 @@
"translate-import-err-no-such-file": "Berkas <nowiki>$1</nowiki> tidak ada atau belum diunggah secara lokal.",
"translate-import-err-stale-group": "Kelompok pesan dari berkas ini tidak ditemukan.",
"translate-import-err-no-headers": "Berkas bukan merupakan berkas Gettext dalam format pengaya Translate yang diciptakan dengan benar:\nTidak dapat menentukan kelompok pesan dan bahasa dari kop berkas.",
- "translate-js-summary": "Ringkasan:",
- "translate-js-save": "Simpan",
- "translate-js-next": "Simpan dan buka selanjutnya",
- "translate-js-skip": "Lewati ke pesan selanjutnya",
- "translate-js-history": "Riwayat terjemahan",
- "translate-js-support": "Ajukan pertanyaan",
- "translate-js-support-title": "Mintalah bantuan jika informasi yang ada tidak cukup untuk menerjemahkan pesan ini dengan benar.",
- "translate-js-support-unsaved-warning": "Anda memiliki terjemahan yang belum disimpan.",
+ "translate-js-support-unsaved-warning": "Anda memiliki terjemahan yang belum diterbitkan.",
"translate-gs-pos": "Posisi",
"translate-gs-code": "Kode",
"translate-gs-continent": "Benua",
@@ -287,14 +313,14 @@
"tux-status-fuzzy": "Usang",
"tux-status-proofread": "Telah ditinjau",
"tux-status-translated": "Telah diterjemahkan",
- "tux-status-saving": "Menyimpan...",
- "tux-status-unsaved": "Belum disimpan",
+ "tux-status-saving": "Menerbitkan...",
+ "tux-status-unsaved": "Belum diterbitkan",
"tux-save-unknown-error": "Terjadi galat tak dikenal.",
"tux-editor-placeholder": "Terjemahan Anda",
"tux-editor-editsummary-placeholder": "Ringkasan opsional",
"tux-editor-paste-original-button-label": "Tempel teks sumber",
"tux-editor-discard-changes-button-label": "Buang perubahan",
- "tux-editor-save-button-label": "Simpan terjemahan",
+ "tux-editor-save-button-label": "Terbitkan terjemahan",
"tux-editor-skip-button-label": "Lewati ke pesan selanjutnya",
"tux-editor-cancel-button-label": "Batal",
"tux-editor-confirm-button-label": "Konfirmasikan terjemahan",
@@ -309,7 +335,7 @@
"tux-editor-tm-match": "$1% sesuai",
"tux-notices-more": "{{PLURAL:$1|$1 lagi}}",
"tux-notices-hide": "sembunyikan",
- "tux-editor-save-failed": "Gagal menyimpan terjemahan: $1",
+ "tux-editor-save-failed": "Gagal menerbitkan terjemahan: $1",
"tux-editor-n-uses": "digunakan $1 {{PLURAL:$1|kali|kali}}",
"tux-editor-message-desc-more": "Tampilkan selengkapnya",
"tux-editor-message-desc-less": "Tampilkan seperlunya",
@@ -324,7 +350,7 @@
"tux-editor-outdated-notice": "Terjemahan ini mungkin perlu dimutakhirkan.",
"tux-editor-outdated-notice-diff-link": "Tampilkan perbedaan",
"tux-editor-doc-editor-placeholder": "Dokumentasi pesan",
- "tux-editor-doc-editor-save": "Sunting dokumentasi",
+ "tux-editor-doc-editor-save": "Terbitkan dokumentasi",
"tux-editor-doc-editor-cancel": "Batal",
"tux-messagetable-more-messages": "$1 {{PLURAL:$1|pesan|pesan}} lagi",
"tux-messagetable-loading-messages": "Memuat {{PLURAL:$1|pesan|pesan}}...",
@@ -360,10 +386,13 @@
"tux-editor-message-tools-translations": "Semua terjemahan",
"tux-editor-message-tools-linktothis": "Pranala balik pesan ini",
"tux-editor-loading": "Memuat...",
+ "tux-editor-loading-failed": "Gagal memuat bantuan terjemahan: $1",
"translate-search-more-languages-info": "$1 {{PLURAL:$1|bahasa|bahasa}} lagi",
"translate-statsbar-tooltip": "$1% telah diterjemahkan, $2% telah ditinjau",
"translate-statsbar-tooltip-with-fuzzy": "$1% telah diterjemahkan, $2% telah ditinjau, $3% usang",
"translate-search-more-groups-info": "$1 {{PLURAL:$1|kelompok|kelompok}} lagi",
+ "translate-syntax-error": "Terjemahan mengandung kesalahan sintaksis",
"tux-session-expired": "Anda sudah tidak lagi masuk log. Silakan masuk log di tab yang terpisah. Atau, buatlah salinan dari terjemahan yang belum disimpan, masuk log, kembali ke halaman ini, lalu masukkan kembali terjemahan Anda.",
- "tux-nojs": "Perkakas ini tidak dapat bekerja tanpa JavaScript. JavaScript dinonaktifkan, gagal berfungsi, atau peramban ini tidak mendukungnya."
+ "tux-nojs": "Perkakas ini tidak dapat bekerja tanpa JavaScript. JavaScript dinonaktifkan, gagal berfungsi, atau peramban ini tidak mendukungnya.",
+ "specialpages-group-translation": "Terjemahan"
}
diff --git a/MLEB/Translate/i18n/core/ie.json b/MLEB/Translate/i18n/core/ie.json
new file mode 100644
index 00000000..7e25b272
--- /dev/null
+++ b/MLEB/Translate/i18n/core/ie.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mithridates"
+ ]
+ },
+ "translate-documentation-language": "Documentation de missage"
+}
diff --git a/MLEB/Translate/i18n/core/ig.json b/MLEB/Translate/i18n/core/ig.json
index 45564cfe..d8905dfd 100644
--- a/MLEB/Translate/i18n/core/ig.json
+++ b/MLEB/Translate/i18n/core/ig.json
@@ -37,12 +37,10 @@
"translate-translations-project": "Nzu:",
"translate-language": "Ásụ̀sụ̀",
"translate-percentage-complete": "Mmechá",
- "translate-save": "Dònye ($1)",
"translate-jssti-add": "Tinyé na ndetu",
"translate-manage-import-new": "Ozi ọhụrụ $1",
"translate-manage-import-deleted": "Ozi bakashịrị $1",
"translate-manage-import-done": "Omechá!",
- "translate-js-save": "Dònye",
"translate-gs-code": "Edemede i zonari",
"translate-gs-continent": "Obodo ukwu",
"translate-gs-speakers": "Ndi na su",
diff --git a/MLEB/Translate/i18n/core/ilo.json b/MLEB/Translate/i18n/core/ilo.json
index 58028ee5..ff766417 100644
--- a/MLEB/Translate/i18n/core/ilo.json
+++ b/MLEB/Translate/i18n/core/ilo.json
@@ -40,11 +40,9 @@
"translate-ignored": "(binay-an)",
"translate-edit-title": "Urnosen ti \"$1\"",
"translate-edit-definition": "Panangipalawag ti mensahe",
- "translate-edit-translation": "Panagitarus",
"translate-edit-contribute": "agparawad",
"translate-edit-no-information": "<em>Daytoy a mensahe ket awan ti dokumentasionna.\nNo ammom ti ayan wenno kasano ti pannaka-usar daytoy a mensahe, matulongam dagiti sabali nga agipatpatarus babaen ti panagnayon ti dokumentasion daytoy a mensahe.</em>",
"translate-edit-information": "Pakaammo a maipanggep ti mensahe ($1)",
- "translate-edit-in-other-languages": "Mensahe kadagiti sabali a pagsasao",
"translate-edit-warnings": "Dagiti ballaag a maipanggep kadagiti saan a kompleto a patarus",
"translate-edit-tmmatch-source": "Teksto a taudan ti panagitarus: $1",
"translate-edit-tmmatch": "$1% a kapada",
@@ -157,7 +155,6 @@
"supportedlanguages-recenttranslations": "dagiti kinaudi a patarus",
"supportedlanguages-count": "$1 a dagup {{PLURAL:$1|ti pagsasao|dagiti pagsasao}}.",
"supportedlanguages-activity": "$1: $2 nga {{PLURAL:$2|inurnos|inur-urnos}} - kinaudi nga inurnos ket $3 nga {{PLURAL:$3|aldaw|al-aldaw}} ti napalabas",
- "translate-save": "Idulin ($1)",
"translate-jssti-add": "Inayon iti listaan",
"managemessagegroups": "Panagtaripato ti grupo ti mensahe",
"translate-smg-notallowed": "Saanmo a mabalin nga aramiden daytoy a tignay.",
@@ -193,13 +190,6 @@
"translate-import-err-no-such-file": "Awan ti papeles ti<nowiki>$1</nowiki> wenno saan pay a lokal a naikarga.",
"translate-import-err-stale-group": "Awan ti grupo ti mensahe nga agtagikua iti daytoy a papeles.",
"translate-import-err-no-headers": "Ti papeles ket saan a nasayaat a naporma a papeles iti Gettext iti pormat a pagpaatiddog ti Translate:\nDi naikeddeng ti grupo ti mensahe ken pagsasao manipud kadagiti paulo ti papeles.",
- "translate-js-summary": "Pakabuklan:",
- "translate-js-save": "Idulin",
- "translate-js-next": "Idulin ken lukatan ti sumaruno",
- "translate-js-skip": "Mapan iti sumaruno",
- "translate-js-history": "Pakasaritaan ti patarus",
- "translate-js-support": "Agdamag ti saludsod",
- "translate-js-support-title": "Agdamag ti tulong no awan ti makaanay a pakaamo tapno husto ti pannakaipatarus daytoy a mensahe.",
"translate-js-support-unsaved-warning": "Adaanka kadagiti saan a naidulin a patarus.",
"translate-gs-pos": "Pues.",
"translate-gs-code": "Kodigo",
diff --git a/MLEB/Translate/i18n/core/inh.json b/MLEB/Translate/i18n/core/inh.json
index 45f698a3..99d1fca9 100644
--- a/MLEB/Translate/i18n/core/inh.json
+++ b/MLEB/Translate/i18n/core/inh.json
@@ -10,7 +10,6 @@
"translate-taction-translate": "Таржам",
"translate-page-group": "Тоаба",
"translate-page-language": "Мотт",
- "translate-edit-translation": "Таржам",
"translate-rcfilters-translations": "Таржамаш",
"translate-rcfilters-translations-only-label": "Таржамаш",
"translate-rcfilters-translations-filter-label": "Таржамаш дац",
diff --git a/MLEB/Translate/i18n/core/io.json b/MLEB/Translate/i18n/core/io.json
index 486103ff..d1f79574 100644
--- a/MLEB/Translate/i18n/core/io.json
+++ b/MLEB/Translate/i18n/core/io.json
@@ -23,11 +23,11 @@
"translate-prev": "Antea pagino",
"translate-page-description-hasoptional": "Ca mesajo-grupo kontenas fakultativa mesaji.\nFakultativa mesaji mustas tradukesar nur se vua linguo havas specala bezoni, exemple ne uzar intervalo inter la vorti, o transliterizar propra nomi. $1",
"translate-page-edit": "redaktar",
+ "translate-edit-title": "Redaktar \"$1\"",
"translate-edit-definition": "Defino di la mesajo",
"translate-edit-contribute": "kontributez",
"translate-edit-no-information": "<em>Ica mesajo ne havas dokumentigo.\nSe vu savas ube o quale ica mesajo uzesas, vu povas helpar altra tradukuri, per la kreado di dokumentigo pri ica mesajo.</em>",
"translate-edit-information": "Informo pri mesajo ($1)",
- "translate-edit-in-other-languages": "Mesajo en altra lingui",
"translate-edit-warnings": "Avizi pri nekompleta tradukuri",
"translate-use-suggestion": "Substitucar la nuna tradukuro per ca sugesto.",
"translate-checks-parameters": "Atencez! La sequanta {{PLURAL:$2|parametro|parametri}} ne uzesis:\n<strong>$1</strong>",
@@ -39,8 +39,10 @@
"translate-checks-gettext-plural-unsupported": "Ca mesajo ne aceptas <nowiki>{{PLURAL:GETTEXT|}}</nowiki>.",
"translate-pref-editassistlang-help": "Listo pri kodexo di lingui separata per komo (,).\nLa tradukuro di ula mesajo en ica lingui montresas dum ke vu tradukas.\nLa listo 'default' pri lingui dependas de vua propra linguo.",
"translate-pref-editassistlang-bad": "Linguala kodexo nevalida che la listo:\n<nowiki>$1</nowiki>.",
+ "translate-rcfilters-translations": "Tradukuri",
+ "translate-rcfilters-translations-only-label": "Tradukuri",
"translate-rc-translation-filter-only": "Montrez nur tradukuri",
- "translate-stats-edits": "Editi",
+ "translate-stats-edits": "Redakturi",
"translate-stats-users": "Tradukeri",
"translate-stats-reviews": "Revizuri",
"translate-statsf-scale": "Tempo-skalo:",
@@ -48,6 +50,7 @@
"translate-statsf-scale-weeks": "Semani",
"translate-statsf-scale-days": "Dii",
"translate-statsf-scale-hours": "Hori",
+ "translate-statsf-count-reviews": "Revizi di la tradukuri",
"translate-statsf-submit": "Previdar",
"translate-tag-page-desc": "Tradukuro de la pagino wiki [[$2|$1]], de $3 ($4).",
"translate-sidebar-alltrans": "En altra lingui",
@@ -72,6 +75,7 @@
"translate-language": "Linguo",
"translate-total": "Mesaji",
"translate-percentage-fuzzy": "Sen aktualigo",
+ "translate-percentage-proofread": "Revizita",
"translate-languagestats-overall": "Omna grupi di mesaji kune",
"translate-ls-submit": "Montrez statistiki",
"translate-ls-column-group": "Grupo di mesaji",
@@ -86,17 +90,15 @@
"supportedlanguages-recenttranslations": "recenta tradukuri",
"supportedlanguages-count": "Entote $1 {{PLURAL:$1|linguo|lingui}}.",
"translate-supportedlanguages-cached": "Ca informo konservesis $1 ante nun.",
- "translate-save": "Registragar ($1)",
"managemessagegroups": "Administrado di mesajo-grupi",
"translate-smg-nochanges": "Existas nula modifiki por procedar.",
"translate-smg-left": "Kontenajo di la mesajo en la Wiki",
"translate-manage-import-rename-summary": "Rinomizita en extera fonto",
"translate-import-err-stale-group": "Ne existas la mesajo-grupo a quo ica arkivo apartenas.",
- "translate-js-skip": "Saltez a la sequanta",
- "translate-js-support": "Questionar",
"translate-documentation-language": "Dokumentado pri la mesajo",
"translate-searchprofile": "Tradukuri",
"translate-searchprofile-tooltip": "Serchez de omna tradukuri",
+ "log-description-translationreview": "Registro di omna tradukuro-revizuri e mesajo-grupi.",
"translate-dynagroup-recent-label": "recenta tradukuri",
"translate-dynagroup-recent-desc": "Ica grupo di mesaji montras omna recenta tradukuri ad ica linguo.\nTo esas utila precipue por la revizo-taski.",
"translate-dynagroup-additions-label": "Recenta adjuntaji",
@@ -109,6 +111,7 @@
"tux-tab-untranslated": "Ne tradukita",
"tux-tab-outdated": "Sen aktualigo",
"tux-tab-translated": "Tradukita",
+ "tux-edit": "Redaktar",
"tux-status-fuzzy": "Sen aktualigo",
"tux-editor-placeholder": "Vua tradukuro",
"tux-editor-editsummary-placeholder": "Rezumo fakultativa",
@@ -117,6 +120,8 @@
"tux-editor-save-button-label": "Sparez la tradukuro",
"tux-editor-skip-button-label": "Saltez a la sequanta",
"tux-editor-cancel-button-label": "Nuligar",
+ "tux-editor-confirm-button-label": "Konfirmez tradukuro",
+ "tux-editor-proofread-button-label": "Indikar kom revizita",
"tux-editor-shortcut-info": "Kliktez \"$1\" por konservar, o \"$2\" por saltar a la sequanta mesajo, o \"$4\" por furnisar rezumo, o \"$3\" por altra plu kurta voyi tra la klavaro.",
"tux-editor-edit-desc": "Redaktar dokumentigo",
"tux-editor-add-desc": "Adjuntez dokumenti",
@@ -131,6 +136,8 @@
"tux-editor-message-desc-less": "Montrez mine",
"tux-editor-clear-translated": "Celar facita tradukuri",
"tux-editor-proofreading-mode": "Revizuri",
+ "tux-proofread-action-tooltip": "Indikar kom revizita",
+ "tux-proofread-edit-label": "Redaktar",
"tux-editor-page-mode": "Pagino",
"tux-editor-outdated-notice": "Ica tradukuro posible esas obsoleta.",
"tux-editor-outdated-notice-diff-link": "Montrez diferi",
@@ -141,6 +148,9 @@
"tux-messagetable-loading-messages": "Karganta {{PLURAL:$1|mesajo|mesaji}}...",
"tux-message-filter-placeholder": "Filtrez listo",
"tux-message-filter-optional-messages-label": "Fakultativa mesaji",
+ "tux-empty-list-all": "Ca mesajo-grupo esas vakua",
+ "tux-empty-list-all-guide": "Selektez diferanta mesajo-grupo por tradukar",
+ "tux-translate-page-no-such-group": "<strong>La grupo mencionita ne existas.</strong> Selektez altra diferanta grupo.",
"tux-empty-list-translated-action": "Tradukar",
"tux-empty-there-are-optional": "Existas fakultativa mesaji, ne montrata en ca listo",
"tux-empty-list-other": "Nulo por tradukar",
diff --git a/MLEB/Translate/i18n/core/is.json b/MLEB/Translate/i18n/core/is.json
index 86748d9b..10711874 100644
--- a/MLEB/Translate/i18n/core/is.json
+++ b/MLEB/Translate/i18n/core/is.json
@@ -42,11 +42,9 @@
"translate-ignored": "(hunsað)",
"translate-edit-title": "Breyta \"$1\"",
"translate-edit-definition": "Útskýring á meldingu",
- "translate-edit-translation": "Þýðing",
"translate-edit-contribute": "breyta",
"translate-edit-no-information": "<em>Þessi melding er ekki með neinar leiðbeiningar.\nEf þú veist hvar eða hvernig meldingin er notuð getur þú hjálpað öðrum þýðendum með því að bæta ábendingum við hana.</em>",
"translate-edit-information": "Upplýsingar um þessa meldingu ($1)",
- "translate-edit-in-other-languages": "Meldingin á öðrum tungumálum",
"translate-edit-warnings": "Viðvaranir vegna ókláraðra þýðinga",
"translate-edit-tmmatch-source": "Uppruna texti þýðingarinnar: $1",
"translate-edit-tmmatch": "$1% samsvörun",
@@ -163,7 +161,6 @@
"supportedlanguages-recenttranslations": "nýlegar þýðingar",
"supportedlanguages-count": "$1 {{PLURAL:$1|tungumál}} alls.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|breyting|breytingar}} - síðasta breyting {{PLURAL:$3|í gær|fyrir $3 dögum}} síðan",
- "translate-save": "Vista ($1)",
"translate-jssti-add": "Bæta við listann",
"managemessagegroups": "Stjórn þýðingahóps",
"translate-smg-notallowed": "Þú hefur ekki leyfi til að framkvæma þessa aðgerð.",
@@ -179,13 +176,6 @@
"translate-import-from-local": "Senda inn skrá af tölvunni:",
"translate-import-load": "Hlaða inn skrá",
"translate-import-err-ul-failed": "Sending skrár mistókst",
- "translate-js-summary": "Ágrip:",
- "translate-js-save": "Vista",
- "translate-js-next": "Vista og opna næstu",
- "translate-js-skip": "Sleppa og fara yfir á næsta.",
- "translate-js-history": "Breytingaskrá þýðingar",
- "translate-js-support": "Spyrja spurningar",
- "translate-js-support-title": "Óskaðu eftir hjálp ef það eru ekki nægar upplýsingar til að þýða þessi skilaboð rétt.",
"translate-js-support-unsaved-warning": "Þú hefur óvistaðar þýðingar.",
"translate-gs-pos": "Staðs.",
"translate-gs-code": "Kóði",
diff --git a/MLEB/Translate/i18n/core/it.json b/MLEB/Translate/i18n/core/it.json
index 8ef4c538..fcd4e17e 100644
--- a/MLEB/Translate/i18n/core/it.json
+++ b/MLEB/Translate/i18n/core/it.json
@@ -59,11 +59,9 @@
"translate-ignored": "(ignorato)",
"translate-edit-title": "Modifica \"$1\"",
"translate-edit-definition": "Definizione del messaggio",
- "translate-edit-translation": "Traduzione",
"translate-edit-contribute": "contribuisci",
"translate-edit-no-information": "<em>Questo messaggio non ha documentazione.\nSe sai dove o come è usato questo messaggio, puoi aiutare gli altri traduttori aggiungendo la documentazione a questo messaggio.</em>",
"translate-edit-information": "Informazioni sul messaggio ($1)",
- "translate-edit-in-other-languages": "Messaggio in altre lingue",
"translate-edit-warnings": "Avvisi sulle traduzioni incomplete",
"translate-edit-tmmatch-source": "Testo di origine per la traduzione: $1",
"translate-edit-tmmatch": "$1&nbsp;% di corrispondenza",
@@ -139,8 +137,8 @@
"translate-statsf-scale": "Un punto ogni:",
"translate-statsf-scale-months": "Mese",
"translate-statsf-scale-weeks": "Settimana",
- "translate-statsf-scale-days": "Giorno",
- "translate-statsf-scale-hours": "Ora",
+ "translate-statsf-scale-days": "Giorni",
+ "translate-statsf-scale-hours": "Ore",
"translate-statsf-count": "Misura:",
"translate-statsf-count-edits": "Numero di modifiche",
"translate-statsf-count-users": "Traduttori attivi",
@@ -150,6 +148,7 @@
"translate-statsf-language": "Elenco dei codici delle lingue separati da virgola:",
"translate-statsf-group": "Elenco dei codici dei gruppi separati da virgola:",
"translate-statsf-submit": "Anteprima",
+ "translate-statsf-unknown-error": "Si è verificato un errore sconosciuto.",
"translate-tag-page-desc": "Traduzione della pagina wiki [[$2|$1]] da $3 ($4).",
"translate-sidebar-alltrans": "In altre lingue",
"translations": "Tutte le traduzioni",
@@ -194,8 +193,8 @@
"translate-mgs-totals": "Tutte le $1 {{PLURAL:$1|lingua|lingue}} insieme",
"translate-mgs-invalid-group": "Il gruppo indicato $1 non esiste.",
"translate-mgs-nothing": "Nulla da mostrare per le statistiche richieste.",
- "supportedlanguages": "Lingue mantenute",
- "supportedlanguages-summary": "Questa pagina mostra un elenco di tutte le lingue mantenute da {{SITENAME}}, insieme ai nomi dei traduttori che hanno lavorato su quella lingua. Il nome di un traduttore appare di dimensioni maggiori in proporzione al numero di modifiche che ha apportato, mentre il colore della sottolineatura indica quanto tempo è passato dalla sua ultima attività.",
+ "supportedlanguages": "Lingue attive",
+ "supportedlanguages-summary": "Questa pagina mostra un elenco di tutte le lingue attive in {{SITENAME}}, insieme ai nomi dei traduttori che hanno lavorato su quella lingua. Il nome di un traduttore appare di dimensioni maggiori in proporzione al numero di modifiche che ha apportato, mentre il colore della sottolineatura indica quanto tempo è passato dalla sua ultima attività.",
"supportedlanguages-colorlegend": "Legenda dei colori: ultima traduzione $1 giorni fa.",
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -205,7 +204,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|lingua|lingue}} in totale.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|modifica|modifiche}} - ultima modifica $3 {{PLURAL:$3|giorno|giorni}} fa",
"abusefilter-edit-builder-vars-translate-source-text": "Testo di origine di un'unità di traduzione",
- "translate-save": "Pubblica ($1)",
"translate-jssti-add": "Aggiungi all'elenco",
"managemessagegroups": "Gestione del gruppo di messaggi",
"translate-smg-notallowed": "Non sei autorizzato a eseguire questa azione.",
@@ -219,6 +217,13 @@
"translate-smg-rename-cancel": "Annulla",
"translate-smg-rename-no-msg": "Nessun messaggio trovato.",
"translate-smg-rename-new": "Aggiungi come nuovo...",
+ "translate-smg-strong-sync-help": "Aiuto",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|messaggio|messaggi}} con errori:",
+ "translate-smg-group-message-tag-rename": "Rinomina",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Etichetta|Etichette}}:",
+ "translate-smg-group-message-message-content": "Contenuto:",
+ "translate-smg-group-message-message-target": "Obiettivo:",
+ "translate-smg-group-message-message-other-langs": "Altre lingue:",
"translate-manage-import-diff": "Messaggio $1 | Azioni: $2",
"translate-manage-import-new": "Nuovo messaggio $1",
"translate-manage-import-deleted": "Cancellato messaggio $1",
@@ -236,6 +241,7 @@
"translate-manage-intro-other": "Di seguito sono elencati i cambiamenti alle traduzioni nella lingua $1.\nControlla le modifiche e scegli l'azione da eseguire per ciascun messaggio.\nSe scegli di ignorare i cambiamenti, questa azione sarà solo temporanea.",
"translate-manage-import-ok": "Importato: $1",
"translate-manage-import-done": "Importazione completa!",
+ "translate-manage-source-message-not-found": "Definizione messaggio non trovata",
"importtranslations": "Importa traduzioni",
"translate-import-from-local": "Carica file locale:",
"translate-import-load": "Carica file",
@@ -245,13 +251,6 @@
"translate-import-err-no-such-file": "Il file <nowiki>$1</nowiki> non esiste o non è stato caricato a livello locale.",
"translate-import-err-stale-group": "Il gruppo di messaggi a cui appartiene questo file non esiste.",
"translate-import-err-no-headers": "Il file non è un file Gettext correttamente formattato per l'estensione Translate:\nImpossibile determinare il gruppo di messaggi e la lingua dalle intestazioni del file.",
- "translate-js-summary": "Oggetto:",
- "translate-js-save": "Pubblica",
- "translate-js-next": "Pubblica e passa al successivo",
- "translate-js-skip": "Passa al successivo",
- "translate-js-history": "Cronologia traduzione",
- "translate-js-support": "Fai una domanda",
- "translate-js-support-title": "Richiesta d'assistenza nel caso non si trovino sufficienti informazioni per tradurre questo messaggio.",
"translate-js-support-unsaved-warning": "Ci sono traduzioni non pubblicate.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Codice",
diff --git a/MLEB/Translate/i18n/core/ja.json b/MLEB/Translate/i18n/core/ja.json
index 6e01bbbf..02443429 100644
--- a/MLEB/Translate/i18n/core/ja.json
+++ b/MLEB/Translate/i18n/core/ja.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"2nd-player",
+ "Aefgh39622",
"Afaz",
"Akaniji",
"Aotake",
@@ -20,6 +21,7 @@
"Schu",
"Shirayuki",
"Sujiniku",
+ "Tamaki Wakita",
"Whym",
"神樂坂秀吉",
"青子守歌",
@@ -63,11 +65,9 @@
"translate-ignored": "(翻訳無視)",
"translate-edit-title": "「$1」を編集",
"translate-edit-definition": "メッセージ定義",
- "translate-edit-translation": "翻訳",
"translate-edit-contribute": "編集",
"translate-edit-no-information": "<em>このメッセージについての説明文はありません。\nこのメッセージがどこでどのように使用されているか知っている場合は、説明文を投稿して他の翻訳者を助けてください。</em>",
"translate-edit-information": "メッセージについての情報 ($1)",
- "translate-edit-in-other-languages": "他言語でのメッセージ",
"translate-edit-warnings": "不完全な翻訳に対する警告",
"translate-edit-tmmatch-source": "翻訳元の文章: $1",
"translate-edit-tmmatch": "$1%の一致",
@@ -152,6 +152,7 @@
"translate-statsf-language": "言語コードを列挙 (カンマ区切り):",
"translate-statsf-group": "メッセージ群コードを列挙 (カンマ区切り):",
"translate-statsf-submit": "プレビュー",
+ "translate-statsf-unknown-error": "不明なエラーが発生しました。",
"translate-tag-page-desc": "ウィキページ [[$2|$1]] に対する $3 ($4) からの翻訳です。",
"translate-sidebar-alltrans": "他言語での翻訳",
"translations": "全翻訳結果",
@@ -207,9 +208,9 @@
"supportedlanguages-recenttranslations": "最近の翻訳",
"supportedlanguages-count": "合計 $1 {{PLURAL:$1|言語}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|回の編集}}・$3 {{PLURAL:$3|日}}前に最終編集",
+ "translate-supportedlanguages-cached": "この情報は$1前にキャッシュされました。",
"abusefilter-edit-builder-vars-translate-source-text": "翻訳単位の原文",
"abusefilter-edit-builder-vars-translate-target-language": "翻訳先言語",
- "translate-save": "保存 ($1)",
"translate-jssti-add": "追加",
"managemessagegroups": "メッセージ群の管理",
"translate-smg-notallowed": "この操作を行うことは許可されていません。",
@@ -226,6 +227,12 @@
"translate-smg-rename-select-err": "改名するメッセージを選択してください",
"translate-smg-rename-no-msg": "メッセージが見つかりません。",
"translate-smg-rename-dialog-title": "$1に適した改名を選択",
+ "translate-smg-groups-with-error-title": "同期の時にエラーが発生したグループ",
+ "translate-smg-group-message-action-history": "履歴",
+ "translate-smg-group-message-tag-rename": "名前を変更",
+ "translate-smg-group-message-message-content": "内容:",
+ "translate-smg-group-message-message-target": "対象:",
+ "translate-smg-group-message-message-other-langs": "その他の言語:",
"translate-manage-import-diff": "メッセージ $1 | 操作: $2",
"translate-manage-import-new": "新しいメッセージ $1",
"translate-manage-import-deleted": "削除されたメッセージ $1",
@@ -247,6 +254,7 @@
"translate-manage-intro-other": "以下は言語 $1 での翻訳の変更の一覧です。\nそれぞれの更新について、変更を精査して、行いたい操作を選択してください。\n変更を無視することを選択した場合、この操作は一時的なものに留まります。",
"translate-manage-import-ok": "取り込みました: $1",
"translate-manage-import-done": "取り込みました。",
+ "translate-manage-source-message-not-found": "メッセージの意味が見つかりませんでした",
"importtranslations": "翻訳の取り込み",
"translate-import-from-local": "ローカルファイルをアップロード:",
"translate-import-load": "ファイル読み込み",
@@ -256,14 +264,7 @@
"translate-import-err-no-such-file": "ファイル <nowiki>$1</nowiki> は存在しないか、ローカルにアップロードされていません。",
"translate-import-err-stale-group": "このファイルが所属するメッセージ群は存在しません。",
"translate-import-err-no-headers": "ファイルが Translate 拡張機能の形式に正しく適応した gettext ファイルではありません。\nファイル ヘッダーからメッセージ群と言語を決定できませんでした。",
- "translate-js-summary": "要約:",
- "translate-js-save": "保存",
- "translate-js-next": "保存して次を開く",
- "translate-js-skip": "次へスキップ",
- "translate-js-history": "翻訳履歴",
- "translate-js-support": "サポートに質問",
- "translate-js-support-title": "このメッセージを正しく翻訳するための情報が足りない場合は助けを求めてください。",
- "translate-js-support-unsaved-warning": "保存していない翻訳があります。",
+ "translate-js-support-unsaved-warning": "公開されていない翻訳があります。",
"translate-gs-pos": "順位",
"translate-gs-code": "コード",
"translate-gs-continent": "大陸",
@@ -316,14 +317,14 @@
"tux-status-fuzzy": "要更新",
"tux-status-proofread": "査読済",
"tux-status-translated": "翻訳済",
- "tux-status-saving": "保存中...",
- "tux-status-unsaved": "未保存",
+ "tux-status-saving": "公開中...",
+ "tux-status-unsaved": "未公開",
"tux-save-unknown-error": "不明なエラーが発生しました。",
"tux-editor-placeholder": "あなたの翻訳を入力",
"tux-editor-editsummary-placeholder": "要約 (省略可能)",
"tux-editor-paste-original-button-label": "原文を貼り付け",
"tux-editor-discard-changes-button-label": "変更内容を破棄",
- "tux-editor-save-button-label": "翻訳を保存",
+ "tux-editor-save-button-label": "翻訳を公開",
"tux-editor-skip-button-label": "次へスキップ",
"tux-editor-cancel-button-label": "キャンセル",
"tux-editor-confirm-button-label": "翻訳を確認",
@@ -338,7 +339,7 @@
"tux-editor-tm-match": "$1%の一致",
"tux-notices-more": "{{PLURAL:$1|他 $1 件}}",
"tux-notices-hide": "非表示",
- "tux-editor-save-failed": "翻訳の保存に失敗しました: $1",
+ "tux-editor-save-failed": "翻訳の公開に失敗しました: $1",
"tux-editor-n-uses": "$1 {{PLURAL:$1|回}}使用",
"tux-editor-message-desc-more": "続きを表示",
"tux-editor-message-desc-less": "折り畳む",
@@ -353,7 +354,7 @@
"tux-editor-outdated-notice": "この翻訳は修正が必要かもしれません。",
"tux-editor-outdated-notice-diff-link": "差分を表示",
"tux-editor-doc-editor-placeholder": "メッセージについての説明文",
- "tux-editor-doc-editor-save": "説明文を保存",
+ "tux-editor-doc-editor-save": "説明文を公開",
"tux-editor-doc-editor-cancel": "キャンセル",
"tux-messagetable-more-messages": "他 $1 {{PLURAL:$1|件のメッセージ}}",
"tux-messagetable-loading-messages": "{{PLURAL:$1|メッセージ}}を読み込み中...",
diff --git a/MLEB/Translate/i18n/core/jam.json b/MLEB/Translate/i18n/core/jam.json
index 964fe986..5e95684c 100644
--- a/MLEB/Translate/i18n/core/jam.json
+++ b/MLEB/Translate/i18n/core/jam.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Dentonius",
"Katxis",
"Yocahuna"
]
@@ -31,9 +32,8 @@
"translate-edit-contribute": "kanchribiut",
"translate-edit-no-information": "''Dis mechiz naa no dakiumentieshan.\nEf yu nuo we ar ou dis mechiz yuuz, yu kiahn elp ada chranslieta bai ad dakiumentieshan tu dis mechiz.''",
"translate-edit-information": "Infamieshan bout mechiz \"$2\" ($1)",
- "translate-edit-in-other-languages": "Mechiz \"$1\" in ada langwij",
"translate-edit-warnings": "Waanin bout inkompliit chranslieshan",
"translate-edit-tmmatch": "$1% mach",
"translate-use-suggestion": "Insoert dis sojeshan ina di chranslieshan ieria. Dis riplies aal korant kantent.",
- "translate-documentation-language": "Mechiz dakiumentieshan"
+ "translate-documentation-language": "Translation help"
}
diff --git a/MLEB/Translate/i18n/core/jbo.json b/MLEB/Translate/i18n/core/jbo.json
index 39724016..89dd2a80 100644
--- a/MLEB/Translate/i18n/core/jbo.json
+++ b/MLEB/Translate/i18n/core/jbo.json
@@ -8,7 +8,6 @@
},
"translate-page-edit": "stika ti",
"translate-edit-title": "stika $1",
- "translate-edit-in-other-languages": "lo notci poi se bangu lo drata",
"translate-rc-translation-filter": "pagrygau lo xe fanva",
"translate-stats-edits": "stika",
"translate-stats-users": "le fanva",
@@ -17,9 +16,6 @@
"translate-translations-project": "co'a bandu",
"translate-translations-history-short": "c",
"translate-language": "lo bangu",
- "translate-save": "rejgau to $1 toi",
- "translate-js-save": "gau se vreji",
- "translate-js-support": "ko retsku",
"translate-gs-total": "lo sumji",
"tux-edit": "stika",
"tux-editor-cancel-button-label": "kansele",
diff --git a/MLEB/Translate/i18n/core/jv.json b/MLEB/Translate/i18n/core/jv.json
index 9ab194d2..a0bae145 100644
--- a/MLEB/Translate/i18n/core/jv.json
+++ b/MLEB/Translate/i18n/core/jv.json
@@ -17,8 +17,8 @@
"translate-taskui-export-as-po": "Èspor kanggo pertalan njaban jaringan",
"translate-taction-translate": "Pertal",
"translate-taction-proofread": "Priksa",
- "translate-taction-lstats": "Statistik basa",
- "translate-taction-mstats": "Statistik golongan layang",
+ "translate-taction-lstats": "Setatistik basa",
+ "translate-taction-mstats": "Setatistik golongan layang",
"translate-taction-export": "Èspor",
"translate-taction-disabled": "Tumindak iki dipatèni ing wiki iki.",
"translate-page-no-such-language": "Basa kang kapilih ora trep.",
@@ -45,11 +45,9 @@
"translate-ignored": "(dilirwakaké)",
"translate-edit-title": "Besut \"$1\"",
"translate-edit-definition": "Wedharaning layang",
- "translate-edit-translation": "Pertalan",
"translate-edit-contribute": "nyumbang",
"translate-edit-no-information": "<em>Layang iki ora ana dhokumèntasiné.\nManawa kowé ngerti ana ing endi lan kapriyé layang iki kaanggo, kowé bisa ngéwangi kang mertal liyané kanthi nambahaké dhokumèntasi menyang layang iki.</em>",
"translate-edit-information": "Pratélan ngenani layang ($1)",
- "translate-edit-in-other-languages": "Layang ing basa liya",
"translate-edit-warnings": "Pepéling bab pertalan kang durung rampung",
"translate-edit-tmmatch-source": "Tulisan sumber pertalan: $1",
"translate-edit-tmmatch": "$1% cocog",
@@ -94,13 +92,13 @@
"translate-rc-translation-filter-only": "Tuduhaké pertalané waé",
"translate-rc-translation-filter-filter": "Saring kajaba pertalan",
"translate-rc-translation-filter-site": "Mung owah-owahan ing layang situs waé",
- "translationstats": "Statistik pertalan",
+ "translationstats": "Setatistik pertalan",
"translate-stats-edits": "Besutan",
"translate-stats-users": "Pamertal",
"translate-stats-registrations": "Pandhaftaran",
"translate-stats-reviews": "Pepriksan",
"translate-stats-reviewers": "Pamriksa",
- "translate-statsf-intro": "Pajenengan bisa nggawé statistik prasaja migunakaké formulir iki. Kabèh angka nduwèni wates ndhuwur lan ngisor.",
+ "translate-statsf-intro": "Pajenengan bisa nggawé setatistik prasaja migunakaké formulir iki. Kabèh angka nduwèni wates ndhuwur lan ngisor.",
"translate-statsf-options": "Opsi grafik",
"translate-statsf-width": "Jembar jroning piksel:",
"translate-statsf-height": "Dhuwur jroning piksel:",
@@ -132,13 +130,13 @@
"translate-translations-project": "Proyèk:",
"translate-translations-including-no-param": "Sumangga isi kunci layang kang trep ing paramètèr anak-kacané",
"translate-translations-history-short": "r",
- "languagestats": "Statistik basa",
- "languagestats-summary": "Kaca iki nuduhaké statistik pertalan saka kabèh golongan layang mungguh ing sawijining basa.",
- "messagegroupstats-summary": "Kaca iki nuduhaké statistik golongan layang.",
- "languagestats-stats-for": "Statistik pertalan kanggo $1 ($2).",
+ "languagestats": "Setatistik basa",
+ "languagestats-summary": "Kaca iki nuduhaké setatistik pertalan saka kabèh golongan layang mungguh ing sawijining basa.",
+ "messagegroupstats-summary": "Kaca iki nuduhaké setatistik golongan layang.",
+ "languagestats-stats-for": "Setatistik pertalan kanggo $1 ($2).",
"languagestats-recenttranslations": "pertalan mentas waé",
- "translate-langstats-incomplete": "Sapérangan statistik ing kaca iki ora wutuh. Sumangga ambali ngamot supaya olèh statistik liyané.",
- "translate-langstats-expand": "amba",
+ "translate-langstats-incomplete": "Sapérangan setatistik ing kaca iki ora wutuh. Sumangga ambali ngamot supaya olèh setatistik liyané.",
+ "translate-langstats-expand": "jembarna",
"translate-langstats-collapse": "ciyut",
"translate-langstats-expandall": "ambakaké kabèh",
"translate-langstats-collapseall": "ciyutaké kabèh",
@@ -152,18 +150,18 @@
"translate-percentage-complete": "Parampungan",
"translate-percentage-fuzzy": "Lawas",
"translate-languagestats-overall": "Kabèh golongan layang mesisan",
- "translate-ls-submit": "Tuduhaké statistik",
+ "translate-ls-submit": "Tuduhaké setatistik",
"translate-ls-column-group": "Golongan layang",
- "translate-mgs-pagename": "Statistik golongan layang",
+ "translate-mgs-pagename": "Setatistik golongan layang",
"translate-mgs-fieldset": "Pitontonaké pilalan",
"translate-mgs-group": "Golongan layang:",
"translate-mgs-nocomplete": "Aja mitontonaké basa kang wis rampung kapertal",
"translate-mgs-noempty": "Aja majang basa kang durung ana pertalané",
- "translate-mgs-submit": "Tuduhaké statistik",
+ "translate-mgs-submit": "Tuduhaké setatistik",
"translate-mgs-column-language": "Basa",
"translate-mgs-totals": "Kabèh $1 {{PLURAL:$1|basa|basa}}",
"translate-mgs-invalid-group": "Golongan $1 kang kokarsakaké ora ana.",
- "translate-mgs-nothing": "Ora ana kang bisa katuduhaké bab statistik kang kokarsakaké.",
+ "translate-mgs-nothing": "Ora ana kang bisa katuduhaké bab setatistik kang kokarsakaké.",
"supportedlanguages": "Basa kang kasengkuyung",
"supportedlanguages-colorlegend": "Legèndha tumrap werna: Pertalan pungkasan $1 dina kapungkur.",
"supportedlanguages-portallink": "[$1] $2 - $3",
@@ -173,7 +171,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|basa}} kabèhé.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|besutan}} - besutan pungkasan $3 {{PLURAL:$3|dina}} kapungkur",
"abusefilter-edit-builder-vars-translate-source-text": "Tèks sumberé unit pertalan",
- "translate-save": "Simpen ($1)",
"translate-jssti-add": "Tambah ing pratélan",
"managemessagegroups": "Tata kemunah golongan layang",
"translate-smg-notallowed": "Kowé ora kawogan nglakokaé iki.",
@@ -206,13 +203,6 @@
"translate-import-err-no-such-file": "Barkas <nowiki>$1</nowiki> ora ana utawa durung diunggah ing papan lokal.",
"translate-import-err-stale-group": "Golongan layangé barkas iki ora ana.",
"translate-import-err-no-headers": "Barkasé dudu barkas Gettext kang karipta kanthi becik nganggo format èstènsi Pertal:\nOra bisa nemtokaké golongan lan basané layang saka sesirahé barkas.",
- "translate-js-summary": "Ringkesan:",
- "translate-js-save": "Simpen",
- "translate-js-next": "Simpen lan bukak sabanjuré",
- "translate-js-skip": "Lumpati menyang sabanjuré",
- "translate-js-history": "Sajarah pertalan",
- "translate-js-support": "Takon",
- "translate-js-support-title": "Njaluk pitulung yèn ora ana cukup informasi kanggo nerjemahaké layang iki kanthi bener.",
"translate-js-support-unsaved-warning": "Ana pertalanmu kang durung kasimpen.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kodhe",
diff --git a/MLEB/Translate/i18n/core/ka.json b/MLEB/Translate/i18n/core/ka.json
index 63b9e882..a322ca6e 100644
--- a/MLEB/Translate/i18n/core/ka.json
+++ b/MLEB/Translate/i18n/core/ka.json
@@ -38,9 +38,7 @@
"translate-ignored": "(იგნორირებული)",
"translate-edit-title": "„$1“ რედაქტირება",
"translate-edit-definition": "შეტყობინების განმარტება",
- "translate-edit-translation": "თარგმანი",
"translate-edit-no-information": "''ამ შეტყობინებას არ აქვს დოკუმენტაცია.''\n''თუ იცით სად და როგორ გამოიყენება ეს შეტყობინება, გთხოვთ დაეხმაროთ სხვა მთარგმნელებს და დაურთოთ დოკუმენტაცია ამ შეტყობინებას.''",
- "translate-edit-in-other-languages": "ეს შეტყობინება სხვა ენებზე",
"translate-edit-tmmatch": "$1% შესაბამისობა",
"translate-checks-malformed": "<nowiki>$1</nowiki> არაკორექტულია.",
"translate-pref-editassistlang": "დამხმარე ენები:",
@@ -115,7 +113,6 @@
"supportedlanguages-recenttranslations": "ბოლო თარგმანები",
"supportedlanguages-count": "სულ $1 {{PLURAL:$1|ენა|ენა}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|რედაქტირება|რედაქტირება}} - ბოლო რედაქტირება $3 {{PLURAL:$3|დღის|დღის}} წინ",
- "translate-save": "შენახვა ($1)",
"translate-jssti-add": "სიაში დამატება",
"translate-manage-import-diff": "შეტყობინება $1 | მოქმედება: $2",
"translate-manage-import-new": "ახალი შეტყობინება $1",
@@ -128,13 +125,7 @@
"translate-import-from-local": "ლოკალური ფაილის ატვირთვა:",
"translate-import-load": "ფაილის ჩამოტვირთვა",
"translate-import-err-ul-failed": "ფაილის ატვირთვა ვერ მოხერხდა",
- "translate-js-summary": "რეზიუმე:",
- "translate-js-save": "შენახვა",
- "translate-js-next": "შენახვა და მომდევნოს გახსნა",
- "translate-js-skip": "შემდეგზე გადასვლა",
- "translate-js-history": "თარგმანის ისტორია",
- "translate-js-support": "კითხვის დასმა",
- "translate-js-support-unsaved-warning": "თქვენ გაქვთ შეუნახავი თარგმანები.",
+ "translate-js-support-unsaved-warning": "თქვენ გაქვთ გამოუქვეყნებელი თარგმანები.",
"translate-gs-pos": "პოზ.",
"translate-gs-code": "კოდი",
"translate-gs-continent": "კონტინენტი",
@@ -167,13 +158,13 @@
"tux-status-fuzzy": "მოძველებული",
"tux-status-proofread": "შემოწმებულია",
"tux-status-translated": "ნათარგმნი",
- "tux-status-saving": "ინახება...",
- "tux-status-unsaved": "არ შეინახა",
+ "tux-status-saving": "გამოქვეყნება...",
+ "tux-status-unsaved": "არ გამოქვეყნდა",
"tux-save-unknown-error": "დაფიქსირდა უცნობი შეცდომა.",
"tux-editor-placeholder": "თქვენი თარგმანები",
"tux-editor-paste-original-button-label": "საწყისი ტექსტის ჩასმა",
"tux-editor-discard-changes-button-label": "ცვლილებების გაუქმება",
- "tux-editor-save-button-label": "თარგმანის შენახვა",
+ "tux-editor-save-button-label": "თარგმანის გამოქვეყნება",
"tux-editor-skip-button-label": "შემდეგზე გადასვლა",
"tux-editor-cancel-button-label": "გაუქმება",
"tux-editor-confirm-button-label": "თარგმანის დადასტურება",
@@ -199,7 +190,7 @@
"tux-editor-outdated-notice": "შესაძლოა, ეს თარგმანი განახლებას საჭიროებს",
"tux-editor-outdated-notice-diff-link": "განსხვავებების ჩვენება",
"tux-editor-doc-editor-placeholder": "შეტყობინების დოკუმენტაცია",
- "tux-editor-doc-editor-save": "დოკუმენტაციის შენახვა",
+ "tux-editor-doc-editor-save": "დოკუმენტაციის გამოქვეყნება",
"tux-editor-doc-editor-cancel": "გაუქმება",
"tux-messagetable-more-messages": "კიდევ $1 {{PLURAL:$1|შეტყობინება|შეტყობინება}}",
"tux-messagetable-loading-messages": "იტვირთება {{PLURAL:$1|შეტყობინება|შეტყობინება}}...",
diff --git a/MLEB/Translate/i18n/core/kaa.json b/MLEB/Translate/i18n/core/kaa.json
index 3fd1c406..427d5eff 100644
--- a/MLEB/Translate/i18n/core/kaa.json
+++ b/MLEB/Translate/i18n/core/kaa.json
@@ -27,7 +27,6 @@
"translate-edit-contribute": "u'les qosıw",
"translate-edit-no-information": "''Bul xabardın' hu'jjet mag'lıwmatı joq. Eger siz bul xabar qayerde yamasa qalay paydalang'anın bilsen'iz, basqa awdarıwshılıwg'a usı xabardın' hu'jjet mag'lıwmatın ko'rsetip ja'rdem beriwin'iz mu'mkin.''",
"translate-edit-information": "Bul xabar haqqında mag'lıwmat ($1)",
- "translate-edit-in-other-languages": "Bul xabar basqa tillerde",
"translate-edit-warnings": "Tolıq awdarılmag'an xabarlar haqqında esletpeler",
"translate-checks-parameters": "To'mendegi parametrler qollanılmag'an: <strong>$1</strong>",
"translate-checks-balance": "Qawıslardın' sanı jup emes: <strong>$1</strong>",
diff --git a/MLEB/Translate/i18n/core/kab.json b/MLEB/Translate/i18n/core/kab.json
index 5858c493..ea89a032 100644
--- a/MLEB/Translate/i18n/core/kab.json
+++ b/MLEB/Translate/i18n/core/kab.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Belkacem77",
+ "Bilalbill",
"Mmistmurt"
]
},
@@ -38,10 +39,8 @@
"translate-ignored": "(yettwazgel)",
"translate-edit-title": "Ẓreg \"$1\"",
"translate-edit-definition": "Tabadut n yizen",
- "translate-edit-translation": "Tasuqilt",
"translate-edit-contribute": "ttekki",
"translate-edit-information": "Talɣef ɣef yizen ($1)",
- "translate-edit-in-other-languages": "Izen di tutlayin-nniḍen",
"translate-edit-warnings": "Alɣu ɣef tsuqilin ur yemmiden ara",
"translate-edit-tmmatch-source": "Aḍris aɣbalu n tsuqilt : $1",
"translate-edit-tmmatch": "$1 % n umenṭaḍ",
@@ -111,7 +110,7 @@
"translate-total": "Iznan",
"translate-untranslated": "Ur yettwasuqel ara",
"translate-percentage-complete": "Afmiḍi",
- "translate-percentage-fuzzy": "Ifat",
+ "translate-percentage-fuzzy": "Izri",
"translate-languagestats-overall": "Akk igrawen n yiznan i meṛṛa",
"translate-ls-submit": "Sken tidaddanin",
"translate-ls-column-group": "Agraw n yiznan",
@@ -124,7 +123,6 @@
"supportedlanguages": "Tutlayin yettusefraken",
"supportedlanguages-recenttranslations": "tisuqilin tineggura",
"supportedlanguages-count": "$1 {{PLURAL:$1|tutlayt|tutlayin}} s umata.",
- "translate-save": "Sekles ($1)",
"managemessagegroups": "Asefrek n ugraw n yiznan",
"translate-manage-import-diff": "Iznan $1 | Tiggawin: $2",
"translate-manage-import-new": "Izen amaynut $1",
@@ -143,9 +141,6 @@
"translate-import-err-dl-failed": "Ur izmir ara ad yekcem ar ufaylu:\n$1",
"translate-import-err-ul-failed": "Asali n ufaylu ur yeddi ara",
"translate-import-err-invalid-title": "Isem n ufayly yettwanefken <nowiki>$1</nowiki> mačči d ameɣtu.",
- "translate-js-summary": "Agzul:",
- "translate-js-save": "Sekles",
- "translate-js-next": "Sekles sakin ldi wayeḍ",
"translate-gs-code": "Tangalt",
"translate-gs-continent": "Amenẓaw",
"translate-gs-score": "Agmuḍ",
@@ -163,7 +158,7 @@
"tux-languageselector": "Suqel ar",
"tux-tab-all": "Akk",
"tux-tab-untranslated": "Ur yettwasuqel ara",
- "tux-tab-outdated": "Ifat",
+ "tux-tab-outdated": "Izri",
"tux-tab-translated": "Yettwasuqel",
"tux-edit": "Ẓreg",
"tux-status-fuzzy": "Ifat",
@@ -224,7 +219,7 @@
"tux-editor-loading": "Asali...",
"translate-search-more-languages-info": "$1 {{PLURAL:$1|tutlayt-nniḍen|tutlayin-nniḍen}}",
"translate-statsbar-tooltip": "$1% tasuqilt, $2% taɣuri",
- "translate-statsbar-tooltip-with-fuzzy": "$1% asuqilt, $2% acegger, $3% ifat",
+ "translate-statsbar-tooltip-with-fuzzy": "$1% asuqilt, $2% acegger, $3% izri",
"translate-search-more-groups-info": "$1 n {{PLURAL:$1|ugraw|igrawen}}-nniden",
"tux-nojs": "Asebter-agi yesra JavaScript."
}
diff --git a/MLEB/Translate/i18n/core/kcg.json b/MLEB/Translate/i18n/core/kcg.json
new file mode 100644
index 00000000..ed13f522
--- /dev/null
+++ b/MLEB/Translate/i18n/core/kcg.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "translate-documentation-language": "Saailyuut ta̱m"
+}
diff --git a/MLEB/Translate/i18n/core/kjp.json b/MLEB/Translate/i18n/core/kjp.json
index 67dd56ea..d68969cf 100644
--- a/MLEB/Translate/i18n/core/kjp.json
+++ b/MLEB/Translate/i18n/core/kjp.json
@@ -18,10 +18,8 @@
"translate-page-edit": "သံင့်ၜးၯဴ",
"translate-edit-title": "သံင့်ၜးၯဴ \"$1\"",
"translate-edit-definition": "ပ်ုယုံ့ဆ်ုခၠါင် ဆ်ုမါဏါင်းအ်ုခဝ့်ပ်ုယဝ့်",
- "translate-edit-translation": "ဆ်ုခၠယ့်ထသယ်လ်ုဖး",
"translate-edit-contribute": "ဆ်ုထ္ၜါ",
"translate-edit-information": "ပ်ုယုံ့ဆ်ုခၠါင်အ်ုကျံင် ဆ်ုပြိုင့်အ်ုဖၠံင်အ်ုဖၠ ($1)",
- "translate-edit-in-other-languages": "အ်ုၰာႋၰံင်ဆ်ုခၠါင်ဘာႋသာ့ခဝ့် ပ်ုယုံ့ဆ်ုခၠါင်",
"translate-rcfilters-translations": "ဆ်ုခၠယ်ထသယ်လ်ုဖး",
"translate-rcfilters-translations-only-label": "ဆ်ုခၠယ့်ထသယ်လ်ုဖး",
"translationstats": "ဆ်ုခၠယ့် စ်ုရင့်ကါင်ကါ",
@@ -64,7 +62,6 @@
"supportedlanguages-recenttranslations": "လ်ုယိက်လ်ုမဝ်ႋ ဆ်ုခၠယ့်လ်ုဖး",
"supportedlanguages-count": "{{PLURAL:$1|ဆ်ုခၠါင်ဘာႋသာ့|ဆ်ုခၠါင်ဘာႋသာ့လ်ုဖး}} ကုံကံင်း $1",
"translate-manage-action-import": "ဆူ့ဍုဂ်သုံ့လင်",
- "translate-js-support": "မ်ုအင်းကိင်ဆ်ုအင်းစာ",
"translate-documentation-language": "လိက်ၜၠာ် လိက်မါၮါင်း",
"translate-searchprofile": "ဆ်ုခၠယ့်ထသယ်လ်ုဖး",
"translate-dynagroup-recent-label": "လ်ုယိက်လ်ုမဝ်ႋ ဆ်ုခၠယ့်လ်ုဖး",
diff --git a/MLEB/Translate/i18n/core/kk-arab.json b/MLEB/Translate/i18n/core/kk-arab.json
index cdf9848e..840faf35 100644
--- a/MLEB/Translate/i18n/core/kk-arab.json
+++ b/MLEB/Translate/i18n/core/kk-arab.json
@@ -26,7 +26,6 @@
"translate-edit-contribute": "ۇلەس بەر",
"translate-edit-no-information": "''بۇل حابار قۇجاتتاماسىز. ەگەر وسى حاباردىڭ قايدا نەمەسە قالاي قولدانعانىن بىلسەڭىز, بۇل حابارعا قۇجاتتاما كەلتىرىپ, باسقا اۋدارۋشىلارعا كومەكتەسە الاسىز.''",
"translate-edit-information": "بۇل حابار تۋرالى مالىمەت ($1)",
- "translate-edit-in-other-languages": "حابار باسقا تىلدەردە",
"translate-edit-warnings": "تولىق اۋدارىلماعان حابارلار تۋرالى اڭعارتپالار",
"translate-checks-parameters": "كەلەسى باپتالىمدار پايدالانىلماعان: <strong>$1</strong>",
"translate-checks-balance": "مىندا جاقشالاردىڭ بارلىق سانى جۇپ ەمەس: <strong>$1</strong>",
diff --git a/MLEB/Translate/i18n/core/kk-cyrl.json b/MLEB/Translate/i18n/core/kk-cyrl.json
index 8c94b0bc..e73d2cd5 100644
--- a/MLEB/Translate/i18n/core/kk-cyrl.json
+++ b/MLEB/Translate/i18n/core/kk-cyrl.json
@@ -40,11 +40,9 @@
"translate-ignored": "(елемейтін)",
"translate-edit-title": "«$1» аудармасын өңдеу",
"translate-edit-definition": "Хабар анықтауы",
- "translate-edit-translation": "Аударма",
"translate-edit-contribute": "өңдеу",
"translate-edit-no-information": "<em>Бұл хабар құжаттамасыз.\nЕгер бұл хабардың қайда немесе қалай қолданғанын білсеңіз, бұл хабарға құжаттама келтіру арқылы басқа аударушыларға көмектесе аласыз.</em>",
"translate-edit-information": "Бұл хабар туралы мәлімет ($1)",
- "translate-edit-in-other-languages": "Хабар басқа тілдерде",
"translate-edit-warnings": "Толық аударылмаған аудармалар туралы ескертулер",
"translate-edit-tmmatch-source": "Аударма қайнар мәтіні: $1",
"translate-edit-tmmatch": "$1% сәйкес келеді",
@@ -136,7 +134,6 @@
"supportedlanguages": "Қолдайтын тілдер",
"supportedlanguages-recenttranslations": "жуықтағы аудармалар",
"supportedlanguages-count": "Барлығы $1 {{PLURAL:$1|тіл|тіл}}.",
- "translate-save": "Сақтау ($1)",
"translate-jssti-add": "Тізімге қосу",
"managemessagegroups": "Хабарлама тобы басқарылуы",
"translate-smg-nochanges": "Үрдісте ешбір өзгеріс жоқ.",
@@ -154,13 +151,6 @@
"translate-import-load": "Файлды оқу",
"translate-import-err-ul-failed": "Файлды жүктеу сәттіз болды",
"translate-import-err-invalid-title": "Көрсетілген <nowiki>$1</nowiki> файл атауы дұрыс емес.",
- "translate-js-summary": "Түйіндемесі:",
- "translate-js-save": "Сақтау",
- "translate-js-next": "Сақтау жөне келесісін ашу",
- "translate-js-skip": "Келесісіне өту",
- "translate-js-history": "Аударма тарихы",
- "translate-js-support": "Сұрақ қою",
- "translate-js-support-title": "Егер бұл хабарламаны дұрысымен аудару үшін жеткілікті мәлімет болмаса көмек сұрау.",
"translate-js-support-unsaved-warning": "Сізде сақталмаған аудармаларыңыз бар.",
"translate-gs-pos": "Орын",
"translate-gs-code": "Код",
diff --git a/MLEB/Translate/i18n/core/kk-latn.json b/MLEB/Translate/i18n/core/kk-latn.json
index 00f62619..0ee1bdb3 100644
--- a/MLEB/Translate/i18n/core/kk-latn.json
+++ b/MLEB/Translate/i18n/core/kk-latn.json
@@ -28,7 +28,6 @@
"translate-edit-contribute": "üles ber",
"translate-edit-no-information": "''Bul xabar qujattamasız. Eger osı xabardıñ qaýda nemese qalaý qoldanğanın bilseñiz, bul xabarğa qujattama keltirip, basqa awdarwşılarğa kömektese alasız.''",
"translate-edit-information": "Bul xabar twralı mälimet ($1)",
- "translate-edit-in-other-languages": "Xabar basqa tilderde",
"translate-edit-warnings": "Tolıq awdarılmağan xabarlar twralı añğartpalar",
"translate-checks-parameters": "Kelesi baptalımdar paýdalanılmağan: <strong>$1</strong>",
"translate-checks-balance": "Mında jaqşalardıñ barlıq sanı jup emes:\n<strong><nowiki>$1</nowiki></strong>",
diff --git a/MLEB/Translate/i18n/core/km.json b/MLEB/Translate/i18n/core/km.json
index aaf8499c..9c8bec75 100644
--- a/MLEB/Translate/i18n/core/km.json
+++ b/MLEB/Translate/i18n/core/km.json
@@ -44,11 +44,9 @@
"translate-ignored": "(បានបោះបង់)",
"translate-edit-title": "កែប្រែ \"$1\"",
"translate-edit-definition": "និយមន័យ​របស់​សារ",
- "translate-edit-translation": "ការបកប្រែ",
"translate-edit-contribute": "រួមចំណែក",
"translate-edit-no-information": "<em>សារ​នេះ​មិន​មាន​ព័ត៌មាន​បន្ថែម​ទេ​។\nប្រសិនបើ​អ្នក​ដឹង​ពី​ទីកន្លែង និង​របៀប​ប្រើប្រាស់​សារ​នេះ អ្នក​អាច​ជួយ​អ្នក​បកប្រែ​ផ្សេងទៀត​តាមរយៈ​ការ​ដាក់​បន្ថែម​ព័ត៌មាន​ទាំងនោះ​មក​ឱ្យ​សារ​នេះ​។</em>",
"translate-edit-information": "ព័ត៌មាន​អំពី​សារ ($1)",
- "translate-edit-in-other-languages": "សារជាភាសា​ដទៃទៀត",
"translate-edit-warnings": "ការព្រមាន​អំពី​បទប្រែសម្រួលមិនពេញលេញ",
"translate-edit-tmmatch-source": "ការ​បក​ប្រែ​ប្រភព​អត្ថបទ៖ $1",
"translate-edit-tmmatch": "ត្រូវគ្នា $1%",
@@ -159,7 +157,6 @@
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|អ្នកបកប្រែ}}|អ្នកបកប្រែ}}៖ $1",
"supportedlanguages-recenttranslations": "ការបកប្រែនាពេលថ្មីៗ",
"supportedlanguages-count": "$1 {{PLURAL:$1|ភាសា|ភាសា}}ទាំងអស់",
- "translate-save": "រក្សាទុក ($1)",
"translate-jssti-add": "បន្ថែមទៅក្នុង​បញ្ជី​",
"managemessagegroups": "ការគ្រប់គ្រងក្រុមសារ",
"translate-manage-import-diff": "សារ $1 | សកម្មភាព៖ $2",
@@ -171,13 +168,6 @@
"importtranslations": "នាំចូល​ការបកប្រែ​",
"translate-import-load": "ផ្ទុក​ឯកសារ​",
"translate-import-err-ul-failed": "ការផ្ទុក​ឡើង​នៃឯកសារ​ មិនបានជោគជ័យ​",
- "translate-js-summary": "ចំណារពន្យល់៖",
- "translate-js-save": "រក្សាទុក",
- "translate-js-next": "រក្សាទុករួចបើកសារបន្ទាប់",
- "translate-js-skip": "រំលងទៅកាន់សារបន្ទាប់",
- "translate-js-history": "ប្រវត្តិនៃការបកប្រែ",
- "translate-js-support": "សួរសំណួរ",
- "translate-js-support-title": "សួររកជំនួយប្រសិនបើគ្មានព័ត៌មានគ្រប់គ្រាន់សំរាប់ជួយអោយអ្នកបកប្រើសារនេះបានត្រឹមត្រូវទេ។",
"translate-js-support-unsaved-warning": "អ្នកមានការបកប្រែដែលមិនទាន់បានរក្សាទុក។",
"translate-gs-pos": "ទីតាំង",
"translate-gs-code": "កូដ",
diff --git a/MLEB/Translate/i18n/core/kn.json b/MLEB/Translate/i18n/core/kn.json
index a0905b8f..17a6302d 100644
--- a/MLEB/Translate/i18n/core/kn.json
+++ b/MLEB/Translate/i18n/core/kn.json
@@ -1,13 +1,15 @@
{
"@metadata": {
"authors": [
+ "AVSmalnad77",
"Dimension10",
"Dipin",
"Munirathnam",
"Nayvik",
"Omshivaprakash",
"VASANTH S.N.",
- "Yogesh"
+ "Yogesh",
+ "ಮಲ್ನಾಡಾಚ್ ಕೊಂಕ್ಣೊ"
]
},
"translate": "ಭಾಷಾಂತರಿಸಿ",
@@ -37,11 +39,9 @@
"translate-ignored": "ಕಡೆಗಣಿಸಲ್ಪಟ್ಟ",
"translate-edit-title": "\"$1\"ನ್ನು ಸಂಪಾದಿಸು",
"translate-edit-definition": "ಸಂದೇಶ ವ್ಯಾಖ್ಯೆ",
- "translate-edit-translation": "ಅನುವಾದ",
"translate-edit-contribute": "ನೆರವಾಗು",
"translate-edit-no-information": "\"ಈ ಸಂದೇಶಕ್ಕೆ ಯಾವುದೇ ದಾಖಲೆಗಳಿಲ್ಲ.\"\n\"ನಿಮಗೆ ಈ ಸಂದೇಶ ಎಲ್ಲಿಯಾದರೂ ಅಥವಾ ಹೇಗಾದರೂ ಉಪಯೋಗದಲ್ಲಿರುವುದು ತಿಳಿದಿದ್ದರೆ,ನೀವು ಇದಕ್ಕೆ ತಕ್ಕ ದಾಖಲೆಗಳನ್ನು ಸೇರಿಸಿ ಬೇರಿ ಭಾಷಾಂತರಕಾರರಿಗೆ ಸಹಾಯ ಮಾಡಬಹುದು.\"",
"translate-edit-information": "ಸಂದೇಶದ ಬಗ್ಗೆ ಮಾಹಿತಿ ($1)",
- "translate-edit-in-other-languages": "ಬೇರೆ ಭಾಷೆಗಳಲ್ಲಿ ಸಂದೇಶ",
"translate-edit-warnings": "ಅಸಂಪೂರ್ಣ ಭಾಷಾಂತರದ ಬಗ್ಗೆ ಎಚ್ಚರಿಕೆ",
"translate-edit-tmmatch": "$1% ಹೊ೦ದಿಸಿ",
"translate-use-suggestion": "ಈಗಿನ ಭಾಷಾಂತರವನ್ನು ಈ ಸಲಹೆಯೊಂದಿಗೆ ಬದಲಾಯಿಸಿ",
@@ -70,7 +70,7 @@
"translate-statsf-scale-months": "ತಿಂಗಳುಗಳು",
"translate-statsf-scale-weeks": "ವಾರಗಳು",
"translate-statsf-scale-days": "ದಿನಗಳು",
- "translate-statsf-scale-hours": "ಘಂಟೆಗಳು",
+ "translate-statsf-scale-hours": "ಗಂಟೆಗಳು",
"translate-statsf-count": "ಅಳತೆ:",
"translate-statsf-count-edits": "ಸಂಪಾದನೆಗಳ ಸಂಖ್ಯೆ",
"translate-statsf-count-users": "ಸಕ್ರಿಯ ಭಾಷಾಂತರಕಾರರು",
@@ -91,8 +91,9 @@
"translate-language": "ಭಾಷೆ",
"translate-total": "ಸಂದೇಶಗಳು",
"translate-mgs-column-language": "ಭಾಷೆ",
+ "supportedlanguages": "ಸಕ್ರಿಯ ಭಾಷೆಗಳು",
"translate-manage-import-new": "ಹೊಸ ಸಂದೇಶ $1",
- "translate-manage-import-done": "ಎಲ್ಲಾ ಮಾಡಲ್ಪಟ್ಟಿದೆ!",
+ "translate-manage-import-done": "ಆಮದು ಮುಗಿಯಿತು!",
"importtranslations": "ಭಾಷಾಂತರಗಳನ್ನು ಆಮದು ಮಾಡಿ",
"translate-gs-total": "ಒಟ್ಟು",
"translate-documentation-language": "ಸಂದೇಶ ದಾಖಲೀಕರಣ",
diff --git a/MLEB/Translate/i18n/core/ko.json b/MLEB/Translate/i18n/core/ko.json
index 09faceb6..be55b7ba 100644
--- a/MLEB/Translate/i18n/core/ko.json
+++ b/MLEB/Translate/i18n/core/ko.json
@@ -54,11 +54,9 @@
"translate-ignored": "(무시됨)",
"translate-edit-title": "\"$1\" 편집하기",
"translate-edit-definition": "메시지 정의",
- "translate-edit-translation": "번역",
"translate-edit-contribute": "기여",
"translate-edit-no-information": "이 메시지에 대한 설명문이 없습니다.\n만약 이 메시지가 어디에 어떻게 사용되는지 알고 있다면 설명문을 작성해 다른 번역자를 도와줄 수 있습니다.",
"translate-edit-information": "이 메시지에 대한 정보 ($1)",
- "translate-edit-in-other-languages": "이 메시지의 다른 언어판",
"translate-edit-warnings": "불완전한 번역에 대한 경고",
"translate-edit-tmmatch-source": "번역 원본 텍스트: $1",
"translate-edit-tmmatch": "$1% 일치",
@@ -141,6 +139,7 @@
"translate-statsf-language": "언어 코드의 쉼표로 구분한 목록:",
"translate-statsf-group": "그룹 코드의 쉼표로 구분한 목록:",
"translate-statsf-submit": "미리 보기",
+ "translate-statsf-unknown-error": "알 수 없는 오류가 발생했습니다.",
"translate-tag-page-desc": "$3 ($4)에서의 [[$2|$1]] 위키 문서의 번역입니다.",
"translate-sidebar-alltrans": "다른 언어",
"translations": "모든 번역",
@@ -186,7 +185,7 @@
"translate-mgs-totals": "$1개의 모든 {{PLURAL:$1|언어}}",
"translate-mgs-invalid-group": "지정한 $1 그룹이 존재하지 않습니다.",
"translate-mgs-nothing": "요청된 통계에 대해 보여줄 것이 없습니다.",
- "supportedlanguages": "지원하는 언어",
+ "supportedlanguages": "활성화된 언어",
"supportedlanguages-summary": "이 문서는 {{SITENAME}}에서 지원하는 모든 언어의 목록과 그 언어로 번역하는 번역자의 이름을 보여줍니다.\n번역자가 편집을 더 많이 할수록 이름이 크게 나타납니다.\n밑줄의 색깔은 번역자가 얼마나 최근에 활동했는지를 나타냅니다.",
"supportedlanguages-colorlegend": "색깔 범례: 마지막 번역을 한 날짜가 $1일 전.",
"supportedlanguages-sqlite-error": "SQLite는 지원되지 않습니다",
@@ -196,7 +195,6 @@
"supportedlanguages-activity": "$1: {{PLURAL:$2|편집}} $2회 - 마지막 편집 $3{{PLURAL:$3|일}} 전",
"abusefilter-edit-builder-vars-translate-source-text": "번역 단위의 소스 본문",
"abusefilter-edit-builder-vars-translate-target-language": "번역 대상 언어",
- "translate-save": "게시 ($1)",
"translate-jssti-add": "목록에 추가",
"managemessagegroups": "메시지 그룹 관리",
"translate-smg-notallowed": "이 작업을 실행하는 것을 허용하지 않습니다.",
@@ -213,6 +211,21 @@
"translate-smg-rename-no-msg": "메시지가 없습니다.",
"translate-smg-rename-new": "새 이름으로 추가...",
"translate-smg-rename-rename": "다른 이름으로 추가...",
+ "translate-smg-no-groups-in-sync": "현재 동기화 중인 그룹이 없습니다",
+ "translate-smg-strong-sync-help": "도움말",
+ "translate-smg-groups-in-sync": "현재 동기화 중인 그룹",
+ "translate-smg-groups-in-sync-list": "현재 백그라운드에서 처리 중인 그룹 목록:",
+ "translate-smg-groups-with-error-title": "동기화 도중 오류가 발생한 그룹",
+ "translate-smg-groups-with-error-desc": "동기화 도중 오류가 발생한 그룹 목록:",
+ "translate-smg-group-with-error-summary": "오류가 있는 {{PLURAL:$1|메시지}} $1개",
+ "translate-smg-group-message-action-history": "역사",
+ "translate-smg-group-message-tag-outdated": "오래됨",
+ "translate-smg-group-message-tag-rename": "이름 바꾸기",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|태그}}:",
+ "translate-smg-group-message-message-content": "내용:",
+ "translate-smg-group-message-message-target": "대상:",
+ "translate-smg-group-message-message-replacement": "대체:",
+ "translate-smg-group-message-message-other-langs": "다른 언어:",
"translate-manage-import-diff": "메시지 $1 | 동작: $2",
"translate-manage-import-new": "새 메시지 $1",
"translate-manage-import-deleted": "메시지 $1을 삭제했습니다.",
@@ -234,6 +247,9 @@
"translate-manage-intro-other": "다음은 $1로 된 번역 바뀜 목록입니다.\n바뀜을 검토하고 각 업데이트에 대해 수행할 작업을 선택하세요.\n바뀜을 무시하기로 선택했다면 이 작업만 일시적입니다.",
"translate-manage-import-ok": "가져옴: $1",
"translate-manage-import-done": "가져오기 완료!",
+ "translate-manage-empty-content": "내용이 비었음",
+ "translate-manage-key-reused": "이 메시지는 위키에 이미 존재합니다. 오래된 키를 우연히 재사용한 것은 아닌지 확인하십시오.",
+ "translate-manage-source-message-not-found": "메시지 정의가 없습니다",
"importtranslations": "번역 가져오기",
"translate-import-from-local": "컴퓨터에 있는 파일 올리기:",
"translate-import-load": "파일 불러오기",
@@ -243,13 +259,6 @@
"translate-import-err-no-such-file": "<nowiki>$1</nowiki> 파일이 없거나 이 위키에 올려지지 않았습니다.",
"translate-import-err-stale-group": "이 파일에 들어있는 메시지 그룹이 존재하지 않습니다.",
"translate-import-err-no-headers": "파일이 번역 확장 기능에 쓰이는 올바른 형식의 Gettext 파일이 아닙니다:\n파일 헤더에서 메시지 그룹과 언어를 판독할 수 없습니다.",
- "translate-js-summary": "요약:",
- "translate-js-save": "게시",
- "translate-js-next": "게시하고 다음으로 넘어가기",
- "translate-js-skip": "다음으로 넘어가기",
- "translate-js-history": "번역 역사",
- "translate-js-support": "질문하기",
- "translate-js-support-title": "이 메시지를 정확히 번역할 만한 정보가 부족하다면 도움을 요청하세요.",
"translate-js-support-unsaved-warning": "번역을 게시하지 않았습니다.",
"translate-gs-pos": "순위",
"translate-gs-code": "코드",
diff --git a/MLEB/Translate/i18n/core/ksh.json b/MLEB/Translate/i18n/core/ksh.json
index 4e11569b..700372ce 100644
--- a/MLEB/Translate/i18n/core/ksh.json
+++ b/MLEB/Translate/i18n/core/ksh.json
@@ -40,11 +40,9 @@
"translate-ignored": "(övverjange)",
"translate-edit-title": "„$1“ ändere",
"translate-edit-definition": "De Ojinaal Nohreesch",
- "translate-edit-translation": "Övversäzong",
"translate-edit-contribute": "beijdraare",
"translate-edit-no-information": "<em>Mer han kein Dokementazjohn för dat Täxshtöck.</em>\n<em>Wann De weijß, wann un woh et jebruch weed, da kanns De dä anndere Övversäzer hellefe, un jet för_et ennjävve.</em>",
"translate-edit-information": "Ennfommazjohne övver dä Täx udder di Nohreesch ($1)",
- "translate-edit-in-other-languages": "Dä Täx udder di Nohreesch in anndere Schprohche",
"translate-edit-warnings": "Warnonge wääje unkomplätte Övversäzonge&#32;",
"translate-edit-tmmatch-source": "Et Ojinaal för ze Övversäzze: $1",
"translate-edit-tmmatch": "$1% zopaß",
@@ -160,7 +158,6 @@
"supportedlanguages-recenttranslations": "neuste Övversäzunge",
"supportedlanguages-count": "{{PLURAL:$1|Ein Schprohch|$1 Schprohche|Kein Schprohche}} ensjesamp.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|Ein Änderong|$2 Änderonge|Kein Änderonge}} — de lätzde wohr {{PLURAL:$3|vör einem Daach|vör $3 Dääsch|hück}}.",
- "translate-save": "Faßhallde ($1)",
"translate-jssti-add": "Bei de Leß dobei donn",
"managemessagegroups": "Jroppeverwalldong",
"translate-smg-notallowed": "Di Axjuhn darfs De nit ußföhre.",
@@ -196,13 +193,6 @@
"translate-import-err-no-such-file": "Di Datei „<nowiki>$1</nowiki>“ jidd_et nit, udder se es nit heh en et Wiki huhjelaade.",
"translate-import-err-stale-group": "De Jropp met Täxte un Nohreeschte, woh heh di Dattei bei jehüüre sull, di jidd_et jaanit.",
"translate-import-err-no-headers": "Di Dattei es nit em Jettäx Fommaht vum Zohsazprojramm <code lang=\"en\" xml:lang=\"en\">Translate</code>: Kunnt de Jropp un Schprohch nit uß de Koppdahte eruß krijje.",
- "translate-js-summary": "Koot Zosammejefaß:",
- "translate-js-save": "Faßhalde",
- "translate-js-next": "Faßhalde un op de nähkßte jonn",
- "translate-js-skip": "Jank op de nähkßte",
- "translate-js-history": "Dä Övversäzong ier Verjangeheit",
- "translate-js-support": "Schtäll en Frohch",
- "translate-js-support-title": "Frohch noh, wann De nit jenohch Aanjahbe häs, öm heh dä Täx udder di Nohreesch joohd un akeraht ze övversäze.",
"translate-js-support-unsaved-warning": "Do häß onjeschpeischerte Övversäzzonge.",
"translate-gs-pos": "Posizjuhn",
"translate-gs-code": "Afjekööz",
diff --git a/MLEB/Translate/i18n/core/ku-latn.json b/MLEB/Translate/i18n/core/ku-latn.json
index e188db96..af1abfb8 100644
--- a/MLEB/Translate/i18n/core/ku-latn.json
+++ b/MLEB/Translate/i18n/core/ku-latn.json
@@ -28,10 +28,8 @@
"translate-optional": "(ne pêwîst)",
"translate-edit-title": "Biguherîne \"$1\"",
"translate-edit-definition": "Peyama orjînal",
- "translate-edit-translation": "Werger",
"translate-edit-contribute": "beşdar bibe",
"translate-edit-information": "Agahiyên di derbarê peyamê de ($1)",
- "translate-edit-in-other-languages": "Peyam bi zimanên din",
"translate-edit-tmmatch": "$1% lê tê",
"translate-edit-nopermission": "Bona tu karibî peyaman wergerînî mafên wergerandinê pêwist e.",
"translate-edit-askpermission": "Destûrê bistîne",
@@ -45,7 +43,7 @@
"translate-rc-translation-filter-only": "Tenê wergerandinan nîşan bide",
"translate-rc-translation-filter-filter": "Wergeran parzûn bike",
"translationstats": "Statîstîkên wergeran",
- "translate-stats-edits": "Guherandin",
+ "translate-stats-edits": "Guhartin",
"translate-stats-users": "Wergêr",
"translate-stats-reviews": "Nirxandin",
"translate-stats-reviewers": "Nirxandêr",
@@ -54,7 +52,7 @@
"translate-statsf-scale-days": "Roj",
"translate-statsf-scale-hours": "Saet",
"translate-statsf-count": "Pîvan:",
- "translate-statsf-count-edits": "Hejmara guherandinan",
+ "translate-statsf-count-edits": "Hejmara guhertinan",
"translate-statsf-count-users": "Wergêrên çalak",
"translate-statsf-count-registrations": "Bikarhênerên nû",
"translate-statsf-count-reviews": "Nirxandinên wergerê",
@@ -92,13 +90,12 @@
"translate-mgs-group": "Koma peyamê:",
"translate-mgs-submit": "Statîstîkan nîşan bide",
"translate-mgs-column-language": "Ziman",
- "translate-mgs-totals": "Hemû ziman bi hev re",
+ "translate-mgs-totals": "Hemû {{PLURAL:$1|ziman|zimanan}} bi hev re",
"supportedlanguages": "Zimanên tên bikaranîn",
"supportedlanguages-summary": "Ev rûpel lîsteya hemû zimananên ku {{SITENAME}} piştgiriyê dide wan, û wergerên ku li ser vî zimanî dixebitin, nîşan dide.\nGava navê wergêrekî mezintir xuya dike, ev tê wê wateyê ku ev wergêr gelek caran beşdar bûye.\nRengên binxetekê çalakiya wergêr nîşan didin.",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Wergêr}}|Wergêr}}: $1",
"supportedlanguages-recenttranslations": "wergerên niha",
"supportedlanguages-count": "Bi tevahî $1 {{PLURAL:$1|ziman}}",
- "translate-save": "($1) biweşîne",
"translate-jssti-add": "Têxe lîsteyê",
"managemessagegroups": "Birêvebirina komên peyaman",
"translate-manage-import-diff": "Peyam $1 |Çalakî: $2",
@@ -107,13 +104,7 @@
"translate-manage-action-import": "Tevlî bike",
"translate-manage-action-ignore": "Paşguh bike",
"translate-import-load": "Dosyeyê bar bike",
- "translate-js-summary": "Kurte:",
- "translate-js-save": "Biweşîne",
- "translate-js-next": "Biweşîne û yê din veke",
- "translate-js-skip": "Derbasî ya din bibe",
- "translate-js-history": "Dîroka wergerê",
- "translate-js-support": "Bipirse",
- "translate-js-support-unsaved-warning": "Wergerên te yên newergerandî hene.",
+ "translate-js-support-unsaved-warning": "Wergerên te yên neweşandî hene.",
"translate-gs-code": "Kod",
"translate-gs-continent": "Parzemîn",
"translate-gs-speakers": "Axaftvan",
@@ -126,7 +117,7 @@
"translate-dynagroup-recent-label": "Wergerên dawî",
"translate-dynagroup-recent-desc": "Ev koma peyaman hemû wergerandinên dawî ber bi vî zimanî ve nîşan dide. Bo karên nirxandinê pir bikêr e.",
"translate-dynagroup-additions-label": "Lêzêdekirinên dawî",
- "translate-dynagroup-additions-desc": "Ev koma peyaman peyamên nû û guherandî nîşan dide.",
+ "translate-dynagroup-additions-desc": "Ev koma peyaman peyamên nû û guhartî nîşan dide.",
"translate-msggroupselector-projects": "Koma peyaman",
"translate-msggroupselector-search-placeholder": "Li koman bigere",
"translate-msggroupselector-search-all": "Hemû",
@@ -158,7 +149,7 @@
"tux-editor-tm-match": "$1% lê tê",
"tux-notices-more": "{{PLURAL:$1|zêdetir $1}}",
"tux-notices-hide": "veşêre",
- "tux-editor-save-failed": "Tomarkirina wergerê biser neket:$1",
+ "tux-editor-save-failed": "Weşandina wergerê bi ser neket:$1",
"tux-editor-message-desc-more": "Zêdetir bibîne",
"tux-editor-message-desc-less": "Kêmtir bibîne",
"tux-editor-clear-translated": "Yên wergerandî veşêre",
@@ -171,7 +162,7 @@
"tux-editor-page-mode": "Rûpel",
"tux-editor-outdated-notice": "Ev werger divê bê rojanekirin.",
"tux-editor-outdated-notice-diff-link": "Cudahiyan nîşan bide",
- "tux-editor-doc-editor-save": "Belgekirinê tomar bike",
+ "tux-editor-doc-editor-save": "Belgekirinê biweşîne",
"tux-editor-doc-editor-cancel": "Betal bike",
"tux-messagetable-more-messages": "$1 {{PLURAL:$1|peyamên}} din",
"tux-messagetable-loading-messages": "{{PLURAL:$1|Peyam}} tên barkirin..",
@@ -186,7 +177,7 @@
"tux-empty-list-translated-action": "Wergerîne",
"tux-empty-no-outdated-messages": "Peyamên kevnbûyî tune ne",
"tux-empty-you-can-review-already-proofread": "Tu dikarî wergerên ku ji aliyê kesên din ve hatine nirxandin, binirxînî.",
- "tux-empty-list-other": "Ti tiştê bê wergerandin tune ye",
+ "tux-empty-list-other": "Ti tiştên ku werin wergerandin nînin",
"tux-empty-list-other-guide": "Tu dikarî wergerên hene binirxînî",
"tux-empty-list-other-action": "Wergeran binirxîne",
"tux-empty-list-other-link": "Hemû peyaman nîşan bide",
diff --git a/MLEB/Translate/i18n/core/ky.json b/MLEB/Translate/i18n/core/ky.json
index ffd970dc..e722a0ae 100644
--- a/MLEB/Translate/i18n/core/ky.json
+++ b/MLEB/Translate/i18n/core/ky.json
@@ -47,13 +47,11 @@
"supportedlanguages": "Колдолгон тилдер",
"supportedlanguages-translators": "{{PLURAL:$2|Котормочу|Котормочулар}}: $1",
"supportedlanguages-recenttranslations": "жакындагы котормолор",
- "translate-save": "Сактоо ($1)",
"translate-jssti-add": "Тизмеге кошуу",
"translate-manage-import-new": "Жаңы билдирүү $1",
"translate-manage-action-import": "Импорт",
"importtranslations": "Котормолорду импорттоо",
"translate-import-load": "Файлды жүктөө",
- "translate-js-save": "Сактоо",
"translate-gs-code": "Код",
"translate-searchprofile": "Котормолор",
"translate-msggroupselector-search-all": "Баары",
diff --git a/MLEB/Translate/i18n/core/lb.json b/MLEB/Translate/i18n/core/lb.json
index 9b5395b1..002b7132 100644
--- a/MLEB/Translate/i18n/core/lb.json
+++ b/MLEB/Translate/i18n/core/lb.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ignoréiert)",
"translate-edit-title": "\"$1\" änneren",
"translate-edit-definition": "Definitioun vum Message",
- "translate-edit-translation": "Iwwersetzung",
"translate-edit-contribute": "matschaffen",
"translate-edit-no-information": "<em>Dëse Message huet keng Dokumentatioun.\nWann Dir wësst wou oder wéi dëse Message gebraucht gëtt, da kënnt Dir aner Iwwersetzer hëllefen an deem Dir Informatiounen iwwer dëse Message gitt.</em>",
"translate-edit-information": "Informatioun iwwer de Message ($1)",
- "translate-edit-in-other-languages": "Message an anere Sproochen",
"translate-edit-warnings": "Warnunge virun onkompletten Iwwersetzungen",
"translate-edit-tmmatch-source": "Quelltext fir d'Iwwersetzung: $1",
"translate-edit-tmmatch": "$1% Iwwereneestëmmung",
@@ -71,11 +69,12 @@
"translate-checks-parametersnotequal": "D'Zuel vun de Parameteren ass {{PLURAL:$1|$1}} et {{PLURAL:$2|dierft awer nëmmen ee sinn|missten der awer $2 sinn}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> ass formal net valabel.",
"translate-checks-fudforum-syntax": "<nowiki>$1</nowiki> aplaz vu(n) <nowiki>$2</nowiki> an dësem Projet benotzen.",
+ "translate-checks-replacement": "Benotzt $2 amplaz vu(n) $1",
"translate-pref-editassistlang": "Sproochen déi ënnerstëtzen:",
"prefs-translate": "Optioune vun der Iwwersetzung",
"translate-pref-editassistlang-help": "Mat Komma getrennte Lëscht vun de Sproochcoden.\nIwwersetzung vun engem Message an dës Sprooche gëtt gewisen wann Dir iwwersetzt.\nD'Standard-Lëscht vu Sproochen hànkt vun Ärer Sprooch of.",
"translate-pref-editassistlang-bad": "Net valabele Sproochcode an der Lëscht:\n<nowiki>$1</nowiki>.",
- "right-translate": "Mat dem Iwwersetzungs Tool änneren",
+ "right-translate": "Mam Iwwersetzungs-Tool änneren",
"right-translate-manage": "Message-Gruppe geréieren",
"action-translate-manage": "Message-Gruppe geréieren",
"right-translate-import": "Offline Iwwersetzungen importéieren",
@@ -98,7 +97,7 @@
"translate-stats-edits": "Ännerunge",
"translate-stats-users": "Iwwersetzer",
"translate-stats-registrations": "Umellungen",
- "translate-stats-reviews": "Iwwerpréifungen",
+ "translate-stats-reviews": "Iwwerpréiwungen",
"translate-stats-reviewers": "Iwwerlieser",
"translate-statsf-intro": "Dir kënnt einfach Statistike mat dësem Formulaire generéieren.\nAll Wäerter hunn eng ënnescht an eng iewescht Limit.",
"translate-statsf-options": "Optioune vum Graphique",
@@ -120,6 +119,7 @@
"translate-statsf-language": "Komma-getrennte Lëscht vun de Sproochcoden:",
"translate-statsf-group": "Komma-getrennte Lëscht vun de Gruppecoden:",
"translate-statsf-submit": "Kucken ouni ofzespäicheren",
+ "translate-statsf-unknown-error": "En onbekannte Feeler ass geschitt.",
"translate-tag-page-desc": "Iwwersetzung vun der Wiki-Säit [[$2|$1]] vu(n) $3 ($4).",
"translate-sidebar-alltrans": "An anere Sproochen",
"translations": "All Iwwersetzungen",
@@ -176,7 +176,6 @@
"translate-supportedlanguages-cached": "Dës Informatioune goufe virun $1 tëschegespäichert.",
"abusefilter-edit-builder-vars-translate-source-text": "Quelltext vun der Iwwersetzungseenheet",
"abusefilter-edit-builder-vars-translate-target-language": "Zilsprooch fir d'Iwwersetzung",
- "translate-save": "Publizéieren ($1)",
"translate-jssti-add": "Op d'Lëscht dobäisetzen",
"managemessagegroups": "Gestioun vun de Gruppe vu Messagen",
"translate-smg-notallowed": "Dir däerft dës Aktioun net maachen.",
@@ -189,6 +188,10 @@
"translate-smg-rename-select": "Eraussichen",
"translate-smg-rename-cancel": "Ofbriechen",
"translate-smg-rename-no-msg": "Keng Messagë fonnt.",
+ "translate-smg-strong-sync-help": "Hëllef",
+ "translate-smg-group-message-tag-outdated": "Vereelst",
+ "translate-smg-group-message-tag-rename": "Ëmbenennen",
+ "translate-smg-group-message-message-content": "Inhalt:",
"translate-manage-import-diff": "Message $1 | Aktiounen: $2",
"translate-manage-import-new": "Neie Message $1",
"translate-manage-import-deleted": "Geläschte Message $1",
@@ -209,6 +212,7 @@
"translate-manage-intro-other": "Ënnendrënner ass eng Lëscht vun den Ännerungen vun den Iwwersetzungen an der Sprooch $1.\nKuckt d'Ännerunge wgl. no a wielt déi Aktioun déi Dir fir déi jeeweileg Iwwersetzung wëllt.\nWann Dir decidéiert fir Ännerungen z'ignoréieren, ass dës Aktioun just temporär.",
"translate-manage-import-ok": "Importéiert: $1",
"translate-manage-import-done": "Import fäerdeg!",
+ "translate-manage-empty-content": "Den Inhalt ass eidel",
"importtranslations": "Iwwersetzungen importéieren",
"translate-import-from-local": "Fichier lokal eropgelueden:",
"translate-import-load": "Fichier lueden",
@@ -218,13 +222,6 @@
"translate-import-err-no-such-file": "De Fichier <nowiki>$1</nowiki> gëtt et net oder gouf lokal net eropgelueden.",
"translate-import-err-stale-group": "De Grupp vu Messagen zu deem dëse Fichier gehéiert gëtt et net.",
"translate-import-err-no-headers": "De Fichier ass net am Format \"Gettext\" deen d'Erweiderung \"Translate\" brauch:\nDe Grupp an d'Sprooch konnte vun der Entête vum Fichier net bestëmmt ginn.",
- "translate-js-summary": "Resumé:",
- "translate-js-save": "Publizéieren",
- "translate-js-next": "Verëffentlechen an den Nächsten opmaachen",
- "translate-js-skip": "Op den Nächste goen",
- "translate-js-history": "Versioune vun der Iwwersetzung",
- "translate-js-support": "Fro stellen",
- "translate-js-support-title": "Frot no Hëllef wann net genuch Informatiounen do si fir de Message korrekt z'iwwersetzen",
"translate-js-support-unsaved-warning": "Dir hutt net publizéiert Iwwersetzungen.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
@@ -256,11 +253,11 @@
"translate-workflow-autocreated-summary": "Automatescht Uleeë vun der Säit fir de Statut vum Workflow $1",
"translate-stats-workflow": "Statut",
"translate-workflowgroup-label": "Etappe vum Workflow",
- "translate-workflowgroup-desc": "Dëse Grupp vu Message weist de Status am Iwwersetzungsoflaf.\nDe Status ass sou wéi an der Konfiguratiounslëscht $wgTranslateWorkflowStates definéiert.",
+ "translate-workflowgroup-desc": "Dës Grupp vu Message weist de Status am Iwwersetzungsoflaf.\nDe Status ass sou wéi an der Konfiguratiounslëscht $wgTranslateWorkflowStates definéiert.",
"translate-dynagroup-recent-label": "Rezent Iwwersetzungen",
- "translate-dynagroup-recent-desc": "Dëse Grupp vu Message weist all rezent Iwwersetzungen an dës Sprooch.\nDëst ass ganz nëtzlech fir d'Aufgabe vum Nokucken.",
+ "translate-dynagroup-recent-desc": "Dës Grupp vu Message weist all rezent Iwwersetzungen an dëser Sprooch.\nDëst ass ganz nëtzlech fir d'Aufgabe vum Nokucken.",
"translate-dynagroup-additions-label": "Rezent nei Message",
- "translate-dynagroup-additions-desc": "Dëse Grupp vu Message weist nei oder geännert Messagen.",
+ "translate-dynagroup-additions-desc": "Dës Grupp vu Message weist nei oder geännert Messagen.",
"translate-msggroupselector-projects": "Grupp vu Messagen",
"translate-msggroupselector-search-placeholder": "An de Gruppe sichen",
"translate-msggroupselector-search-all": "All",
@@ -289,7 +286,7 @@
"tux-editor-cancel-button-label": "Ofbriechen",
"tux-editor-confirm-button-label": "Iwwersetzung confirméieren",
"tux-editor-proofread-button-label": "Als nogekuckt markéieren",
- "tux-editor-shortcut-info": "Dréckt \"$1\" fir ze confirméieren an op den nächsten Te3xt-Message ze goen, \"$2\" fir op den nächste Message ze goen, \"$4\" fir e Resumé unzeginn, oder dréckt op \"$3\" fir aner Tasturkierzel ze gesinn.",
+ "tux-editor-shortcut-info": "Dréckt \"$1\" fir ze confirméieren an op den nächsten Text-Message ze goen, \"$2\" fir op den nächste Message ze goen, \"$4\" fir e Resumé unzeginn, oder dréckt op \"$3\" fir aner Tasturkierzel ze gesinn.",
"tux-editor-edit-desc": "Dokumentatioun änneren",
"tux-editor-add-desc": "Dokumentatioun dobäisetzen",
"tux-editor-suggestions-title": "Virschléi",
diff --git a/MLEB/Translate/i18n/core/lez.json b/MLEB/Translate/i18n/core/lez.json
new file mode 100644
index 00000000..50172ff5
--- /dev/null
+++ b/MLEB/Translate/i18n/core/lez.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Soul Train"
+ ]
+ },
+ "translate-documentation-language": "Чарчин документация"
+}
diff --git a/MLEB/Translate/i18n/core/li.json b/MLEB/Translate/i18n/core/li.json
index d4bab391..e0615082 100644
--- a/MLEB/Translate/i18n/core/li.json
+++ b/MLEB/Translate/i18n/core/li.json
@@ -39,9 +39,7 @@
"translate-ignored": "(euvergeslage)",
"translate-edit-title": "Bewirk \"$1\"",
"translate-edit-definition": "Berichbepaoling",
- "translate-edit-translation": "Euverzètting",
"translate-edit-contribute": "draag bie",
- "translate-edit-in-other-languages": "Berich in anger spraoke",
"translate-edit-warnings": "Waorsjoewinge euver ónjuuste euverzèttinge",
"translate-edit-tmmatch-source": "Brónteks veur euverzètting: $1",
"translate-edit-tmmatch": "$1% euvereinkóms",
diff --git a/MLEB/Translate/i18n/core/lij.json b/MLEB/Translate/i18n/core/lij.json
index 1fe062b2..82f2e6f2 100644
--- a/MLEB/Translate/i18n/core/lij.json
+++ b/MLEB/Translate/i18n/core/lij.json
@@ -39,11 +39,9 @@
"translate-ignored": "(ignorou)",
"translate-edit-title": "Modiffica \"$1\"",
"translate-edit-definition": "Definission do messaggio",
- "translate-edit-translation": "Traduçion",
"translate-edit-contribute": "contribuisci",
"translate-edit-no-information": "<em>Sto messaggio chie o no g'ha de documentassion.\nSe ti sæ dovve ò comme sto messaggio o l'è doeuviou, ti poeu agiutâ i atri tradutoî azonzendo a documentassion a sto messaggio.</em>",
"translate-edit-information": "Informassioin in sciô messaggio ($1)",
- "translate-edit-in-other-languages": "Messaggio in atre lengue",
"translate-edit-warnings": "Avvixi in scê tradussioin incomplete",
"translate-edit-tmmatch-source": "Testo d'origgine pe-a tradussion: $1",
"translate-edit-tmmatch": "$1&nbsp;% de corispondensa",
@@ -62,6 +60,5 @@
"translate-checks-links-missing": "Gh'amanca {{PLURAL:$2|o seguente ingancio|i $2 seguenti inganci}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-plural": "La definission a l'adoeuvia <nowiki>{{PLURAL:}}</nowiki> ma a tradussion no.",
"languagestats": "Statisteghe da lengoa",
- "translate-js-support": "Fanni 'na domanda",
"translate-documentation-language": "Documentassion do messaggio"
}
diff --git a/MLEB/Translate/i18n/core/lki.json b/MLEB/Translate/i18n/core/lki.json
index ebaf50fe..9786a1e9 100644
--- a/MLEB/Translate/i18n/core/lki.json
+++ b/MLEB/Translate/i18n/core/lki.json
@@ -37,10 +37,8 @@
"translate-ignored": "(نادیده گرفته شده)",
"translate-edit-title": "دەسکاری«$1»",
"translate-edit-definition": "تعریف پیغام",
- "translate-edit-translation": "زوون چاوواشاکردن/تةرجؤمة",
"translate-edit-contribute": "بەشاکرەل(هام بێرەل)",
"translate-edit-no-information": "<em>این پیغام دارای توضیحات نیست.\n''اگر می‌دانید که این پیغام چگونه یا در کجا استفاده می‌شود، می‌توانید با اضافه کردن توضیحات به دیگر ترجمه‌کنندگان کمک کنید.</em>",
- "translate-edit-in-other-languages": "پەیام وە زوونەلێ ترآ",
"translate-edit-tmmatch-source": "متن منبع ترجمه: $1",
"translate-pref-editassistlang": "زوونةل ياري گةر:",
"prefs-translate": "گزینه‌های ترجمه",
@@ -94,9 +92,6 @@
"supportedlanguages-summary": "این صفحه فهرستی از تمام زبان‌های پشتیبانی‌شده توسط {{SITENAME}} را به همراه نام مترجمان در حال کار در آن زبان نمایش میدهد.\nهرچه یک مترجم با ویرایش‌های بیشتری مشارکت کرده باشد، نامش بزرگتر دیده می‌شود.\nرنگ زیرخط نشان‌دهندهٔ تازگی فعالیت مترجم در اینجا است.",
"supportedlanguages-recenttranslations": "ترجمه‌های اخیر/ایسة",
"translate-manage-import-done": "وارد کردن تکمیل شد!",
- "translate-js-summary": "خلاصه:",
- "translate-js-save": "هیشتن(ذخیره)",
- "translate-js-next": "هیشتن(ذخیره)ؤ وازکردن نووآ تر",
"translate-documentation-language": "مستندات پیام",
"translate-searchprofile": "زوون چاوواشاکردن/تةرجؤمة",
"translate-searchprofile-tooltip": "جستجو از تمامی ترجمه‌ها",
diff --git a/MLEB/Translate/i18n/core/lmo.json b/MLEB/Translate/i18n/core/lmo.json
index 1c337988..b891b2fc 100644
--- a/MLEB/Translate/i18n/core/lmo.json
+++ b/MLEB/Translate/i18n/core/lmo.json
@@ -2,27 +2,31 @@
"@metadata": {
"authors": [
"Dakrismeno",
- "Insübrich"
+ "Eafoð",
+ "Insübrich",
+ "Salvemm el lombard"
]
},
- "translate-page-settings-legend": "Impustazión",
- "translate-page-group": "Grüp",
+ "translate-page-settings-legend": "Impostazzion",
+ "translate-page-group": "Grup",
"translate-page-limit": "Limit",
"translate-page-limit-option": "$1 {{PLURAL:$1|messagg|messagg}} per pagina",
- "translate-submit": "Fàm vedè",
- "translate-prev": "Pagina precedent",
- "translate-pref-editassistlang": "Assistent di lenguv:",
- "prefs-translate": "Opzión di tradüzión",
- "translate-rc-translation-filter": "Filtra i tradüzión",
- "translate-rc-translation-filter-no": "Fà nagòt",
- "translate-rc-translation-filter-only": "Mustra dumà i tradüzión",
- "translate-rc-translation-filter-filter": "Elimina i tradüzión",
- "translate-rc-translation-filter-site": "Dumà i cambiament ai messagg del sit",
- "translationstats": "Statistegh de tradüzión",
- "translate-stats-edits": "Mudifegh",
- "translate-stats-users": "Tradütur",
- "translate-statsf-submit": "Fà vidè prima",
- "translate-tag-page-desc": "Tradüzión de la pagina wiki [[$2|$1]].",
- "translate-sidebar-alltrans": "In alter lenguv",
- "translations": "Tüt i tradüzión"
+ "translate-submit": "Otén",
+ "translate-prev": "Pagina indree",
+ "translate-pref-editassistlang": "Assistent di lengove:",
+ "prefs-translate": "Opzion de traduzzion",
+ "translate-rc-translation-filter": "Filtra i traduzzion",
+ "translate-rc-translation-filter-no": "Fà nagot",
+ "translate-rc-translation-filter-only": "Mostra doma i traduzzion",
+ "translate-rc-translation-filter-filter": "Fa minga vedè i traduzzion",
+ "translate-rc-translation-filter-site": "Doma i cambiament a i messagg del sit",
+ "translationstats": "Statistiche de traduzzion",
+ "translate-stats-edits": "Modifeghe",
+ "translate-stats-users": "Tradutor",
+ "translate-statsf-submit": "Veduda antecipada",
+ "translate-tag-page-desc": "Traduzzion de la pagina wiki [[$2|$1]] de $3($4)",
+ "translate-sidebar-alltrans": "In alter lengove",
+ "translations": "Tute i traduzzion",
+ "translate-smg-strong-sync-help": "Aiut",
+ "translate-documentation-language": "Documentazzion del messagg"
}
diff --git a/MLEB/Translate/i18n/core/lrc.json b/MLEB/Translate/i18n/core/lrc.json
index 44d804e8..f9bc084d 100644
--- a/MLEB/Translate/i18n/core/lrc.json
+++ b/MLEB/Translate/i18n/core/lrc.json
@@ -20,7 +20,6 @@
"translate-prev": "بلگه دمايی",
"translate-page-edit": "ڤیرایئشت",
"translate-edit-title": "ڤیرایئشت $1",
- "translate-edit-translation": "لرسن",
"translate-edit-contribute": "هومياری كردن",
"translate-edit-askpermission": "قول بیئتو",
"translate-pref-editassistlang": "زونيا ياريگر",
@@ -60,9 +59,6 @@
"translate-mgs-totals": "همه زونا وایک",
"supportedlanguages": "زونا حمایت بیه",
"supportedlanguages-recenttranslations": "لرسنيا تازه",
- "translate-js-summary": "چكسته",
- "translate-js-save": "ذخيره كردن",
- "translate-js-support": "د سوال جؤاو دئين",
"translate-gs-code": "كد",
"translate-gs-speakers": "گپ زننه",
"translate-gs-score": "امتياز",
diff --git a/MLEB/Translate/i18n/core/lt.json b/MLEB/Translate/i18n/core/lt.json
index 2dffddca..5f2da93b 100644
--- a/MLEB/Translate/i18n/core/lt.json
+++ b/MLEB/Translate/i18n/core/lt.json
@@ -48,11 +48,9 @@
"translate-ignored": "(ignoruojamas)",
"translate-edit-title": "Redaguoti \"$1\"",
"translate-edit-definition": "Pranešimo aprašymas",
- "translate-edit-translation": "Vertimas",
"translate-edit-contribute": "papildyti",
"translate-edit-no-information": "<em>Šis pranešimas neturi dokumentacijos.\nJei žinote kur ar kaip šis pranešimas naudojamas, galite padėti kitiems vertėjams pridėdami dokumentacijos į šį pranešimą.</em>",
"translate-edit-information": "Informacija apie pranešimą ($1)",
- "translate-edit-in-other-languages": "Pranešimas kitomis kalbomis",
"translate-edit-warnings": "Įspėjimai apie nepilnus vertimus",
"translate-edit-tmmatch-source": "Vertimo šaltinio tekstas: $1",
"translate-edit-tmmatch": "$1% atitinka",
@@ -164,7 +162,6 @@
"supportedlanguages-recenttranslations": "Nauji vertimai",
"supportedlanguages-count": "Iš viso $1 {{PLURAL:$1|kalba|kalbos|kalbų}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|keitimas|keitimai|keitimų}} - paskutinis keitimas yra prieš $3 {{PLURAL:$3|dieną|dienas|dienų}}",
- "translate-save": "Paskelbti ($1)",
"translate-jssti-add": "Pridėti į sąrašą",
"managemessagegroups": "Pranešimų grupės valdymas",
"translate-smg-notallowed": "Jums neleidžiama atlikti šio veiksmo.",
@@ -191,13 +188,6 @@
"translate-import-err-ul-failed": "Failo įkėlimas nepavyko",
"translate-import-err-invalid-title": "Pateiktas failo pavadinimas <nowiki>$1</nowiki> buvo negalimas.",
"translate-import-err-stale-group": "Pranešimų grupė, kuriai priklauso šis failas, neegzistuoja.",
- "translate-js-summary": "Santrauka:",
- "translate-js-save": "Publikuoti",
- "translate-js-next": "Paskelbti ir atidaryti kitą",
- "translate-js-skip": "Praleisti",
- "translate-js-history": "Vertimo istorija",
- "translate-js-support": "Užduoti klausimą",
- "translate-js-support-title": "Paprašyk pagalbos, jei nėra pakankamai informacijos, kad verstų šį pranešimą teisingai.",
"translate-js-support-unsaved-warning": "Jūs turite nepaskelbtų vertimų.",
"translate-gs-pos": "Praneš.",
"translate-gs-code": "Kodas",
diff --git a/MLEB/Translate/i18n/core/ltg.json b/MLEB/Translate/i18n/core/ltg.json
index d637aa54..5cb091be 100644
--- a/MLEB/Translate/i18n/core/ltg.json
+++ b/MLEB/Translate/i18n/core/ltg.json
@@ -25,6 +25,5 @@
"languagestats": "Volūdys statistika",
"translate-language": "Volūda",
"supportedlanguages-translators": "{{PLURAL:$2|Puorvārsuojs|Puorvārsuoji}}: $1",
- "translate-save": "Izglobuot ($1)",
"translate-gs-continent": "Koņtinents"
}
diff --git a/MLEB/Translate/i18n/core/lus.json b/MLEB/Translate/i18n/core/lus.json
index cebe410a..6c0cd416 100644
--- a/MLEB/Translate/i18n/core/lus.json
+++ b/MLEB/Translate/i18n/core/lus.json
@@ -34,11 +34,9 @@
"translate-ignored": "(ngaihthah)",
"translate-edit-title": "$1 siamţha rawh",
"translate-edit-definition": "Thuthawn hrilhfiahna",
- "translate-edit-translation": "Lehlinna",
"translate-edit-contribute": "kutthawhna",
"translate-edit-no-information": "''He thuthawn hian sawifiahna mumal a la nei lo.''\n''He thuthawn hmanna hmun leh hmanphung hi i hriat chuan sawifiah la, letlingtute nasa takin i pui ang.''",
"translate-edit-information": "Thuthawn chungchang ($1)",
- "translate-edit-in-other-languages": "Thuthawn ţawng dangin",
"translate-edit-warnings": "Lehlin famkim lo vaukhanna",
"translate-edit-tmmatch-source": "Lehlinna thu hnar: $1",
"translate-edit-tmmatch": "$1% inmil",
@@ -129,7 +127,6 @@
"supportedlanguages-recenttranslations": "lehlin thar",
"supportedlanguages-count": "A vaiin {{PLURAL:$1|ţawng|ţawng}} $1.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|siamţhatna|siamţhatna}} $2 - siamţhat hnuhnung ber ni $3{{PLURAL:$3||}} kal tâah",
- "translate-save": "Tlangzarhna ($1)",
"translate-jssti-add": "Tlara telhna",
"managemessagegroups": "Thuthawn pawl enkawlna",
"translate-manage-import-diff": "Thuthawn $1 | Thiltih: $2",
@@ -142,13 +139,6 @@
"translate-manage-nochanges-other": "He ţawnga tihdanglam thar a awm lo.\nHläwm chanchin inziahna phêka lêt tùrin a hnuaia zawmnaah khuan kal rawh.",
"translate-manage-submit": "Déng raw pip!",
"translate-manage-import-done": "A zo ta vek mai!",
- "translate-js-summary": "Laktawi:",
- "translate-js-save": "Dahţhatna",
- "translate-js-next": "Dahţha la a dawt hawng nghâl rawh",
- "translate-js-skip": "Kalkân rawh",
- "translate-js-history": "Lehlinna chanchin",
- "translate-js-support": "Zawhna zawhna",
- "translate-js-support-title": "Thuthawn lehlin dik a harsat chuan zawhna zawh hreh loh tùr.",
"translate-js-support-unsaved-warning": "Lehlinna la dahṭhat loh i nei.",
"translate-gs-pos": "Dinhmn.",
"translate-gs-code": "Thurûk",
diff --git a/MLEB/Translate/i18n/core/lv.json b/MLEB/Translate/i18n/core/lv.json
index 8a20ec07..efa94199 100644
--- a/MLEB/Translate/i18n/core/lv.json
+++ b/MLEB/Translate/i18n/core/lv.json
@@ -37,9 +37,7 @@
"translate-optional": "(neobligāts)",
"translate-ignored": "(ignorēts)",
"translate-edit-title": "Labot \"$1\"",
- "translate-edit-translation": "Tulkojums",
"translate-edit-information": "Informācija par ziņojumu ($1)",
- "translate-edit-in-other-languages": "Ziņojums citās valodās",
"translate-edit-warnings": "Brīdinājumi par nepilnīgiem tulkojumiem",
"translate-edit-tmmatch-source": "Tulkojuma izejas teksts: $1",
"translate-edit-tmmatch": "$1% atbilstība",
@@ -123,12 +121,12 @@
"supportedlanguages-sqlite-error": "SQLite nav atbaltīts",
"supportedlanguages-translators": "{{PLURAL:$2|Tulkotāji|{{GENDER:$3|Tulkotājs|Tulkotāja}}|Tulkotāji}}: $1",
"supportedlanguages-recenttranslations": "pēdējie tulkojumi",
- "translate-save": "Saglabāt ($1)",
"translate-jssti-add": "Pievienot sarakstam",
"translate-smg-right": "Ienākošās izmaiņas",
"translate-smg-rename-select": "Izvēlēties",
"translate-smg-rename-cancel": "Atcelt",
"translate-smg-rename-new": "Pievienot kā jaunu...",
+ "translate-smg-strong-sync-help": "Palīdzība",
"translate-manage-import-diff": "Ziņojums $1 | Darbības: $2",
"translate-manage-import-new": "Jauns ziņojums $1",
"translate-manage-action-import": "Importēt",
@@ -140,12 +138,6 @@
"importtranslations": "Importēt tulkojumus",
"translate-import-load": "Ielādēt failu",
"translate-import-err-ul-failed": "Faila augšupielāde neizdevās.",
- "translate-js-summary": "Kopsavilkums:",
- "translate-js-save": "Saglabāt",
- "translate-js-next": "Saglabāt un atvērt nākamo",
- "translate-js-skip": "Pāriet uz nākamo",
- "translate-js-history": "Tulkošanas vēsture",
- "translate-js-support": "Uzdot jautājumu",
"translate-js-support-unsaved-warning": "Tev ir nesaglabāti tulkojumi.",
"translate-gs-pos": "Vieta",
"translate-gs-code": "Kods",
diff --git a/MLEB/Translate/i18n/core/lzh.json b/MLEB/Translate/i18n/core/lzh.json
index 815fc9c4..9276c272 100644
--- a/MLEB/Translate/i18n/core/lzh.json
+++ b/MLEB/Translate/i18n/core/lzh.json
@@ -35,10 +35,8 @@
"translate-ignored": "(略)",
"translate-edit-title": "始譯「$1」",
"translate-edit-definition": "訊之原",
- "translate-edit-translation": "譯",
"translate-edit-contribute": "功績",
"translate-edit-information": "述該訊息($1)",
- "translate-edit-in-other-languages": "他語之訊",
"translate-edit-warnings": "未譯之警",
"translate-edit-tmmatch": "$1%符",
"translate-edit-nopermission": "汝須獲權方可譯訊。",
@@ -87,13 +85,9 @@
"translate-mgs-column-language": "語言",
"translate-mgs-nothing": "無彙統以示",
"supportedlanguages-recenttranslations": "近譯",
- "translate-save": "修($1)",
"translate-manage-import-deleted": "已刪訊 $1",
"translate-manage-action-import": "入匯",
"translate-import-load": "載檔",
- "translate-js-save": "修",
- "translate-js-skip": "次譯",
- "translate-js-support": "問",
"translate-documentation-language": "訊之檔",
"translate-searchprofile": "譯",
"translate-searchprofile-tooltip": "尋譯",
diff --git a/MLEB/Translate/i18n/core/mad.json b/MLEB/Translate/i18n/core/mad.json
new file mode 100644
index 00000000..7ebb8317
--- /dev/null
+++ b/MLEB/Translate/i18n/core/mad.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Boesenbergia"
+ ]
+ },
+ "translate-documentation-language": "Dokumèntasi pessen"
+}
diff --git a/MLEB/Translate/i18n/core/map-bms.json b/MLEB/Translate/i18n/core/map-bms.json
index f3c9dd74..67373f12 100644
--- a/MLEB/Translate/i18n/core/map-bms.json
+++ b/MLEB/Translate/i18n/core/map-bms.json
@@ -32,11 +32,9 @@
"translate-ignored": "(dilirwakna)",
"translate-edit-title": "Nyunting \"$1\"",
"translate-edit-definition": "Definisi pesen",
- "translate-edit-translation": "Terjemahan",
"translate-edit-contribute": "aweh kontribusi",
"translate-edit-no-information": "\"Pesen kiye ora duwe dokumentasi.\"\n\"Angger Rika weruh nang endi utawa kepriwe pesen kiye digunakna, Rika teyeng nulungi penerjemah liyane mawa nambahna dokumentasi ming pesen kiye.\"",
"translate-edit-information": "Informasi bab pesen ($1)",
- "translate-edit-in-other-languages": "Pesen nang basa-basa liyane",
"translate-edit-tmmatch-source": "Tèks sumber pertalan: $1",
"translate-edit-tmmatch": "$1% cocog",
"translate-use-suggestion": "Ganti terjemahan sekiye nganggo saran kiye.",
diff --git a/MLEB/Translate/i18n/core/min.json b/MLEB/Translate/i18n/core/min.json
index 3589177d..db150853 100644
--- a/MLEB/Translate/i18n/core/min.json
+++ b/MLEB/Translate/i18n/core/min.json
@@ -18,7 +18,6 @@
"translate-statsf-count-users": "Panajamah aktip",
"translate-statsf-count-registrations": "Pangguno baru",
"translate-sidebar-alltrans": "Dalam bahaso lain",
- "translate-js-support": "Batanyo",
"translate-documentation-language": "Dokumentasi pasan",
"translate-searchprofile": "Tajamahan",
"translate-searchprofile-tooltip": "Cari dari sado tajamahan",
diff --git a/MLEB/Translate/i18n/core/mk.json b/MLEB/Translate/i18n/core/mk.json
index 8694110d..d9b365b7 100644
--- a/MLEB/Translate/i18n/core/mk.json
+++ b/MLEB/Translate/i18n/core/mk.json
@@ -46,11 +46,9 @@
"translate-ignored": "(игнорирано)",
"translate-edit-title": "Уреди „$1“",
"translate-edit-definition": "Изворна порака",
- "translate-edit-translation": "Превод",
"translate-edit-contribute": "придонес",
"translate-edit-no-information": "<em>Оваа порака нема документација.\nАко знаете каде или како се користи поракава, тогаш помогнете им на другите преведувачи додавајќи ѝ документација.</em>",
"translate-edit-information": "Информации за пораката ($1)",
- "translate-edit-in-other-languages": "Пораката на други јазици",
"translate-edit-warnings": "Предупредувања за нецелосни преводи",
"translate-edit-tmmatch-source": "Изворен текст за преводот: $1",
"translate-edit-tmmatch": "$1% совпаѓање",
@@ -144,6 +142,11 @@
"translate-statsf-language": "Список на јазични кодови, одвоени со запирка:",
"translate-statsf-group": "Список на групни кодови, одвоени со запирка:",
"translate-statsf-submit": "Преглед",
+ "translate-statsf-unknown-error": "Се појави непозната грешка.",
+ "translate-statsf-error-message": "Се јави грешка при вчитувањето на графикот: $1",
+ "translate-statsf-graph-alt-text-info": "Текстуална алтернативна на преводните статистики е во податочната табела подолу.",
+ "translate-statsf-alt-text": "Оваа текстуалната алтернатива за преводните статистики.",
+ "translate-statsf-embed": "Код за вметнување на градикот за преводни статистики во други страници.",
"translate-tag-page-desc": "Превод на викистраницата [[$2|$1]] од $3 ($4).",
"translate-sidebar-alltrans": "На други јазици",
"translations": "Сите преводи",
@@ -189,8 +192,8 @@
"translate-mgs-totals": "{{PLURAL:$1|Сиот јазик|Сите $1 јазици заедно}}",
"translate-mgs-invalid-group": "Наведената група $1 не постои.",
"translate-mgs-nothing": "Нема што да се прикаже за побараните статистики.",
- "supportedlanguages": "Поддржани јазици",
- "supportedlanguages-summary": "На оваа страница се наведени сите јазици што ги поддржува {{SITENAME}},\nзаедно со имињата на преведувачите што работат на секој јазик.\nГолемината на името (т.е. буквите) на преведувачот зависи од тоа колку пораки има преведено.\nБојата на линијата со која е подвлечено името ја покажува скорешноста на неговата активност.",
+ "supportedlanguages": "Активни јазици",
+ "supportedlanguages-summary": "На оваа страница е прикажан список на активните на {{SITENAME}},\nзаедно со имињата на преведувачите што работат на секој јазик.\nГолемината на името (т.е. буквите) на преведувачот зависи од тоа колку пораки има преведено.\nБојата на линијата со која е подвлечено името ја покажува скорешноста на неговата активност.",
"supportedlanguages-colorlegend": "Легенда за бојата: Последен превод извршен пред $1 дена.",
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -202,7 +205,6 @@
"translate-supportedlanguages-cached": "Оваа информација е меѓускладирана пред $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Изворен текст на преводната единица",
"abusefilter-edit-builder-vars-translate-target-language": "Целен јазик за преводот",
- "translate-save": "Објави ($1)",
"translate-jssti-add": "Додај во список",
"managemessagegroups": "Раководење со групи на пораки",
"translate-smg-notallowed": "Не ви е дозволено да ја извршите оваа постапка.",
@@ -223,6 +225,24 @@
"translate-smg-rename-rename": "Додај како преименување на...",
"translate-smg-rename-dialog-title": "Избери совпаднато преименување за $1",
"translate-smg-changeset-modified": "Промените се изменети од друг корисник или постапка. Вашите промени не можат да се објават бидејќи ќе ги заменат нив. Превчитајте ја страницата за да ги видите најновите промени.",
+ "translate-smg-no-groups-in-sync": "Тековно нема групи во усогласување",
+ "translate-smg-strong-sync-help": "Помош",
+ "translate-smg-groups-in-sync": "Групи тековно во усогласување",
+ "translate-smg-groups-in-sync-list": "Список на групи кои тековно се обработуваат во позадина:",
+ "translate-smg-groups-with-error-title": "Групи кои имаа грешки при усогласување",
+ "translate-smg-groups-with-error-desc": "Список на групи и нивните пораки кои имаа грешки при усогласувањето:",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|порака|пораки}} со грешки:",
+ "translate-smg-group-message-action-history": "Историја",
+ "translate-smg-group-action-resolve": "Означи како решено",
+ "translate-smg-group-message-tag-outdated": "Застарени",
+ "translate-smg-group-message-tag-rename": "Преименувај",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Ознака|Ознаки}}:",
+ "translate-smg-group-message-message-content": "Содржина:",
+ "translate-smg-group-message-message-target": "Цел:",
+ "translate-smg-group-message-message-replacement": "Замена:",
+ "translate-smg-group-message-message-other-langs": "Други јазици:",
+ "translate-smg-loading": "Вчитувам...",
+ "translate-smg-unknown-error": "Се појави непозната грешка при обработката на вашето барање.",
"translate-manage-import-diff": "Порака $1 | Дејства: $2",
"translate-manage-import-new": "Нова порака $1",
"translate-manage-import-deleted": "Избришана порака $1",
@@ -244,6 +264,9 @@
"translate-manage-intro-other": "Еве список на промени во преводите на јазикот $1.\nПрегледајте ги пораките и изберете го дејството што сакате да го направите за секоја поднова.\nАко изберете да ги занемарите промените, ова дејство ќе биде само привремено.",
"translate-manage-import-ok": "Увезена: $1",
"translate-manage-import-done": "Увозот е готов!",
+ "translate-manage-empty-content": "Содржината е празна",
+ "translate-manage-key-reused": "Оваа порака веќе постои на викито. Проверете да не станува збор за случајна преупотреба на стар клуч.",
+ "translate-manage-source-message-not-found": "Не пронајдов определба на пораката",
"importtranslations": "Увези преводи",
"translate-import-from-local": "Месно подигање на податотека:",
"translate-import-load": "Вчитај податотека",
@@ -253,13 +276,6 @@
"translate-import-err-no-such-file": "Податотеката <nowiki>$1</nowiki> не постои или не е подигната месно.",
"translate-import-err-stale-group": "Податотекава припаѓа на непостоечка група пораки.",
"translate-import-err-no-headers": "Податотеката не е добро обликувана Gettext податотека во форматот за преведување на додатоци:\nНе можам да одредам група и јазик од насловите на податотеката.",
- "translate-js-summary": "Опис:",
- "translate-js-save": "Објави",
- "translate-js-next": "Објави и отвори следна",
- "translate-js-skip": "Прејди на следно",
- "translate-js-history": "Минати преводи",
- "translate-js-support": "Постави прашање",
- "translate-js-support-title": "Побарајте помош ако немате доволно информации за да направите точен превод на пораката.",
"translate-js-support-unsaved-warning": "Имате необјавени преводи.",
"translate-gs-pos": "Место",
"translate-gs-code": "Код",
diff --git a/MLEB/Translate/i18n/core/ml.json b/MLEB/Translate/i18n/core/ml.json
index 349eb221..f4e4ccb9 100644
--- a/MLEB/Translate/i18n/core/ml.json
+++ b/MLEB/Translate/i18n/core/ml.json
@@ -43,11 +43,9 @@
"translate-ignored": "(അവഗണിച്ചിരിക്കുന്നു)",
"translate-edit-title": "\"$1\" തിരുത്തുക",
"translate-edit-definition": "സന്ദേശത്തിന്റെ നിർ‌വചനം",
- "translate-edit-translation": "പരിഭാഷ",
"translate-edit-contribute": "തിരുത്തുക",
"translate-edit-no-information": "''ഈ സന്ദേശത്തിനു ഡോക്കുമെന്റേഷൻ ഇല്ല.\nഈ സന്ദേശം എങ്ങനെയാണു ഉപയോഗിക്കപ്പെടുന്നത് എന്ന് താങ്കൾക്ക് അറിയാമെങ്കിൽ, അതിനെകുറിച്ചുള്ള ഡോക്കുമെന്റേഷൻ ചേർത്ത് താങ്കൾക്ക് മറ്റുള്ള പരിഭാഷകർക്കു സഹായമേകാം.''",
"translate-edit-information": "സന്ദേശത്തെക്കുറിച്ചുള്ള വിശദീകരണം ($1)",
- "translate-edit-in-other-languages": "സന്ദേശം മറ്റു ഭാഷകളിൽ",
"translate-edit-warnings": "അപൂർണ്ണമായ പരിഭാഷയെക്കുറിച്ചുള്ള മുന്നറിയിപ്പ്",
"translate-edit-tmmatch-source": "പരിഭാഷയുടെ മൂലരൂപം: $1",
"translate-edit-tmmatch": "$1% പൊരുത്തപ്പെടുന്നു",
@@ -158,7 +156,6 @@
"supportedlanguages-translators": "{{PLURAL:$2|പരിഭാഷക(ൻ)|പരിഭാഷകർ}}: $1",
"supportedlanguages-recenttranslations": "സമീപകാല പരിഭാഷകൾ",
"supportedlanguages-count": "ആകെ {{PLURAL:$1|ഒരു ഭാഷ|$1 ഭാഷകൾ}}.",
- "translate-save": "സേവ് ചെയ്യുക ($1)",
"translate-jssti-add": "പട്ടികയിലേക്ക് ചേർക്കുക",
"managemessagegroups": "സന്ദേശഗണങ്ങളുടെ മേൽനോട്ടം",
"translate-smg-notallowed": "ഇതു ചെയ്യാൻ താങ്കൾക്കനുവാദമില്ല",
@@ -173,12 +170,6 @@
"translate-import-from-local": "അപ്‌ലോഡ് ചെയ്യേണ്ട പ്രാദേശിക പ്രമാണം:",
"translate-import-load": "പ്രമാണം എടുക്കുക",
"translate-import-err-ul-failed": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യൽ വിജയകരമല്ലായിരുന്നു",
- "translate-js-summary": "ചുരുക്കം:",
- "translate-js-save": "സേവ് ചെയ്യുക",
- "translate-js-next": "സേവ് ചെയ്യുക, അടുത്തത് തുറക്കുക",
- "translate-js-skip": "അടുത്തതിലേയ്ക്ക് പോവുക",
- "translate-js-history": "പരിഭാഷയുടെ നാൾവഴി",
- "translate-js-support": "ചോദ്യം ചോദിക്കുക",
"translate-js-support-unsaved-warning": "താങ്കൾ സേവ് ചെയ്യാത്ത പരിഭാഷകൾ ഉണ്ട്.",
"translate-gs-pos": "സ്ഥാനം",
"translate-gs-code": "കോഡ്",
diff --git a/MLEB/Translate/i18n/core/mnc.json b/MLEB/Translate/i18n/core/mnc.json
new file mode 100644
index 00000000..d759dcbe
--- /dev/null
+++ b/MLEB/Translate/i18n/core/mnc.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Foavi33",
+ "Moon0319"
+ ]
+ },
+ "translate": "ᡠᠪᠠᠯᡳᠶᠠᠮᠪᡠᠮᠪᡳ",
+ "translate-extensionname": "ᡠᠪᠠᠯᡳᠶᠠᠮᠪᡠᠮᠪᡳ",
+ "translate-taction-translate": "ᡠᠪᠠᠯᡳᠶᠠᠮᠪᡠᠮᠪᡳ",
+ "translate-page-settings-legend": "ᡳᠨᠰᡨᡝᠯᠯᡝᠨ",
+ "translate-page-language": "ᡨᠠᠠᠯ",
+ "translate-page-limit": "ᠪᡝᡦᡝᡵᡴᡝᠨ",
+ "translate-documentation-language": "medege dangse"
+}
diff --git a/MLEB/Translate/i18n/core/mni.json b/MLEB/Translate/i18n/core/mni.json
index d704b88d..e9fda3ba 100644
--- a/MLEB/Translate/i18n/core/mni.json
+++ b/MLEB/Translate/i18n/core/mni.json
@@ -1,9 +1,12 @@
{
"@metadata": {
"authors": [
+ "Afingba Mangang",
"Amire80",
- "Awangba Mangang"
+ "Awangba Mangang",
+ "Luwanglinux"
]
},
- "translate-documentation-language": "Documentationda paojel thao"
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|ꯊꯦꯠꯄꯥ |ꯊꯦꯠꯄꯥꯁꯤꯡ}}:",
+ "translate-documentation-language": "ꯗꯣꯀꯨꯃꯦꯟꯇꯦꯁꯟꯗ ꯄꯥꯎꯖꯦꯜ ꯊꯥꯎ"
}
diff --git a/MLEB/Translate/i18n/core/mo.json b/MLEB/Translate/i18n/core/mo.json
index e1327208..fce2be30 100644
--- a/MLEB/Translate/i18n/core/mo.json
+++ b/MLEB/Translate/i18n/core/mo.json
@@ -32,13 +32,10 @@
"translate-edit-contribute": "контрибуе",
"translate-edit-no-information": "<em>Ачест месаж ну аре документацие.\nДакэ штиць унде сау кум есте фолосит, ый путець ажута пе чейлалць традукэторь прин адэугаря документацией сале.</em>",
"translate-edit-information": "Информаций деспре месаж ($1)",
- "translate-edit-in-other-languages": "Месажул ын алте лимбь",
"translate-stats-users": "Традукэторь",
"translate-untranslated": "Де традус",
"translate-ls-column-group": "Груп де месаже",
"translate-mgs-group": "Груп де месаже:",
- "translate-js-next": "Салвязэ ши мерӂь май департе",
- "translate-js-skip": "Урмэторул месаж",
"translate-documentation-language": "Документация месажулуй",
"tux-languageselector": "Традучець ын",
"tux-tab-all": "Тоате",
diff --git a/MLEB/Translate/i18n/core/mr.json b/MLEB/Translate/i18n/core/mr.json
index 5da4df89..45dded52 100644
--- a/MLEB/Translate/i18n/core/mr.json
+++ b/MLEB/Translate/i18n/core/mr.json
@@ -45,11 +45,9 @@
"translate-ignored": "(दुर्लक्षित)",
"translate-edit-title": "\"$1\"चे संपादन",
"translate-edit-definition": "संदेश व्याख्या",
- "translate-edit-translation": "भाषांतर",
"translate-edit-contribute": "योगदान करा",
"translate-edit-no-information": "<em>या संदेशाकरिता कोणतेही नोंदीकरण(डॉक्यूमेंटेशन) नाही. हा संदेश कुठे आणि कसा वापरला आहे हे तुम्हाला ठाऊक असेल तर, या पानाचे नोंदीकरण(डॉक्यूमेंटेशन) करून तुम्ही इतर भाषांतरकारांना मदत करू शकता.</em>",
"translate-edit-information": "($1) या संदेशाबद्दल माहिती",
- "translate-edit-in-other-languages": "इतर भाषांमधील संदेश",
"translate-edit-warnings": "अर्धवट भाषांतरांसाठीचे इशारे",
"translate-edit-tmmatch-source": "स्रोत मजकूराचे भाषांतर: $1",
"translate-edit-tmmatch": "$1% जुळते",
@@ -164,7 +162,6 @@
"supportedlanguages-recenttranslations": "अलीकडील भाषांतरे",
"supportedlanguages-count": "$1 {{PLURAL:$1|भाषा}} एकुण.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|संपादन|संपादने}} शेवटचे संपादन $3 {{PLURAL:$3|दिवसापूर्वी|दिवसांपूर्वी}}",
- "translate-save": "जतन करा($1)",
"translate-jssti-add": "यादीत जोडा",
"managemessagegroups": "संदेश गट व्यवस्थापन",
"translate-smg-notallowed": "आपणास हे क्रिया कार्य करण्याची परवानगी नाही.",
@@ -196,13 +193,6 @@
"translate-import-err-invalid-title": "दिलेले संचिकानाम<nowiki>$1</nowiki>अवैध होते.",
"translate-import-err-no-such-file": "संचिका<nowiki>$1</nowiki>अस्तित्वात नाही किंवा ती स्थानिकरित्या अपभारीत झालेली आहे.",
"translate-import-err-stale-group": "ज्या संदेशगटाची ही संचिका आहे तो अस्तित्वात नाही.",
- "translate-js-summary": "सारांश:",
- "translate-js-save": "जतन करा",
- "translate-js-next": "जतन करुन मजकूर उघडा",
- "translate-js-skip": "पुढच्यावर सरका",
- "translate-js-history": "भाषांतर इतिहास",
- "translate-js-support": "प्रश्न विचारा",
- "translate-js-support-title": "जर या संदेशाच्या भाषांतरासाठी योग्य व पुरेशी माहिती येथे नसल्यास, मदतीची हाक द्या.",
"translate-js-support-unsaved-warning": "आपणापाशी, जतन न केलेली भाषांतरे आहेत.",
"translate-gs-code": "संकेत",
"translate-gs-score": "प्राप्तांक",
diff --git a/MLEB/Translate/i18n/core/mrh.json b/MLEB/Translate/i18n/core/mrh.json
index 6f4c5e5b..0ad934f3 100644
--- a/MLEB/Translate/i18n/core/mrh.json
+++ b/MLEB/Translate/i18n/core/mrh.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
- "Laitei"
+ "Laitei",
+ "Reihpaleituh"
]
},
+ "translate-smg-strong-sync-help": "Baona",
"translate-documentation-language": "Mesei châhnarahvozy"
}
diff --git a/MLEB/Translate/i18n/core/ms.json b/MLEB/Translate/i18n/core/ms.json
index 15ddf657..a943516c 100644
--- a/MLEB/Translate/i18n/core/ms.json
+++ b/MLEB/Translate/i18n/core/ms.json
@@ -10,6 +10,7 @@
]
},
"translate": "Terjemah",
+ "translate-extensionname": "Terjemah",
"translate-desc": "[[Special:Translate|Laman khas]] untuk menterjemah MediaWiki dan lain-lain",
"translate-taskui-export-to-file": "Eksport dalam format natif",
"translate-taskui-export-as-po": "Eksport untuk penterjemahan luar talian",
@@ -44,17 +45,16 @@
"translate-ignored": "(tidak diendahkan)",
"translate-edit-title": "Sunting \"$1\"",
"translate-edit-definition": "Takrifan mesej",
- "translate-edit-translation": "Terjemahan",
"translate-edit-contribute": "sumbangkan",
"translate-edit-no-information": "<em>Pesanan ini tidak mempunyai pendokumenan. Jika anda tahu di mana atau bagaimana pesanan ini digunakan, anda boleh membantu para penterjemah dengan menambahkan pendokumenan kepada pesanan ini.</em>",
"translate-edit-information": "Maklumat mesej ($1)",
- "translate-edit-in-other-languages": "Mesej dalam bahasa lain",
"translate-edit-warnings": "Amaran penterjemahan tak lengkap",
"translate-edit-tmmatch-source": "Teks sumber terjemahan: $1",
"translate-edit-tmmatch": "$1% berpadan",
"translate-use-suggestion": "Ganti terjemahan semasa dengan cadangan ini.",
"translate-edit-nopermission": "Anda memerlukan hak penterjemahan untuk menterjemahkan mesej.",
"translate-edit-askpermission": "Dapatkan izin",
+ "translate-export-form-format": "Format",
"translate-checks-parameters": "{{PLURAL:$2|Parameter|Parameter-parameter}} berikut tidak digunakan:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|Parameter|Parameter-parameter}} berikut tidak dikenali:\n<strong>$1</strong>",
"translate-checks-balance": "Bilangan {{PLURAL:$2|tanda kurungan|tanda kurungan}} tidak sekata:\n<strong><nowiki>$1</nowiki></strong>",
@@ -80,6 +80,8 @@
"action-translate-import": "mengimport terjemahan luar talian",
"right-translate-messagereview": "Kaji semula terjemahan",
"right-translate-groupreview": "Mengubah keadaan alir kerja kumpulan mesej",
+ "translate-rcfilters-translations": "Terjemahan",
+ "translate-rcfilters-translations-only-label": "Terjemahan",
"translate-rc-translation-filter": "Tapis terjemahan:",
"translate-rc-translation-filter-no": "Tidak berbuat apa-apa",
"translate-rc-translation-filter-only": "Tunjukkan terjemahan sahaja",
@@ -163,7 +165,6 @@
"supportedlanguages-recenttranslations": "terjemahan terbaru",
"supportedlanguages-count": "Sejumlah $1 bahasa.",
"supportedlanguages-activity": "$1: $2 suntingan - suntingan terakhir pada $3 hari lalu",
- "translate-save": "Terbit ($1)",
"translate-jssti-add": "Tambahkan kepada senarai",
"managemessagegroups": "Pengurusan kumpulan mesej",
"translate-smg-notallowed": "Anda tidak dibenarkan untuk melaksanakan tindakan ini.",
@@ -173,6 +174,7 @@
"translate-smg-more": "Akan terdapat lebih banyak perubahan untuk diproses setelah suntingan-suntingan ini diserahkan.",
"translate-smg-left": "Kandungan pesanan dalam wiki",
"translate-smg-right": "Perubahan baru",
+ "translate-smg-strong-sync-help": "Bantuan",
"translate-manage-import-diff": "Mesej $1 | Tindakan: $2",
"translate-manage-import-new": "Mesej baru ($1)",
"translate-manage-import-deleted": "Mesej yang dihapuskan $1",
@@ -199,13 +201,6 @@
"translate-import-err-no-such-file": "Fail <nowiki>$1</nowiki> tidak wujud atau telah dimuat naik secara setempat.",
"translate-import-err-stale-group": "Kumpulan mesej bagi fail ini tidak wujud.",
"translate-import-err-no-headers": "Fail ini bukan fail Gettext yang dibentuk dengan betul dalam format sambungan Translate:\nKumpulan dan bahasa tidak dapat ditentukan daripada pengatas fail.",
- "translate-js-summary": "Ringkasan:",
- "translate-js-save": "Terbitkan",
- "translate-js-next": "Terbit dan buka yang seterusnya",
- "translate-js-skip": "Langkau ke mesej seterusnya",
- "translate-js-history": "Sejarah penterjemahan",
- "translate-js-support": "Tanyakan soalan",
- "translate-js-support-title": "Minta tolong kalau tak cukup maklumat untuk menterjemahkan mesej ini dengan betul.",
"translate-js-support-unsaved-warning": "Anda mempunyai terjemahan yang belum diterbit.",
"translate-gs-pos": "Ked.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/mt.json b/MLEB/Translate/i18n/core/mt.json
index 522bc259..38f42bdc 100644
--- a/MLEB/Translate/i18n/core/mt.json
+++ b/MLEB/Translate/i18n/core/mt.json
@@ -34,11 +34,9 @@
"translate-ignored": "(injorat)",
"translate-edit-title": "Modifika ta' \"$1\"",
"translate-edit-definition": "Definizzjoni tal-messaġġ",
- "translate-edit-translation": "Traduzzjoni",
"translate-edit-contribute": "ikkontribwixxi",
"translate-edit-no-information": "''Dan il-messaġġ m'għandu l-ebda dokumentazzjoni.''\n''Jekk taf fejn jew kif jiġi wżat dan il-messaġġ, tista' tgħin lit-tradutturi l-oħra billi żżid id-dokumentazzjoni ma' dan il-messaġġ.''",
"translate-edit-information": "Informazzjoni dwar il-messaġġ ($1)",
- "translate-edit-in-other-languages": "Il-messaġġ f'lingwi oħra",
"translate-edit-warnings": "Twissijiet dwar traduzzjonijiet mhux kompluti",
"translate-use-suggestion": "Biddel it-traduzzjoni attwali ma' din is-suġġeriment.",
"translate-edit-nopermission": "Għandek bżonn l-awtorizzazzjoni sabiex tittraduċi messaġġi.",
@@ -134,7 +132,6 @@
"supportedlanguages-recenttranslations": "traduzzjonijiet riċenti",
"supportedlanguages-count": "Total ta' $1 {{PLURAL:$1|lingwa|lingwi}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|modifika|modifiki}} - l-aħħar modifika $3 {{PLURAL:$3|ġurnata|ġranet}} ilu",
- "translate-save": "Salva ($1)",
"translate-jssti-add": "Żid mal-lista",
"translate-manage-import-new": "Messaġġ ġdid $1",
"translate-manage-action-ignore": "Injora",
@@ -144,10 +141,6 @@
"translate-import-err-ul-failed": "It-tlugħ tal-fajl ma rnexxiex",
"translate-import-err-invalid-title": "L-isem tal-fajl <nowiki>$1</nowiki> mhuwiex validu.",
"translate-import-err-no-such-file": "Il-fajl <nowiki>$1</nowiki> ma jeżistix jew ma ġiex imtella fuq livell lokali.",
- "translate-js-next": "Salvaha u għaddi għal li jmiss",
- "translate-js-skip": "Li jmiss",
- "translate-js-history": "Kronoloġija",
- "translate-js-support": "Staqsi mistoqsija",
"translate-gs-pos": "Poż.",
"translate-gs-code": "Kodiċi",
"translate-gs-continent": "Kontinent",
diff --git a/MLEB/Translate/i18n/core/mwl.json b/MLEB/Translate/i18n/core/mwl.json
index 35cd0b12..cf30652f 100644
--- a/MLEB/Translate/i18n/core/mwl.json
+++ b/MLEB/Translate/i18n/core/mwl.json
@@ -6,7 +6,6 @@
]
},
"translate-taction-export": "Sportar",
- "translate-edit-translation": "Traduçon",
"languagestats": "Statísticas de la lhéngua",
"supportedlanguages": "Lhénguas sustentadas",
"translate-import-load": "Cargar fexeiro",
diff --git a/MLEB/Translate/i18n/core/my.json b/MLEB/Translate/i18n/core/my.json
index 51707886..19c5ef04 100644
--- a/MLEB/Translate/i18n/core/my.json
+++ b/MLEB/Translate/i18n/core/my.json
@@ -35,10 +35,8 @@
"translate-ignored": "(လျစ်လျူရှု)",
"translate-edit-title": "\"$1\" ကိုပြင်ဆင်ရန်",
"translate-edit-definition": "မက်ဆေ့ အဓိပ္ပာယ်သတ်မှတ်ချက်",
- "translate-edit-translation": "ဘာသာပြန်ခြင်း",
"translate-edit-contribute": "ပံ့ပိုးရန်",
"translate-edit-information": "မက်ဆေ့အကြောင်း သတင်းအချက်အလက် ($1)",
- "translate-edit-in-other-languages": "အခြားဘာသာစကားများရှိ မက်ဆေ့",
"translate-edit-warnings": "မပြီးမြောက်သော ဘာသာပြန်များအတွက် သတိပေးချက်များ",
"translate-edit-tmmatch": "$1% ကိုက်ညီ",
"translate-use-suggestion": "ဤအကြံပြုချက်ဖြင့် လက်ရှိဘာသာပြန်ကို အစားထိုးရန်။",
@@ -141,7 +139,6 @@
"supportedlanguages-recenttranslations": "လတ်တလော ဘာသာပြန်များ",
"supportedlanguages-count": "စုစုပေါင်း {{PLURAL:$1|ဘာသာစကား|ဘာသာစကားများ}} $1",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}} - နောက်ဆုံးတည်းဖြတ်မှု $3 {{PLURAL:$3|ရက်|ရက်}} အကြာက",
- "translate-save": "သိမ်းရန် ($1)",
"translate-jssti-add": "စာရင်းသို့ ပေါင်းထည့်ရန်",
"managemessagegroups": "မက်ဆေ့အုပ်စု စီမံခန့်ခွဲရေး",
"translate-smg-nochanges": "အစီစဉ်တကျလုပ်ဆောင်ရန် ပြောင်းလဲမှုများ မရှိပါ။",
@@ -149,19 +146,14 @@
"translate-smg-more": "ဤပြောင်းလဲမှုများကို ထည့်သွင်းပြီးပါက အစီစဉ်တကျလုပ်ဆောင်ရန် ပြောင်းလဲမှုများ ပိုများလာပါမည်။",
"translate-smg-left": "ဝီကီထဲရှိ မက်ဆေ့အကြောင်းအရာ",
"translate-smg-right": "ဝင်လာသော ပြောင်းလဲမှုများ",
+ "translate-smg-group-action-resolve": "ဖြေရှင်းပြီးဖြစ်ကြောင်း မှတ်သားရန်",
+ "translate-smg-loading": "ဝန်ဆွဲတင်နေသည်...",
"translate-manage-import-diff": "မက်ဆေ့ $1 | လုပ်ဆောင်ချက်များ: $2",
"translate-manage-import-new": "မက်ဆေ့ အသစ် $1",
"translate-manage-import-deleted": "ဖျက်ထားသော မက်ဆေ့ $1",
"translate-manage-action-import": "တင်သွင်းရန်",
"translate-manage-action-ignore": "လျစ်လျူရှု",
"importtranslations": "ဘာသာပြန်များကို တင်သွင်းရန်",
- "translate-js-summary": "အကျဉ်းချုပ်:",
- "translate-js-save": "သိမ်းရန်",
- "translate-js-next": "သိမ်းဆည်းပြီး နောက်တစ်ခုဖွင့်",
- "translate-js-skip": "နောက်တစ်ခုသို့ ကျော်သွားရန်",
- "translate-js-history": "ဘာသာပြန်မှု ရာဇဝင်",
- "translate-js-support": "မေးခွန်းမေးရန်",
- "translate-js-support-title": "ဤမက်ဆေ့ကို မှန်ကန်စွာဘာသာပြန်ရန် သတင်းအချက်အလက် မရှိပါက အကူအညီတောင်းခံရန်။",
"translate-js-support-unsaved-warning": "သင့်တွင် မသိမ်းရသေးသော ဘာသာပြန်များ ရှိသည်။",
"translate-gs-pos": "နေရာ",
"translate-gs-code": "ကုဒ်",
diff --git a/MLEB/Translate/i18n/core/myv.json b/MLEB/Translate/i18n/core/myv.json
index 9af7cad0..d28a7a56 100644
--- a/MLEB/Translate/i18n/core/myv.json
+++ b/MLEB/Translate/i18n/core/myv.json
@@ -24,7 +24,6 @@
"translate-edit-contribute": "эсеть путовкс путомс",
"translate-edit-no-information": "''Те пачтямнесэнть арась чарькодевтема. Тевс нолдамодонзо содат, косо эли кода, лездак лия ютавтыцятненень. Поладт те пачтямнентень превть-арсемат.''",
"translate-edit-information": "Мезе содамс \"$1\" пачтямнэденть",
- "translate-edit-in-other-languages": "Пачтямнесь лия кельсэ",
"translate-rc-translation-filter": "Сувтнемс ютавтовкстнэнь",
"translate-rc-translation-filter-no": "Мезеяк а теемс",
"translate-rc-translation-filter-only": "Ськамост ютавтовкстнэнь невтемс",
diff --git a/MLEB/Translate/i18n/core/nah.json b/MLEB/Translate/i18n/core/nah.json
index af5cbe95..40c1c3ef 100644
--- a/MLEB/Translate/i18n/core/nah.json
+++ b/MLEB/Translate/i18n/core/nah.json
@@ -20,9 +20,7 @@
"translate-prev": "Achto tlahcuilolamatl",
"translate-page-description-legend": "Olōltechopa",
"translate-page-edit": "xicpatla",
- "translate-edit-translation": "Tlahtolcuepaliztli",
"translate-edit-contribute": "titlapalēhuīz",
- "translate-edit-in-other-languages": "Tētītlaniliztli occē tlahtōltica",
"translate-rcfilters-translations": "Tlahtolcuepaliztli",
"translate-rcfilters-translations-only-label": "Tlahtolcuepaliztli",
"translate-rc-translation-filter-no": "Ahtlein titlachīhuāz",
diff --git a/MLEB/Translate/i18n/core/nb.json b/MLEB/Translate/i18n/core/nb.json
index 73d1991a..f5bfb34f 100644
--- a/MLEB/Translate/i18n/core/nb.json
+++ b/MLEB/Translate/i18n/core/nb.json
@@ -48,11 +48,9 @@
"translate-ignored": "(ignorert)",
"translate-edit-title": "Rediger «$1»",
"translate-edit-definition": "Meldingsdefinisjon",
- "translate-edit-translation": "Oversettelse",
"translate-edit-contribute": "bidra",
"translate-edit-no-information": "<em>Denne meldingen har ingen dokumentasjon.\nOm du vet hvor eller hvordan denne meldingen brukes kan du hjelpe andre oversettere ved å legge inn dokumentasjon på denne meldingen.</em>",
"translate-edit-information": "Informasjon om meldingen ($1)",
- "translate-edit-in-other-languages": "Meldingen på andre språk",
"translate-edit-warnings": "Advarsler om ufullstendige oversettelser",
"translate-edit-tmmatch-source": "Kildetekst for oversettelse: $1",
"translate-edit-tmmatch": "samsvarer $1 %",
@@ -146,6 +144,11 @@
"translate-statsf-language": "Kommaseparert liste over språkkoder:",
"translate-statsf-group": "Kommaseparert liste over gruppekoder:",
"translate-statsf-submit": "Forhåndsvisning",
+ "translate-statsf-unknown-error": "En ukjent feil har oppstått.",
+ "translate-statsf-error-message": "En feil oppsto under lasting av grafen: $1",
+ "translate-statsf-graph-alt-text-info": "Alternativ tekst for oversettelsesstatistikken finnes i datatabellen nedenfor.",
+ "translate-statsf-alt-text": "Dette er tekstalternativet for oversettelsesstatistikken.",
+ "translate-statsf-embed": "Kode for å bygge inn grafen for oversettelsesstatistikk på andre sider.",
"translate-tag-page-desc": "Oversettelse av wikisiden [[$2|$1]] fra $3 ($4).",
"translate-sidebar-alltrans": "På andre språk",
"translations": "Alle oversettelser",
@@ -203,7 +206,6 @@
"translate-supportedlanguages-cached": "Denne informasjon ble mellomlagret for $1 siden.",
"abusefilter-edit-builder-vars-translate-source-text": "Kildeteksten til oversettelsesenheten",
"abusefilter-edit-builder-vars-translate-target-language": "Målspråk for oversettelse",
- "translate-save": "Publiser ($1)",
"translate-jssti-add": "Legg til i listen",
"managemessagegroups": "Meldingsgruppehåndtering",
"translate-smg-notallowed": "Du har ikke tillatelse til å utføre dette.",
@@ -254,13 +256,6 @@
"translate-import-err-no-such-file": "Filen <nowiki>$1</nowiki> finnes ikke eller har ikke blitt lastet opp lokalt.",
"translate-import-err-stale-group": "Meldingsgruppen som denne filen tilhører finnes ikke.",
"translate-import-err-no-headers": "Filen er ikke en velformatert Gettext-fil i Translate-utvidelsesformatet:\nKunne ikke fastslå gruppe og språk fra filoverskriftene.",
- "translate-js-summary": "Forklaring:",
- "translate-js-save": "Publiser",
- "translate-js-next": "Publiser og åpne neste",
- "translate-js-skip": "Hopp over til neste",
- "translate-js-history": "Oversettelseshistorikk",
- "translate-js-support": "Still spørsmål",
- "translate-js-support-title": "Be om hjelp hvis det ikke er nok informasjon til å oversette denne meldingen korrekt.",
"translate-js-support-unsaved-warning": "Du har upubliserte oversettelser.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kode",
diff --git a/MLEB/Translate/i18n/core/nds-nl.json b/MLEB/Translate/i18n/core/nds-nl.json
index e442b4fb..8fc8a8d8 100644
--- a/MLEB/Translate/i18n/core/nds-nl.json
+++ b/MLEB/Translate/i18n/core/nds-nl.json
@@ -25,11 +25,9 @@
"translate-percentage-proofread": "Nåkeaken",
"translate-mgs-fieldset": "Låt instellingen seen",
"translate-mgs-column-language": "Språke",
- "translate-js-skip": "Oaverslån en volgende",
- "translate-js-support": "Vråge stellen",
"translate-documentation-language": "Berichtbeskryving",
"translate-searchprofile": "Oaversettingen",
- "translate-searchprofile-note": "Meyr söökoptys binnet beskikbår mid de [$1 oaversettingssöökfunkty].",
+ "translate-searchprofile-note": "Meyr söökoptys bint beskikbår mid de [$1 oaversettingssöökfunkty].",
"tux-tab-untranslated": "Neet oaversetted",
"tux-tab-outdated": "Verolderd",
"tux-tab-translated": "Oaversetted",
diff --git a/MLEB/Translate/i18n/core/nds.json b/MLEB/Translate/i18n/core/nds.json
index 011b8a99..b31e403c 100644
--- a/MLEB/Translate/i18n/core/nds.json
+++ b/MLEB/Translate/i18n/core/nds.json
@@ -17,9 +17,7 @@
"translate-page-edit": "ännern",
"translate-optional": "(optschoonal)",
"translate-edit-title": "Ännern \"$1\"",
- "translate-edit-translation": "Översetten",
"translate-edit-information": "Informatschoon to Nochricht ($1)",
- "translate-edit-in-other-languages": "Nochricht in annere Spraken",
"translate-edit-tmmatch-source": "Översettenborntext: $1",
"translate-language-code": "Spraak-Code",
"translate-language-code-field-name": "Spraak-Code:",
diff --git a/MLEB/Translate/i18n/core/ne.json b/MLEB/Translate/i18n/core/ne.json
index b924285a..ac763f9f 100644
--- a/MLEB/Translate/i18n/core/ne.json
+++ b/MLEB/Translate/i18n/core/ne.json
@@ -19,7 +19,7 @@
"translate-desc": "मिडियाविकी तथा अन्यको अनुवादको निम्ति [[Special:Translate|विशेष पृष्ठ]]",
"translate-taction-translate": "अनुवाद गर्ने",
"translate-taction-proofread": "समीक्षा",
- "translate-taction-lstats": "भाषा तथ्यांक",
+ "translate-taction-lstats": "भाषा तथ्याङ्क",
"translate-taction-mstats": "सन्देश समूह तथ्याङ्कहरू",
"translate-taction-export": "निर्यात",
"translate-page-no-such-language": "निर्दिष्ट भाषा अमान्य थियो",
@@ -46,11 +46,9 @@
"translate-ignored": "(अनदेखा गरिएको)",
"translate-edit-title": "\"$1\" सम्पादन गर्ने",
"translate-edit-definition": "सन्देश परिभाषा",
- "translate-edit-translation": "अनुवाद",
"translate-edit-contribute": "योगदान गर्ने",
"translate-edit-no-information": "''यो सन्देशको कुनैपनि दस्तावेजीकरण छैन''\n''यदि तपाई यो सन्देश कहाँ अथवा कसरी प्रयोग गरिन्छ भन्ने कुरा जान्नु हुन्छ भने तपाईले यसको दस्तावेजीकरण थप गरी अरू अनुवादकहरूलाई सहयोग गर्न सक्नुहुन्छ।''",
"translate-edit-information": "($1) सन्देशको बारेमा जानकारी",
- "translate-edit-in-other-languages": "सन्देश अरु भाषाहरूमा",
"translate-edit-warnings": "चेतावनी अपूर्ण अनुवादको बारेमा",
"translate-edit-tmmatch": "$1% मेल",
"translate-use-suggestion": "यस सुझाउलाई अनुवादको कोठामा हाल्नुहोस् । यसले वर्तमान सामग्री(शब्दहरू)को स्थान लिनेछ।",
@@ -66,7 +64,7 @@
"action-translate-messagereview": "अनुवादहरूलाई समीक्षा गर्नुहाेस्",
"translate-rcfilters-translations": "अनुवादहरू",
"translate-rcfilters-translations-only-label": "अनुवादहरू",
- "translationstats": "अनुवाद तथ्यांक",
+ "translationstats": "अनुवाद तथ्याङ्कहरू",
"translate-stats-edits": "सम्पादनहरू",
"translate-stats-users": "अनुवादकहरू",
"translate-stats-registrations": "पंजीकरण",
@@ -99,7 +97,7 @@
"translate-translations-messagename": "नाम:",
"translate-translations-project": "परियोजना:",
"translate-translations-history-short": "हि",
- "languagestats": "भाषा तथ्यांक",
+ "languagestats": "भाषा तथ्याङ्क",
"languagestats-summary": "यस पृष्ठमा भाषाको निम्ति सबै सन्देश समूहहरूका लागि अनुवाद तथ्याङ्क प्रदर्शित गरिन्छ।",
"languagestats-stats-for": "$1 ($2)को लागि अनुवाद तथ्यांक।",
"languagestats-recenttranslations": "भर्खरैका अनुवादहरू",
@@ -137,10 +135,6 @@
"translate-manage-action-import": "आयात गर्नु",
"translate-manage-action-ignore": "उपेक्षा",
"translate-manage-action-rename": "नाम फेर्नुहोस्",
- "translate-js-summary": "सारांश :",
- "translate-js-save": "प्रकाशन",
- "translate-js-history": "अनुवाद इतिहास",
- "translate-js-support": "प्रश्न सोध्नुहोस्",
"translate-js-support-unsaved-warning": "तपाईँकोमा अप्रकाशित अनुवादहरू छन्।",
"translate-gs-code": "कोड",
"translate-gs-continent": "महादेश",
diff --git a/MLEB/Translate/i18n/core/nia.json b/MLEB/Translate/i18n/core/nia.json
new file mode 100644
index 00000000..4635bd68
--- /dev/null
+++ b/MLEB/Translate/i18n/core/nia.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Slaia"
+ ]
+ },
+ "translate-documentation-language": "Fanolo wo'ali sura"
+}
diff --git a/MLEB/Translate/i18n/core/nl.json b/MLEB/Translate/i18n/core/nl.json
index e0905977..898e3612 100644
--- a/MLEB/Translate/i18n/core/nl.json
+++ b/MLEB/Translate/i18n/core/nl.json
@@ -56,11 +56,9 @@
"translate-ignored": "(genegeerd)",
"translate-edit-title": "\"$1\" bewerken",
"translate-edit-definition": "Berichtdefinitie",
- "translate-edit-translation": "Vertaling",
"translate-edit-contribute": "bijdragen",
"translate-edit-no-information": "<em>Dit bericht heeft geen documentatie.\nAls u weet waar of hoe dit bericht wordt gebruikt, dan kunt u andere gebruikers helpen door documentatie voor dit bericht toe te voegen.</em>",
"translate-edit-information": "Informatie over bericht ($1)",
- "translate-edit-in-other-languages": "Bericht in andere talen",
"translate-edit-warnings": "Waarschuwingen over onjuiste vertalingen",
"translate-edit-tmmatch-source": "Brontekst voor vertaling: $1",
"translate-edit-tmmatch": "$1% overeenkomst",
@@ -202,7 +200,6 @@
"translate-supportedlanguages-cached": "Deze informatie werd $1 geleden in de cache opgeslagen.",
"abusefilter-edit-builder-vars-translate-source-text": "Brontekst van de vertalingseenheid",
"abusefilter-edit-builder-vars-translate-target-language": "Doeltaal voor de vertaling",
- "translate-save": "Publiceren ($1)",
"translate-jssti-add": "Aan lijst toevoegen",
"managemessagegroups": "Berichtengroepen beheren",
"translate-smg-notallowed": "U mag deze handeling niet uitvoeren.",
@@ -249,13 +246,6 @@
"translate-import-err-no-such-file": "Het bestand <nowiki>$1</nowiki> bestaat niet of is niet naar de server geüpload.",
"translate-import-err-stale-group": "De berichtengroep die in dit bestand staat bestaat niet.",
"translate-import-err-no-headers": "Het bestand heeft geen goed gevormd Gettext-opmaak zoals vereist door de uitbreiding Translate:\nhet was niet mogelijk de groep en taal te bepalen uit het bestand.",
- "translate-js-summary": "Samenvatting:",
- "translate-js-save": "Publiceren",
- "translate-js-next": "Publiceren en volgende",
- "translate-js-skip": "Overslaan en volgende",
- "translate-js-history": "Vertaalgeschiedenis",
- "translate-js-support": "Vraag stellen",
- "translate-js-support-title": "Vraag om hulp als er niet voldoende informatie is om dit bericht juist te vertalen.",
"translate-js-support-unsaved-warning": "U hebt niet-opgeslagen vertalingen.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/nn.json b/MLEB/Translate/i18n/core/nn.json
index 18657a1c..14b18443 100644
--- a/MLEB/Translate/i18n/core/nn.json
+++ b/MLEB/Translate/i18n/core/nn.json
@@ -47,11 +47,9 @@
"translate-ignored": "(ignorert)",
"translate-edit-title": "Endra «$1»",
"translate-edit-definition": "Melding som skal setjast om",
- "translate-edit-translation": "Omsetjing",
"translate-edit-contribute": "bidra",
"translate-edit-no-information": "<em>Denne meldinga har ingen dokumentasjon.\nOm du veit kvar eller korleis denne meldinga vert nytta, kan du hjelpe andre omsetjarar ved å legge inn dokumentasjon til denne meldinga.</em>",
"translate-edit-information": "Informasjon om meldinga ($1)",
- "translate-edit-in-other-languages": "Meldinga på andre språk",
"translate-edit-warnings": "Åtvaringar om ufullstendige omsetjingar",
"translate-edit-tmmatch-source": "Kjeldetekst for omsetjing: $1",
"translate-edit-tmmatch": "$1% samsvar",
@@ -173,7 +171,6 @@
"supportedlanguages-recenttranslations": "siste omsetjingane",
"supportedlanguages-count": "$1 {{PLURAL:$1|språk}} totalt.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|éi endring|$2 endringar}} – siste endringa for {{PLURAL:$3|éin dag|$3 dagar}} sidan",
- "translate-save": "Lagra ($1)",
"translate-jssti-add": "Legg til i lista",
"managemessagegroups": "Handsaming av meldingsgruppe",
"translate-smg-notallowed": "Du har ikkje løyve til å utføra handlinga.",
@@ -199,13 +196,6 @@
"translate-import-err-ul-failed": "Filopplastinga var ikkje vellukka",
"translate-import-err-invalid-title": "Det oppgjevne filnamnnet <nowiki>$1</nowiki> var ugyldig.",
"translate-import-err-no-such-file": "Fila <nowiki>$1</nowiki> finst ikkje eller er ikkje vorten lasta opp lokalt.",
- "translate-js-summary": "Samandrag:",
- "translate-js-save": "Lagra",
- "translate-js-next": "Lagra og opna neste",
- "translate-js-skip": "Hopp over til neste",
- "translate-js-history": "Omsetjingshistorikk",
- "translate-js-support": "Still spørsmål",
- "translate-js-support-title": "Spør etter hjelp om det ikkje er nok informasjon til å setja om meldinga rett.",
"translate-js-support-unsaved-warning": "Du har omsetjingar som ikkje er lagra.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kode",
diff --git a/MLEB/Translate/i18n/core/nqo.json b/MLEB/Translate/i18n/core/nqo.json
index 0b2fd594..bb282206 100644
--- a/MLEB/Translate/i18n/core/nqo.json
+++ b/MLEB/Translate/i18n/core/nqo.json
@@ -7,9 +7,5 @@
},
"translate": "ߘߟߊߡߌ߬ߘߊ߬",
"translate-extensionname": "ߘߟߊߡߌ߬ߘߊ߬",
- "translate-js-save": "ߊ߬ ߟߊߞߎ߲߬ߘߎ߬",
- "translate-js-next": "ߊ߬ ߟߊߞߎ߲߬ߘߎ߬ ߞߊ߬ ߟߊߕߎ߲߰ߕߊ ߘߊߦߟߍ߬",
- "translate-js-skip": "ߌ ߜߊ߲߫ ߣߌ߲߬ ߞߎ߲߬ߠߊ߫",
- "translate-js-support": "ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߞߍ߫",
"translate-documentation-language": "ߗߋߛߓߍ ߘߐ߬ߛߙߋ߬ߦߊ߬ߟߌ"
}
diff --git a/MLEB/Translate/i18n/core/nso.json b/MLEB/Translate/i18n/core/nso.json
index 95587b13..63ac2736 100644
--- a/MLEB/Translate/i18n/core/nso.json
+++ b/MLEB/Translate/i18n/core/nso.json
@@ -13,7 +13,5 @@
"translate-page-description-legend": "Tsebo ka sehlopha",
"translate-statsf-scale-days": "Matšatši",
"translate-statsf-scale-hours": "Diiri",
- "translate-statsf-count-edits": "Palo ya diphetogo",
- "translate-js-next": "Boloka o bule yago latela",
- "translate-js-skip": "Lesa o bule yago latela"
+ "translate-statsf-count-edits": "Palo ya diphetogo"
}
diff --git a/MLEB/Translate/i18n/core/oc.json b/MLEB/Translate/i18n/core/oc.json
index 72c75916..9bddecff 100644
--- a/MLEB/Translate/i18n/core/oc.json
+++ b/MLEB/Translate/i18n/core/oc.json
@@ -44,11 +44,9 @@
"translate-ignored": "(ignorat)",
"translate-edit-title": "Modificar « $1 »",
"translate-edit-definition": "Definicion del messatge",
- "translate-edit-translation": "Traduccion",
"translate-edit-contribute": "contribuir",
"translate-edit-no-information": "<em>Aqueste messatge es pas documentat.\nSe sabètz ont o cossí aqueste messatge es utilizat, podètz ajudar los autres traductors en creant sa documentacion.</em>",
"translate-edit-information": "Entresenhas a prepaus del messatge ($1)",
- "translate-edit-in-other-languages": "Messatge dins d'autras lengas",
"translate-edit-warnings": "Avertiments que concernisson las traduccions incompletas",
"translate-edit-tmmatch-source": "Tèxte font de la traduccion : $1",
"translate-edit-tmmatch": "$1 % de correspondéncia",
@@ -178,7 +176,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|lenga|lengas}} al total.",
"supportedlanguages-activity": "$1 : $2 modificacion{{PLURAL:$2||s}} - Darrièra modificacion i a $3 jorn{{PLURAL:$3||s}}",
"abusefilter-edit-builder-vars-translate-source-text": "Tèxte font de l'unitat de traduccion",
- "translate-save": "Publicar ($1)",
"translate-jssti-add": "Apondre a la lista",
"managemessagegroups": "Gestion del grop de messatges",
"translate-smg-notallowed": "Sètz pas autorizat a efectuar aquesta accion.",
@@ -212,13 +209,6 @@
"translate-import-err-no-such-file": "Lo fichièr <nowiki>$1</nowiki> existís pas o es pas importat localament.",
"translate-import-err-stale-group": "Lo grop de messatges qu'aquel fichièr i aperten existís pas.",
"translate-import-err-no-headers": "Lo fichièr es pas un fichièr ''Gettext'' plan format dins lo format esperat per l’extension ''Translate'' :\nes impossible de determinar lo grop e la lenga dempuèi las entèstas del fichièr.",
- "translate-js-summary": "Resumit :",
- "translate-js-save": "Publicar",
- "translate-js-next": "Publicar e dobrir lo seguent",
- "translate-js-skip": "Anar al seguent",
- "translate-js-history": "Istoric de traduccion",
- "translate-js-support": "Pausar una question",
- "translate-js-support-title": "Demandatz d'ajuda se trobatz que i a pas pro d'informacions per tradusir corrèctament aquel messatge.",
"translate-js-support-unsaved-warning": "Avètz de traduccions pas enregistradas.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Còdi",
diff --git a/MLEB/Translate/i18n/core/ojb.json b/MLEB/Translate/i18n/core/ojb.json
new file mode 100644
index 00000000..7bb234d2
--- /dev/null
+++ b/MLEB/Translate/i18n/core/ojb.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aandeginini"
+ ]
+ },
+ "translate-smg-no-groups-in-sync": "Gaawiin gegoo okwiinowag aazha bezhigwan",
+ "translate-smg-strong-sync-help": "Wiiji'",
+ "translate-smg-groups-in-sync": "Okwiinowag azhaa bezhigwan",
+ "translate-smg-groups-in-sync-list": "Ondamanokii nagadan niibiwa-ikidowin okwiinowag:",
+ "translate-documentation-language": "Maajiibii'igan ozhibii'igan"
+}
diff --git a/MLEB/Translate/i18n/core/om.json b/MLEB/Translate/i18n/core/om.json
new file mode 100644
index 00000000..8c4ab6e0
--- /dev/null
+++ b/MLEB/Translate/i18n/core/om.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahrada2016",
+ "Maammee"
+ ]
+ },
+ "supportedlanguages": "Qooqa hojiirrayiru",
+ "translate-smg-group-message-action-history": "Seenaa",
+ "translate-smg-group-message-tag-outdated": "Guyala",
+ "translate-smg-group-message-tag-rename": "Maqa sirreessi",
+ "translate-smg-group-message-message-content": "Qabiyyee:",
+ "translate-smg-group-message-message-target": "Manii:",
+ "translate-smg-group-message-message-replacement": "Iddobuusuu:",
+ "translate-smg-group-message-message-other-langs": "Afaanota biroo:",
+ "translate-manage-source-message-not-found": "Hinki ergaa hin argamne",
+ "translate-documentation-language": "Galmeessaa ragaa"
+}
diff --git a/MLEB/Translate/i18n/core/or.json b/MLEB/Translate/i18n/core/or.json
index c6c37178..fd0e624f 100644
--- a/MLEB/Translate/i18n/core/or.json
+++ b/MLEB/Translate/i18n/core/or.json
@@ -15,7 +15,7 @@
"translate-taction-translate": "ଅନୁବାଦ କରନ୍ତୁ",
"translate-taction-proofread": "ବନାନ‌ଗ‌ତ ଭୁଲ ସୁଧାରନ୍ତୁ",
"translate-taction-lstats": "ଭାଷା ପରିସଂଖ୍ୟାନ",
- "translate-taction-mstats": "ମେସେଜମାନଙ୍କ ମୋଟ ପରିସଂଖ୍ୟାନ",
+ "translate-taction-mstats": "ମେସେଜ ଦଳ ପରିସଂଖ୍ୟାନ",
"translate-taction-export": "ପଠାନ୍ତୁ",
"translate-taction-disabled": "ଉଇକିରେ ଅପଲୋଡ଼ କରିବା ଅଚଳ କରାଯାଇଛି ।",
"translate-page-no-such-language": "ଦିଆଯାଇଥିବା ଭାଷାଟି ଭୁଲ ।",
@@ -41,10 +41,8 @@
"translate-ignored": "(ଏଡ଼ାଇଯାନ୍ତୁ)",
"translate-edit-title": "ବଦଳ \"$1\"",
"translate-edit-definition": "ମେସେଜ ସଜ୍ଞା",
- "translate-edit-translation": "ଅନୁବାଦ",
"translate-edit-contribute": "ଅବଦାନ",
"translate-edit-information": "($1) ମେସେଜ ବାବଦରେ ସୂଚନା",
- "translate-edit-in-other-languages": "ଅଲଗା ଭାଷାରେ ମେସେଜ",
"translate-edit-warnings": "ଅସମ୍ପୂର୍ଣ୍ଣ ଅନୁବାଦ ବାବଦରେ ଚେତାବନୀ",
"translate-edit-tmmatch-source": "ସୋର୍ସ ଟେକ୍ସଟରୁ ଅନୁବାଦ: $1",
"translate-edit-tmmatch": "$1% ମେଳ",
@@ -56,7 +54,7 @@
"translate-checks-balance": "ଏଠାରେ ଅସମ ସଂଖ୍ୟକ {{PLURAL:$2|ପେରେନ୍ଥେସ|ପେରେନ୍ଥେସସବୁ}} ରହିଛି:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-links": "ଏହି {{PLURAL:$2|ଲିଙ୍କଟି|$2 lଲିଙ୍କମାନ}} ଅସୁବିଧାଜନକ: <strong><nowiki>$1</nowiki></strong>",
"prefs-translate": "ଅନୁବାଦ ବିକଳ୍ପସବୁ",
- "translate-rc-translation-filter-no": "କିଛି ବି କରିବେ ନାହିଁ",
+ "translate-rc-translation-filter-no": "କିଛି କରିବେନାହିଁ",
"translate-rc-translation-filter-only": "କେବଳ ଅନୁବାଦସବୁ ଦେଖାନ୍ତୁ",
"translate-rc-translation-filter-filter": "ଅନୁବାଦସବୁ ଅଲଗା କରିଦିଅନ୍ତୁ",
"translationstats": "ଅନୁବାଦ ପରିସଙ୍ଖ୍ୟାନ",
@@ -89,7 +87,6 @@
"supportedlanguages-recenttranslations": "ବର୍ତ୍ତମାନର ଅନୁବାଦସବୁ",
"supportedlanguages-count": "$1 {{PLURAL:$1|ଭାଷା|ଭାଷା}} ସବୁ ମିଶି ।",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|ବଦଳ|ବଦଳସବୁ}} - ଶେଷ ବଦଳ $3 {{PLURAL:$3|ଦିନ|ଦିନସବୁ}} ଆଗରୁ",
- "translate-save": "($1)କୁ ସାଇତିବେ",
"translate-jssti-add": "ତାଲିକାରେ ଯୋଡ଼ନ୍ତୁ",
"translate-manage-import-new": "ନୂଆ ସନ୍ଦେଶ $1",
"translate-manage-action-import": "ଆମଦାନି",
diff --git a/MLEB/Translate/i18n/core/os.json b/MLEB/Translate/i18n/core/os.json
index d204f277..7cd2dccb 100644
--- a/MLEB/Translate/i18n/core/os.json
+++ b/MLEB/Translate/i18n/core/os.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Amikeco",
+ "Arturgudiev",
"Bouron"
]
},
@@ -10,5 +11,6 @@
"translate-next": "Фæдылдзог фарс",
"translate-prev": "Раздæры фарс",
"translate-page-edit": "ивын",
- "translate-statsf-submit": "Разæркаст"
+ "translate-statsf-submit": "Разæркаст",
+ "translate-documentation-language": "Уацы документаци"
}
diff --git a/MLEB/Translate/i18n/core/pa.json b/MLEB/Translate/i18n/core/pa.json
index ab821776..ed2b8ac6 100644
--- a/MLEB/Translate/i18n/core/pa.json
+++ b/MLEB/Translate/i18n/core/pa.json
@@ -39,10 +39,8 @@
"translate-ignored": "(ਅਣਡਿੱਠਾ)",
"translate-edit-title": "\"$1\" ਸੋਧੋ",
"translate-edit-definition": "ਸਨੇਹੇ ਦੀ ਪਰਿਭਾਸ਼ਾ",
- "translate-edit-translation": "ਤਰਜਮਾਕਾਰੀ",
"translate-edit-contribute": "ਯੋਗਦਾਨ ਪਾਓ",
"translate-edit-information": "($1) ਸੁਨੇਹੇ ਬਾਬਤ ਜਾਣਕਾਰੀ",
- "translate-edit-in-other-languages": "ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿਚ ਸੁਨੇਹਾ",
"translate-edit-warnings": "ਊਣੇ ਤਰਜਮਿਆਂ ਬਾਰੇ ਚਿਤਾਵਨੀ",
"translate-edit-tmmatch-source": "ਅਨੁਵਾਦ ਦੀ ਸਰੋਤ ਲਿਖਤ:$1",
"translate-edit-tmmatch": "$1% ਮੇਲ",
@@ -106,7 +104,6 @@
"translate-mgs-nothing": "ਮੰਗੇ ਗਏ ਅੰਕੜਿਆਂ ਲਈ ਵਿਖਾਉਣ ਨੂੰ ਕੁਝ ਨਹੀਂ ਹੈ।",
"supportedlanguages-recenttranslations": "ਹਾਲੀਆ ਤਰਜਮੇ",
"supportedlanguages-count": "ਕੁੱਲ $1 {{PLURAL:$1|ਭਾਸ਼ਾ|ਭਾਸ਼ਾਵਾਂ}}।",
- "translate-save": "ਸਾਂਭੋ ($1)",
"translate-jssti-add": "ਸੂਚੀ ਵਿਚ ਜੋੜੋ",
"managemessagegroups": "ਸੁਨੇਹਿਆਂ ਦੀ ਟੋਲੀ ਦਾ ਪ੍ਰਬੰਧ",
"translate-smg-right": "ਆਉਂਦੀਆਂ ਤਬਦੀਲੀਆਂ",
@@ -119,12 +116,6 @@
"translate-import-from-local": "ਸਥਾਨਕ ਫ਼ਾਈਲ ਅੱਪਲੋਡ:",
"translate-import-load": "ਫ਼ਾਈਲ ਲੋਡ ਕਰੋ",
"translate-import-err-ul-failed": "ਫ਼ਾਈਲ ਅੱਪਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ",
- "translate-js-summary": "ਸਾਰ:",
- "translate-js-save": "ਸੰਭਾਲੋ",
- "translate-js-next": "ਸੰਭਾਲੋ ਤੇ ਅਗਲਾ ਖੋਲ੍ਹੋ",
- "translate-js-skip": "ਛੱਡ ਕੇ ਅੱਗੇ ਜਾਉ",
- "translate-js-history": "ਤਰਜਮਾਕਾਰੀ ਦਾ ਅਤੀਤ",
- "translate-js-support": "ਸੁਆਲ ਪੁੱਛੋ",
"translate-js-support-unsaved-warning": "ਤੁਹਾਡੇ ਕੋਲ ਅਣ-ਸਾਂਭੇ ਤਰਜਮੇ ਹਨ।",
"translate-gs-pos": "ਸਥਿਤੀ",
"translate-gs-code": "ਕੋਡ",
diff --git a/MLEB/Translate/i18n/core/pam.json b/MLEB/Translate/i18n/core/pam.json
index 7b2e2cdf..dec7e54a 100644
--- a/MLEB/Translate/i18n/core/pam.json
+++ b/MLEB/Translate/i18n/core/pam.json
@@ -6,6 +6,5 @@
},
"translate": "↓Ilikas",
"translate-rc-translation-filter-no": "↓Ala kang gagawan",
- "translate-stats-users": "↓Talalikas",
- "translate-js-save": "↓Isikap"
+ "translate-stats-users": "↓Talalikas"
}
diff --git a/MLEB/Translate/i18n/core/pap.json b/MLEB/Translate/i18n/core/pap.json
new file mode 100644
index 00000000..5dd3562c
--- /dev/null
+++ b/MLEB/Translate/i18n/core/pap.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ObaTango"
+ ]
+ },
+ "translate-documentation-language": "Dokumentashon di mensahe"
+}
diff --git a/MLEB/Translate/i18n/core/pdc.json b/MLEB/Translate/i18n/core/pdc.json
index aba03898..f369bee2 100644
--- a/MLEB/Translate/i18n/core/pdc.json
+++ b/MLEB/Translate/i18n/core/pdc.json
@@ -15,8 +15,6 @@
"translate-prev": "letscht Blatt",
"translate-page-edit": "ennere",
"translate-edit-title": "„$1“ ennere",
- "translate-edit-translation": "Iwwersetzing",
- "translate-edit-in-other-languages": "Meldinge in annere Schprooche",
"translationstats": "Nummere vun Iwwersetzinge",
"translate-stats-edits": "Enneringe",
"translate-stats-users": "Iwwersetzer",
@@ -48,10 +46,8 @@
"translate-mgs-column-language": "Schprooch",
"supportedlanguages-translators": "{{PLURAL:$2|Iwwersetzer|Iwwersetzer}}: $1",
"supportedlanguages-recenttranslations": "Letscht Iwwersetzinge",
- "translate-save": "Beilege ($1)",
"translate-jssti-add": "Zu de Lischt dezu duh",
"translate-manage-import-done": "Alles geduh!",
"translate-import-load": "Feil ufflaade",
- "translate-js-save": "Beilege",
"translate-gs-speakers": "Schwetzer"
}
diff --git a/MLEB/Translate/i18n/core/pfl.json b/MLEB/Translate/i18n/core/pfl.json
index 192427b7..56f29cd2 100644
--- a/MLEB/Translate/i18n/core/pfl.json
+++ b/MLEB/Translate/i18n/core/pfl.json
@@ -39,11 +39,9 @@
"translate-ignored": "(ignoriead)",
"translate-edit-title": "„$1“ bearwaide",
"translate-edit-definition": "Uaschbringlischi Nochrischd",
- "translate-edit-translation": "Iwasedzung",
"translate-edit-contribute": "midschaffe",
"translate-edit-no-information": "''Fa die Nochrischd hods kä Unalaache.''\n''Wonn driwwa was wisse duschd, konschd de onare baide Erwed helfe, wonnen saache duschd, worums do gehd.''",
"translate-edit-information": "Auskinfd iwa die Nochrischd ($1)",
- "translate-edit-in-other-languages": "Nochrischd in onare Schbrooche",
"translate-edit-warnings": "Waanung iwa mongelhafde Iwasedzunge",
"translate-edit-tmmatch-source": "Qwelltegsch vunde Iwasedzung: $1",
"translate-edit-tmmatch": "$1 % Iwaoischdimmung",
@@ -154,7 +152,6 @@
"supportedlanguages-recenttranslations": "Jingschdi Iwasedzunge",
"supportedlanguages-count": "$1 {{PLURAL:$1|Schbrooch|Schbrooche}} gsommd.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|B'awaidung|B'awaidunge}} - leschdi voa $3 {{PLURAL:$3|Daach|Daach}}",
- "translate-save": "Schbaischa ($1)",
"translate-jssti-add": "Zude Lisch dzufiesche",
"managemessagegroups": "Vawaldung vunde Nochrischdegrubbe",
"translate-smg-notallowed": "Du deafschddo des ned mache.",
@@ -184,13 +181,6 @@
"translate-import-err-no-such-file": "Die Dadai <nowiki>$1</nowiki> hods ned oda isch do ned ruffglaade worre.",
"translate-import-err-stale-group": "Die Nochrischdegrubb vonde Dadai hods ned.",
"translate-import-err-no-headers": "Die Dadai isch ned im Gettext-Foamad vunde Eawaidarung \"Iwasedze\":\nDie Grubb un Schbrooch hodned ausm Dadaikopp bschdimmd werre kenne.",
- "translate-js-summary": "Zommefassung:",
- "translate-js-save": "Schbaischare",
- "translate-js-next": "Schbaischare unde negschd effne",
- "translate-js-skip": "Waida zum negschde",
- "translate-js-history": "Iwasedzungsgschischd",
- "translate-js-support": "Frooch",
- "translate-js-support-title": "Froch noch Hilf, woans ned gnischnd Auskinfd hod, um die Nochrischd rischdisch iwasedze zu kenne.",
"translate-js-support-unsaved-warning": "Du hoschd ugsichade Iwasedzunge.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Code",
diff --git a/MLEB/Translate/i18n/core/pl.json b/MLEB/Translate/i18n/core/pl.json
index 7a088f00..61ba72b6 100644
--- a/MLEB/Translate/i18n/core/pl.json
+++ b/MLEB/Translate/i18n/core/pl.json
@@ -9,6 +9,7 @@
"Derbeth",
"Dodek",
"Jwitos",
+ "Kareyac",
"Leinad",
"Maikking",
"Marcin Łukasz Kiejzik",
@@ -69,11 +70,9 @@
"translate-ignored": "(zignorowane)",
"translate-edit-title": "Edycja „$1“",
"translate-edit-definition": "Tekst źródłowy komunikatu",
- "translate-edit-translation": "Tłumaczenie",
"translate-edit-contribute": "zmień",
"translate-edit-no-information": "<em>Ten komunikat nie posiada dokumentacji.\nJeśli wiesz gdzie lub jak ten komunikat jest używany, możesz pomóc innym tłumaczom przez dodanie dokumentacji do tego komunikatu.</em>",
"translate-edit-information": "Objaśnienie komunikatu ($1)",
- "translate-edit-in-other-languages": "Komunikat w innych językach",
"translate-edit-warnings": "Ostrzeżenia o niedokończonych tłumaczeniach",
"translate-edit-tmmatch-source": "Tekst źródłowy tłumaczenia: $1",
"translate-edit-tmmatch": "pasuje $1%",
@@ -105,7 +104,7 @@
"translate-checks-unicode-plural-invalid": "Formy liczby mnogiej powinny być zdefiniowane jako $1. To tłumaczenie zawiera $2.",
"translate-checks-pagename": "Przestrzeń nazw różni się od tekstu źródłowego",
"translate-checks-format": "To tłumaczenie jest niezgodne z tekstem źródłowym lub ma nieprawidłową składnię: $1",
- "translate-checks-escape": "Następujące sekwencje mogą być niezamierzone: <strong>$1</strong>",
+ "translate-checks-escape": "{{PLURAL:$2|Poniższy znak ucieczki może być niezamierzony|Poniższe znaki ucieczki mogą być niezamierzone}}: <strong>$1</strong>. {{PLURAL:$4|Dozwolony symbol ucieczki to|Dozwolone symbole ucieczki zawierają:}} $3",
"translate-checks-parametersnotequal": "Liczba parametrów to {{PLURAL:$1|$1}}; {{PLURAL:$2|powinien być $2|powinno być $2}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> jest niepoprawne.",
"translate-checks-fudforum-syntax": "Użyj w tym projekcie <nowiki>$1</nowiki> zamiast <nowiki>$2</nowiki>.",
@@ -167,6 +166,11 @@
"translate-statsf-language": "Kody języków rozdzielone przecinkami:",
"translate-statsf-group": "Kody grup rozdzielone przecinkami:",
"translate-statsf-submit": "Podgląd",
+ "translate-statsf-unknown-error": "Wystąpił nieznany błąd.",
+ "translate-statsf-error-message": "Wystąpił błąd podczas ładowania grafu: $1",
+ "translate-statsf-graph-alt-text-info": "Alternatywny tekst dla statystyk tłumaczeń znajduje się w tabeli poniżej.",
+ "translate-statsf-alt-text": "Oto alternatywa tekstowa dla statystyk tłumaczeń.",
+ "translate-statsf-embed": "Kod do osadzenia grafu statystyk tłumaczeń na innych stronach.",
"translate-tag-page-desc": "Tłumaczenie wiki strony [[$2|$1]] z $3 ($4).",
"translate-sidebar-alltrans": "W innych językach",
"translations": "Wszystkie tłumaczenia",
@@ -223,7 +227,6 @@
"translate-supportedlanguages-cached": "Ta informacja została zapisana w pamięci podręcznej $1 temu.",
"abusefilter-edit-builder-vars-translate-source-text": "Tekst źródłowy jednostki tłumaczeniowej",
"abusefilter-edit-builder-vars-translate-target-language": "Docelowy język tłumaczenia",
- "translate-save": "Opublikuj ($1)",
"translate-jssti-add": "Dodaj do listy",
"managemessagegroups": "Zarządzanie grupami komunikatów",
"translate-smg-notallowed": "Nie masz prawa wykonania tej akcji.",
@@ -243,6 +246,12 @@
"translate-smg-rename-new": "Dodaj jako nowy…",
"translate-smg-rename-rename": "Dodaj jako efekt zmiany nazwy…",
"translate-smg-changeset-modified": "Zestaw zmian został zmodyfikowany przez innego użytkownika lub proces. Twoje zmiany nie mogą zostać opublikowane, ponieważ mogłyby nadpisać ich zmiany. Przeładuj stronę aby zobaczyć najnowsze zmiany.",
+ "translate-smg-strong-sync-help": "Pomoc",
+ "translate-smg-groups-with-error-desc": "Lista grup i komunikatów z błędami podczas synchronizacji:",
+ "translate-smg-group-action-resolve": "Oznacz jako gotowe",
+ "translate-smg-group-message-message-other-langs": "Inne języki:",
+ "translate-smg-loading": "Ładowanie…",
+ "translate-smg-unknown-error": "Podczas przetwarzania Twojego żądania wystąpił nieznany błąd.",
"translate-manage-import-diff": "Komunikat $1 | Operacje: $2",
"translate-manage-import-new": "Nowy komunikat $1",
"translate-manage-import-deleted": "Usunięto komunikat $1",
@@ -264,6 +273,8 @@
"translate-manage-intro-other": "Poniżej znajduje się lista zmian komunikatów w języku $1.\nProszę przejrzeć zmiany i wybrać dla każdego komunikatu operację, którą chcesz dla niego wykonać.\nJeśli polecisz zignorować zmiany, zostaną one nadpisane przy następnym eksporcie.",
"translate-manage-import-ok": "Zaimportowano: $1",
"translate-manage-import-done": "Import zakończony!",
+ "translate-manage-empty-content": "Nie ma zawartości",
+ "translate-manage-key-reused": "Ten komunikat istnieje już na wiki. Sprawdź, czy nie doszło do przypadkowego użycia starego klucza.",
"importtranslations": "Importowanie tłumaczeń",
"translate-import-from-local": "Załadowanie lokalnego pliku",
"translate-import-load": "Pobierz plik",
@@ -273,13 +284,6 @@
"translate-import-err-no-such-file": "Plik <nowiki>$1</nowiki> nie istnieje lub nie został jeszcze przesłany.",
"translate-import-err-stale-group": "Grupa komunikatów, do której należy ten plik, nie istnieje.",
"translate-import-err-no-headers": "Plik nie jest prawidłowo sformatowanym plikiem Gettext właściwym dla rozszerzenia Translate – nie udało się odczytać grupy i języka z nagłówków pliku.",
- "translate-js-summary": "Podsumowanie:",
- "translate-js-save": "Opublikuj",
- "translate-js-next": "Opublikuj i otwórz następny",
- "translate-js-skip": "Przejdź do następnego",
- "translate-js-history": "Historia tłumaczeń",
- "translate-js-support": "Zadaj pytanie",
- "translate-js-support-title": "Poproś o pomoc, jeśli brak jest wystarczających informacji, aby przetłumaczyć ten komunikat właściwie.",
"translate-js-support-unsaved-warning": "Masz nieopublikowane tłumaczenia.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/pms.json b/MLEB/Translate/i18n/core/pms.json
index 98676ec7..4efd0390 100644
--- a/MLEB/Translate/i18n/core/pms.json
+++ b/MLEB/Translate/i18n/core/pms.json
@@ -40,11 +40,9 @@
"translate-ignored": "(ignorà)",
"translate-edit-title": "Modìfica \"$1\"",
"translate-edit-definition": "Definission dël mëssagi",
- "translate-edit-translation": "Tradussion",
"translate-edit-contribute": "colaboré",
"translate-edit-no-information": "''Ës mëssagi a l'ha gnun-a documentassion.\nS'a sa andoa o coma 's mëssagi a l'é dovrà, a peul giuté d'àutri tradutor an giontant dla documentassion a cost mëssagi.''",
"translate-edit-information": "Anformassion an sël mëssagi ($1)",
- "translate-edit-in-other-languages": "Mëssagi an d'àutre lenghe",
"translate-edit-warnings": "Avertensa an sle tradussion incomplete",
"translate-edit-tmmatch-source": "Test sorgiss dla tradussion: $1",
"translate-edit-tmmatch": "corëspondensa ëd $1%",
@@ -157,7 +155,6 @@
"supportedlanguages-recenttranslations": "tradussion recente",
"supportedlanguages-count": "$1 {{PLURAL:$1|lenghe|lenghe}} an total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|modìfica|modìfiche}} - ùltima modìfica $3 {{PLURAL:$3|di|di}} fà",
- "translate-save": "Salva ($1)",
"translate-jssti-add": "Gionté a la lista",
"managemessagegroups": "Gestion ëd la partìa dij mëssagi",
"translate-smg-notallowed": "It peule pa fé st'assion-sì.",
@@ -192,13 +189,6 @@
"translate-import-err-no-such-file": "L'archivi <nowiki>$1</nowiki> a esist pa o a l'é pa stàit carià localment.",
"translate-import-err-stale-group": "La partìa ëd mëssagi anté ch'a ponta s'archivi a esist pa.",
"translate-import-err-no-headers": "L'archivi a l'é pa n'archivi Gettext bin formà ant ël formà dl'estension Translate:\nAs peul pa determinesse la partìa e la lenga da l'antestassion dl'archivi.",
- "translate-js-summary": "Resumé:",
- "translate-js-save": "Salva",
- "translate-js-next": "Salvé e duverté col apress",
- "translate-js-skip": "Sàuta a col ch'a ven",
- "translate-js-history": "Stòria dël viragi",
- "translate-js-support": "Ciama",
- "translate-js-support-title": "Ch'a ciama d'agiut s'a-i é pa basta d'anformassion për volté bin cost mëssagi.",
"translate-js-support-unsaved-warning": "A l'ha dle tradussion nen salvà.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Còdes",
diff --git a/MLEB/Translate/i18n/core/pnb.json b/MLEB/Translate/i18n/core/pnb.json
index d6bd8e3e..d71b7181 100644
--- a/MLEB/Translate/i18n/core/pnb.json
+++ b/MLEB/Translate/i18n/core/pnb.json
@@ -6,6 +6,9 @@
]
},
"translate": "ترجمعہ",
+ "translate-extensionname": "ترجمہ",
+ "translate-taction-translate": "ترجمہ",
+ "translate-taction-lstats": "بولی آنکڑے",
"translate-page-settings-legend": "ترتیب",
"translate-page-group": "ٹولی",
"translate-page-language": "بولی",
@@ -14,5 +17,39 @@
"translate-page-showing-none": "وکھانے آسطے کوئی سنیعا نئیں۔",
"translate-next": "اگلا صفحہ",
"translate-page-description-legend": "ٹولی دے بارے چ معلومات",
- "translate-documentation-language": "سنیہہ دستاویز"
+ "prefs-translate": "ترجمہ اختیارات",
+ "translate-rcfilters-translations": "ترجمے",
+ "translate-rcfilters-translations-filter-label": "ترجمے نئیں",
+ "translate-rc-translation-filter": "فلٹر ترجمے:",
+ "translationstats": "ترجمہ آنکڑے",
+ "translate-statsf-days": "ویلہ مدت دناں وچ:",
+ "translate-statsf-scale-months": "مہینے",
+ "translate-statsf-scale-weeks": "ہفتے",
+ "translate-statsf-scale-days": "دن",
+ "translate-sidebar-alltrans": "ہور بولیاں وچ",
+ "translations": "سارے ترجمے",
+ "languagestats": "بولی آنکڑے",
+ "translate-language-code": "بولی کوڈ",
+ "translate-language": "بولی",
+ "translate-ls-submit": "آنکڑے ویکھاؤ",
+ "translate-mgs-submit": "آنکڑے ویکھاؤ",
+ "translate-mgs-column-language": "بولی",
+ "supportedlanguages-activity": "$1: $2 {{PLURAL:$2|ترمیم|ترمیماں}} - آخری ترمیم $3 {{PLURAL:$3|دن|دناں}} پہلے",
+ "translate-smg-rename-cancel": "رد کرو",
+ "translate-documentation-language": "سنیہا دستاویز",
+ "translate-searchprofile": "ترجمے",
+ "tux-languageselector": "وچ ترجمہ",
+ "tux-tab-translated": "ترجمہ شدہ",
+ "tux-status-translated": "ترجمہ شدہ",
+ "tux-editor-cancel-button-label": "رد کرو",
+ "tux-notices-more": "{{PLURAL:$1|$1 ہور}}",
+ "tux-notices-hide": "لُکاؤ",
+ "tux-editor-message-desc-more": "ہور دیکھو",
+ "tux-editor-doc-editor-cancel": "منسوخ کرو",
+ "tux-messagetable-more-messages": "$1 ہور {{PLURAL:$1|سنیہا|سنیہے}}",
+ "tux-message-filter-advanced-button": "ہور کھوج",
+ "tux-empty-list-translated-action": "ترجمہ",
+ "tux-editor-message-tools-translations": "سارے ترجمے",
+ "translate-search-more-languages-info": "$1 ہور {{PLURAL:$1|بولی|بولیاں}}",
+ "specialpages-group-translation": "ترجمہ"
}
diff --git a/MLEB/Translate/i18n/core/ps.json b/MLEB/Translate/i18n/core/ps.json
index a2314345..4eb15b47 100644
--- a/MLEB/Translate/i18n/core/ps.json
+++ b/MLEB/Translate/i18n/core/ps.json
@@ -37,10 +37,8 @@
"translate-ignored": "(بابېزه گڼل شوی)",
"translate-edit-title": "\"$1\" سمول",
"translate-edit-definition": "د پيغام پېژند",
- "translate-edit-translation": "ژباړه",
"translate-edit-contribute": "ونډه اخيستل",
"translate-edit-information": "د پيغام په اړه مالومات ($1)",
- "translate-edit-in-other-languages": "پيغام په نورو ژبو کې",
"translate-edit-warnings": "د نابشپړه ژباړو په اړه گواښنې",
"translate-edit-tmmatch-source": "د ژباړې د سرچينې متن: $1",
"translate-edit-askpermission": "پرېښه اخيستل",
@@ -120,7 +118,6 @@
"supportedlanguages-count": "ټولټال $1 {{PLURAL:$1|ژبه|ژبې}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|سمون|سمونونه}} - وروستی سمون $3 {{PLURAL:$3|ورځ|ورځې}} دمخه",
"abusefilter-edit-builder-vars-translate-source-text": "د ژباړې يوون د سرچينې متن",
- "translate-save": "خوندي کول ($1)",
"translate-jssti-add": "لړليک کې گډول",
"managemessagegroups": "د پیغام ګروپ مدیریت",
"translate-manage-import-new": "نوی پيغام $1",
@@ -131,11 +128,6 @@
"translate-import-from-local": "د سيمه ايزې دوتنې پورته کېدل:",
"translate-import-load": "دوتنه برسېرول",
"translate-import-err-invalid-title": "د ورکړل شوې دوتنې نوم <nowiki>$1</nowiki> ناسم و.",
- "translate-js-summary": "لنډيز:",
- "translate-js-save": "خوندي کول",
- "translate-js-skip": "بل ته ورتېرېدل",
- "translate-js-history": "د ژباړې پېښليک",
- "translate-js-support": "پوښتنه پوښتل",
"translate-gs-code": "کوډ",
"translate-gs-continent": "لويه وچه",
"translate-gs-speakers": "وييونکي",
diff --git a/MLEB/Translate/i18n/core/pt-br.json b/MLEB/Translate/i18n/core/pt-br.json
index 0e1307de..fc3ad2a1 100644
--- a/MLEB/Translate/i18n/core/pt-br.json
+++ b/MLEB/Translate/i18n/core/pt-br.json
@@ -7,14 +7,17 @@
"Dr03ramos",
"Eduardo Addad de Oliveira",
"Eduardo.mps",
+ "Eduardoaddad",
"Fabsouza1",
"Felipe L. Ewald",
"Giro720",
"Hamilton Abreu",
"He7d3r",
"Helder.wiki",
+ "Luan",
"Luckas",
"Luckas Blade",
+ "Mariagarbin",
"Opraco",
"TheEduGobi",
555
@@ -57,11 +60,9 @@
"translate-ignored": "(ignorada)",
"translate-edit-title": "Editar \"$1\"",
"translate-edit-definition": "Definição da mensagem",
- "translate-edit-translation": "Tradução",
"translate-edit-contribute": "contribua",
"translate-edit-no-information": "<em>Esta mensagem ainda não foi documentada.\nCaso você saiba onde ou como ela é utilizada, poderá ajudar outros tradutores adicionando informações sobre esta mensagem.</em>",
"translate-edit-information": "Informações sobre a mensagem ($1)",
- "translate-edit-in-other-languages": "Esta mensagem em outros idiomas",
"translate-edit-warnings": "Avisos sobre traduções incompletas",
"translate-edit-tmmatch-source": "Texto de origem da tradução: $1",
"translate-edit-tmmatch": "$1% coincidente",
@@ -96,7 +97,7 @@
"translate-checks-escape": "{{PLURAL:$2|O seguinte carácter de escape pode ter sido acidental|Os seguintes caráteres de escape podem ter sido acidentais}}: <strong>$1</strong>. {{PLURAL:$4|Um carácter de escape válido seria|Entre os caráteres de escape válidos incluem-se os seguintes:}} $3.",
"translate-checks-parametersnotequal": "A contagem de parâmetros detectou {{PLURAL:$1|$1}}. É necessário que sejam {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> está formatado incorretamente.",
- "translate-checks-fudforum-syntax": "Use, neste projeto, <nowiki>$1</nowiki> ao invés de <nowiki>$2</nowiki>.",
+ "translate-checks-fudforum-syntax": "Use, neste projeto, <nowiki>$1</nowiki> em vez de <nowiki>$2</nowiki>.",
"translate-checks-newline-missing-start": "{{PLURAL:$1|Falta $1 carácter|Faltam $1 caracteres}} de nova linha em falta no início da tradução.",
"translate-checks-newline-missing-end": "{{PLURAL:$1|Falta $1 carácter|Faltam $1 caracteres}} de nova linha em falta no fim da tradução.",
"translate-checks-newline-extra-start": "Há $1 {{PLURAL:$1|carácter|caracteres}} de nova linha a mais no início da tradução.",
@@ -155,6 +156,11 @@
"translate-statsf-language": "Códigos de idiomas, separados por vírgulas:",
"translate-statsf-group": "Códigos de grupos, separados por vírgulas:",
"translate-statsf-submit": "Visualizar",
+ "translate-statsf-unknown-error": "Ocorreu um erro desconhecido.",
+ "translate-statsf-error-message": "Ocorreu um erro ao carregar o gráfico: $1",
+ "translate-statsf-graph-alt-text-info": "A alternativa de texto para as estatísticas de tradução está na tabela de dados abaixo.",
+ "translate-statsf-alt-text": "Esta é a alternativa em texto para as estatísticas de tradução.",
+ "translate-statsf-embed": "Código para incorporar o gráfico de estatísticas de tradução em outras páginas.",
"translate-tag-page-desc": "Tradução da página wiki [[$2|$1]] de $3 ($4).",
"translate-sidebar-alltrans": "Em outros idiomas",
"translations": "Todas as traduções",
@@ -200,7 +206,7 @@
"translate-mgs-totals": "{{PLURAL:$1|A língua em conjunto|Todas as $1 línguas em conjunto}}",
"translate-mgs-invalid-group": "O grupo especificado ($1) não existe.",
"translate-mgs-nothing": "Sem dados para as estatísticas solicitadas.",
- "supportedlanguages": "Idiomas suportados",
+ "supportedlanguages": "Idiomas ativos",
"supportedlanguages-summary": "Esta página apresenta uma lista de todas os idiomas suportados por {{SITENAME}},\njunto dos respectivos nomes dos tradutores de cada idioma.\nQuanto maior for exibido um nome, com mais traduções a pessoa terá contribuído.\nA cor do sublinhado é um indicativo de atividades recentes do usuário.",
"supportedlanguages-colorlegend": "Legenda: última tradução $1 dias atrás.",
"supportedlanguages-portallink": "[$1] $2 - $3",
@@ -213,7 +219,6 @@
"translate-supportedlanguages-cached": "Esta informação foi armazenada em cache em $1 atrás.",
"abusefilter-edit-builder-vars-translate-source-text": "Texto original da unidade de tradução",
"abusefilter-edit-builder-vars-translate-target-language": "Idioma alvo para tradução",
- "translate-save": "Publicar ($1)",
"translate-jssti-add": "Adicionar à lista",
"managemessagegroups": "Gerenciamento de grupos de mensagens",
"translate-smg-notallowed": "Você não tem os privilégios necessários para executar esta ação.",
@@ -234,6 +239,24 @@
"translate-smg-rename-rename": "Adicionar como renomear de...",
"translate-smg-rename-dialog-title": "Selecione renomear correspondente para $1",
"translate-smg-changeset-modified": "O conjunto de alterações foi modificado por outro usuário ou processo. Suas alterações não podem ser publicadas, pois podem substituir as alterações. Atualize a página para ver as alterações mais recentes.",
+ "translate-smg-no-groups-in-sync": "Não há grupos atualmente em sincronização",
+ "translate-smg-strong-sync-help": "Ajuda",
+ "translate-smg-groups-in-sync": "Grupos atualmente em sincronização",
+ "translate-smg-groups-in-sync-list": "Lista de grupos atualmente em processamento em segundo plano:",
+ "translate-smg-groups-with-error-title": "Grupos que tiveram erros durante a sincronização",
+ "translate-smg-groups-with-error-desc": "Lista de grupos que apresentaram erros durante a sincronização:",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|mensagem|mensagens}} com erros:",
+ "translate-smg-group-message-action-history": "Histórico",
+ "translate-smg-group-action-resolve": "Marcar como resolvido",
+ "translate-smg-group-message-tag-outdated": "Desatualizadas",
+ "translate-smg-group-message-tag-rename": "Renomear",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Etiqueta|Etiquetas}}:",
+ "translate-smg-group-message-message-content": "Conteúdo:",
+ "translate-smg-group-message-message-target": "Destinatário:",
+ "translate-smg-group-message-message-replacement": "Substituição:",
+ "translate-smg-group-message-message-other-langs": "Outros idiomas:",
+ "translate-smg-loading": "Carregando...",
+ "translate-smg-unknown-error": "Ocorreu um erro desconhecido ao processar sua solicitação.",
"translate-manage-import-diff": "Mensagem $1 | Ações: $2",
"translate-manage-import-new": "Nova mensagem $1",
"translate-manage-import-deleted": "Mensagem apagada $1",
@@ -255,6 +278,9 @@
"translate-manage-intro-other": "Abaixo está a lista de mudanças de tradução no idioma $1.\nPor favor, revise essas mudanças e escolha uma ação para cada atualização.\nSe optar por ignorar as alterações, esta ação é apenas temporária.",
"translate-manage-import-ok": "Importado: $1",
"translate-manage-import-done": "Importação completa!",
+ "translate-manage-empty-content": "O conteúdo está vazio",
+ "translate-manage-key-reused": "Esta mensagem já existe na wiki. Verifique se há uma reutilização acidental de uma chave antiga.",
+ "translate-manage-source-message-not-found": "Definição de mensagem não encontrada",
"importtranslations": "Importar traduções",
"translate-import-from-local": "Enviar arquivo local:",
"translate-import-load": "Enviar arquivo",
@@ -264,13 +290,6 @@
"translate-import-err-no-such-file": "O arquivo <nowiki>$1</nowiki> não existe ou não foi enviado.",
"translate-import-err-stale-group": "O grupo de mensagens a que este arquivo pertence não existe.",
"translate-import-err-no-headers": "Este não é um arquivo Gettext compatível com o formato da extensão Translate:\nNão foi possível determinar o grupo e a língua a partir dos cabeçalhos.",
- "translate-js-summary": "Sumário:",
- "translate-js-save": "Publicar",
- "translate-js-next": "Publicar e abrir a próxima",
- "translate-js-skip": "Pular para próxima",
- "translate-js-history": "Histórico de traduções",
- "translate-js-support": "Fazer uma pergunta",
- "translate-js-support-title": "Peça ajuda se não existir informação suficiente para traduzir esta mensagem de forma correta.",
"translate-js-support-unsaved-warning": "Você possui traduções não publicadas.",
"translate-gs-pos": "Lugar",
"translate-gs-code": "Código",
diff --git a/MLEB/Translate/i18n/core/pt.json b/MLEB/Translate/i18n/core/pt.json
index 6cc47840..92069024 100644
--- a/MLEB/Translate/i18n/core/pt.json
+++ b/MLEB/Translate/i18n/core/pt.json
@@ -53,11 +53,9 @@
"translate-ignored": "(ignorada)",
"translate-edit-title": "Editar \"$1\"",
"translate-edit-definition": "Definição da mensagem",
- "translate-edit-translation": "Tradução",
"translate-edit-contribute": "contribua",
"translate-edit-no-information": "<em>Esta mensagem ainda não foi documentada.\nCaso saiba onde ou como ela é utilizada, pode ajudar os outros tradutores acrescentando as informações necessárias nesta mensagem.</em>",
"translate-edit-information": "Informações sobre a mensagem ($1)",
- "translate-edit-in-other-languages": "Esta mensagem noutras línguas",
"translate-edit-warnings": "Avisos sobre traduções incompletas",
"translate-edit-tmmatch-source": "Texto de origem da tradução: $1",
"translate-edit-tmmatch": "$1% coincidente",
@@ -202,9 +200,9 @@
"supportedlanguages-recenttranslations": "traduções recentes",
"supportedlanguages-count": "$1 {{PLURAL:$1|língua|línguas}} no total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|edição|edições}} - a última edição foi há $3 {{PLURAL:$3|dia|dias}}",
+ "translate-supportedlanguages-cached": "Esta informação foi armazenada em cache há $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Texto de origem da unidade de tradução",
"abusefilter-edit-builder-vars-translate-target-language": "Língua alvo da tradução",
- "translate-save": "Gravar ($1)",
"translate-jssti-add": "Adicionar à lista",
"managemessagegroups": "Administração de grupos de mensagens",
"translate-smg-notallowed": "Não tem os privilégios necessários para esta operação.",
@@ -255,13 +253,6 @@
"translate-import-err-no-such-file": "O ficheiro <nowiki>$1</nowiki> não existe ou não foi carregado localmente.",
"translate-import-err-stale-group": "O grupo de mensagens a que este ficheiro pertence não existe.",
"translate-import-err-no-headers": "O ficheiro não é um ficheiro Gettext válido, com o formato da extensão Translate:\nNão foi possível determinar o grupo e a língua a partir dos cabeçalhos.",
- "translate-js-summary": "Resumo:",
- "translate-js-save": "Gravar",
- "translate-js-next": "Gravar e abrir a seguinte",
- "translate-js-skip": "Saltar para a seguinte",
- "translate-js-history": "Histórico de traduções",
- "translate-js-support": "Fazer pergunta",
- "translate-js-support-title": "Peça ajuda se não existir informação suficiente para traduzir esta mensagem corretamente.",
"translate-js-support-unsaved-warning": "Há traduções que ainda não foram gravadas.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Código",
diff --git a/MLEB/Translate/i18n/core/qqq.json b/MLEB/Translate/i18n/core/qqq.json
index 1ae1b264..60a19509 100644
--- a/MLEB/Translate/i18n/core/qqq.json
+++ b/MLEB/Translate/i18n/core/qqq.json
@@ -80,11 +80,9 @@
"translate-ignored": "{{Identical|Ignore}}",
"translate-edit-title": "Used as a tooltip for edit links in lists with translatable messages. Parameters:\n* $1 is the name of the page to be edited.\n{{Identical|Edit}}",
"translate-edit-definition": "Heading of infobox containing original message to be translated.",
- "translate-edit-translation": "Legend for box like {{msg-mw|Translate-edit-definition}} or {{msg-mw|Translate-edit-in-other-languages}}.\n{{Identical|Translation}}",
"translate-edit-contribute": "This appears in the parentheses after {{msg-mw|Translate-edit-information}}. It links to the information page in edit mode.\n{{Identical|Contribute}}",
"translate-edit-no-information": "Message is used as a hint to translators that documentation for a message without documentation is needed.",
"translate-edit-information": "Caption for box which contains information about the message. $1 is {{msg-mw|translate-edit-contribute}}.",
- "translate-edit-in-other-languages": "Caption for box which contains translation of message in other languages.",
"translate-edit-warnings": "Title of the warnings box when editing a message.\nThis box lists the problems found in the translation.",
"translate-edit-tmmatch-source": "Used as tooltip for the message {{msg-mw|translate-edit-tmmatch}} in the translation suggestions by the server.\n\nParameters:\n* $1 - translation source text",
"translate-edit-tmmatch": "This message is displayed in the translation interface when there is suggestions from translation memory.\n\nParameters:\n* $1 - number between 1 and 100\n{{Identical|Match}}",
@@ -178,6 +176,11 @@
"translate-statsf-language": "Field label on [[Special:TranslationStats|form]] for generating graph.",
"translate-statsf-group": "Field label on [[Special:TranslationStats|form]] for generating graph.",
"translate-statsf-submit": "Submit button label on [[Special:TranslationStats|form]] for generating graph.\n\n{{Identical|Preview}}",
+ "translate-statsf-unknown-error": "Used when an unknown error occurs on fetching translation statistics.",
+ "translate-statsf-error-message": "Error message displayed when fetching of translation statistics fails.\n\nParameters:\n* $1 - error information from the API.",
+ "translate-statsf-graph-alt-text-info": "Displayed inside the canvas element pointing to a text based alternative to the data displayed on the graph.",
+ "translate-statsf-alt-text": "Used as the text for the summary attribute displayed on the table which is the text alternative to the data displayed on the graph.",
+ "translate-statsf-embed": "Used as aria-label for the <code><nowiki><pre></nowiki></code> tag that contains the code to embed the translation stats graph on other pages",
"translate-tag-page-desc": "Used as description for the message group in [[Special:Translate]].\n\nParameters:\n* $1 - the page title\n* $2 - link to the translation page <code>Special:MyLanguage/$1</code>, not the source page\n* $3 - source language name\n* $4 - source language code",
"translate-sidebar-alltrans": "{{Identical|Otherlanguages}}",
"translations": "{{doc-special|Translations}}\n{{Identical|All translations}}",
@@ -224,20 +227,19 @@
"translate-mgs-invalid-group": "Used as error message. Parameters:\n* $1 - target message group name",
"translate-mgs-nothing": "Error message shown on Special:LanguageStats and Special:MessageGroupStats.",
"supportedlanguages": "{{doc-special|SupportedLanguages}}\n{{Identical|Supported language}}",
- "supportedlanguages-summary": "Header for [[Special:SupportedLanguages]] page.",
- "supportedlanguages-colorlegend": "Used on [[Special:SupportedLanguages]]. Parameters:\n* $1 is not a single number, but a series of numbers with different background colors, serving as a legend to match each color with a number of days passed since the last contributed translation. $1 is usually \"0 30 60 90 120 150 180\".\nSee [[Special:SupportedLanguages]] to see the final rendering.",
+ "supportedlanguages-summary": "Header for [[Special:ActiveLanguages]] page.",
+ "supportedlanguages-colorlegend": "Used on [[Special:ActiveLanguages]]. Parameters:\n* $1 is not a single number, but a series of numbers with different background colors, serving as a legend to match each color with a number of days passed since the last contributed translation. $1 is usually \"0 30 60 90 120 150 180\".\nSee [[Special:ActiveLanguages]] to see the final rendering.",
"supportedlanguages-localsummary": "{{notranslate}}\nPlace any site specific message here.",
"supportedlanguages-portallink": "{{optional}}\nParameters:\n* $1 - language code\n* $2 - localized language name\n* $3 - native language name\nSee also:\n* {{msg-mw|Supportedlanguages-portallink-nocldr}}",
"supportedlanguages-portallink-nocldr": "{{optional}}\nUsed if the localized language name is available. Parameters:\n* $1 - language code\n* $2 - native language name\nSee also:\n* {{msg-mw|Supportedlanguages-portallink}}",
"supportedlanguages-sqlite-error": "Error message emitted when unsupported sqlite database is detected",
- "supportedlanguages-translators": "Row for a language in [[Special:SupportedLanguages]], under the respective header.\n* $1 - the list of translators names\n* $2 - the number of translators listed\n* $3 - username for GENDER support when there is only one translator\n{{Identical|Translator}}",
- "supportedlanguages-recenttranslations": "Link on [[Special:SupportedLanguages]] to [[Special:RecentChanges]].",
- "supportedlanguages-count": "On [[Special:SupportedLanguages]]\n*$1 is the total number of supported languages.",
- "supportedlanguages-activity": "Used as tooltip text for username in users list, to show user's activity.\n\nSee [{{canonicalurl:Special:SupportedLanguages}}#fr example].\n\nParameters:\n* $1 - username\n* $2 - number of edits the user made\n* $3 - number of days",
- "translate-supportedlanguages-cached": "Notice shown in [[Special:SupportedLanguages]].\n\nParameters:\n*$1 is formatted time, such as '5 minutes'",
+ "supportedlanguages-translators": "Row for a language in [[Special:ActiveLanguages]], under the respective header.\n* $1 - the list of translators names\n* $2 - the number of translators listed\n* $3 - username for GENDER support when there is only one translator\n{{Identical|Translator}}",
+ "supportedlanguages-recenttranslations": "Link on [[Special:ActiveLanguages]] to [[Special:RecentChanges]].",
+ "supportedlanguages-count": "On [[Special:ActiveLanguages]]\n*$1 is the total number of supported languages.",
+ "supportedlanguages-activity": "Used as tooltip text for username in users list, to show user's activity.\n\nSee [{{canonicalurl:Special:ActiveLanguages}}#fr example].\n\nParameters:\n* $1 - username\n* $2 - number of edits the user made\n* $3 - number of days",
+ "translate-supportedlanguages-cached": "Notice shown in [[Special:ActiveLanguages]].\n\nParameters:\n*$1 is formatted time, such as '5 minutes'",
"abusefilter-edit-builder-vars-translate-source-text": "Description for an [[mw:Extension:AbuseFilter|AbuseFilter]] variable. Used as an abuse filter syntax option in a dropdown from the group {{msg-mw|abusefilter-edit-builder-group-vars}}.",
"abusefilter-edit-builder-vars-translate-target-language": "Description for an [[mw:Extension:AbuseFilter|AbuseFilter]] variable. Used as an abuse filter syntax option in a dropdown from the group {{msg-mw|abusefilter-edit-builder-group-vars}}.",
- "translate-save": "Used as label for the Submit button. Parameters:\n* $1 - language name, or {{msg-mw|Translate-documentation-language}}\n{{Identical|Save}}",
"translate-jssti-add": "Name of button in [[Special:Preferences]], tab Editing.",
"managemessagegroups": "{{doc-special|ManageMessageGroups}}",
"translate-smg-notallowed": "Wikitext error message in [[Special:ManageMessageGroups]]",
@@ -258,6 +260,24 @@
"translate-smg-rename-rename": "Dropdown item displayed on the [[Special:ManageMessageGroups]] page next to newly added messages.",
"translate-smg-rename-dialog-title": "Title for the message rename dialog. It is followed by the key being renamed. Parameters: \n* $1 - Title message text.",
"translate-smg-changeset-modified": "Error message shown to the user on the [[Special:ManageMessageGroups]] page when the user tries to submit outdated changes.",
+ "translate-smg-no-groups-in-sync": "Displayed on [[Special:ManageMessageGroups]] page when there are no groups currently in synchronization.",
+ "translate-smg-strong-sync-help": "Displayed on [[Special:ManageMessageGroups]] and links to https://translatewiki.net/wiki/Special:MyLanguage/Strong_Synchronization\n{{identical|Help}}",
+ "translate-smg-groups-in-sync": "Used as a label for the details tag that displays the groups in synchronization.",
+ "translate-smg-groups-in-sync-list": "Notice shown in the details tag when it is opened.",
+ "translate-smg-groups-with-error-title": "Used as a label for the details tag that displays the groups that have had errors during synchronization",
+ "translate-smg-groups-with-error-desc": "Notice shown in the details tag when it is opened. {{Related|Translate-smg-groups-with-error-title}}",
+ "translate-smg-group-with-error-summary": "Notice shown in the details tag that lists error messages under a group. Parameters:\n* $1 Number of messages under the group that have errors",
+ "translate-smg-group-message-action-history": "Used as a label for the link that displays the history for the message that had errors.",
+ "translate-smg-group-action-resolve": "Used as a label for the link that allows translation administrator to mark the errors with the message or group as resolved.",
+ "translate-smg-group-message-tag-outdated": "Tag added for group synchronization message in case it is outdated",
+ "translate-smg-group-message-tag-rename": "Tag added for group synchronization message in case it is a rename\n{{identical|Rename}}",
+ "translate-smg-group-message-tag-label": "Used as a label for group synchronization message to list tags",
+ "translate-smg-group-message-message-content": "Used as a label for group synchronization message content",
+ "translate-smg-group-message-message-target": "Used as a label for the target group synchronization message that is being renamed",
+ "translate-smg-group-message-message-replacement": "Used as a label for the replacement text of the group synchronization message that is being renamed",
+ "translate-smg-group-message-message-other-langs": "Used as a label for other languages of the group synchronization message that is being renamed",
+ "translate-smg-loading": "Used as a label on [[Special:ManageMessageGroups]] to inform user of a server requests in progress",
+ "translate-smg-unknown-error": "Error message shown to the user on [[Special:ManageMessageGroups]] when an unexpected error occurs",
"translate-manage-import-diff": "See screenshot [[File:Manage-2.png|150px|right|Group management interface]].\nVariables:\n*$1 - Message name\n*$2 - radio buttons\n**{{msg-mw|Translate-manage-action-import}}\n**{{msg-mw|Translate-manage-action-conflict}}\n**{{msg-mw|Translate-manage-action-ignore}}",
"translate-manage-import-new": "Parameters:\n* $1 - message ID, enclosed in <code><nowiki><code></nowiki></code> tag",
"translate-manage-import-deleted": "Parameters:\n* $1 - message ID, enclosed in <code><nowiki><code></nowiki></code> tag",
@@ -279,6 +299,9 @@
"translate-manage-intro-other": "[[File:Manage-2.png|150px|right|Group management interface]]\nIntroduction to special page. See screenshot. Parameters:\n* $1 is a language name.",
"translate-manage-import-ok": "Message given when a translation has been imported on Special:ImportTranslations. Parameters:\n* $1 is the target page name for the translation.",
"translate-manage-import-done": "Message given when actions on SpeciaL:ImportTranslations have completed.",
+ "translate-manage-empty-content": "Shown in Special:ManageGroups when an external source has added or removed a definition or a translation which has no content (is empty string).",
+ "translate-manage-key-reused": "Shown in Special:ManageGroups when an external source has added a message for which the definition or translation page already exists.",
+ "translate-manage-source-message-not-found": "Shown on Special:ManageGroups when an external source has added a message for which the definition does not exist.",
"importtranslations": "{{doc-special|ImportTranslations}}\n{{doc-screenshot|Import-1.png|twn}}",
"translate-import-from-local": "Used in [[Special:ImportTranslations]]. {{doc-screenshot|Import-1.png|twn}}",
"translate-import-load": "Used in [[Special:ImportTranslations]].\n{{doc-screenshot|Import-1.png|twn}}\n{{Identical|Load file}}",
@@ -288,13 +311,6 @@
"translate-import-err-no-such-file": "Used as error message in [[Special:ImportTranslations]]. Parameters:\n* $1 - filename\n{{Related|Translate-import-err}}",
"translate-import-err-stale-group": "Used as error message in [[Special:ImportTranslations]].\n{{Related|Translate-import-err}}",
"translate-import-err-no-headers": "Used as error message in [[Special:ImportTranslations]].\n{{Related|Translate-import-err}}",
- "translate-js-summary": "Label for summary field in translation editor.\n{{Identical|Summary}}",
- "translate-js-save": "Button in translation editor which saves the content and closes the dialog.\n{{Identical|Save}}",
- "translate-js-next": "next refers to next message in the message list",
- "translate-js-skip": "A button together with Save and Save an open next. Goes to the next message without saving.",
- "translate-js-history": "A button text in the legacy translation interface.",
- "translate-js-support": "A button text in the legacy translation interface.",
- "translate-js-support-title": "A button tooltip in the legacy translation interface.",
"translate-js-support-unsaved-warning": "A warning shown in a dialog box if a user tries to close a page without saving a translation written .",
"translate-gs-pos": "Used in wiki tables for localisation statistics as a column header for 'Position' abbreviated. See [[Project:MediaWiki localisation in the 50 most spoken languages|example]]",
"translate-gs-code": "Used in wiki tables for localisation statistics as a column header for language code. See [[Project:MediaWiki localisation in the 50 most spoken languages|example]]\n{{Identical|Code}}",
diff --git a/MLEB/Translate/i18n/core/qu.json b/MLEB/Translate/i18n/core/qu.json
index 5d90f09d..a48d4ff6 100644
--- a/MLEB/Translate/i18n/core/qu.json
+++ b/MLEB/Translate/i18n/core/qu.json
@@ -35,10 +35,8 @@
"translate-ignored": "(qhawarparisqa)",
"translate-edit-title": "\"$1\" nisqata llamk'apuy",
"translate-edit-definition": "Qallariy willay qillqa",
- "translate-edit-translation": "T'ikray",
"translate-edit-contribute": "llamk'apuy",
"translate-edit-information": "Willaymanta t'iktuynin ($1)",
- "translate-edit-in-other-languages": "Kay willay huk rimaykunapi",
"translate-edit-warnings": "Mana hunt'a t'ikrasqakunamanta yuyampaykuna",
"translate-edit-tmmatch-source": "T'ikranapaq pukyu qillqa: $1",
"translate-edit-tmmatch": "$1%-nin kaqlla kaq",
@@ -129,7 +127,6 @@
"supportedlanguages-recenttranslations": "ñaqha t'ikrasqakuna",
"supportedlanguages-count": "$1 {{PLURAL:$1|rimay|rimaykuna}} llapantinpi.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|llamk'apusqa|llamk'apusqakuna}} - qhipaq llamk'apusqa $3 {{PLURAL:$3|p'unchaw|p'unchaw}} ñaqha",
- "translate-save": "Waqaychay ($1)",
"translate-jssti-add": "Sutisuyuman yapay",
"managemessagegroups": "Willay huñukunata kamachiy",
"translate-smg-notallowed": "Kayta ruraytaqa manam saqillasqachu kanki.",
@@ -150,13 +147,6 @@
"translate-import-err-invalid-title": "Qusqa willañiqi sutiqa <nowiki>$1</nowiki> manam allinchu.",
"translate-import-err-no-such-file": "<nowiki>$1</nowiki> nisqa willañiqiqa manam kanchu icha manam tiyanalla churkusqachu.",
"translate-import-err-stale-group": "Kay willañiqip willay huñunqa manam kanchu.",
- "translate-js-summary": "Pisichay:",
- "translate-js-save": "Waqaychay",
- "translate-js-next": "Waqaychay, qatiqta kichaspa",
- "translate-js-skip": "Qatiqman t'iskuy",
- "translate-js-history": "T'ikraypa wiñay kaswaynin",
- "translate-js-support": "Tapuy",
- "translate-js-support-title": "Yanapayta mañarikuy, kay willamanta mana aypalla yachaspaykiqa.",
"translate-js-support-unsaved-warning": "Manaraq waqaychasqayki t'ikrasqaykikunam kachkan.",
"translate-gs-pos": "Ñiqi",
"translate-gs-code": "Tuyru",
diff --git a/MLEB/Translate/i18n/core/rm.json b/MLEB/Translate/i18n/core/rm.json
index 6c5e18a8..a4918ade 100644
--- a/MLEB/Translate/i18n/core/rm.json
+++ b/MLEB/Translate/i18n/core/rm.json
@@ -27,7 +27,6 @@
"translate-edit-contribute": "contribuir",
"translate-edit-no-information": "''Tar quai messadi na datti nagina documentaziun.\nSche vus savais nua e co che quai messadi vegn duvrà, pudais vus gidar auters translaturs cun agiuntar ina documentaziun tar quai messadi.''",
"translate-edit-information": "Infurmaziuns davart il messadi \"$2\" ($1)",
- "translate-edit-in-other-languages": "Messadis \"$1\" en autras linguas",
"translate-edit-warnings": "Avertiment davart translaziuns nuncumplettas",
"translate-documentation-language": "Documentaziun da messadi",
"tux-notices-hide": "zuppentar"
diff --git a/MLEB/Translate/i18n/core/ro.json b/MLEB/Translate/i18n/core/ro.json
index c2b53f80..5f5e3eb3 100644
--- a/MLEB/Translate/i18n/core/ro.json
+++ b/MLEB/Translate/i18n/core/ro.json
@@ -9,6 +9,7 @@
"KlaudiuMihaila",
"McDutchie",
"Minisarm",
+ "NGC 54",
"Sociologist",
"Stelistcristi"
]
@@ -47,11 +48,9 @@
"translate-ignored": "(ignorat)",
"translate-edit-title": "Modificați „$1”",
"translate-edit-definition": "Definiția mesajului",
- "translate-edit-translation": "Traducerea",
"translate-edit-contribute": "contribuiți",
"translate-edit-no-information": "<em>Acest mesaj nu are documentație.\nDacă știți unde sau cum este folosit, îi puteți ajuta pe ceilalți traducători prin adăugarea documentației sale.</em>",
"translate-edit-information": "Informații despre mesaj ($1)",
- "translate-edit-in-other-languages": "Mesajul în alte limbi",
"translate-edit-warnings": "Avertizări în legătură cu traducerile incomplete",
"translate-edit-tmmatch-source": "Textul sursă al traducerii: $1",
"translate-edit-tmmatch": "Potrivire în proporție de $1%",
@@ -68,7 +67,7 @@
"translate-checks-plural-dupe": "Expresia <nowiki>{{PLURAL:}}</nowiki> are elemente duplicate la sfârșit. <nowiki>{{PLURAL:$1|oaie|oaie}}</nowiki> trebuie scris ca <nowiki>{{PLURAL:$1|oaie}}</nowiki>.",
"translate-checks-pagename": "Spațiul de nume schimbat față de definiție",
"translate-checks-format": "Această traducere nu respectă definiția sau conține o sintaxă incorectă: $1",
- "translate-checks-escape": "Următoarele scăpări pot fi accidentale: <strong>$1</strong>",
+ "translate-checks-escape": "{{PLURAL:$2|Următorul caracter scăpat poate fi accidental|Următoarele caractere scăpate pot fi accidentale}}: <strong>$1</strong>. {{PLURAL:$4|Un carcater scăpat valid este|Caractere scăpate valide includ:}} $3.",
"translate-checks-parametersnotequal": "Numărul de parametri este {{PLURAL:$1|$1}}; ar trebui să fie {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> este incorect.",
"translate-checks-fudforum-syntax": "Utilizați <nowiki>$1</nowiki> în loc de <nowiki>$2</nowiki> în cadrul acestui proiect.",
@@ -83,6 +82,7 @@
"action-translate-import": "importați traduceri off-line",
"right-translate-messagereview": "Revizuiește traduceri",
"right-translate-groupreview": "Schimbă starea fluxului de lucru a grupurilor de mesaje",
+ "translate-rcfilters-translations-filter-label": "Nu traduceri",
"translate-rc-translation-filter": "Filtru de traduceri:",
"translate-rc-translation-filter-no": "Nu fă nimic",
"translate-rc-translation-filter-only": "Arată doar traduceri",
@@ -158,14 +158,13 @@
"translate-mgs-totals": "$1 {{PLURAL:$1|limbă|limbi|de limbi}} împreună",
"translate-mgs-invalid-group": "Grupul specificat, $1, nu există.",
"translate-mgs-nothing": "Nimic de afișat pentru statisticile solicitate.",
- "supportedlanguages": "Limbi întreținute",
- "supportedlanguages-summary": "Această pagină afișează o listă cu toate limbile acceptate de {{SITENAME}}, alături de numele utilizatorilor care traduc în respectiva limbă.\nCu cât numele traducătorului este mai mare ca dimensiune, cu atât contribuțiile sale sunt mai numeroase.\nCuloarea sublinierii de sub nume indică momentul la care un traducător a fost activ ultima oară.",
+ "supportedlanguages": "Limbi active",
+ "supportedlanguages-summary": "Această pagină afișează o listă cu toate limbile active pe {{SITENAME}}, alături de numele utilizatorilor care traduc în respectiva limbă.\nCu cât numele traducătorului este mai mare ca dimensiune, cu atât contribuțiile sale sunt mai numeroase.\nCuloarea sublinierii de sub nume indică momentul la care un traducător a fost activ ultima oară.",
"supportedlanguages-colorlegend": "Explicația culorilor: ultima traducere datează de acum $1 zile.",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Traducător}}|Traducători}}: $1",
"supportedlanguages-recenttranslations": "traduceri recente",
"supportedlanguages-count": "$1 {{PLURAL:$1|limbă|limbi}} în total.",
"supportedlanguages-activity": "$1: {{PLURAL:$2|o modificare|$2 modificări|$2 de modificări}} – ultima modificare datează de acum {{PLURAL:$3|o zi|$3 zile|$3 de zile}}",
- "translate-save": "Salvare ($1)",
"translate-jssti-add": "Adaugă în listă",
"managemessagegroups": "Administrare grup de mesaje",
"translate-smg-notallowed": "Nu vă este permisă executarea acestei acțiuni.",
@@ -200,14 +199,7 @@
"translate-import-err-no-such-file": "Fișierul <nowiki>$1</nowiki> nu există sau nu a fost încărcat local.",
"translate-import-err-stale-group": "Grupul de mesaje de care aparține acest fișier nu există.",
"translate-import-err-no-headers": "Fișierul nu este un fișier Gettext bine formatat în conformitate cu formatul necesar extensiei Translate:\nNu se poate determina grupul de mesaje și limba din antetele fișierului.",
- "translate-js-summary": "Rezumat:",
- "translate-js-save": "Salvare",
- "translate-js-next": "Salvează și mergi mai departe",
- "translate-js-skip": "Sari mai departe",
- "translate-js-history": "Istoricul traducerii",
- "translate-js-support": "Adresați o întrebare",
- "translate-js-support-title": "Cereți ajutor în cazul în care nu există suficiente informații pentru a traduce corect acest mesaj.",
- "translate-js-support-unsaved-warning": "Aveți traduceri nesalvate.",
+ "translate-js-support-unsaved-warning": "Aveți traduceri nepublicate.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Cod",
"translate-gs-continent": "Continent",
@@ -247,20 +239,22 @@
"tux-tab-outdated": "Învechite",
"tux-tab-translated": "Traduse",
"tux-tab-unproofread": "Nerevizuite",
- "tux-edit": "Modifică",
+ "tux-edit": "Editare",
"tux-status-optional": "Opțional",
- "tux-status-fuzzy": "Învechită",
- "tux-status-proofread": "Revizuită",
+ "tux-status-fuzzy": "Învechit",
+ "tux-status-proofread": "Revizuit",
"tux-status-translated": "Tradus",
- "tux-status-saving": "Se salvează...",
- "tux-status-unsaved": "Nesalvată",
+ "tux-status-saving": "Se publică...",
+ "tux-status-unsaved": "Nepublicat",
"tux-editor-placeholder": "Traducerea dumneavoastră",
+ "tux-editor-editsummary-placeholder": "Rezumat opțional",
"tux-editor-paste-original-button-label": "Introdu textul-sursă",
"tux-editor-discard-changes-button-label": "Anulează modificările",
- "tux-editor-save-button-label": "Salvare traducere",
+ "tux-editor-save-button-label": "Publicare traducere",
"tux-editor-skip-button-label": "Sari mai departe",
"tux-editor-cancel-button-label": "Revocare",
"tux-editor-confirm-button-label": "Confirmare traducere",
+ "tux-editor-proofread-button-label": "Marchează ca revizuită",
"tux-editor-shortcut-info": "Apăsați „$1” pentru a salva, „$2” pentru a sări la următorul mesaj, „$4” pentru a furniza un rezumat sau țineți apăsat „$3” pentru a vedea alte comenzi rapide.",
"tux-editor-edit-desc": "Modifică documentația",
"tux-editor-add-desc": "Adăugare documentație",
@@ -271,7 +265,7 @@
"tux-editor-tm-match": "Potrivire în proporție de $1%",
"tux-notices-more": "{{PLURAL:$1|încă una|încă $1}}",
"tux-notices-hide": "ascunde",
- "tux-editor-save-failed": "Salvarea traducerii nu a reușit: $1",
+ "tux-editor-save-failed": "Publicarea traducerii a eșuat: $1",
"tux-editor-n-uses": "folosită {{PLURAL:$1|o dată|de $1 ori}}",
"tux-editor-message-desc-more": "Mai mult",
"tux-editor-message-desc-less": "Mai puțin",
@@ -286,7 +280,7 @@
"tux-editor-outdated-notice": "Această traducere ar putea avea nevoie de actualizare.",
"tux-editor-outdated-notice-diff-link": "Arată diferențele",
"tux-editor-doc-editor-placeholder": "Documentația mesajului",
- "tux-editor-doc-editor-save": "Salvare documentație",
+ "tux-editor-doc-editor-save": "Publicare documentație",
"tux-editor-doc-editor-cancel": "Revocare",
"tux-messagetable-more-messages": "Încă {{PLURAL:$1|un mesaj|$1 mesaje|$1 de mesaje}}",
"tux-messagetable-loading-messages": "Se încarcă {{PLURAL:$1|mesajul|mesajele}}...",
@@ -313,15 +307,18 @@
"tux-empty-list-other-guide": "Puteți ajuta la revizuirea traducerilor existente",
"tux-empty-list-other-action": "Revizuire traduceri",
"tux-empty-list-other-link": "Arată toate mesajele",
- "tux-editor-close-tooltip": "Închidere",
- "tux-editor-expand-tooltip": "Extindere",
+ "tux-editor-close-tooltip": "Închide",
+ "tux-editor-expand-tooltip": "Extinde",
"tux-editor-collapse-tooltip": "Restrânge",
+ "tux-editor-message-tools-show-editor": "Arată în editorul wiki",
"tux-editor-message-tools-history": "Istoric",
"tux-editor-message-tools-delete": "Șterge",
"tux-editor-message-tools-translations": "Toate traducerile",
+ "tux-editor-message-tools-linktothis": "Legătură către acest mesaj",
"tux-editor-loading": "Încărcare...",
"translate-search-more-languages-info": "Încă {{PLURAL:$1|o limbă|$1 limbi|$1 de limbi}}",
"translate-statsbar-tooltip": "$1% traduse, $2% revizuite",
"translate-statsbar-tooltip-with-fuzzy": "$1% traduse, $2% revizuite, $3% învechite",
- "translate-search-more-groups-info": "Încă {{PLURAL:$1|un grup|$1 grupuri|$1 de grupuri}}"
+ "translate-search-more-groups-info": "Încă {{PLURAL:$1|un grup|$1 grupuri|$1 de grupuri}}",
+ "specialpages-group-translation": "Traducere"
}
diff --git a/MLEB/Translate/i18n/core/roa-tara.json b/MLEB/Translate/i18n/core/roa-tara.json
index 12c88b4e..40cc2d48 100644
--- a/MLEB/Translate/i18n/core/roa-tara.json
+++ b/MLEB/Translate/i18n/core/roa-tara.json
@@ -40,11 +40,9 @@
"translate-ignored": "(ignorate)",
"translate-edit-title": "Cange \"$1\"",
"translate-edit-definition": "Definizione d'u messàgge",
- "translate-edit-translation": "Traduzione",
"translate-edit-contribute": "condrebbute",
"translate-edit-no-information": "<em>Stu messàgge non ge tène 'na documendazione.\nCe tu canusce addò o cumme stu messàgge avène ausate, tu puè dà 'na màne a otre tradutture pe aggiungere 'a documendazione a stu messàgge.</em>",
"translate-edit-information": "'Mbormaziune sus a 'u messàgge ($1)",
- "translate-edit-in-other-languages": "Messàgge jndr'à otre lènghe",
"translate-edit-warnings": "Avverteminde sus a le traduziune 'ngomblete",
"translate-edit-tmmatch-source": "Teste origgenale d'a traduzione: $1",
"translate-edit-tmmatch": "$1% de combronde",
@@ -85,6 +83,7 @@
"translate-checks-newline-extra-start": "{{PLURAL:$1|Ste|Stonne}} $1 {{PLURAL:$1|carattere}} de linèa nove de cchiù a l'inizie d'a traduzione.",
"translate-checks-newline-extra-end": "{{PLURAL:$1|Ste|Stonne}} $1 {{PLURAL:$1|carattere}} de linèa nove de cchiù a fine d'a traduzione.",
"translate-checks-value-not-present": "'A traduzione adda essere uguale a {{PLURAL:$1|1=|une de ste valore:}} $1.",
+ "translate-checks-replacement": "Ause $2 invece de $1.",
"translate-pref-editassistlang": "Assistende de le lènghe:",
"prefs-translate": "Opziune de traduzione",
"translate-pref-editassistlang-help": "Codece de le lènghe separate da virgole.\nLe traduziune de 'nu messàgge jndr'à ste lènghe avènene fatte 'ndrucà duranne 'a traduzione.\nL'elenghe predefinite (default) de le lènghe depende da ìa probbia lènghe.",
@@ -137,6 +136,11 @@
"translate-statsf-language": "Elenghe separate da virgole de le codece de le lènghe:",
"translate-statsf-group": "Elenghe separate da virgole de le codece de le gruppe:",
"translate-statsf-submit": "Andeprime",
+ "translate-statsf-unknown-error": "Ha assute 'n'errore scanusciute.",
+ "translate-statsf-error-message": "S'a verificate 'n'errore quanne ste scarecave 'u grafeche: $1",
+ "translate-statsf-graph-alt-text-info": "Teste alternative pe le statisteche de le traduziune ste jndr'à tabbelle aqquà sotte.",
+ "translate-statsf-alt-text": "Quiste jè 'u teste alternative pe le statisteche de le traduziune.",
+ "translate-statsf-embed": "Codece da sckaffà 'u grafeche de le statisteche de le traduziune sus a le otre pàggene.",
"translate-tag-page-desc": "Traduzione d'a pàgene uicchi [[$2|$1]] da $3 ($4).",
"translate-sidebar-alltrans": "Jndr'à l'otre lènghe",
"translations": "Tutte le traduziune",
@@ -182,8 +186,8 @@
"translate-mgs-totals": "Tutte le $1 {{PLURAL:$1|lènghe}} 'nzieme",
"translate-mgs-invalid-group": "'U gruppe specifiche $1 non g'esiste.",
"translate-mgs-nothing": "Ninde da fà vedè pe le statisteche cercate.",
- "supportedlanguages": "Lènghe supportate",
- "supportedlanguages-summary": "Sta pàgene face 'ndrucà 'n'elenghe de totte le lènghe mandenute da {{SITENAME}}, 'nzieme a le nome de le tradutture ca onne fatiate sus a quedda lènghe. 'U nome de 'nu traduttore iesse de demenziune cchiù granne ce ha fatte 'nu sbuènne de cangiaminde ce nò iesse cchiù piccinne, invece 'u culore d'a sottolineature indichesce quanda tiembe ha passate da l'urtema attività soje.",
+ "supportedlanguages": "Lènghe attive",
+ "supportedlanguages-summary": "Sta pàgene face 'ndrucà 'n'elenghe de le lènghe attive jndr'à {{SITENAME}}, 'nzieme a le nome de le tradutture ca onne fatiate sus a quedda lènghe. 'U nome de 'nu traduttore iesse de demenziune cchiù granne ce ha fatte 'nu sbuènne de cangiaminde ce nò iesse cchiù piccinne, invece 'u culore d'a sottolineature indichesce quanda tiembe ha passate da l'urtema attività soje.",
"supportedlanguages-colorlegend": "Leggende d'u culore: L'urtema traduzione jè de $1 sciurne fà.",
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -195,7 +199,6 @@
"translate-supportedlanguages-cached": "Sta 'mbormazione ha state cachate $1 fà.",
"abusefilter-edit-builder-vars-translate-source-text": "Teste de origgene de 'n'aunità de traduzione",
"abusefilter-edit-builder-vars-translate-target-language": "Lènghe de arrive pa traduzione",
- "translate-save": "Pubbleche ($1)",
"translate-jssti-add": "Aggiunge a l'elenghe",
"managemessagegroups": "Gestione de le gruppe de messàgge",
"translate-smg-notallowed": "Non ge t'è permesse de eseguì st'azione.",
@@ -216,6 +219,24 @@
"translate-smg-rename-rename": "Aggiunge cumme renomenate de...",
"translate-smg-rename-dialog-title": "Scacchie 'nu renomenamende ca s'accocchie pe $1",
"translate-smg-changeset-modified": "'U 'nzieme de le cangiaminde ha state cangiate da 'n'otre utende o processe. Le cangiaminde tune non ge ponne essere pubblecate cumme sovrascretture de chidde lore. Pe piacere careche arrete 'a pàgene pe 'ndrucà le urteme cangiaminde.",
+ "translate-smg-no-groups-in-sync": "Non ge stonne gruppe in singronizzazzione",
+ "translate-smg-strong-sync-help": "Aijute",
+ "translate-smg-groups-in-sync": "Gruppe ca se stonne e singronizzane",
+ "translate-smg-groups-in-sync-list": "Elenghe de le gruppe ca stonne avènene processate in seconde piane:",
+ "translate-smg-groups-with-error-title": "Gruppe ca onne avute errore durande 'a singronizzazzione",
+ "translate-smg-groups-with-error-desc": "Elenghe de le gruppe e le messàgge lore ca onne avute errore durande 'a singronizzazzione:",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|messàgge}} cu errore:",
+ "translate-smg-group-message-action-history": "Cunde",
+ "translate-smg-group-action-resolve": "Signe cumme resolte",
+ "translate-smg-group-message-tag-outdated": "Non aggiornate",
+ "translate-smg-group-message-tag-rename": "Renomene",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Tag}}:",
+ "translate-smg-group-message-message-content": "Condenute:",
+ "translate-smg-group-message-message-target": "Destinazione:",
+ "translate-smg-group-message-message-replacement": "Sostituzione:",
+ "translate-smg-group-message-message-other-langs": "Otre lènghe:",
+ "translate-smg-loading": "Stoche a careche…",
+ "translate-smg-unknown-error": "Ha assute 'n'errore scanusciute durande 'u processe d'a richiesta toje.",
"translate-manage-import-diff": "Messàgge $1 | Aziune: $2",
"translate-manage-import-new": "Messàgge nuève $1",
"translate-manage-import-deleted": "Messàgge scangellate $1",
@@ -237,6 +258,9 @@
"translate-manage-intro-other": "Aqquà sotte ste 'n'elenghe de cangiaminde a le traduziune jndr'à lènghe $1.\nCondrolle le cangiaminde e scacchie l'azione da ffà pe ogne messàgge.\nCe scacchie de cacà le cangiaminde, sta azione addevende sulamende temboranèe.",
"translate-manage-import-ok": "'Mbortate: $1",
"translate-manage-import-done": "'Mbortazione combletate!",
+ "translate-manage-empty-content": "'U condenute jè vacande",
+ "translate-manage-key-reused": "Stu messàgge ggià esiste jndr'à sta uicchi. Condrolle pe 'n'ause accidendale de 'na vecchia chiave.",
+ "translate-manage-source-message-not-found": "Definizione d'u messàgge non acchiate",
"importtranslations": "'Mborte le traduziune",
"translate-import-from-local": "Carecamende d'u file locale:",
"translate-import-load": "Careche 'u file",
@@ -246,13 +270,6 @@
"translate-import-err-no-such-file": "'U file <nowiki>$1</nowiki> non g'esiste o non già state carecate in locale.",
"translate-import-err-stale-group": "Jndr'à 'u gruppe de messàgge stu file non g'esiste.",
"translate-import-err-no-headers": "'U file non g'è 'nu Gettext formattate correttamende pe l'estenzione Translate:\n'Mbossibbile determinà 'u gruppe de messàgge e 'a lènghe da le 'ndestazziune d'u file.",
- "translate-js-summary": "Riepileghe:",
- "translate-js-save": "Pubbleche",
- "translate-js-next": "Pubbleche e iapre 'u prossime",
- "translate-js-skip": "Zumbe a 'u prossime",
- "translate-js-history": "Cunde d'a traduzione",
- "translate-js-support": "Fà 'na domande",
- "translate-js-support-title": "Richieste de assistenze ce non ge iacchie 'mbormaziune sufficiende pe traducere stu messàgge.",
"translate-js-support-unsaved-warning": "Tu è tradiziune non pubblecate.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Codece",
diff --git a/MLEB/Translate/i18n/core/ru.json b/MLEB/Translate/i18n/core/ru.json
index 28b09844..90c75484 100644
--- a/MLEB/Translate/i18n/core/ru.json
+++ b/MLEB/Translate/i18n/core/ru.json
@@ -28,6 +28,7 @@
"MaxSem",
"Meerrahtar",
"Movses",
+ "MuratTheTurkish",
"NBS",
"Okras",
"Pacha Tchernof",
@@ -81,11 +82,9 @@
"translate-ignored": "(игнорируемое)",
"translate-edit-title": "Изменить «$1»",
"translate-edit-definition": "Формулировка сообщения",
- "translate-edit-translation": "Перевод",
"translate-edit-contribute": "править",
"translate-edit-no-information": "<em>Это сообщение не имеет описания. Если вы знаете, где или как это сообщение используется, то можете помочь другим переводчикам, добавив к нему описание.</em>",
"translate-edit-information": "Информация о сообщении ($1)",
- "translate-edit-in-other-languages": "Сообщение на других языках",
"translate-edit-warnings": "Предупреждения о неполных переводах",
"translate-edit-tmmatch-source": "Текст исходного сообщения для перевода: $1",
"translate-edit-tmmatch": "$1% соответствия",
@@ -221,7 +220,7 @@
"translate-mgs-totals": "Все $1 {{PLURAL:$1|язык|языка|языков}} вместе",
"translate-mgs-invalid-group": "Указанная группа $1 не существует.",
"translate-mgs-nothing": "Нет данных для отображения.",
- "supportedlanguages": "Поддерживаемые языки",
+ "supportedlanguages": "Активные языки",
"supportedlanguages-summary": "На этой странице приведён список поддерживаемых проектом {{SITENAME}} языков\nвместе с именами тех, кто трудится над переводами на эти языки на TranslateWiki.\nИмя переводчика отображается тем крупнее, чем больше правок он сделал.\nПо цвету подчёркивания можно понять, насколько давно переводчик последний раз совершал здесь какое-либо действие.",
"supportedlanguages-colorlegend": "Цветовая легенда: последний перевод был сделан $1 {{PLURAL:$1|день|дня|дней}} назад.",
"supportedlanguages-portallink": "[$1] $2 — $3",
@@ -233,7 +232,6 @@
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|правка|правки|правок}} — последняя правка $3 {{PLURAL:$3|день|дня|дней}} назад",
"abusefilter-edit-builder-vars-translate-source-text": "Исходный текст элемента перевода",
"abusefilter-edit-builder-vars-translate-target-language": "Целевой язык для перевода",
- "translate-save": "Сохранить ($1)",
"translate-jssti-add": "Добавить в список",
"managemessagegroups": "Управление группами сообщений",
"translate-smg-notallowed": "Вы не можете выполнить это действие.",
@@ -251,6 +249,13 @@
"translate-smg-rename-new": "Добавить как новое...",
"translate-smg-rename-rename": "Добавить как переименование для...",
"translate-smg-rename-dialog-title": "Выбрать подходящее переименование для $1",
+ "translate-smg-strong-sync-help": "Помощь",
+ "translate-smg-group-message-action-history": "История",
+ "translate-smg-group-message-tag-outdated": "Устарело",
+ "translate-smg-group-message-tag-rename": "Переименовать",
+ "translate-smg-group-message-message-content": "Содержание:",
+ "translate-smg-group-message-message-replacement": "Замена:",
+ "translate-smg-loading": "Загрузка…",
"translate-manage-import-diff": "Сообщение $1 | Действия: $2",
"translate-manage-import-new": "Новое сообщение $1",
"translate-manage-import-deleted": "Удалённое сообщение $1",
@@ -280,14 +285,7 @@
"translate-import-err-no-such-file": "Файл <nowiki>$1</nowiki> не существует или не загружен локально.",
"translate-import-err-stale-group": "Группы сообщений, к которой принадлежит этот файл, не существует.",
"translate-import-err-no-headers": "Указан некорректно построенный Gettext-файл в формате расширения перевода.\nИз заголовков файла невозможно определить группу и язык.",
- "translate-js-summary": "Описание:",
- "translate-js-save": "Сохранить",
- "translate-js-next": "Сохранить и открыть следующий",
- "translate-js-skip": "Перейти к следующему",
- "translate-js-history": "История перевода",
- "translate-js-support": "Задать вопрос",
- "translate-js-support-title": "Обратитесь за помощью, если не хватает информации для правильного перевода этого сообщения.",
- "translate-js-support-unsaved-warning": "Имеются несохранённые переводы.",
+ "translate-js-support-unsaved-warning": "У вас имеются неопубликованные переводы.",
"translate-gs-pos": "Поз.",
"translate-gs-code": "Код",
"translate-gs-continent": "Часть света",
@@ -340,14 +338,14 @@
"tux-status-fuzzy": "Устарело",
"tux-status-proofread": "Проверено",
"tux-status-translated": "Переведено",
- "tux-status-saving": "Сохраняется...",
- "tux-status-unsaved": "Не сохранено",
+ "tux-status-saving": "Публикация…",
+ "tux-status-unsaved": "Не опубликовано",
"tux-save-unknown-error": "Произошла неизвестная ошибка.",
"tux-editor-placeholder": "Ваш перевод",
"tux-editor-editsummary-placeholder": "Необязательный комментарий",
"tux-editor-paste-original-button-label": "Вставить исходный текст",
"tux-editor-discard-changes-button-label": "Отменить изменения",
- "tux-editor-save-button-label": "Сохранить перевод",
+ "tux-editor-save-button-label": "Опубликовать перевод",
"tux-editor-skip-button-label": "Следующее",
"tux-editor-cancel-button-label": "Отмена",
"tux-editor-confirm-button-label": "Подтвердить перевод",
@@ -362,7 +360,7 @@
"tux-editor-tm-match": "$1% соответствия",
"tux-notices-more": "{{PLURAL:$1|ещё $1}}",
"tux-notices-hide": "скрыть",
- "tux-editor-save-failed": "Сохранение перевода не удалось: $1",
+ "tux-editor-save-failed": "Публикация перевода не удалось: $1",
"tux-editor-n-uses": "использован $1 {{PLURAL:$1|раз|раза|раз}}",
"tux-editor-message-desc-more": "Показать подробно",
"tux-editor-message-desc-less": "Показать компактно",
@@ -377,7 +375,7 @@
"tux-editor-outdated-notice": "Возможно, этот перевод нуждается в обновлении.",
"tux-editor-outdated-notice-diff-link": "Показать отличия",
"tux-editor-doc-editor-placeholder": "документация сообщения",
- "tux-editor-doc-editor-save": "Сохранить документацию",
+ "tux-editor-doc-editor-save": "Опубликовать документацию",
"tux-editor-doc-editor-cancel": "Отмена",
"tux-messagetable-more-messages": "Ещё $1 {{PLURAL:$1|сообщение|сообщения|сообщений}}",
"tux-messagetable-loading-messages": "{{PLURAL:$1|1=Загружается сообщение|Загружаются сообщения}}...",
diff --git a/MLEB/Translate/i18n/core/rue.json b/MLEB/Translate/i18n/core/rue.json
index 8b3edb6b..38b26d4a 100644
--- a/MLEB/Translate/i18n/core/rue.json
+++ b/MLEB/Translate/i18n/core/rue.json
@@ -39,11 +39,9 @@
"translate-ignored": "(іґнороване)",
"translate-edit-title": "Едітовати «$1»",
"translate-edit-definition": "Текст повідомлїня",
- "translate-edit-translation": "Переклад",
"translate-edit-contribute": "приспіти",
"translate-edit-no-information": "''Тото повідомлїня не має документацію. Кідь знаєте, де або як ся повідомлїня хоснує, можете помочі далшым перекладателям так, же придате документацію ку тому повідомлїню.''",
"translate-edit-information": "Інформація о повідомлїню ($1)",
- "translate-edit-in-other-languages": "Повідомлїня іншыма языками",
"translate-edit-warnings": "Упозорнїня на неповный переклад",
"translate-edit-tmmatch-source": "Жрідловый текст перекладу: $1",
"translate-edit-tmmatch": "$1% згода",
@@ -149,7 +147,6 @@
"supportedlanguages-summary": "На тій сторінцї ся находить список вшыткых языків підпорованых на {{grammar:6sg|{{SITENAME}}}} вєдно з іменамі перекладателїв, котры на языку роблять.\nВеце інформацій ку каждому языку можете здобыти на языковім порталї, на котрый ся дістанете, кідь кликнете на тот язык.\nКликнутём на імя перекладателя ся дістанете на сторінку хоснователя.\n\nКідь ту даякый язык не є, можете собі прочітати мануал про основаня локалізачного проєкту на сторінцї „[[Translating:Process|Новый язык]]“.\n\nКідь даякый язык перекладате, а ваше імя ту не є уведжене, додайте ся до списку перекладателїв на одповідаючім [[:Category:Languages|языковім порталї]].\nОдказ на портал вашого преферованого языка найдете в меню.",
"supportedlanguages-translators": "{{PLURAL:$2|Перекладатель|Перекладателї}}: $1",
"supportedlanguages-recenttranslations": "найновшы переклады",
- "translate-save": "Уложыти ($1)",
"translate-jssti-add": "Придати до списку",
"translate-manage-import-diff": "Повідомлїня $1 | Дїї: $2",
"translate-manage-import-new": "Нове повідомлїня $1",
@@ -160,10 +157,6 @@
"translate-manage-import-done": "Вшытко зроблено!",
"importtranslations": "Імпортовати переклады",
"translate-import-load": "Награти файл",
- "translate-js-save": "Уложыти",
- "translate-js-next": "Уложыти і отворити далше",
- "translate-js-skip": "Перескоч на далше",
- "translate-js-history": "Історія перекладу",
"translate-gs-pos": "Поз.",
"translate-gs-code": "Код",
"translate-gs-continent": "Частина світу",
diff --git a/MLEB/Translate/i18n/core/sa.json b/MLEB/Translate/i18n/core/sa.json
index d2d4c4c6..8717c8e0 100644
--- a/MLEB/Translate/i18n/core/sa.json
+++ b/MLEB/Translate/i18n/core/sa.json
@@ -20,7 +20,6 @@
"translate-optional": "(ऐच्छिकम्)",
"translate-ignored": "(अवगणितम्)",
"translate-edit-title": "सम्पाद्यताम् \"$1\"",
- "translate-edit-translation": "अनुवादः",
"translate-edit-contribute": "योगदानम्",
"translate-edit-tmmatch": "$1% समानम्",
"translate-stats-edits": "सम्पाद्यताम्",
@@ -54,13 +53,10 @@
"translate-mgs-group": "सन्देशसमूहः :",
"translate-mgs-submit": "साङ्ख्यिकी दृश्यताम्",
"translate-mgs-column-language": "भाषा",
- "translate-save": "रक्ष्यताम् ($1)",
"translate-jssti-add": "सूच्यां योज्यताम्",
"translate-manage-action-import": "आयातं करोतु",
"translate-manage-action-ignore": "अवगण्यताम्",
"translate-import-load": "सञ्चिका आरोप्यताम्",
- "translate-js-summary": "सारांशः :",
- "translate-js-save": "रक्ष्यताम्",
"translate-gs-code": "कूटः",
"translate-gs-continent": "अन्तर्विषयाः",
"translate-gs-speakers": "वक्तारः",
diff --git a/MLEB/Translate/i18n/core/sah.json b/MLEB/Translate/i18n/core/sah.json
index 6b23f7ef..3ef212a7 100644
--- a/MLEB/Translate/i18n/core/sah.json
+++ b/MLEB/Translate/i18n/core/sah.json
@@ -41,11 +41,9 @@
"translate-ignored": "(ааххайыллыбат)",
"translate-edit-title": "\"$1\" уларытыы",
"translate-edit-definition": "Этии ис хоһооно, суолтата",
- "translate-edit-translation": "Тылбаас",
"translate-edit-contribute": "уларытыыны киллэр",
"translate-edit-no-information": "''Бу этии туһунан туох да суох. Ханна, хаһан бу этии туттулларын билэр буоллаххына, атын тылбаасчыттарга көмөлөһөн, ол туһунан суруйуоххун сөп.''",
"translate-edit-information": "Бу туһунан ($1)",
- "translate-edit-in-other-languages": "Атын тылынан",
"translate-edit-warnings": "Ситэтэ суох тылбаас туһунан сэрэтии",
"translate-edit-tmmatch-source": "Тылбаастаныахтаах этии: $1",
"translate-edit-tmmatch": "$1% сөп түбэһэр",
@@ -154,12 +152,12 @@
"supportedlanguages-recenttranslations": "соторутааҥы тылбаастар",
"supportedlanguages-count": "Барыта $1 тыл.",
"supportedlanguages-activity": "$1: $2 көннөрүү — тиһэх көннөрүү $3 хонук ынараа өттүгэр",
- "translate-save": "Бигэргэт ($1)",
"translate-jssti-add": "Тиһиккэ киллэр",
"managemessagegroups": "Этиилэр бөлөхтөрүн салайыы",
"translate-smg-notallowed": "Бу дьайыыны оҥорор кыаҕыҥ суох эбит.",
"translate-smg-nochanges": "Таҥар уларытыы суох.",
"translate-smg-submit": "Уларытыылары таҥыыга ыыт",
+ "translate-smg-strong-sync-help": "Көмө",
"translate-gs-code": "Куод",
"translate-gs-continent": "Континент",
"translate-gs-speakers": "Саҥарааччы",
diff --git a/MLEB/Translate/i18n/core/scn.json b/MLEB/Translate/i18n/core/scn.json
index aec235b3..ea772b50 100644
--- a/MLEB/Translate/i18n/core/scn.json
+++ b/MLEB/Translate/i18n/core/scn.json
@@ -13,7 +13,6 @@
"translate-edit-definition": "Difinizzioni dû missaggiu",
"translate-edit-contribute": "cuntribbuisci",
"translate-edit-information": "Nfurmazzioni supra lu missaggiu ($1)",
- "translate-edit-in-other-languages": "Missaggiu n àutri lingui",
"translate-rc-translation-filter": "Filtra li traduzzioni:",
"translate-rc-translation-filter-no": "Nun fari nenti",
"translate-rc-translation-filter-only": "Ammustra sulu li traduzzioni",
@@ -28,8 +27,6 @@
"languagestats": "Statìstichi dâ lingua",
"translate-mgs-pagename": "Statìstichi dô gruppu di missaggi",
"supportedlanguages": "Lingui mantinuti",
- "translate-save": "Sarva ($1)",
- "translate-js-support": "Addumanna na cosa",
"translate-documentation-language": "Ducumintazzione dû missaggiu",
"tux-editor-message-tools-translations": "Tutti li traduzzioni"
}
diff --git a/MLEB/Translate/i18n/core/sco.json b/MLEB/Translate/i18n/core/sco.json
index 8e6192e6..68081909 100644
--- a/MLEB/Translate/i18n/core/sco.json
+++ b/MLEB/Translate/i18n/core/sco.json
@@ -36,11 +36,9 @@
"translate-optional": "(aen optie)",
"translate-edit-title": "Eedit \"$1\"",
"translate-edit-definition": "Message defineetion",
- "translate-edit-translation": "Owerset(ment)",
"translate-edit-contribute": "contreebute",
"translate-edit-no-information": "<em>This message haes naw documentation.\nGif ye ken whaur or hou this message is uised, ye can heelp ither owerseters bi eikin documentation til this message.</em>",
"translate-edit-information": "Information aneat message ($1)",
- "translate-edit-in-other-languages": "Message in ither leids",
"translate-edit-warnings": "Warnishments aneat oncompleate owersets",
"translate-edit-tmmatch-source": "Owerset soorce tex: $1",
"translate-use-suggestion": "Replace the Nou owerset wi this suggestion.",
@@ -140,7 +138,6 @@
"supportedlanguages-recenttranslations": "recynt owersets",
"supportedlanguages-count": "$1 {{PLURAL:$1|leid|lleids}} in total.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|eedit|eedits}} - laist eedit $3 {{PLURAL:$3|day|days}} syne",
- "translate-save": "Hain ($1)",
"translate-jssti-add": "Eik til leet",
"managemessagegroups": "Message groop management",
"translate-smg-notallowed": "Ye'r na permittit tae execute this action.",
@@ -169,13 +166,6 @@
"translate-import-err-no-such-file": "File <nowiki>$1</nowiki> disna exeest or haes na been uplaided locallie.",
"translate-import-err-stale-group": "The message groop that this file belangs til disna exeest.",
"translate-import-err-no-headers": "File's na ae weel formed Gettext file in Owerset extension format:\nOnable tae determine message groop n leid fae file heiders.",
- "translate-js-summary": "Ootline:",
- "translate-js-save": "Hain",
- "translate-js-next": "Hain n apen nex",
- "translate-js-skip": "Skip til the nex",
- "translate-js-history": "Owersetin histerie",
- "translate-js-support": "Speir speirin",
- "translate-js-support-title": "Speir fer heelp gif thaur's na enooch information tae owerset this message richt.",
"translate-js-support-unsaved-warning": "Ye hae onhained owersets.",
"translate-gs-continent": "Continant",
"translate-gs-count": "Coont",
diff --git a/MLEB/Translate/i18n/core/sd.json b/MLEB/Translate/i18n/core/sd.json
index 374ed04c..317bb61b 100644
--- a/MLEB/Translate/i18n/core/sd.json
+++ b/MLEB/Translate/i18n/core/sd.json
@@ -29,9 +29,7 @@
"translate-ignored": "(نظر انداز ڪيل)",
"translate-edit-title": "\"$1\" سنواريو",
"translate-edit-definition": "پيغام جي وصف",
- "translate-edit-translation": "ترجمو",
"translate-edit-contribute": "ڀاڱيداري ڪريو",
- "translate-edit-in-other-languages": "ٻين ٻولين ۾ نياپو",
"translate-export-form-format": "فارميٽ",
"right-translate-messagereview": "ترجمن جي نظرثاني ڪريو",
"action-translate-messagereview": "ترجمن جي نظرثاني ڪريو",
@@ -71,14 +69,10 @@
"supportedlanguages-recenttranslations": "ھاڻوڪا ترجما",
"supportedlanguages-count": "ڪل $1 {{PLURAL:$1|ٻولي|ٻوليون}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|سنوار|سنوارون}} - آخري سنوار $3 {{PLURAL:$3|ڏينھن|ڏينھَن}} اڳ",
- "translate-save": "($1) سانڍيو",
"translate-jssti-add": "فھرست ۾ وجھو",
"translate-smg-right": "اندر ايندڙ تبديليون",
"translate-smg-rename-select": "چونڊيو",
"translate-smg-rename-cancel": "رد",
- "translate-js-save": "سانڍيو",
- "translate-js-skip": "اڳلي ڏانھن وڌو",
- "translate-js-support": "سوال پڇو",
"translate-documentation-language": "نياپاتي دستاويزسازي",
"translate-msggroupselector-search-all": "سڀ",
"tux-languageselector": "۾ ترجمايو",
diff --git a/MLEB/Translate/i18n/core/sdc.json b/MLEB/Translate/i18n/core/sdc.json
index 877c7064..b1243ee5 100644
--- a/MLEB/Translate/i18n/core/sdc.json
+++ b/MLEB/Translate/i18n/core/sdc.json
@@ -15,11 +15,10 @@
"translate-page-description-legend": "Iffuimmazioni paj kistha pàgina",
"translate-page-edit": "mudificà",
"translate-edit-title": "Mudificà \"$1\"",
- "translate-edit-translation": "Traduzioni",
"translate-edit-contribute": "cuntribuì",
- "translate-edit-in-other-languages": "Imbasciadda i' li althri linghi",
"translate-edit-askpermission": "Uttiní primmissu",
"exporttranslations": "Ippurtha li traduzioni",
"prefs-translate": "Opzioni traduzioni",
+ "translate-smg-strong-sync-help": "Aggiuddu",
"translate-documentation-language": "Documentazioni d'imbasciaddi"
}
diff --git a/MLEB/Translate/i18n/core/se.json b/MLEB/Translate/i18n/core/se.json
new file mode 100644
index 00000000..a2e63f0f
--- /dev/null
+++ b/MLEB/Translate/i18n/core/se.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "translate-next": "Čuovvovaš siidu",
+ "translate-prev": "Ovddit siidu",
+ "translate-stats-users": "Jorgaleaddjit",
+ "translate-sidebar-alltrans": "Eará gielaide",
+ "supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Jorgaleaddji}}|jorgaleaddji}}: $1",
+ "tux-editor-in-other-languages": "Eará gielaide"
+}
diff --git a/MLEB/Translate/i18n/core/sgs.json b/MLEB/Translate/i18n/core/sgs.json
index f0626dd2..5d7299e2 100644
--- a/MLEB/Translate/i18n/core/sgs.json
+++ b/MLEB/Translate/i18n/core/sgs.json
@@ -7,7 +7,6 @@
"translate-sidebar-alltrans": "Kėtuom kalbuom",
"translate-untranslated": "Napargoldītė",
"translate-percentage-fuzzy": "Vetošė",
- "translate-js-support": "Paklaustė",
"translate-documentation-language": "Pranešėma aprašā",
"tux-tab-all": "Vėsė",
"tux-tab-untranslated": "Napargoldītė",
diff --git a/MLEB/Translate/i18n/core/shi.json b/MLEB/Translate/i18n/core/shi.json
new file mode 100644
index 00000000..a86483ed
--- /dev/null
+++ b/MLEB/Translate/i18n/core/shi.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lhoussine AIT TAYFST"
+ ]
+ },
+ "translate-documentation-language": "Azmmem n tabrat"
+}
diff --git a/MLEB/Translate/i18n/core/si.json b/MLEB/Translate/i18n/core/si.json
index b5db13ff..7e945694 100644
--- a/MLEB/Translate/i18n/core/si.json
+++ b/MLEB/Translate/i18n/core/si.json
@@ -42,11 +42,9 @@
"translate-ignored": "(නොසලකන ලදි)",
"translate-edit-title": "\"$1\" සංස්කරණය කරන්න",
"translate-edit-definition": "පණිවුඩ විග්‍රහය",
- "translate-edit-translation": "පරිවර්තනය",
"translate-edit-contribute": "දායකවන්න",
"translate-edit-no-information": "''මෙම පණිවුඩය සතුව ප්‍රලේඛනයක් නොමැත.''\n''මෙම පණිවුඩය තිබෙන්නේ කොහේදැයි හෝ භාවිතා කරන්නේ කුමටද කියා දන්නවානම්, මෙම පණිවුඩය සඳහා ප්‍රලේඛනයක් තැනීම මඟින් ඔබට අනෙකුත් පරිවර්තකයන් හට සහය විය හැක.''",
"translate-edit-information": "($1) පණිවුඩය පිලිබඳ තොරතුරු",
- "translate-edit-in-other-languages": "පණිවුඩය වෙනත් භාෂාවලින්",
"translate-edit-warnings": "අසම්පුර්ණ පරිවර්තන පිලිබඳ අවවාද",
"translate-edit-tmmatch-source": "පරිවර්තන මූලාශ්‍ර පාඨය: $1",
"translate-edit-tmmatch": "$1% ගැලපේ",
@@ -153,7 +151,6 @@
"supportedlanguages-translators": "{{PLURAL:$2|පරිවර්තකයා|පරිවර්තකයන්}}: $1",
"supportedlanguages-recenttranslations": "මෑත පරිවර්තන",
"supportedlanguages-count": "එකතුව වශයෙන් {{PLURAL:$1|භාෂා|භාෂා}} $1 ක් ඇත.",
- "translate-save": "($1) සුරකින්න",
"translate-jssti-add": "ලැයිස්තුවට එක් කරන්න",
"managemessagegroups": "පණිවුඩ සමූහ කළමනාකරණය",
"translate-smg-notallowed": "ඔබට මෙම ක්‍රියාව සිදු කිරීමට ඉඩ ලබා නොදේ.",
@@ -182,13 +179,6 @@
"translate-import-err-ul-failed": "ගොනු උඩුගත කෙරුම සාර්ථකව සිදු නොවුණි",
"translate-import-err-invalid-title": "ඉදිරිපත්කල ගොනු නාමය <nowiki>$1</nowiki> වලංගු නොවේ.",
"translate-import-err-no-such-file": "<nowiki>$1</nowiki> ගොනුව නොපවතියි හෝ තවමත් ප්‍රාදේශීය වශයෙන් උඩුගත කල නොමැත.",
- "translate-js-summary": "සාරාංශය:",
- "translate-js-save": "සුරකින්න",
- "translate-js-next": "සුරකීමෙන් පසු ඊළඟ එක විවෘත කරන්න",
- "translate-js-skip": "මීළඟ පියවරට පනින්න",
- "translate-js-history": "පරිවර්තන ඉතිහාසය",
- "translate-js-support": "ප්‍රශ්නයක් අසන්න",
- "translate-js-support-title": "මෙම පණිවුඩය නිවැරදිව පරිවර්තනය කිරීම සඳහා ප්‍රමාණවත් තරම් තොරතුරු නොමැති නම් උදව් සඳහා විමසන්න.",
"translate-js-support-unsaved-warning": "ඔබ සතුව නොසුරැකූ පරිවර්තන ඇත.",
"translate-gs-pos": "ස්ථාන.",
"translate-gs-code": "කේතය",
diff --git a/MLEB/Translate/i18n/core/sk.json b/MLEB/Translate/i18n/core/sk.json
index 15f35ffa..70f35785 100644
--- a/MLEB/Translate/i18n/core/sk.json
+++ b/MLEB/Translate/i18n/core/sk.json
@@ -11,7 +11,8 @@
"Sudo77(new)",
"Teslaton",
"TomášPolonec",
- "Vegetator"
+ "Vegetator",
+ "Yardom78"
]
},
"translate": "Preložiť",
@@ -50,11 +51,9 @@
"translate-ignored": "(ignorované)",
"translate-edit-title": "Upraviť \"$1\"",
"translate-edit-definition": "Definícia správy",
- "translate-edit-translation": "Preklad",
"translate-edit-contribute": "prispejte",
"translate-edit-no-information": "<em>Táto správa nemá dokumentáciu.\nAk viete kde alebo ako je táto správa použitá, môžete pomôcť ostatným prekladateľom tým, že pridáte dokumentáciu.</em>",
"translate-edit-information": "Informácia o správe ($1)",
- "translate-edit-in-other-languages": "Správa v iných jazykoch",
"translate-edit-warnings": "Upozornenia na neúplné preklady",
"translate-edit-tmmatch-source": "Zdroj prekladu: $1",
"translate-edit-tmmatch": "$1% zhoda",
@@ -176,9 +175,8 @@
"supportedlanguages-count": "Dohromady $1 {{PLURAL:$1|jazyk|jazyky|jazykov}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|editácia|editácie|editácií}} – posledná pred $3 {{PLURAL:$3|dňom|dňami}}",
"abusefilter-edit-builder-vars-translate-source-text": "Zdrojový text prekladovej jednotky",
- "translate-save": "Uložiť ($1)",
"translate-jssti-add": "Pridať do zoznamu",
- "managemessagegroups": "Správa skupín správ",
+ "managemessagegroups": "Manažment skupín správ",
"translate-smg-nochanges": "Neexistujú žiadne zmeny na spracovanie.",
"translate-manage-import-diff": "Správa $1 | Operácie: $2",
"translate-manage-import-new": "Nová správa $1",
@@ -206,13 +204,6 @@
"translate-import-err-no-such-file": "Súbor „<nowiki>$1</nowiki>“ neexistuje alebo nebol lokálne nahraný.",
"translate-import-err-stale-group": "Skupina správ, do ktorej patrí tento súbor neexistuje.",
"translate-import-err-no-headers": "Súbor nie je správne vytvorený Gettext súbor vo formáte rozšírenia Translate:\nNebolo možné určiť skupinu a jazyk z hlavičiek súboru.",
- "translate-js-summary": "Zhrnutie:",
- "translate-js-save": "Uložiť",
- "translate-js-next": "Uložiť a otvoriť ďalšiu",
- "translate-js-skip": "Preskočiť na ďalšiu",
- "translate-js-history": "História prekladov",
- "translate-js-support": "Položiť otázku",
- "translate-js-support-title": "Požiadať o pomoc, ak nie je k dispozícii dostatok informácií pre správny preklad tejto správy.",
"translate-js-support-unsaved-warning": "Máte neuložené preklady.",
"translate-gs-pos": "Poz.",
"translate-gs-code": "Kód",
diff --git a/MLEB/Translate/i18n/core/skr-arab.json b/MLEB/Translate/i18n/core/skr-arab.json
index ce164703..0c8e14d8 100644
--- a/MLEB/Translate/i18n/core/skr-arab.json
+++ b/MLEB/Translate/i18n/core/skr-arab.json
@@ -35,8 +35,12 @@
"translate-ls-submit": "شماریات ݙکھاؤ",
"translate-mgs-submit": "شماریات ݙکھاؤ",
"translate-mgs-column-language": "زبان",
- "translate-js-summary": "خلاصہ:",
- "translate-js-save": "بچاؤ",
+ "supportedlanguages-activity": "$1: $2 {{PLURAL:$2|تبدیلی|تبدیلیاں}} ــ چھیکڑی تبدیلی $3 ݙین٘ہ پہلے",
+ "translate-supportedlanguages-cached": "ایہ معلومات $1 پہلے کٹھی تھئی ہائی۔",
+ "translate-smg-group-message-action-history": "تاریخ",
+ "translate-smg-group-message-tag-outdated": "پُراݨے",
+ "translate-smg-group-message-message-content": "شامل حصے:",
+ "translate-smg-group-message-message-other-langs": "ٻیاں زباناں:",
"translate-gs-code": "کوڈ",
"translate-gs-continent": "براعظم",
"translate-gs-speakers": "الاوݨ آلے",
diff --git a/MLEB/Translate/i18n/core/sl.json b/MLEB/Translate/i18n/core/sl.json
index 706bfe62..ec81353f 100644
--- a/MLEB/Translate/i18n/core/sl.json
+++ b/MLEB/Translate/i18n/core/sl.json
@@ -12,7 +12,7 @@
"translate": "Prevedi",
"translate-desc": "[[Special:Translate|Posebna stran]] za prevajanje MediaWiki in razširitev",
"translate-taskui-export-to-file": "Izvozi v izvirni obliki",
- "translate-taskui-export-as-po": "Izvozi za nepovezano prevajanje",
+ "translate-taskui-export-as-po": "Izvozi za prevajanje brez povezave",
"translate-taction-translate": "Prevedi",
"translate-taction-proofread": "Preglej",
"translate-taction-lstats": "Statistika jezika",
@@ -36,20 +36,18 @@
"translate-next": "Naslednja stran",
"translate-prev": "Prejšnja stran",
"translate-page-description-legend": "Informacije o skupini",
- "translate-page-description-hasoptional": "Ta skupina sporočil vsebuje izbirna sporočila.\nIzbirna sporočila prevedite samo, če ima vaš jezik posebne zahteve,\nkot sta neuporaba presledkov ali prečrkovanje izvirnih imen. $1",
+ "translate-page-description-hasoptional": "Ta skupina sporočil vsebuje izbirna sporočila.\nIzbirna sporočila prevedite samo, če ima vaš jezik posebne zahteve, kot sta neuporaba presledkov ali prečrkovanje izvirnih imen. $1",
"translate-page-description-hasoptional-open": "Pokaži izbirna sporočila.",
"translate-page-edit": "uredi",
- "translate-optional": "(neobvezno)",
+ "translate-optional": "(izbirno)",
"translate-ignored": "(prezri)",
"translate-edit-title": "Uredi »$1«",
"translate-edit-definition": "Opredelitev sporočila v izvirnem jeziku",
- "translate-edit-translation": "Prevod",
"translate-edit-contribute": "prispevaj",
"translate-edit-no-information": "<em>Sporočilo nima dokumentacije.\nČe veste, kje in kako je uporabljeno, lahko pomagate drugim prevajalcem z dodajanjem dokumentacije.</em>",
"translate-edit-information": "Podatki o sporočilu ($1)",
- "translate-edit-in-other-languages": "Sporočilo v drugih jezikih",
"translate-edit-warnings": "Opozorila o nepopolnosti prevoda",
- "translate-edit-tmmatch-source": "Izvirno besedilo prevoda: $1",
+ "translate-edit-tmmatch-source": "Izvorno besedilo prevoda: $1",
"translate-edit-tmmatch": "$1-% ujemanje",
"translate-use-suggestion": "Zamenjaj trenutni prevod s tem predlogom.",
"translate-edit-nopermission": "Za prevajanje sporočil potrebujete prevajalske pravice.",
@@ -64,8 +62,8 @@
"translate-checks-balance": "V sporočilu je neparno število {{PLURAL:$2|oklepajev}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-links": "{{PLURAL:$2|Naslednja povezava je sporna|Naslednji povezavi sta sporni|Naslednje povezave so sporne}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-links-missing": "{{PLURAL:$2|Naslednja povezava manjka|Naslednji povezavi manjkata|Naslednje povezave manjkajo}}:\n<strong><nowiki>$1</nowiki></strong>",
- "translate-checks-plural": "Opredelitev uporablja <nowiki>{{PLURAL:}}</nowiki>, vendar je prevod ne.",
- "translate-checks-plural-forms": "<nowiki>{{PLURAL:}}</nowiki> ima {{PLURAL:$1|določeno eno obliko|določeni dve obliki|določene $1 oblike|določenih $1 oblik}}, vendar {{PLURAL:$2|je podprta samo ena oblika|sta podprti samo dve obliki|so podprte samo $2 oblike|je podprtih samo $2 oblik}} (izključujoč obliki 0= in 1=).",
+ "translate-checks-plural": "Opredelitev uporablja <nowiki>{{PLURAL:}}</nowiki>, prevod pa ne.",
+ "translate-checks-plural-forms": "<nowiki>{{PLURAL:}}</nowiki> ima {{PLURAL:$1|določeno eno obliko|določeni dve obliki|določene $1 oblike|določenih $1 oblik}}, vendar {{PLURAL:$2|je podprta samo ena oblika|sta podprti samo dve obliki|so podprte samo $2 oblike|je podprtih samo $2 oblik}} (brez oblik 0= in 1=).",
"translate-checks-plural-dupe": "<nowiki>{{PLURAL:}}</nowiki> ima na koncu podvojeni obliki. <nowiki>{{PLURAL:$1|ovca|ovca}}</nowiki> naj bo napisano kot <nowiki>{{PLURAL:$1|ovca}}</nowiki>.",
"translate-checks-pagename": "Imenski prostor je drugačen kot v opredelitvi",
"translate-checks-format": "Ta prevod ne sledi opredelitvi ali ima neveljavno skladnjo: $1",
@@ -133,13 +131,13 @@
"translate-translations-fieldset-title": "Sporočilo",
"translate-translations-messagename": "Ime:",
"translate-translations-project": "Projekt:",
- "translate-translations-including-no-param": "Prosimo, navedite veljavni ključ sporočila v parametru podstrani",
+ "translate-translations-including-no-param": "V parametru za podstran morate navesti veljaven ključ",
"translate-translations-history-short": "z",
"languagestats": "Statistika jezika",
"languagestats-summary": "Stran prikazuje statistiko prevodov za vse skupine sporočil jezika.",
"messagegroupstats-summary": "Stran prikazuje statistiko skupin sporočil.",
"languagestats-stats-for": "Statistika prevodov za jezik $1 ($2).",
- "languagestats-recenttranslations": "nedavni prevodi",
+ "languagestats-recenttranslations": "novi prevodi",
"translate-langstats-incomplete": "Nekatere statistike na tej strani so nepopolne. Prosimo, da za več statistik ponovno naložite stran.",
"translate-langstats-expand": "razširi",
"translate-langstats-collapse": "skrči",
@@ -147,8 +145,8 @@
"translate-langstats-collapseall": "skrči vse",
"translate-language-code": "Koda jezika",
"translate-language-code-field-name": "Koda jezika:",
- "translate-suppress-complete": "Preskoči v celoti prevedene skupine sporočil",
- "translate-ls-noempty": "Preskoči v celoti neprevedene skupine sporočil",
+ "translate-suppress-complete": "Preskoči popolnoma prevedene skupine sporočil",
+ "translate-ls-noempty": "Preskoči popolnoma neprevedene skupine sporočil",
"translate-language": "Jezik",
"translate-total": "Sporočil",
"translate-untranslated": "Neprevedeno",
@@ -167,14 +165,13 @@
"translate-mgs-totals": "{{PLURAL:$1|2=Oba jezika|Vsi jeziki}} skupaj",
"translate-mgs-invalid-group": "Izbrana skupina $1 ne obstaja.",
"translate-mgs-nothing": "Pri izbrani statistiki ni ničesar za prikazati.",
- "supportedlanguages": "Podprti jeziki",
- "supportedlanguages-summary": "Ta stran prikazuje seznam vseh jezikov, ki jih podpira {{SITENAME}},\nskupaj z imeni prevajalcev, ki delujejo na tem jeziku.\nVeč urejanj je prevajalec prispeval, večje je izpisano njegovo ime.\nBarva podrčtave kaže na zadnjo tukajšnjo dejavnost prevajalca.",
+ "supportedlanguages": "Dejavni jeziki",
+ "supportedlanguages-summary": "Ta stran prikazuje seznam dejavnik jezikov na strani {{SITENAME}},\nskupaj z imeni prevajalcev, ki delujejo na tem jeziku.\nVeč urejanj je prevajalec prispeval, večje je izpisano njegovo ime.\nBarva podrčtave kaže na zadnjo tukajšnjo dejavnost prevajalca.",
"supportedlanguages-colorlegend": "Legenda barv: Zadnji prevod pred $1 dnevi.",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Prevajalec|Prevajalka}}|Prevajalca|Prevajalci}}: $1",
- "supportedlanguages-recenttranslations": "nedavni prevodi",
+ "supportedlanguages-recenttranslations": "novi prevodi",
"supportedlanguages-count": "$1 {{PLURAL:$1|jezik|jezika|jeziki|jezikov}} skupno.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|urejanje|urejanji|urejanja|urejanj}} – zadnje urejanje pred $3 {{PLURAL:$3|dnem|dnema|dnemi}}",
- "translate-save": "Objavi ($1)",
"translate-jssti-add": "Dodaj na seznam",
"managemessagegroups": "Upravljanje skupin sporočil",
"translate-smg-notallowed": "Nimate dovoljenj za izvedbo dejanja.",
@@ -192,7 +189,7 @@
"translate-manage-action-ignore": "Prezri",
"translate-manage-action-fuzzy": "Uvozi in prevode označi kot ohlapne",
"translate-manage-nochanges": "Ni sprememb v opredelitvi sporočil za to skupino.",
- "translate-manage-nochanges-other": "Za ta jezik ni bilo sprememb.\nUporabite spodnjo povezavo za vrnitev na pogled podrobnosti skupine.",
+ "translate-manage-nochanges-other": "Za ta jezik ni bilo sprememb.\nZa vrnitev na prikaz podrobnosti skupine uporabite spodnjo povezavo.",
"translate-manage-inconsistent": "V zahtevi je bila odkrita nedoslednost.\nProsimo, preverite spremembe in poskusite znova.\nPodrobnosti: $1",
"translate-manage-toolong": "Najdaljši čas obdelave $1 {{PLURAL:$1|sekunde|sekund}} je presežen.\nProsimo, ponovno potrdite obrazec, da nadaljujete z obdelavo.",
"translate-manage-import-summary": "Uvažanje nove različice iz zunanjega vira",
@@ -210,13 +207,6 @@
"translate-import-err-no-such-file": "Datoteka <nowiki>$1</nowiki> ne obstaja ali pa ni bila naložena lokalno.",
"translate-import-err-stale-group": "Skupina sporočil, kateri pripada ta datoteka, ne obstaja.",
"translate-import-err-no-headers": "Datoteka ni dobro oblikovana datoteka Gettext v obliki razširitve Translate:\nNe morem določiti skupine in jezika iz glav datoteke.",
- "translate-js-summary": "Povzetek:",
- "translate-js-save": "Objavi",
- "translate-js-next": "Objavi in odpri naslednje",
- "translate-js-skip": "Preskoči na naslednje",
- "translate-js-history": "Zgodovina prevoda",
- "translate-js-support": "Postavi vprašanje",
- "translate-js-support-title": "Prosite za pomoč, če tukaj ni navedenih dovolj informacij, da bi lahko sporočilo pravilno prevedli.",
"translate-js-support-unsaved-warning": "Imate neobjavljene prevode.",
"translate-gs-pos": "Št.",
"translate-gs-code": "Koda",
@@ -239,27 +229,27 @@
"logentry-translationreview-group": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stanje prevodov jezika $4 za $3 iz $6 v $7",
"group-translate-sandboxed": "Neodobreni prevajalci",
"group-translate-sandboxed-member": "{{GENDER:$1|neodobren prevajalec}}",
- "right-translate-sandboxmanage": "Upravljanje z uporabniki, omejenimi na peskovnik",
- "action-translate-sandboxmanage": "upravljanje z uporabniki, omejenimi na peskovnik",
+ "right-translate-sandboxmanage": "Upravljanje uporabnikov, omejenih na peskovnik",
+ "action-translate-sandboxmanage": "upravljanje uporabnikov, omejenih na peskovnik",
"right-translate-sandboxaction": "Izvršitev dejanj, dovoljenih na peskovnik omejenim uporabnikom",
"action-translate-sandboxaction": "izvršitev dejanj, dovoljenih na peskovnik omejenim uporabnikom",
- "translate-workflow-state-": "(izključeno)",
+ "translate-workflow-state-": "(nenastavljeno)",
"translate-workflowstatus": "Stanje: $1",
"translate-workflow-set-doing": "Nastavljanje ...",
"translate-workflow-autocreated-summary": "Samodejno ustvarjanje strani za stanje delovnega toka $1",
"translate-stats-workflow": "Stanje",
"translate-workflowgroup-label": "Stanja delovnega toka",
"translate-workflowgroup-desc": "Skupina sporočil prikazuje stanja delovnih tokov prevodov.\nStanja so opredeljena v konfiguracijski spremenljivki $wgTranslateWorkflowStates.",
- "translate-dynagroup-recent-label": "Nedavni prevodi",
+ "translate-dynagroup-recent-label": "Novi prevodi",
"translate-dynagroup-recent-desc": "Skupina sporočil prikazuje vse nedavne prevode v ta jezik.\nNajuporabnejše za opravila pregleda.",
- "translate-dynagroup-additions-label": "Nedavna dodajanja",
+ "translate-dynagroup-additions-label": "Nove vsebine",
"translate-dynagroup-additions-desc": "Ta skupina sporočil kaže nova in spremenjena sporočila.",
"translate-msggroupselector-projects": "Skupina sporočil",
"translate-msggroupselector-search-placeholder": "Iskanje skupin",
"translate-msggroupselector-search-all": "Vsi",
"translate-msggroupselector-search-recent": "Nedavni",
"translate-msggroupselector-view-subprojects": "$1 {{PLURAL:$1|podskupina|podskupini|podskupine|podskupin}}",
- "tux-languageselector": "Prevedi v jezik",
+ "tux-languageselector": "Ciljni jezik:",
"tux-tab-all": "Vse",
"tux-tab-untranslated": "Neprevedeno",
"tux-tab-outdated": "Zastarelo",
@@ -274,11 +264,11 @@
"tux-status-unsaved": "Neobjavljeno",
"tux-save-unknown-error": "Prišlo je do neznane napake.",
"tux-editor-placeholder": "Vaš prevod",
- "tux-editor-editsummary-placeholder": "Izbirni povzetek",
+ "tux-editor-editsummary-placeholder": "Neobvezni povzetek",
"tux-editor-paste-original-button-label": "Prilepi izvorno besedilo",
"tux-editor-discard-changes-button-label": "Zavrzi spremembe",
"tux-editor-save-button-label": "Objavi prevod",
- "tux-editor-skip-button-label": "Preskoči na naslednje",
+ "tux-editor-skip-button-label": "Pojdi na naslednje",
"tux-editor-cancel-button-label": "Prekliči",
"tux-editor-confirm-button-label": "Potrdi prevod",
"tux-editor-proofread-button-label": "Označi kot pregledano",
@@ -323,13 +313,13 @@
"tux-empty-list-translated-guide": "Pomagate lahko pri prevajanju",
"tux-empty-list-translated-action": "Prevedi",
"tux-empty-no-messages-to-display": "Ni sporočil za prikaz.",
- "tux-empty-there-are-optional": "Na razpolago so izbirna sporočila, ki niso prikazana na seznamu",
+ "tux-empty-there-are-optional": "Na voljo so izbirna sporočila, ki niso prikazana na seznamu",
"tux-empty-show-optional-messages": "Prikaz izbirnih sporočil",
"tux-empty-no-outdated-messages": "NI zastarelih sporočil",
"tux-empty-nothing-to-proofread": "Ničesar ni treba pregledati",
"tux-empty-you-can-help-providing": "Pomagate lahko z novimi prevodi",
- "tux-empty-nothing-new-to-proofread": "Za pregled ni nič novega",
- "tux-empty-you-can-review-already-proofread": "Pregledate lahko prevode, ki so jih pregledali že drugi.",
+ "tux-empty-nothing-new-to-proofread": "Za pregled ni ničesar novega",
+ "tux-empty-you-can-review-already-proofread": "Pregledujete lahko prevode, ki so jih pregledali že drugi",
"tux-empty-list-other": "Ničesar ni treba prevesti.",
"tux-empty-list-other-guide": "Pomagate lahko s pregledom obstoječih prevodov.",
"tux-empty-list-other-action": "Pregled prevodov",
@@ -337,7 +327,7 @@
"tux-editor-close-tooltip": "Zapri",
"tux-editor-expand-tooltip": "Razširi",
"tux-editor-collapse-tooltip": "Skrči",
- "tux-editor-message-tools-show-editor": "Pokaži v wikiurejevalniku",
+ "tux-editor-message-tools-show-editor": "Prikaži v vikiurejevalniku",
"tux-editor-message-tools-history": "Zgodovina",
"tux-editor-message-tools-delete": "Izbriši",
"tux-editor-message-tools-translations": "Vsi prevodi",
@@ -347,6 +337,6 @@
"translate-statsbar-tooltip": "$1% prevedenih, $2% pregledanih",
"translate-statsbar-tooltip-with-fuzzy": "$1% prevedenih, $2% pregledanih, $3% zastarelih",
"translate-search-more-groups-info": "Še $1 {{PLURAL:$1|skupina|skupini|skupine|skupin}}",
- "tux-session-expired": "Niste več prijavljeni. Prosimo, prijavite se v ločenem zavihku. Druga možnost je, da naredite kopijo neshranjenega prevoda, se prijavite, se vrnete na to stran in ponovno vnesete vaš prevod.",
+ "tux-session-expired": "Niste več prijavljeni. Prosimo, prijavite se na ločenem zavihku. Druga možnost je, da ustvarite kopijo neshranjenega prevoda, se prijavite, se vrnete na to stran in znova vnesete svoj prevod.",
"tux-nojs": "Orodje ne deluje brez JavaScripta. JavaScript je onemogočen, ne deluje ali pa brskalnik ni podprt."
}
diff --git a/MLEB/Translate/i18n/core/sli.json b/MLEB/Translate/i18n/core/sli.json
new file mode 100644
index 00000000..01a30bb6
--- /dev/null
+++ b/MLEB/Translate/i18n/core/sli.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Äberlausitzer"
+ ]
+ },
+ "translate-documentation-language": "Nachrichtadokumentation"
+}
diff --git a/MLEB/Translate/i18n/core/smn.json b/MLEB/Translate/i18n/core/smn.json
index 8fb5a981..1f72c572 100644
--- a/MLEB/Translate/i18n/core/smn.json
+++ b/MLEB/Translate/i18n/core/smn.json
@@ -1,8 +1,16 @@
{
"@metadata": {
"authors": [
- "Trondtr"
+ "Trondtr",
+ "Yupik"
]
},
- "translate-documentation-language": "jurgâlemravvuuh"
+ "translate-next": "Čuávuvâš sijđo",
+ "translate-prev": "Oovdeb sijđo",
+ "translate-rcfilters-translations-filter-label": "Iä jurgâlusah",
+ "translate-stats-users": "Jurgâleijeeh",
+ "translate-sidebar-alltrans": "Eres kieláid",
+ "translate-documentation-language": "jurgâlemravvuuh",
+ "tux-languageselector": "Puátukielâ:",
+ "tux-editor-in-other-languages": "Eres kieláid"
}
diff --git a/MLEB/Translate/i18n/core/sms.json b/MLEB/Translate/i18n/core/sms.json
new file mode 100644
index 00000000..21485dde
--- /dev/null
+++ b/MLEB/Translate/i18n/core/sms.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "translate-prev": "Oouʹdab seidd",
+ "translate-sidebar-alltrans": "Jeeʹres ǩiõlid",
+ "tux-languageselector": "Täävtõsǩiõll:",
+ "tux-editor-in-other-languages": "Jeeʹres ǩiõlid",
+ "tux-editor-page-mode": "Seidd"
+}
diff --git a/MLEB/Translate/i18n/core/sq.json b/MLEB/Translate/i18n/core/sq.json
index 507684fa..08462340 100644
--- a/MLEB/Translate/i18n/core/sq.json
+++ b/MLEB/Translate/i18n/core/sq.json
@@ -29,7 +29,6 @@
"translate-statsf-count-users": "Përkthyesit aktiv",
"translate-statsf-submit": "Parapamja",
"translate-mgs-pagename": "Statistikat e mesazhit të grupit",
- "translate-js-history": "Historia e përkthimit",
"translate-documentation-language": "Dokumentimi i mesazhit",
"tux-editor-save-button-label": "Ruaj përkthimin",
"tux-editor-shortcut-info": "Shtypni \"$1\" për të ruajtur ose \"$2\" për të kaluar në mesazhin tjetër, ose \"$3\" për shkurtesa të tjera."
diff --git a/MLEB/Translate/i18n/core/sr-ec.json b/MLEB/Translate/i18n/core/sr-ec.json
index afab4216..0a36be00 100644
--- a/MLEB/Translate/i18n/core/sr-ec.json
+++ b/MLEB/Translate/i18n/core/sr-ec.json
@@ -3,6 +3,7 @@
"authors": [
"Acamicamacaraca",
"BadDog",
+ "Kizule",
"Milicevic01",
"Obsuser",
"Prevodim",
@@ -46,18 +47,16 @@
"translate-next": "Следећа страница",
"translate-prev": "Претходна страница",
"translate-page-description-legend": "Информације о групи",
- "translate-page-description-hasoptional": "Ова група порука садржи опционалне поруке.\nЊих би требало преводити само када језик има посебне потребе,\nпопут неупотребе размака или пресловљавања имена. $1",
- "translate-page-description-hasoptional-open": "Прикажи опционалне поруке.",
+ "translate-page-description-hasoptional": "Ова група порука садржи необаветне поруке.\nЊих би требало преводити само када језик има посебне потребе,\nпопут неупотребе размака или пресловљавања имена. $1",
+ "translate-page-description-hasoptional-open": "Прикажи необавезне поруке.",
"translate-page-edit": "уреди",
"translate-optional": "(опционално)",
"translate-ignored": "(занемарено)",
"translate-edit-title": "Уредите страницу „$1”",
"translate-edit-definition": "Текст поруке",
- "translate-edit-translation": "Превод",
- "translate-edit-contribute": "допринесите",
+ "translate-edit-contribute": "допринеси",
"translate-edit-no-information": "<em>Ова порука нема документацију.\nАко знате где или како се користи, помозите другим преводиоцима тако што ћете је написати.</em>",
"translate-edit-information": "Информације о поруци ($1)",
- "translate-edit-in-other-languages": "Порука на другим језицима",
"translate-edit-warnings": "Упозорења о непотпуним преводима",
"translate-edit-tmmatch-source": "Изворни текст за превођење: $1",
"translate-edit-tmmatch": "$1% подударања",
@@ -69,12 +68,12 @@
"translate-export-invalid-format": "Наведите важећи формат.",
"translate-export-not-supported": "Извоз превода није подржан.",
"translate-export-format-notsupported": "Група порука не подржава наведени формат извоза.",
- "translate-export-group-too-large": "Одабрана група порука је превелика. Одаберите групу порука која има мање од $1 {{PLURAL:$1|поруке|порука}} или контактирајте администратора превода за савет.",
+ "translate-export-group-too-large": "Изабрана група порука је превелика. Изаберите групу порука која има мање од $1 {{PLURAL:$1|поруке|порука}} или се посаветујте с администраторем превода.",
"translate-checks-parameters": "Следећи {{PLURAL:$2|параметар се не користи|параметри се не користе}}:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "Следећи {{PLURAL:$2|параметар је непознат|параметри су непознати}}:\n<strong>$1</strong>",
"translate-checks-balance": "Присутан је непаран број {{PLURAL:$2|заграда}}:\n<strong><nowiki>$1</nowiki></strong>",
- "translate-checks-links": "{{PLURAL:$2|Следећа веза је проблематична|Следеће $2 везе су проблематичне|Следећих $2 веза је проблематично}}:\n<strong><nowiki>$1</nowiki></strong>",
- "translate-checks-links-missing": "{{PLURAL:$2|Следећа веза недостаје|Следеће $2 везе недостају|Следећих $2 веза недостају}}:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-links": "{{PLURAL:$2|Следећи линк је проблематичан|Следећа $2 линка су проблематична|Следећих $2 линкова је проблематично}}:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-links-missing": "{{PLURAL:$2|Следећи линк недостаје|Следећа $2 линка недостају|Следећих $2 линкова недостају}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-plural": "Изворни текст користи ознаку <nowiki>{{PLURAL:}}</nowiki>, а превод не.",
"translate-checks-plural-forms": "У ознаци <nowiki>{{PLURAL:}}</nowiki> {{PLURAL:$1|унет је један облик|унета су $1 облика}}, али {{PLURAL:$2|само један облик је подржан|$2 облика су подржана|$2 облика је подржано}} (изузимајући облике 0= и 1=).",
"translate-checks-plural-dupe": "Ознака <nowiki>{{PLURAL:}}</nowiki> садржи удвојене облике. Облик <nowiki>{{PLURAL:$1|врата|врата}}</nowiki> би требало писати само као <nowiki>{{PLURAL:$1|врата}}</nowiki>.",
@@ -84,7 +83,7 @@
"translate-checks-unicode-plural-unsupported": "Ова порука не подржава <nowiki>{{PLURAL|}}</nowiki>.",
"translate-checks-pagename": "Именски простор је промењен у односу на изворни текст",
"translate-checks-format": "Овај превод не следи изворни текст или нема важећу синтаксу: $1",
- "translate-checks-escape": "Следећи излази могу бити случајни: <strong>$1</strong>",
+ "translate-checks-escape": "{{PLURAL:$2|Следећи излаз карактера може бити случајан|Следећи излази карактера могу бити случајни}}: <strong>$1</strong>. {{PLURAL:$4|Коректан излаз карактера је|Коректни излази карактера садрже:}} $3.",
"translate-checks-parametersnotequal": "Број параметара је {{PLURAL:$1|$1}}; требало би бити {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "<nowiki>$1</nowiki> је погрешно уобличен.",
"translate-checks-fudforum-syntax": "На овом пројекту, користите <nowiki>$1</nowiki> уместо <nowiki>$2</nowiki.",
@@ -92,6 +91,7 @@
"translate-checks-newline-missing-end": "{{PLURAL:$1|Недостаје $1 знак|Недостају $1 знака|Недостају $1 знакова}} за нови ред на крају превода.",
"translate-checks-newline-extra-start": "{{PLURAL:$1|Недостаје $1 додатни знак|Недостају $1 додатна знака|Недостају $1 додатних знакова}} за нови ред на почетку превода.",
"translate-checks-newline-extra-end": "{{PLURAL:$1|Недостаје $1 додатни знак|Недостају $1 додатна знака|Недостају $1 додатних знакова}} за нови ред на крају превода.",
+ "translate-checks-replacement": "Користи $2 уместо $1.",
"translate-pref-editassistlang": "Помоћни језици:",
"prefs-translate": "Опције превођења",
"translate-pref-editassistlang-help": "Списак кодова језика раздвојених зарезом.\nПревод поруке на овим језицима приказује се док преводите.\nПодразумевани списак језика зависи од вашег језика.",
@@ -108,7 +108,7 @@
"action-translate-groupreview": "мењате стање тока рада за групе порука",
"translate-rcfilters-translations": "Преводи",
"translate-rcfilters-translations-only-label": "Преводи",
- "translate-rcfilters-translations-only-desc": "Промене преведених страница",
+ "translate-rcfilters-translations-only-desc": "Измене преведених страница",
"translate-rcfilters-translations-filter-label": "Нису преводи",
"translate-rcfilters-translations-filter-desc": "Све измене које нису преводи",
"translate-rcfilters-translations-site-label": "Системске поруке",
@@ -117,7 +117,7 @@
"translate-rc-translation-filter-no": "не ради ништа",
"translate-rc-translation-filter-only": "прикажи само преводе",
"translate-rc-translation-filter-filter": "избаци преводе",
- "translate-rc-translation-filter-site": "само промене порука сајта",
+ "translate-rc-translation-filter-site": "само измене порука сајта",
"translationstats": "Статистика превода",
"translate-stats-edits": "Измене",
"translate-stats-users": "Преводиоци",
@@ -144,6 +144,8 @@
"translate-statsf-language": "Списак кодова језика раздвојених зарезом:",
"translate-statsf-group": "Списак кодова група раздвојених зарезом:",
"translate-statsf-submit": "Прегледај",
+ "translate-statsf-unknown-error": "Дошло је до непознате грешке.",
+ "translate-statsf-error-message": "Дошло је до грешке при учитавању графика: $1",
"translate-tag-page-desc": "Превод вики странице [[$2|$1]] са $3 ($4).",
"translate-sidebar-alltrans": "На другим језицима",
"translations": "Сви преводи",
@@ -189,7 +191,7 @@
"translate-mgs-totals": "Свих $1 {{PLURAL:$1|језика}} заједно",
"translate-mgs-invalid-group": "Наведена група „$1” не постоји.",
"translate-mgs-nothing": "Нема ничега да се прикаже за захтеване статистике.",
- "supportedlanguages": "Подржани језици",
+ "supportedlanguages": "Активни језици",
"supportedlanguages-summary": "Ова страница приказује списак свих језика које подржава {{SITENAME}},\nзаједно са именима преводилаца који раде на том језику.\nИме преводиоца је веће што је више превода допринео.\nБоја линије подвлачења указује колико скоро је преводилац овде био присутан.",
"supportedlanguages-colorlegend": "Легенда за боју: последњи превод извршен пре $1 дана.",
"supportedlanguages-portallink": "[$1] $2 – $3",
@@ -199,18 +201,18 @@
"supportedlanguages-recenttranslations": "недавни преводи",
"supportedlanguages-count": "Укупно $1 {{PLURAL:$1|језик|језика}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|измена|измене|измена}} – последња измена пре $3 {{PLURAL:$3|дан|дана|дана}}",
+ "translate-supportedlanguages-cached": "Ова информација је кеширана пре $1.",
"abusefilter-edit-builder-vars-translate-source-text": "Изворни текст преводилачке јединице",
"abusefilter-edit-builder-vars-translate-target-language": "Жељени језик за превођење",
- "translate-save": "Објави ($1)",
"translate-jssti-add": "Додај на списак",
"managemessagegroups": "Управљање групама порука",
"translate-smg-notallowed": "Није вам дозвољено да извршите ову радњу.",
- "translate-smg-nochanges": "Нема промена за обрађивање.",
- "translate-smg-submit": "Пошаљи промене на обраду",
- "translate-smg-submitted": "Текстови порука су ажурирани. Промене се обрађују у позадини.",
- "translate-smg-more": "Биће још промена за обраду након што пошаљете ове.",
+ "translate-smg-nochanges": "Нема измена за обрађивање.",
+ "translate-smg-submit": "Проследи измене на обраду",
+ "translate-smg-submitted": "Текстови порука су ажурирани. Измене се обрађују у позадини.",
+ "translate-smg-more": "Биће још измена за обраду након што поднесете ове.",
"translate-smg-left": "Садржај поруке на викију",
- "translate-smg-right": "Предстојеће промене",
+ "translate-smg-right": "Предстојеће измене",
"translate-smg-rename-select": "Изабери",
"translate-smg-rename-cancel": "Откажи",
"translate-smg-rename-search": "Претражите подударне поруке…",
@@ -225,16 +227,16 @@
"translate-manage-action-fuzzy": "увези преводе и означи их застарелим",
"translate-manage-action-rename-fuzzy": "Преименуј и означи преводе застарелим",
"translate-manage-action-rename": "Преименуј",
- "translate-manage-action-ignore-change": "Занемари промене превода",
- "translate-manage-nochanges": "Нема промена у текстовима порука у овој групи.",
- "translate-manage-nochanges-other": "Нема промена за овај језик.\nКористите доленаведену везу да бисте се вратили на приказ детаља групе.",
- "translate-manage-inconsistent": "Откривена је недоследност у захтеву.\nПроверите промене, па покушајте поново.\nДетаљи: $1.",
+ "translate-manage-action-ignore-change": "Занемари измене превода",
+ "translate-manage-nochanges": "Нема измена у текстовима порука у овој групи.",
+ "translate-manage-nochanges-other": "Нема измена за овај језик.\nОтворите доњи линк да бисте се вратили на приказ детаља групе.",
+ "translate-manage-inconsistent": "Откривена је недоследност у захтеву.\nПроверите измене па покушајте поново.\nДетаљи: $1.",
"translate-manage-toolong": "Највеће време извршавања од $1 {{PLURAL:$1|секунде|секунде|секунди}} је прекорачено.\nПоново пошаљите образац за наставак.",
"translate-manage-import-summary": "Увозим нову верзију из спољашњег извора",
"translate-manage-import-rename-summary": "Преименовано у спољном извору",
"translate-manage-conflict-summary": "Увозим нову верзију из спољашњег извора.\nПроверите.",
"translate-manage-submit": "Изврши",
- "translate-manage-intro-other": "Испод је списак промена превода за $1 језик.\nПроверите промене и одаберите радњу коју желите да предузмете за свако ажурирање.\nАко одаберете да занемарите промене, ова радња ће бити привремена.",
+ "translate-manage-intro-other": "Испод је списак измена превода за $1 језик.\nПроверите их и изаберите радњу коју желите да предузмете за свако ажурирање.\nАко изаберете да занемарите измене, ова радња ће бити привремена.",
"translate-manage-import-ok": "Увезено: $1.",
"translate-manage-import-done": "Увоз је завршен.",
"importtranslations": "Увоз превода",
@@ -246,13 +248,6 @@
"translate-import-err-no-such-file": "Датотека <nowiki>$1</nowiki> не постоји или није локално отпремљена.",
"translate-import-err-stale-group": "Група порука којој ова датотека припада не постоји.",
"translate-import-err-no-headers": "Датотека није исправно обликована Gettext датотека у формату додатка „Превођење”:\nНије могуће одредити групу порука и језик из заглавља датотеке.",
- "translate-js-summary": "Резиме:",
- "translate-js-save": "Објави",
- "translate-js-next": "Објави и отвори следећу",
- "translate-js-skip": "Прескочи на следећу",
- "translate-js-history": "Историја превода",
- "translate-js-support": "Постави питање",
- "translate-js-support-title": "Затражите помоћ ако немате довољно информација за исправан превод ове поруке.",
"translate-js-support-unsaved-warning": "Имате необјавене преводе.",
"translate-gs-pos": "Место",
"translate-gs-code": "Кôд",
@@ -272,7 +267,7 @@
"log-name-translationreview": "Дневник провере превода",
"log-description-translationreview": "Дневник свих провера превода и група порука.",
"logentry-translationreview-message": "$1 је {{GENDER:$2|прегледао|прегледала}} превод $3",
- "logentry-translationreview-group": "$1 је {{GENDER:$2|променио|променила}} стање $4 превода $3 са $6 на $7",
+ "logentry-translationreview-group": "$1 је {{GENDER:$2|променио|променила}} стање превода странице $3 на $4 језику са $6 у $7",
"group-translate-sandboxed": "Неодобрени преводиоци",
"group-translate-sandboxed-member": "{{GENDER:$1|неодобрени преводилац|неодобрена преводитељка}}",
"right-translate-sandboxmanage": "управљање корисницима у песку",
@@ -312,7 +307,7 @@
"tux-editor-placeholder": "Ваш превод",
"tux-editor-editsummary-placeholder": "Опис (пожељно)",
"tux-editor-paste-original-button-label": "Налепи изворни текст",
- "tux-editor-discard-changes-button-label": "Одбаци промене",
+ "tux-editor-discard-changes-button-label": "Одбаци измене",
"tux-editor-save-button-label": "Објави превод",
"tux-editor-skip-button-label": "Пређи на следећу",
"tux-editor-cancel-button-label": "Откажи",
@@ -350,25 +345,25 @@
"tux-message-filter-placeholder": "Филтрирајте списак",
"tux-message-filter-result": "{{PLURAL:$1|Пронађен је $1 резултат|Пронађена су $1 резултата|Пронађено је $1 резултата}} за ниску „$2”",
"tux-message-filter-advanced-button": "Напредна претрага",
- "tux-message-filter-optional-messages-label": "Опционалне поруке",
+ "tux-message-filter-optional-messages-label": "Необавезне поруке",
"tux-proofread-translated-by-self": "Ваш превод",
"tux-empty-list-all": "Ова група порука је празна",
"tux-empty-list-all-guide": "Изаберите другу групу порука за превод",
"tux-translate-page-no-such-group": "<strong>Назначена група порука не постоји.</strong> Изаберите другу.",
"tux-empty-list-translated": "Нема преведених порука",
"tux-empty-list-translated-guide": "Помозите у превођењу",
- "tux-empty-list-translated-action": "Преведите",
+ "tux-empty-list-translated-action": "Преведи",
"tux-empty-no-messages-to-display": "Нема порука за приказивање.",
- "tux-empty-there-are-optional": "Постоје опционалне поруке које нису приказане на списку",
- "tux-empty-show-optional-messages": "Прикажи опционалне поруке",
+ "tux-empty-there-are-optional": "Постоје необавезне поруке које нису приказане на списку",
+ "tux-empty-show-optional-messages": "Прикажи необавезне поруке",
"tux-empty-no-outdated-messages": "Нема застарелих порука",
"tux-empty-nothing-to-proofread": "Нема ничега за проверу",
"tux-empty-you-can-help-providing": "Помозите пружањем нових превода",
"tux-empty-nothing-new-to-proofread": "Нема ничег новог за проверу",
"tux-empty-you-can-review-already-proofread": "Можете да проверавате преводе које су други већ проверили.",
"tux-empty-list-other": "Све је преведено",
- "tux-empty-list-other-guide": "Помозите провером постојећих превода",
- "tux-empty-list-other-action": "Проверите преводе",
+ "tux-empty-list-other-guide": "Помозите провером постојећих превода.",
+ "tux-empty-list-other-action": "Провери преводе",
"tux-empty-list-other-link": "Прикажи све поруке",
"tux-editor-close-tooltip": "Затвори",
"tux-editor-expand-tooltip": "Прошири",
@@ -377,7 +372,7 @@
"tux-editor-message-tools-history": "Историја",
"tux-editor-message-tools-delete": "Избриши",
"tux-editor-message-tools-translations": "Сви преводи",
- "tux-editor-message-tools-linktothis": "Веза ка овој поруци",
+ "tux-editor-message-tools-linktothis": "Линк ка овој поруци",
"tux-editor-loading": "Учитавање…",
"translate-search-more-languages-info": "још $1 {{PLURAL:$1|језик|језика}}",
"translate-statsbar-tooltip": "$1% преведено, $2% проверено",
@@ -385,6 +380,6 @@
"translate-search-more-groups-info": "још $1 {{PLURAL:$1|група|групе|група}}",
"translate-syntax-error": "Превод садржи синтаксне грешке",
"tux-session-expired": "Више нисте пријављени. Пријавите се у засебној картици. Друга могућност је да прекопирате несачуване преводе, пријавите се, вратите се на ову страницу и поново унесете своје преводе.",
- "tux-nojs": "Ова алатка не ради без јаваскрипта. Јаваскрипт је онемогућен, не ради или је овај прегледач неподржан.",
+ "tux-nojs": "Ова алатка не ради без јаваскрипта. Јаваскрипт је искључен, не ради или је овај прегледач неподржан.",
"specialpages-group-translation": "Превођење"
}
diff --git a/MLEB/Translate/i18n/core/sr-el.json b/MLEB/Translate/i18n/core/sr-el.json
index 57497bed..7e5f5304 100644
--- a/MLEB/Translate/i18n/core/sr-el.json
+++ b/MLEB/Translate/i18n/core/sr-el.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Edinwiki",
+ "Kizule",
"Michaello",
"Milicevic01",
"Obsuser",
@@ -51,11 +52,9 @@
"translate-ignored": "(zanemareno)",
"translate-edit-title": "Uredite stranicu „$1”",
"translate-edit-definition": "Definicija poruke",
- "translate-edit-translation": "Prevod",
"translate-edit-contribute": "doprinesite",
"translate-edit-no-information": "<em>Ova poruka nema dokumentaciju.\nAko znate gde ili kako se koristi, pomozite drugim prevodiocima tako što ćete je napisati.</em>",
"translate-edit-information": "Informacije o poruci ($1)",
- "translate-edit-in-other-languages": "Poruka na drugim jezicima",
"translate-edit-warnings": "Upozorenja o nepotpunim prevodima",
"translate-edit-tmmatch-source": "Tekst izvornog prevoda: $1",
"translate-edit-tmmatch": "$1% poklapanja",
@@ -187,7 +186,6 @@
"supportedlanguages-count": "Ukupno $1 {{PLURAL:$1|jezik|jezika}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|izmena|izmene|izmena}} – poslednja izmena pre $3 {{PLURAL:$3|dan|dana|dana}}",
"abusefilter-edit-builder-vars-translate-source-text": "Izvorni tekst prevodilačke jedinice",
- "translate-save": "Sačuvaj ($1)",
"translate-jssti-add": "Dodaj na spisak",
"managemessagegroups": "Upravljanje grupama poruka",
"translate-smg-notallowed": "Nije vam dozvoljeno da izvršite ovu radnju.",
@@ -223,13 +221,6 @@
"translate-import-err-no-such-file": "Datoteka <nowiki>$1</nowiki> ne postoji ili nije otpremljena lokalno.",
"translate-import-err-stale-group": "Grupa poruka kojoj ova datoteka pripada ne postoji.",
"translate-import-err-no-headers": "Datoteka nije dobro formirana Gettext datoteka u formatu dodatka „Prevođenje”:\nNe mogu da odredim grupu poruka i jezik iz zaglavlja datoteke.",
- "translate-js-summary": "Rezime:",
- "translate-js-save": "Sačuvaj",
- "translate-js-next": "Sačuvaj i otvori sledeću",
- "translate-js-skip": "Preskoči na sledeću",
- "translate-js-history": "Istorija prevoda",
- "translate-js-support": "Postavi pitanje",
- "translate-js-support-title": "Zatražite pomoć ako nemate dovoljno informacija za ispravan prevod ove poruke.",
"translate-js-support-unsaved-warning": "Imate nesačuvanih izmena.",
"translate-gs-pos": "Položaj",
"translate-gs-code": "Kôd",
diff --git a/MLEB/Translate/i18n/core/stq.json b/MLEB/Translate/i18n/core/stq.json
index 5b053bdb..71d31495 100644
--- a/MLEB/Translate/i18n/core/stq.json
+++ b/MLEB/Translate/i18n/core/stq.json
@@ -30,7 +30,6 @@
"translate-edit-contribute": "beoarbaidje",
"translate-edit-no-information": "''Disse Systemättergjucht häd noch neen Dokumentation. Wan du waast, wier un in wäkken Touhoopehong ju benutsed wäd, koast du uur Uursättere hälpe, deertruch dät du ne Dokumentation bietouföigest.''",
"translate-edit-information": "Information uur Systemättergjucht ($1)",
- "translate-edit-in-other-languages": "Systemättergjucht in uur Sproaken",
"translate-edit-warnings": "Woarskauenge uur uunfulboodige Uursättengen",
"translate-checks-parameters": "{{PLURAL:$2|Die foulgjende Parameter wäd|Do foulgjende Parametere wäide}} nit benutsed: <strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|Die foulgjende Parameter is|Do foulgjende Parametere sunt}} uunbekoand: <strong>$1</strong>",
diff --git a/MLEB/Translate/i18n/core/su.json b/MLEB/Translate/i18n/core/su.json
index 91cf2d7a..01b89b08 100644
--- a/MLEB/Translate/i18n/core/su.json
+++ b/MLEB/Translate/i18n/core/su.json
@@ -30,7 +30,6 @@
"translate-edit-contribute": "milu ngédit",
"translate-edit-no-information": "''Talatah ieu teu ngabogaan dokuméntasi. Lamun Anjeun nyaho di mana sarta kumaha talatah ieu dipaké, Anjeun bisa nulungan panarjamah séjén kalawan nambahan dokuméntasi pikeun talatah ieu.''",
"translate-edit-information": "Informasi ngeunaan talatah ieu \"$2\" ($1)",
- "translate-edit-in-other-languages": "Talatah \"$1\" dina basa séjén",
"translate-edit-warnings": "Panginget ngeunaan tarjamahan anu teu pepek",
"translate-edit-tmmatch": "$1% cocog",
"right-translate": "Édit migunakeun antarmuka panarjamah",
@@ -50,7 +49,6 @@
"translate-language-code-field-name": "Sandi basa:",
"translate-language": "Basa:",
"translate-total": "Talatah",
- "translate-save": "Simpen ($1)",
"translate-gs-code": "Sandi",
"translate-gs-continent": "Buana",
"translate-documentation-language": "Dokuméntasi talatah",
diff --git a/MLEB/Translate/i18n/core/sv.json b/MLEB/Translate/i18n/core/sv.json
index eabb02e6..c9e9a4d2 100644
--- a/MLEB/Translate/i18n/core/sv.json
+++ b/MLEB/Translate/i18n/core/sv.json
@@ -64,11 +64,9 @@
"translate-ignored": "(ignorerad)",
"translate-edit-title": "Redigera \"$1\"",
"translate-edit-definition": "Definition av meddelandet",
- "translate-edit-translation": "Översättning",
"translate-edit-contribute": "bidra",
"translate-edit-no-information": "<em>Det här meddelandet har ingen dokumentation.\nOm du vet var eller hur detta meddelande används, så kan du hjälpa andra översättare genom att skriva dokumentation för meddelandet.</em>",
"translate-edit-information": "Information om meddelandet ($1)",
- "translate-edit-in-other-languages": "Meddelandet på andra språk",
"translate-edit-warnings": "Varningar om fel i översättningen",
"translate-edit-tmmatch-source": "Källtext för översättning: $1",
"translate-edit-tmmatch": "$1&nbsp;% likhet",
@@ -126,7 +124,7 @@
"action-translate-groupreview": "ändra arbetsflödestillstånd för meddelandegrupper",
"translate-rcfilters-translations": "Översättningar",
"translate-rcfilters-translations-only-label": "Översättningar",
- "translate-rcfilters-translations-only-desc": "Ändringar på översätta sidor.",
+ "translate-rcfilters-translations-only-desc": "Ändringar på översatta sidor.",
"translate-rcfilters-translations-filter-label": "Inte översättningar",
"translate-rcfilters-translations-filter-desc": "Alla ändringar som inte är översättningar.",
"translate-rcfilters-translations-site-label": "Webbplatsmeddelanden",
@@ -162,6 +160,11 @@
"translate-statsf-language": "Kommaseparerad lista över språkkoder:",
"translate-statsf-group": "Kommaseparerad lista över gruppkoder:",
"translate-statsf-submit": "Förhandsgranska",
+ "translate-statsf-unknown-error": "Ett okänt fel har uppstått.",
+ "translate-statsf-error-message": "Ett fel uppstod när grafen lästes in: $1",
+ "translate-statsf-graph-alt-text-info": "Textalternativ för översättningsstatistiken finns i datatabellen nedan.",
+ "translate-statsf-alt-text": "Detta är textalternativet för översättningsstatistiken.",
+ "translate-statsf-embed": "Kod för att bädda in grafen för översättningsstatistik på andra sidor.",
"translate-tag-page-desc": "Översättning av wikisidan [[$2|$1]] från $3 ($4).",
"translate-sidebar-alltrans": "På andra språk",
"translations": "Alla översättningar",
@@ -207,8 +210,8 @@
"translate-mgs-totals": "Alla $1 {{PLURAL:$1|språk}} tillsammans",
"translate-mgs-invalid-group": "Den angivna gruppen $1 finns inte.",
"translate-mgs-nothing": "Inget att visa för begärd statistik.",
- "supportedlanguages": "Språk som stöds",
- "supportedlanguages-summary": "Den här sidan visar en lista över alla språk som stöds av {{SITENAME}},\ntillsammans med namnen på översättarna som arbetar på det språket.\nEn översättares namn visas större ju fler redigeringar översättaren har bidragit med.\nFärgen på en understrykning visar hur nyligen en översättare har varit aktiv här.",
+ "supportedlanguages": "Aktiva språk",
+ "supportedlanguages-summary": "Den här sidan visar en lista över aktiva språk på {{SITENAME}},\ntillsammans med namnen på översättarna som arbetar på det språket.\nEn översättares namn visas större ju fler redigeringar översättaren har bidragit med.\nFärgen på en understrykning visar hur nyligen en översättare har varit aktiv här.",
"supportedlanguages-colorlegend": "Färgförklaring: Senaste översättningen gjordes $1 dagar sedan.",
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -220,7 +223,6 @@
"translate-supportedlanguages-cached": "Denna information cachelagrades $1 sedan.",
"abusefilter-edit-builder-vars-translate-source-text": "Översättningsenhetens källtext",
"abusefilter-edit-builder-vars-translate-target-language": "Målspråk för översättning",
- "translate-save": "Publicera ($1)",
"translate-jssti-add": "Lägg till i listan",
"managemessagegroups": "Meddelandegruppshantering",
"translate-smg-notallowed": "Du har inte tillåtelse att utföra denna åtgärd",
@@ -241,6 +243,21 @@
"translate-smg-rename-rename": "Lägg till som namnbyte av...",
"translate-smg-rename-dialog-title": "Välj matchande namnbyte för $1",
"translate-smg-changeset-modified": "Ändringsuppsättningen har ändrats av en annan användare eller process. Dina ändringar har inte publicerats då de kanske skriver över dessa ändringar. Uppdatera sidan för att se de senaste ändringarna.",
+ "translate-smg-no-groups-in-sync": "Inga grupper synkroniseras för tillfället",
+ "translate-smg-strong-sync-help": "Hjälp",
+ "translate-smg-groups-in-sync": "Grupper som synkroniseras för tillfället",
+ "translate-smg-groups-in-sync-list": "Lista över grupper som bearbetas för tillfället i bakgrunden:",
+ "translate-smg-groups-with-error-title": "Grupper som har stött på fel under synkronisering",
+ "translate-smg-groups-with-error-desc": "Lista över grupper som har stött på fel under synkronisering",
+ "translate-smg-group-with-error-summary": "$1 {{PLURAL:$1|meddelande|meddelanden}} med fel:",
+ "translate-smg-group-message-action-history": "Historik",
+ "translate-smg-group-message-tag-outdated": "Föråldrad",
+ "translate-smg-group-message-tag-rename": "Byt namn",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Märke|Märken}}:",
+ "translate-smg-group-message-message-content": "Innehåll:",
+ "translate-smg-group-message-message-target": "Mål:",
+ "translate-smg-group-message-message-replacement": "Ersättning:",
+ "translate-smg-group-message-message-other-langs": "Andra språk:",
"translate-manage-import-diff": "Meddelande $1 | Åtgärder: $2",
"translate-manage-import-new": "Nytt meddelande $1",
"translate-manage-import-deleted": "Raderat meddelande $1",
@@ -262,6 +279,9 @@
"translate-manage-intro-other": "Nedan följer en lista över översättningsändringar på språket $1.\nVar god granska ändringarna och välj en åtgärd du vill utföra för varje uppdatering.\nOm du väljer att ignorera ändringar är denna handling endast tillfällig.",
"translate-manage-import-ok": "Importerad: $1",
"translate-manage-import-done": "Import klar!",
+ "translate-manage-empty-content": "Innehållet är tomt",
+ "translate-manage-key-reused": "Detta meddelande finns redan på wikin. Leta efter en oavsiktlig återanvändning av en gammal nyckel.",
+ "translate-manage-source-message-not-found": "Meddelandedefinition hittades inte",
"importtranslations": "Importera översättningar",
"translate-import-from-local": "Lokal filuppladdning:",
"translate-import-load": "Ladda fil",
@@ -271,13 +291,6 @@
"translate-import-err-no-such-file": "Fil <nowiki>$1</nowiki> finns inte, eller har inte laddats upp lokalt.",
"translate-import-err-stale-group": "Meddelandegruppen som den här filen tillhör finns inte.",
"translate-import-err-no-headers": "Filen är inte en välformerad Gettext-fil i översättnings-förlängningsformat:\nDet gick inte att bestämma grupp och språk från filhuvuden.",
- "translate-js-summary": "Sammanfattning:",
- "translate-js-save": "Publicera",
- "translate-js-next": "Publicera och öppna nästa",
- "translate-js-skip": "Hoppa över till nästa",
- "translate-js-history": "Översättningshistorik",
- "translate-js-support": "Ställ en fråga",
- "translate-js-support-title": "Fråga efter hjälp om det inte finns tillräckligt mycket information för att översätta detta meddelande korrekt.",
"translate-js-support-unsaved-warning": "Du har opublicerade översättningar.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kod",
@@ -310,7 +323,7 @@
"translate-workflow-autocreated-summary": "Automatisk skapande av sida för arbetsflödesstatus $1",
"translate-stats-workflow": "Tillstånd",
"translate-workflowgroup-label": "Arbetsflödesstatus",
- "translate-workflowgroup-desc": "Denna meddelandegrupp visar all arbetsflödesstatus för översättningar.\nAll status är definierad i konfigurationsvariabeln $wgTranslateWorkflowStates.",
+ "translate-workflowgroup-desc": "Denna meddelandegrupp visar alla arbetsflödesstatusar för översättningar.\nAlla statusar finns definierade i konfigurationsvariabeln $wgTranslateWorkflowStates.",
"translate-dynagroup-recent-label": "Senaste översättningar",
"translate-dynagroup-recent-desc": "Denna meddelandegrupp visar alla de senaste översättningar på detta språk.\nFrämst användbar för granskningsuppgifter.",
"translate-dynagroup-additions-label": "Senaste tillägg",
diff --git a/MLEB/Translate/i18n/core/sw.json b/MLEB/Translate/i18n/core/sw.json
index bd5ab7ed..3fa4bf3b 100644
--- a/MLEB/Translate/i18n/core/sw.json
+++ b/MLEB/Translate/i18n/core/sw.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Edwingudfriend",
"Kwisha",
"Lloffiwr",
"Stephenwanjau"
@@ -21,7 +22,6 @@
"translate-optional": "(ya hiari)",
"translate-ignored": "(imepuuzwa)",
"translate-edit-title": "Hariri \"$1\"",
- "translate-edit-translation": "Tafsiri",
"translate-edit-contribute": "changia",
"right-translate-messagereview": "Pitia hariri",
"translate-rc-translation-filter-no": "Usifanye kitu",
@@ -41,6 +41,8 @@
"translate-statsf-count": "Pima:",
"translate-statsf-count-edits": "Idadi ya hariri",
"translate-statsf-count-registrations": "Watumiaji wapya",
+ "translate-statsf-unknown-error": "Ilitokea hitilafu isiyojulikana.",
+ "translate-statsf-error-message": "Kulikuwa na hitilafu wakati wa kupakia grafu: $ 1",
"translate-sidebar-alltrans": "Katika lugha nyingine",
"translations": "Tafsiri zote",
"translate-translations-fieldset-title": "Ujumbe",
@@ -67,18 +69,11 @@
"translate-mgs-column-language": "Lugha",
"supportedlanguages-recenttranslations": "fasiri za hivi karibuni",
"supportedlanguages-count": "$1 {{PLURAL:$1|language|lugha}} kwa jumla.",
- "translate-save": "Hifadhi ($1)",
"translate-jssti-add": "Ongeza kwa orodha",
"translate-smg-right": "Mabadiliko yanayoingia",
"translate-manage-import-new": "Ujumbe mpya $1",
"translate-manage-action-ignore": "Puuza",
"translate-import-load": "Pakua faili",
- "translate-js-summary": "Muhtasari:",
- "translate-js-save": "Hifadhi",
- "translate-js-next": "Hifadhi na ufungue inayofuatia",
- "translate-js-skip": "Ruka hado unaofuatia",
- "translate-js-history": "Historia ya fasiri",
- "translate-js-support": "Uliza swali",
"translate-gs-code": "Msimbo",
"translate-gs-continent": "Bara",
"translate-gs-count": "Hesabu",
diff --git a/MLEB/Translate/i18n/core/szy.json b/MLEB/Translate/i18n/core/szy.json
index 5044055f..ac0ec870 100644
--- a/MLEB/Translate/i18n/core/szy.json
+++ b/MLEB/Translate/i18n/core/szy.json
@@ -6,7 +6,6 @@
"Tokoabibi"
]
},
- "translate-edit-translation": "mibelih",
"translate-export-form-format": "kese",
"translate-statsf-count-registrations": "baluhay misaungayay",
"translations": "sacahamin a belih nu kamu",
diff --git a/MLEB/Translate/i18n/core/ta.json b/MLEB/Translate/i18n/core/ta.json
index 640796ee..804a868a 100644
--- a/MLEB/Translate/i18n/core/ta.json
+++ b/MLEB/Translate/i18n/core/ta.json
@@ -48,11 +48,9 @@
"translate-ignored": "(புறக்கணிக்கப்பட்டது)",
"translate-edit-title": "\"$1\" -ஐ தொகுக்கவும்",
"translate-edit-definition": "தகவல் வரையறை",
- "translate-edit-translation": "மொழிபெயர்ப்பு",
"translate-edit-contribute": "பங்களி",
"translate-edit-no-information": "இச் செய்திக்கு ஆவணமாக்கல் ஏதும் இல்லை.\nஇச் செய்தி எங்கே எப்படிப் பயன்படுத்தப்படும் என்பது உங்களுக்குத் தெரியுமாயின் இதற்கு ஆவணமாக்கல் சேர்ப்பதன் மூலம் மற்ற மொழிபெயர்ப்பாளர்களுக்கு நீங்கள் உதவ முடியும்.",
"translate-edit-information": "தகவல் ($1) ஐப் பற்றிய குறிப்பு",
- "translate-edit-in-other-languages": "மற்ற மொழிகளில் தகவல்",
"translate-edit-warnings": "நிறைவுபெறாத மொழிபெயர்ப்புகளைப் பற்றிய எச்சரிக்கைகள்",
"translate-edit-tmmatch": "$1% பொருத்தம்",
"translate-edit-nopermission": "தகவல்களை மொழிபெயர்க்க உங்களுக்கு அனுமதி இருக்கவேண்டும்.",
@@ -127,7 +125,6 @@
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-recenttranslations": "அண்மைய மொழிபெயர்ப்புகள்",
"supportedlanguages-count": "மொத்தமாக $1 {{PLURAL:$1|மொழி|மொழிகள்}}.",
- "translate-save": "சேமி ($1)",
"translate-jssti-add": "பட்டியலில் சேர்",
"managemessagegroups": "தகவல் குழு மேலாண்மை",
"translate-smg-right": "உள்வரும் மாற்றங்கள்",
@@ -148,13 +145,6 @@
"translate-import-err-dl-failed": "கொண்டுவர இயலாத கோப்பு: $1",
"translate-import-err-ul-failed": "கோப்பு ஏற்றம் வெற்றியடையவில்லை",
"translate-import-err-invalid-title": "வழங்கப்பட்ட கோப்பின் பெயர் <nowiki>$1</nowiki> தவறானது.",
- "translate-js-summary": "சுருக்கம்:",
- "translate-js-save": "பதிப்பிடு",
- "translate-js-next": "பதிப்பிட்டு அடுத்ததைத் திறக்கவும்",
- "translate-js-skip": "அடுத்ததற்குத் தாண்டிச் செல்க",
- "translate-js-history": "மொழிபெயர்ப்பு வரலாறு",
- "translate-js-support": "கேள்வி கேள்",
- "translate-js-support-title": "இந்தத் தகவலை சரியாக மொழிபெயர்க்கத் தேவையான தகவல்கள் இல்லையெனில் உதவி கேட்கவும்.",
"translate-js-support-unsaved-warning": "நீங்கள் சேமிக்கப்படாத மொழிபெயர்ப்புகளைக் கொண்டுள்ளீர்கள்.",
"translate-gs-pos": "இடம்",
"translate-gs-code": "குறியீடு",
diff --git a/MLEB/Translate/i18n/core/tcy.json b/MLEB/Translate/i18n/core/tcy.json
index c92dc9ae..1238043b 100644
--- a/MLEB/Translate/i18n/core/tcy.json
+++ b/MLEB/Translate/i18n/core/tcy.json
@@ -18,7 +18,6 @@
"translate-next": "ಬೊಕ್ಕದ ಪುಟೊ",
"translate-prev": "ದುಂಬುದ ಪುಟೊ",
"translate-edit-contribute": "ಸಹಾಯ ಕೊರ್ಲೆ",
- "translate-edit-in-other-languages": "ಬೇತೆ ಬಾಸೆಲೆಡ್ ಸಂದೇಶೊ",
"translate-export-group-too-large": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಸಂದೇಸೊದ ಗುಂಪು ದಿಂಜ ಮಲ್ಲೆ ಆತ್ಂಡ್. ಗುಂಪು ೧ {{PLURAL: $ 1 | ಸಂದೇಸೊ | ಸಂದೇಸೊಲು}} ಡ್ದ್ ಕಡಮೆ ಇಪ್ಪುನ ಸಂದೇಸೊ ಗುಂಪುನು ನಾಡ್ ಅತ್ತಂಡ ಸಲಹೆಗಾದ್ ಅನುವಾದೊ ನಿರ್ವಾಹಕೆರೆನ್ ಸಂಪರ್ಕಿಸಲ.",
"translate-rc-translation-filter": "ತರ್ಜುಮೆದ ಅರಿಪೆ",
"translate-rc-translation-filter-no": "ದಾಲ ಮಲ್ಪೊಡ್ಚಿ",
@@ -50,7 +49,6 @@
"languagestats-recenttranslations": "ಇಂಚಿಪದ ಅನುವಾದೋಲು",
"translate-language": "ಬಾಸೆ",
"translate-total": "ಸಂದೇಶಲು",
- "translate-js-support": "ಪ್ರಶ್ನೆ ಕೇನ್‌ಲೆ",
"translate-gs-total": "ಒಟ್ಟು",
"translate-documentation-language": "ಸುದ್ದಿ ದಾಕಲೆ ಮಲ್ಪುನು",
"tux-languageselector": "ತರ್ಜುಮೆ ಮಲ್ಪೊಡಾಯಿನ ಬಾಸೆ",
diff --git a/MLEB/Translate/i18n/core/te.json b/MLEB/Translate/i18n/core/te.json
index ea224558..ee789b71 100644
--- a/MLEB/Translate/i18n/core/te.json
+++ b/MLEB/Translate/i18n/core/te.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "AVVK Chaitanya",
"Arjunaraoc",
"Chaduvari",
"Kiranmayee",
@@ -42,11 +43,9 @@
"translate-ignored": "(ఉపేక్షించినది)",
"translate-edit-title": "\"$1\"ని మార్చండి",
"translate-edit-definition": "సందేశ నిర్వచనం",
- "translate-edit-translation": "అనువాదం",
"translate-edit-contribute": "తోడ్పడండి",
"translate-edit-no-information": "<em>ఈ సందేశానికి డాక్యుమెంటేషను లేదు. \nఈ సందేశాన్ని ఎక్కడ లేదా ఎలా ఉపయోగిస్తారో మీకు తెలిస్తే, దీనికి ఆ సమాచారాన్ని చేర్చి ఇతర అనువాదకులకు తోడ్పడవచ్చు.</em>",
"translate-edit-information": "సందేశం గురించి సమాచారం ($1)",
- "translate-edit-in-other-languages": "ఇతర భాషలలో సందేశం",
"translate-edit-warnings": "అసంపూర్తి అనువాదాల గురించి హెచ్చరికలు",
"translate-edit-tmmatch-source": "మూలకోశ అనువాదం: $1",
"translate-edit-tmmatch": "$1% పోలిక",
@@ -137,13 +136,23 @@
"translate-mgs-submit": "గణాంకాలను చూపించు",
"translate-mgs-column-language": "భాష",
"translate-mgs-totals": "అన్ని భాషలు కలిపి",
- "supportedlanguages": "తోడ్పాటు ఉన్న భాషలు",
+ "supportedlanguages": "క్రియాశీల భాషలు",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|అనువాదకుడు|అనువాదకురాలు}}|అనువాదకులు}}: $1",
"supportedlanguages-recenttranslations": "ఇటీవలి అనువాదాలు",
"supportedlanguages-count": "మొత్తం $1 {{PLURAL:$1|భాష|భాషలు}}.",
- "translate-save": "ప్రచురించు ($1)",
"translate-jssti-add": "జాబితాకి చేర్చు",
"managemessagegroups": "సందేశ గుంపుల నిర్వహణ",
+ "translate-smg-groups-with-error-title": "కలిసి చేయడంలో ఇబ్బందులు ఎదుర్కొన్న గుంపులు/సమూహాలు",
+ "translate-smg-groups-with-error-desc": "కలిసి చేయడంలో ఇబ్బందులు ఎదుర్కొన్న సమూహాల జాబితా",
+ "translate-smg-group-with-error-summary": "$1 {{బహువచనం:$1|సందేశం|సందేశాలు}} తప్పులతో:",
+ "translate-smg-group-message-action-history": "చరిత్ర",
+ "translate-smg-group-message-tag-outdated": "కాలం చెల్లినది లేదా పాతది",
+ "translate-smg-group-message-tag-rename": "పేరు మార్చు",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|ట్యాగు|ట్యాగులు}}:",
+ "translate-smg-group-message-message-content": "సమాచారం లేదా అంశం లేదా విషయం లేదా సంగతి లేదా వివరం",
+ "translate-smg-group-message-message-target": "లక్ష్యం:",
+ "translate-smg-group-message-message-replacement": "పునఃస్థాపన లేదా పునః ప్రతిష్ఠ",
+ "translate-smg-group-message-message-other-langs": "ఇతర భాషలు:",
"translate-manage-import-diff": "సందేశం $1 | చర్యలు: $2",
"translate-manage-import-new": "కొత్త సందేశం $1",
"translate-manage-import-deleted": "సందేశం $1ని తొలగించారు",
@@ -153,13 +162,6 @@
"importtranslations": "అనువాదాల దిగుమతి",
"translate-import-from-local": "స్థానిక దస్త్రపు ఎక్కింపు:",
"translate-import-err-ul-failed": "దస్త్రపు ఎక్కింపు విఫలమైంది",
- "translate-js-summary": "సారాంశం:",
- "translate-js-save": "ప్రచురించు",
- "translate-js-next": "ప్రచురించి, తర్వాతది తెరువు",
- "translate-js-skip": "వదిలేసి తర్వాతి దానికి వెళ్ళు",
- "translate-js-history": "అనువాద చరిత్ర",
- "translate-js-support": "సందేహముంటే అడగండి",
- "translate-js-support-title": "ఈ సందేశాన్ని సరిగ్గా అనువదించేందుకు అవసరమైన సమాచారం సరిపడా లేకపోతే సాయం కోసం అడగండి",
"translate-gs-pos": "స్ధానం",
"translate-gs-code": "సంకేతం",
"translate-gs-continent": "ఖండం",
diff --git a/MLEB/Translate/i18n/core/tet.json b/MLEB/Translate/i18n/core/tet.json
index 07ec0729..65988afd 100644
--- a/MLEB/Translate/i18n/core/tet.json
+++ b/MLEB/Translate/i18n/core/tet.json
@@ -16,8 +16,6 @@
"translate-page-description-legend": "Informasaun kona-ba grupu",
"translate-page-edit": "edita",
"translate-edit-title": "Edita \"$1\"",
- "translate-edit-translation": "Tradusaun",
- "translate-edit-in-other-languages": "Mensajen iha lian seluk",
"translate-stats-edits": "Edisaun sira",
"translate-language": "Lian",
"translate-searchprofile": "Tradusaun sira"
diff --git a/MLEB/Translate/i18n/core/tg-cyrl.json b/MLEB/Translate/i18n/core/tg-cyrl.json
index d1655488..3332e755 100644
--- a/MLEB/Translate/i18n/core/tg-cyrl.json
+++ b/MLEB/Translate/i18n/core/tg-cyrl.json
@@ -30,7 +30,6 @@
"translate-edit-contribute": "ҳиссагузорӣ",
"translate-edit-no-information": "''Ин пайғом дорои тавзеҳот нест.\nАгар шумо медонед ин пағом чигуна ё дар куҷо истифода мешавад, шумо метавонед бо изофа кардани тавзеҳот ба ин пайғом ба дигар тарҷумакунандагон кӯмак кунед.''",
"translate-edit-information": "Иттилоот дар мавриди ин пайғом ($1)",
- "translate-edit-in-other-languages": "Ҳамин пайғом дар дигар забонҳо",
"translate-edit-warnings": "Ҳушдор дар мавриди тарҷумаҳои нокомил",
"translate-checks-parameters": "Параметрҳои зерин истифода нашудаанд: <strong>$1</strong>",
"translationstats": "Омори тарҷумаҳо",
@@ -93,14 +92,7 @@
"supportedlanguages-recenttranslations": "тарҷумаҳои тоза",
"supportedlanguages-count": "Тамоми $1 {{PLURAL:$1|забон}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|вироиш|вироишот}} - охирон вироиш $3 {{PLURAL:$3|рӯз}} пеш",
- "translate-save": "Захира ($1)",
"translate-jssti-add": "Ба рӯйхат илова намудпн",
- "translate-js-summary": "Сумма:",
- "translate-js-save": "Захира",
- "translate-js-next": "Захира ва кушодани матн",
- "translate-js-skip": "Ба дигараш гузаштан",
- "translate-js-history": "Таърихи тарҷума",
- "translate-js-support": "Савол додан",
"translate-gs-pos": "Тараф",
"translate-gs-code": "Рамз",
"translate-gs-continent": "Қитъа",
diff --git a/MLEB/Translate/i18n/core/th.json b/MLEB/Translate/i18n/core/th.json
index 74e5477c..26bde8e3 100644
--- a/MLEB/Translate/i18n/core/th.json
+++ b/MLEB/Translate/i18n/core/th.json
@@ -3,6 +3,7 @@
"authors": [
"Aefgh39622",
"Ans",
+ "Bebiezaza",
"Geonuch",
"Horus",
"Manop",
@@ -46,11 +47,9 @@
"translate-ignored": "(เพิกเฉย)",
"translate-edit-title": "แก้ไข \"$1\"",
"translate-edit-definition": "นิยามข้อความต้นฉบับ",
- "translate-edit-translation": "การแปล",
"translate-edit-contribute": "ช่วยเขียน",
"translate-edit-no-information": "<em>ข้อความนี้ไม่มีคำอธิบายการใช้งาน\nถ้าคุณทราบว่าข้อความนี้ใช้ตรงส่วนไหนหรือใช้อย่างไร คุณสามารถช่วยเพิ่มคำอธิบายการใช้งานของข้อความนี้ เพื่อเป็นประโยชน์แก่ผู้แปลคนอื่นได้</em>",
"translate-edit-information": "ข้อมูลเกี่ยวกับข้อความ ($1)",
- "translate-edit-in-other-languages": "ข้อความในภาษาอื่น ๆ",
"translate-edit-warnings": "คำเตือนเกี่ยวกับคำแปลที่ยังไม่สมบูรณ์หรือมีปัญหา",
"translate-edit-tmmatch-source": "ข้อความต้นทางการแปล: $1",
"translate-edit-tmmatch": "ตรงกัน $1%",
@@ -172,7 +171,7 @@
"translate-mgs-totals": "รวมทั้งหมด $1 {{PLURAL:$1|ภาษา}}",
"translate-mgs-invalid-group": "กลุ่ม $1 ที่ระบุไม่มีอยู่",
"translate-mgs-nothing": "ไม่มีอะไรที่จะแสดงสำหรับสถิติที่ร้องขอ",
- "supportedlanguages": "ภาษาที่รองรับ",
+ "supportedlanguages": "ภาษาที่มีการใช้งาน",
"supportedlanguages-summary": "หน้านี้แสดงรายการภาษาทั้งหมดที่ {{SITENAME}} รองรับ\nพร้อมชื่อผู้แปลที่ีทำงานแปลภาษานั้นๆ\nโดยชื่อผู้แปลจะปรากฏเป็นขนาดใหญ่ ถ้าผู้แปลคนนั้นร่วมแปลมาก\nสีขีดเส้นใต้บ่งบอกว่าผู้แปลได้ทำงานที่้นี่ครั้งล่าสุดเมื่อใด",
"supportedlanguages-colorlegend": "คำอธิบายสี: แปลครั้งล่าสุดเมื่อ $1 วันที่ผ่านมา",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|ผู้แปล}}|ผู้แปล}}: คุณ $1",
@@ -180,7 +179,6 @@
"supportedlanguages-count": "รวมทั้งหมด $1 {{PLURAL:$1|ภาษา}}",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|การแก้ไข}} - แก้ไขล่าสุดเมื่อ $3 {{PLURAL:$3|วัน}}ที่ผ่านมา",
"abusefilter-edit-builder-vars-translate-source-text": "ข้อความต้นทางของหน่วยการแปล",
- "translate-save": "บันทึก ($1)",
"translate-jssti-add": "เพิ่มลงในรายชื่อ",
"managemessagegroups": "การจัดการกลุ่มภาษา",
"translate-smg-notallowed": "คุณไม่ได้รับอนุญาตให้ดำเนินการนี้",
@@ -190,6 +188,13 @@
"translate-smg-more": "จะมีการเปลี่ยนแปลงที่จะประมวลผลเพิ่มเติมหลังจากที่ส่งการเปลี่ยนแปลงเหล่านี้แล้ว",
"translate-smg-left": "เนื้อหาข้อความในวิกิ",
"translate-smg-right": "การเปลี่ยนแปลงที่ใกล้จะมาถึง",
+ "translate-smg-rename-select": "เลือก",
+ "translate-smg-rename-cancel": "ยกเลิก",
+ "translate-smg-group-message-action-history": "ประวัติ",
+ "translate-smg-group-message-tag-outdated": "ล้าสมัย",
+ "translate-smg-group-message-tag-rename": "เปลี่ยนชื่อ",
+ "translate-smg-group-message-message-content": "เนื้อหา:",
+ "translate-smg-group-message-message-other-langs": "ภาษาอื่น ๆ:",
"translate-manage-import-diff": "ข้อความ $1 | การกระทำ: $2",
"translate-manage-import-new": "ข้อความใหม่ $1",
"translate-manage-import-deleted": "ข้อความที่ลบแล้ว $1",
@@ -197,8 +202,10 @@
"translate-manage-action-conflict": "นำเข้าและทำเครื่องหมายว่าคลุมเครือ",
"translate-manage-action-ignore": "ละเว้น",
"translate-manage-action-fuzzy": "นำเข้าและทำเครื่องหมายว่าการแปลคลุมเครือ",
+ "translate-manage-action-rename": "เปลี่ยนชื่อ",
"translate-manage-nochanges": "ไม่มีการเปลี่ยนแปลงในนิยามข้อความสำหรับกลุ่มนี้",
"translate-manage-nochanges-other": "ไม่มีการเปลี่ยนแปลงใดๆ สำหรับภาษานี้\nใช้ลิงก์ด้านล่างเพื่อกลับไปใช้มุมมองรายละเอียดกลุ่ม",
+ "translate-manage-inconsistent": "ลบความไม่สม่ำเสมอในคำขอแล้ว\nโปรดตรวจสอบการเปลี่ยนแปลงแล้วลองอีกครั้ง\nรายละเอียด: $1",
"translate-manage-toolong": "หมดเวลาการประมวลผลสูงสุด $1 {{PLURAL:$1|วินาที}}แล้ว\nโปรดส่งแบบฟอร์มใหม่เพื่อดำเนินการประมวลผลต่อไป",
"translate-manage-import-summary": "กำลังนำเข้ารุ่นใหม่จากแหล่งข้อมูลภายนอก",
"translate-manage-conflict-summary": "กำลังนำเข้ารุ่นใหม่จากแหล่งข้อมูลภายนอก\nโปรดตรวจสอบ",
@@ -215,19 +222,14 @@
"translate-import-err-no-such-file": "ไม่ปรากฎไฟล์ <nowiki>$1</nowiki> หรือไฟล์นี้ไม่ได้ถูกอัพโหลดเข้ามา",
"translate-import-err-stale-group": "ไฟล์ที่เป็นสมาชิกของกลุ่มข้อความนี้ไม่มีอยู่",
"translate-import-err-no-headers": "ไฟล์นี้ไม่ใช่ไฟล์ Gettext ในส่วนเพิ่มเติมการแปลภาษาที่ดี:\n<br />ไม่สามารถกำหนดกลุ่มและภาษาจากส่วนต้นของไฟล์ได้",
- "translate-js-summary": "สรุป:",
- "translate-js-save": "บันทึก",
- "translate-js-next": "บันทึกและแปลต่อ",
- "translate-js-skip": "ข้าม",
- "translate-js-history": "ประวัติการแปล",
- "translate-js-support": "ถามคำถาม",
- "translate-js-support-title": "ขอความช่วยเหลือ ถ้ามีข้อมูลไม่เพียงพอที่จะแปลข้อความนี้ให้ถูกต้อง",
- "translate-js-support-unsaved-warning": "คุณมีการแปลที่ยังไม่ได้บันทึก",
+ "translate-js-support-unsaved-warning": "คุณมีการแปลที่ยังไม่ได้เผยแพร่",
"translate-gs-pos": "ตำแหน่ง",
"translate-gs-code": "รหัส",
"translate-gs-continent": "ทวีป",
"translate-gs-speakers": "จำนวนผู้ใช้",
"translate-gs-score": "คะแนน",
+ "translate-gs-multiple": "หลายทวีป",
+ "translate-gs-count": "จำนวน",
"translate-gs-total": "รวม",
"translate-gs-avgscore": "คะแนนเฉลี่ย",
"translate-documentation-language": "เอกสารกำกับสาร",
@@ -242,8 +244,10 @@
"logentry-translationreview-group": "$1 {{GENDER:$2|เปลี่ยน}}สถานะการแปลภาษา$4ของหน้า $3 จาก $6 เป็น $7",
"group-translate-sandboxed": "ผู้แปลที่ยังไม่ได้อนุมัติ",
"group-translate-sandboxed-member": "{{GENDER:$1|ผู้แปลที่ยังไม่ได้อนุมัติ}}",
- "right-translate-sandboxmanage": "จัดการผู้ใช้แบบ Sandbox",
- "action-translate-sandboxmanage": "จัดการผู้ใช้แบบ sandbox",
+ "right-translate-sandboxmanage": "จัดการผู้ใช้แบบแซนด์บอกซ์",
+ "action-translate-sandboxmanage": "จัดการผู้ใช้แบบแซนด์บอกซ์",
+ "right-translate-sandboxaction": "ดำเนินการการกระทำที่อนุญาตสำหรับผู้ใช้แบบแซนด์บอกซ์",
+ "action-translate-sandboxaction": "ดำเนินการการกระทำที่อนุญาตสำหรับผู้ใช้แบบแซนด์บอกซ์",
"translate-workflow-state-": "(ไม่ได้ตั้งค่า)",
"translate-workflowstatus": "สถานะ: $1",
"translate-workflow-set-doing": "กำลังตั้งค่า...",
@@ -347,5 +351,7 @@
"translate-statsbar-tooltip": "แปลแล้ว $1%, ตรวจทานแล้ว $2%",
"translate-statsbar-tooltip-with-fuzzy": "แปลแล้ว $1%, ตรวจทานแล้ว $2%, ล้าสมัย $3%",
"translate-search-more-groups-info": "$1 {{PLURAL:$1|กลุ่ม}}เพิ่มเติม",
- "tux-nojs": "เครื่องมือนี้ไม่สามารถทำงานได้โดยไม่มี JavaScript JavaScript อาจถูกปิดใช้งาน ไม่สามารถทำงานได้ หรือเบราว์เซอร์นี้ไม่รองรับ"
+ "translate-syntax-error": "การแปลมีข้อผิดพลาดไวยากรณ์",
+ "tux-nojs": "เครื่องมือนี้ไม่สามารถทำงานได้โดยไม่มี JavaScript JavaScript อาจถูกปิดใช้งาน ไม่สามารถทำงานได้ หรือเบราว์เซอร์นี้ไม่รองรับ",
+ "specialpages-group-translation": "การแปล"
}
diff --git a/MLEB/Translate/i18n/core/ti.json b/MLEB/Translate/i18n/core/ti.json
index 9d1f8ea2..5ec8d5f9 100644
--- a/MLEB/Translate/i18n/core/ti.json
+++ b/MLEB/Translate/i18n/core/ti.json
@@ -4,81 +4,131 @@
"Joanmp17"
]
},
- "translate": "ተርጎመ",
- "translate-extensionname": "ተርጎመ",
- "translate-taction-translate": "ተርጎመ",
- "translate-taction-proofread": "ገምገመ",
+ "translate": "ተርጉም",
+ "translate-extensionname": "ተርጉም",
+ "translate-taction-translate": "ተርጉም",
+ "translate-taction-proofread": "ገምግም",
"translate-taction-lstats": "ናይ ቋንቋ ስታቲስቲክስ",
- "translate-taction-mstats": "ናይ መልእክትታት ጉጅለ ስታቲስቲክስ",
+ "translate-taction-mstats": "ናይ መልእኽትታት ጉጅለ ስታቲስቲክስ",
"translate-taction-export": "ስደድ",
"translate-page-settings-legend": "ኣቀማምጣታት",
"translate-page-group": "ጉጅለ",
"translate-page-language": "ቋንቋ",
"translate-page-limit": "ወሰን",
- "translate-submit": "ኣምጽአ",
+ "translate-submit": "ኣምጽእ",
"translate-page-navigation-legend": "መዳህሰስ",
"translate-next": "ዝቕጽል ገጽ",
"translate-prev": "ዝቐደመ ገጽ",
- "translate-page-edit": "ኣተዓራረየ",
- "translate-edit-title": "«$1» ኣተዓራረየ",
- "translate-edit-translation": "ትርጉም",
- "translate-edit-contribute": "ኣበርከተ",
+ "translate-page-edit": "ኣመዓራርይ",
+ "translate-optional": "(ኣማራጽያዊ)",
+ "translate-edit-title": "«$1» ኣመዓራርይ",
+ "translate-edit-contribute": "ኣበርክት",
+ "right-translate-messagereview": "ትርጉማት ገምግም",
"translate-rcfilters-translations": "ትርጉማት",
"translate-rcfilters-translations-only-label": "ትርጉማት",
+ "translate-rc-translation-filter": "ትርጉማት ኣጻርይ፦",
+ "translate-rc-translation-filter-no": "ወላሓደ ነገር ኣይትግበር",
+ "translate-stats-edits": "ምምዕርራያት",
"translate-stats-users": "ተርጎምቲ",
+ "translate-stats-registrations": "ምዝገባታት",
+ "translate-stats-reviews": "ገምጋማት",
+ "translate-statsf-scale-months": "ኣዋርሕ",
+ "translate-statsf-scale-weeks": "ሰሙናት",
+ "translate-statsf-scale-days": "መዓልታት",
+ "translate-statsf-scale-hours": "ሰዓታት",
"translate-statsf-count": "ለኪዑ:",
"translate-statsf-submit": "ኣቐደሚ ትርኢት",
- "translate-sidebar-alltrans": "ብካልኦት ቋንቋታት",
- "translations": "ኩሉ ትርጉማት",
+ "translate-sidebar-alltrans": "ኣብ ካልኦት ቋንቋታት",
+ "translations": "ኩሎም ትርጉማት",
+ "translate-translations-count": "{{PLURAL:$1|ሓደ ትርጉም ዝተረኸበ|$1 ትርጉማት ዝተረኸቡ}}።",
"translate-translations-fieldset-title": "መልእኽቲ",
"translate-translations-messagename": "ሽም፦",
- "translate-translations-project": "ፕሮጀክት፥",
+ "translate-translations-project": "ፕሮጀክት፦",
"translate-translations-history-short": "ታ",
"languagestats": "ናይ ቋንቋ ስታቲስቲክስ",
"translate-langstats-expand": "ዘርግሕ",
"translate-langstats-collapse": "ኣክብ",
+ "translate-langstats-expandall": "ኩሉ ዘርግሕ",
+ "translate-langstats-collapseall": "ኩሉ ኣክብ",
"translate-language-code": "ናይ ቋንቋ ኮድ",
- "translate-language-code-field-name": "ናይ ቋንቋ ኮድ፥",
+ "translate-language-code-field-name": "ናይ ቋንቋ ኮድ፦",
"translate-language": "ቋንቋ",
- "translate-total": "መልእክትታት",
+ "translate-total": "መልእኽትታት",
+ "translate-untranslated": "ዘይተተርጎሙ",
+ "translate-percentage-proofread": "ዝተገምገመ",
"translate-ls-submit": "ስታቲስቲክስ ኣርእይ",
+ "translate-ls-column-group": "ጉጅለ መልእኽቲ",
+ "translate-mgs-group": "ጉጅለ መልእኽትታት፦",
"translate-mgs-submit": "ስታቲስቲክስ ኣርእይ",
"translate-mgs-column-language": "ቋንቋ",
- "translate-save": "ኣቐምጥ ($1)",
+ "supportedlanguages": "ዝድገፉ ቋንቋታት",
"translate-smg-rename-select": "ምረጽ",
"translate-smg-rename-cancel": "ኣትርፍ",
+ "translate-smg-strong-sync-help": "ሓገዝ",
+ "translate-manage-import-diff": "መልእኽቲ $1 | ተግባራት፦ $2",
"translate-manage-import-new": "ሓድሽ መልእኽቲ $1",
- "translate-manage-action-rename": "ደጊምኸ ስም ሃብ",
- "translate-js-summary": "መጠቓለሊ፥",
- "translate-js-save": "ኣቐምጥ",
+ "translate-manage-action-rename": "ዳግም ሰይም",
"translate-gs-code": "ኮድ",
+ "translate-gs-speakers": "ተዛረብቲ",
+ "translate-documentation-language": "ምስናድ መልእኽቲ",
"translate-searchprofile": "ትርጉማት",
- "translate-msggroupselector-search-all": "ኩሉ",
- "tux-languageselector": "ተርጎመ ናብ",
- "tux-tab-all": "ኩሉ",
- "tux-tab-translated": "ዝተተርጎመ",
- "tux-edit": "ኣተዓራረየ",
+ "translate-search-languagefilter": "ብቋንቋ ኣጻርይ፦",
+ "translate-msggroupselector-search-placeholder": "ጉጅለታት ድለይ",
+ "translate-msggroupselector-search-all": "ኩሎም",
+ "translate-msggroupselector-search-recent": "ናይ ቀረባ ግዜ",
+ "tux-languageselector": "ተርጉም ናብ",
+ "tux-tab-all": "ኩሎም",
+ "tux-tab-untranslated": "ዘይተተርጎሙ",
+ "tux-tab-translated": "ዝተተርጎሙ",
+ "tux-edit": "ኣመዓራርይ",
+ "tux-status-optional": "ኣማራጽያዊ",
+ "tux-status-proofread": "ዝተገምገመ",
"tux-status-translated": "ዝተተርጎመ",
- "tux-status-saving": "የቐምጥ ኣሎ...",
+ "tux-status-saving": "ይሓትም ኣሎ...",
"tux-editor-placeholder": "ትርጉምካ",
- "tux-editor-save-button-label": "ትርጉም ኣቐምጥ",
+ "tux-editor-editsummary-placeholder": "ኣማራጽያዊ መጠቓለሊ",
+ "tux-editor-paste-original-button-label": "ናይ ምንጪ ጽሑፍ ለጥፍ",
+ "tux-editor-discard-changes-button-label": "ለውጥታት ኣወግድ",
+ "tux-editor-save-button-label": "ትርጉም ኣሕትም",
"tux-editor-cancel-button-label": "ኣትርፍ",
+ "tux-editor-confirm-button-label": "ትርጉም ኣረጋግጽ",
+ "tux-editor-proofread-button-label": "ከም ዝተገምገመ ኣመልክት",
"tux-editor-suggestions-title": "ምኽርታት",
- "tux-notices-hide": "ከውል",
- "tux-editor-proofreading-mode": "ገምገመ",
+ "tux-editor-in-other-languages": "ኣብ ካልኦት ቋንቋታት",
+ "tux-editor-need-more-help": "ተወሳኺ ሓገዝ ትደሊ ዶ?",
+ "tux-notices-more": "{{PLURAL:$1|$1 ተወሳኺ|$1 ተወሰኽቲ}}",
+ "tux-notices-hide": "ሕባእ",
+ "tux-editor-message-desc-more": "ተወሳኺ ርኣይ",
+ "tux-editor-message-desc-less": "ውሑድ ርኣይ",
+ "tux-editor-clear-translated": "ዝተተርጎሙ ሕባእ",
+ "tux-editor-proofreading-mode": "ገምግም",
"tux-editor-translate-mode": "ዝርዝር",
- "tux-proofread-edit-label": "ኣተዓራረየ",
+ "tux-proofread-action-tooltip": "ከም ዝተገምገመ ኣመልክት",
+ "tux-proofread-edit-label": "ኣመዓራርይ",
"tux-editor-page-mode": "ገጽ",
- "tux-editor-doc-editor-save": "ምስናድ ኣቐምጥ",
+ "tux-editor-doc-editor-placeholder": "ምስናድ መልእኽቲ",
+ "tux-editor-doc-editor-save": "ምስናድ ኣሕትም",
"tux-editor-doc-editor-cancel": "ኣትርፍ",
- "tux-message-filter-advanced-button": "ብሉጽ ምድላይ",
- "tux-empty-list-translated-action": "ተርጎመ",
+ "tux-messagetable-loading-messages": "{{PLURAL:$1|መልእኽቲ|መልእኽትታት}} ኣብ ምጽዓን...",
+ "tux-message-filter-placeholder": "ዝርዝር ኣጻርይ",
+ "tux-message-filter-result": "ን«$2» {{PLURAL:$1|$1 ውጽኢት ዝተረኸበ|$1 ውጺኢታት ዝተረኸቡ}}",
+ "tux-message-filter-advanced-button": "ዝማዕበለ ምድላይ",
+ "tux-message-filter-optional-messages-label": "ኣማራጽያዊ መልእኽትታት",
+ "tux-proofread-translated-by-self": "ብንስኻ ዝተተርጎመ",
+ "tux-empty-list-translated-action": "ተርጉም",
+ "tux-empty-nothing-to-proofread": "ንምግምጋም ወላሓደ ነገር የለን",
+ "tux-empty-list-other": "ንምትርጓም ወላሓደ ነገር የለን",
+ "tux-empty-list-other-action": "ትርጉማት ገምግም",
+ "tux-empty-list-other-link": "ኩሎም መልእኽትታት ኣርእይ",
"tux-editor-close-tooltip": "ዕጸው",
"tux-editor-expand-tooltip": "ዘርግሕ",
"tux-editor-collapse-tooltip": "ኣክብ",
"tux-editor-message-tools-history": "ታሪኽ",
- "tux-editor-message-tools-delete": "ሰረዘ",
- "tux-editor-message-tools-translations": "ኩሉ ትርጉማት",
+ "tux-editor-message-tools-delete": "ሰርዝ",
+ "tux-editor-message-tools-translations": "ኩሎም ትርጉማት",
"tux-editor-loading": "ይጽዕን ኣሎ...",
+ "translate-search-more-languages-info": "{{PLURAL:$1|$1 ተወሳኺ|$1 ተወሰኽቲ}} {{PLURAL:$1|ቋንቋ|ቋንቋታት}}",
+ "translate-statsbar-tooltip": "$1% ዝተተርጎመ፣ $2% ዝተገምገመ",
+ "translate-search-more-groups-info": "{{PLURAL:$1|$1 ተወሳኺ|$1 ተወሰኽቲ}} {{PLURAL:$1|ጉጅለ|ጉጅለታት}}",
"specialpages-group-translation": "ትርጉም"
}
diff --git a/MLEB/Translate/i18n/core/tk.json b/MLEB/Translate/i18n/core/tk.json
index 65e2e147..2a9237de 100644
--- a/MLEB/Translate/i18n/core/tk.json
+++ b/MLEB/Translate/i18n/core/tk.json
@@ -25,7 +25,6 @@
"translate-edit-contribute": "goşant goş",
"translate-edit-no-information": "''Bu habarlaşygyň düşündirişi ýok.\nEger-de bu habarlaşygyň nirede we nähili ulanylýandygyny bilýän bolsaňyz, onda bu habarlaşyga düşündiriş ýazmak arkaly beýleki terjimeçilere kömek edip bilersiňiz.''",
"translate-edit-information": "\"$2\" habarlaşygy hakda maglumat ($1)",
- "translate-edit-in-other-languages": "Beýleki dillerde \"$1\" habarlaşygy",
"translate-stats-users": "Terjimeçiler",
"translate-statsf-submit": "Deslapky syn",
"translate-sidebar-alltrans": "Başga dillerde",
@@ -40,6 +39,5 @@
"translate-total": "Habarlaşyklar",
"translate-untranslated": "Terjime edilmedik",
"translate-percentage-complete": "Ýerine ýetirilen",
- "translate-percentage-fuzzy": "Möwriti geçen",
- "translate-save": "Ýazdyr ($1)"
+ "translate-percentage-fuzzy": "Möwriti geçen"
}
diff --git a/MLEB/Translate/i18n/core/tl.json b/MLEB/Translate/i18n/core/tl.json
index 3afe9750..168b9219 100644
--- a/MLEB/Translate/i18n/core/tl.json
+++ b/MLEB/Translate/i18n/core/tl.json
@@ -41,11 +41,9 @@
"translate-ignored": "(binalewala)",
"translate-edit-title": "Baguhin ang \"$1\"",
"translate-edit-definition": "Kahulugan ng mensahe",
- "translate-edit-translation": "Salinwika",
"translate-edit-contribute": "magambag",
"translate-edit-no-information": "''Walang kasulatan ang mensaheng ito.\nKung alam mo kung saan o paano ginagamit ang mensaheng ito, makakatulong ka sa iba pang mga tagapagsalinwika sa pamamagitan ng pagdaragdag ng kasulatan sa mensaheng ito.''",
"translate-edit-information": "Kabatiran hinggil sa mensahe ($1)",
- "translate-edit-in-other-languages": "Mensahe na nasa ibang mga wika",
"translate-edit-warnings": "Mga babala hinggil sa hindi pa ganap na mga salinwika",
"translate-edit-tmmatch-source": "Teksto ng pinagmulan ng salinwika: $1",
"translate-edit-tmmatch": "$1% tumugma",
@@ -158,7 +156,6 @@
"supportedlanguages-recenttranslations": "kamakailang mga pagsasalinwika",
"supportedlanguages-count": "$1 {{PLURAL:$1|wika|mga wika}} sa kabuoan.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|pagbabago|mga pagbabago}} - huling pagbago $3 {{PLURAL:$3|araw|mga araw}} na ang nakalilipas",
- "translate-save": "Sagipin ($1)",
"translate-jssti-add": "Idagdag sa talaan",
"managemessagegroups": "Pamamahala ng pangkat ng mensahe",
"translate-smg-notallowed": "Hindi ka pinapahintulutang isakatuparan ang galaw na ito.",
@@ -193,13 +190,6 @@
"translate-import-err-no-such-file": "Hindi umiiral o hindi pa naikakargang nakaukol dito ang talaksang <nowiki>$1</nowiki>.",
"translate-import-err-stale-group": "Hindi umiiral ang pangkat ng mensahe na kinaaaniban ng talaksang ito.",
"translate-import-err-no-headers": "Ang talaksang ay isang hindi isang talaksang Gettext may mabuting anyo na pangkaanyuhang dugtong na Isalinwika:\nHindi natukoy ang pangkat at wika mula sa mga paulo ng talaksan.",
- "translate-js-summary": "Buod:",
- "translate-js-save": "Itala",
- "translate-js-next": "Susunod na sasagipin at bubuksan",
- "translate-js-skip": "Lumaktaw papunta sa susunod",
- "translate-js-history": "Kasaysayan ng salinwika",
- "translate-js-support": "Itanong ang katanungan",
- "translate-js-support-title": "Humingi ng tulong kung walang sapat na kabatiran upang maisalinwika ng wasto ang mensaheng ito.",
"translate-js-support-unsaved-warning": "Mayroon kang mga salinwikang hindi pa nasasagip.",
"translate-gs-pos": "Pos.",
"translate-gs-code": "Kodigo",
diff --git a/MLEB/Translate/i18n/core/tly.json b/MLEB/Translate/i18n/core/tly.json
index fa8f7c80..715d6786 100644
--- a/MLEB/Translate/i18n/core/tly.json
+++ b/MLEB/Translate/i18n/core/tly.json
@@ -1,23 +1,40 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"Erdemaslancan",
"Patriot Kur",
+ "QeneralĞasım",
"Гусейн"
]
},
- "translate": "Пегордынијеј",
- "translate-page-settings-legend": "Кукон",
+ "translate": "Peqordıniyey",
+ "translate-page-settings-legend": "Nizamon",
"translate-page-language": "Zıvon",
- "translate-next": "Пешонә сәһифә",
+ "translate-next": "Peşonə səhifə",
"translate-page-edit": "dəqiş karde",
"translate-edit-title": "Dəqiş karde \"$1\"",
- "translate-edit-translation": "Пегордыније",
"translate-stats-edits": "Dəqişion karde",
+ "translate-statsf-scale-months": "Manqon",
+ "translate-statsf-scale-weeks": "Hafton",
+ "translate-statsf-scale-days": "Rüjon",
+ "translate-statsf-scale-hours": "Saaton",
+ "translate-translations-fieldset-title": "Nomə",
+ "translate-translations-messagename": "Nom:",
+ "translate-translations-project": "Naxşə:",
+ "translate-translations-history-short": "tar.",
+ "translate-total": "Noməon",
+ "translate-ls-column-group": "Nomə qrup",
+ "translate-mgs-group": "Nomə qrup:",
+ "supportedlanguages-portallink": "[$1] $2 - $3",
+ "supportedlanguages-portallink-nocldr": "[$1] $2",
"translate-smg-rename-cancel": "Ləğv karde",
"translate-documentation-language": "Mesaji dokumentasiyə",
+ "translate-msggroupselector-search-all": "Həmə",
+ "tux-tab-all": "Həmə",
"tux-edit": "Dəqiş karde",
"tux-editor-cancel-button-label": "Ləğv karde",
"tux-proofread-edit-label": "Dəqiş karde",
+ "tux-editor-doc-editor-placeholder": "Nomə dokumentasiyə",
"tux-editor-doc-editor-cancel": "Ləğv karde"
}
diff --git a/MLEB/Translate/i18n/core/tr.json b/MLEB/Translate/i18n/core/tr.json
index b4c302bb..636cddf0 100644
--- a/MLEB/Translate/i18n/core/tr.json
+++ b/MLEB/Translate/i18n/core/tr.json
@@ -13,8 +13,11 @@
"Kumkumuk",
"McAang",
"Meelo",
+ "MuratTheTurkish",
"Rapsar",
+ "SaldırganSincap",
"Sayginer",
+ "Sezgin İbiş",
"Srhat",
"Suelnur",
"TmY e12",
@@ -24,7 +27,7 @@
},
"translate": "Çevir",
"translate-desc": "MediaWiki'yi ve ötesini çevirmek için [[Special:Translate|özel sayfa]]",
- "translate-fuzzybot-desc": "Bu, çevirileri korumak için kullanılan MediaWiki [https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:Translate Translate uzantısı] tarafından kullanılan özel bir sistem hesabıdır.\nBu hesap MediaWiki yazılımının bir parçasıdır ve hiçbir kullanıcıya ait değildir.",
+ "translate-fuzzybot-desc": "Bu, çevirileri korumak için kullanılan MediaWiki [https://www.mediawiki.org/wiki/Extension:Translate/tr Translate uzantısı] tarafından kullanılan özel bir sistem hesabıdır.\nBu hesap MediaWiki yazılımının bir parçasıdır ve hiçbir kullanıcıya ait değildir.",
"translate-taskui-export-to-file": "Yerel biçimde aktar",
"translate-taskui-export-as-po": "Çevrim dışı çeviri aktar",
"translate-taction-translate": "Çevir",
@@ -58,11 +61,9 @@
"translate-ignored": "(yoksayıldı)",
"translate-edit-title": "\"$1\" sayfayı düzenle",
"translate-edit-definition": "İleti tanımı",
- "translate-edit-translation": "Çeviri",
"translate-edit-contribute": "katkıda bulun",
"translate-edit-no-information": "<em>Bu iletide belge yok.\nBu iletinin nerede veya nasıl kullanıldığını biliyorsanız, bu iletiyi belge ekleyerek diğer çevirmenlere yardımcı olabilirsiniz.</em>",
"translate-edit-information": "İleti hakkında bilgi ($1)",
- "translate-edit-in-other-languages": "Diğer dillerdeki iletisi",
"translate-edit-warnings": "Tamamlanmamış çeviriler hakkındaki uyarılar",
"translate-edit-tmmatch-source": "Çeviri kaynağı metin: $1",
"translate-edit-tmmatch": "%$1 benzer",
@@ -156,6 +157,11 @@
"translate-statsf-language": "Dil kodlarının virgül ile ayrılmış listesi:",
"translate-statsf-group": "Grup kodlarının virgül ile ayrılmış listesi:",
"translate-statsf-submit": "Önizleme",
+ "translate-statsf-unknown-error": "Bilinmeyen bir hata oluştu.",
+ "translate-statsf-error-message": "Grafik yüklenirken bir hata oluştu: $1",
+ "translate-statsf-graph-alt-text-info": "Çeviri istatistikleri için metin alternatifi aşağıdaki veri tablosundadır.",
+ "translate-statsf-alt-text": "Bu, çeviri istatistikleri için metin alternatifidir.",
+ "translate-statsf-embed": "Çeviri istatistikleri grafiğini diğer sayfalara yerleştirmek için kod.",
"translate-tag-page-desc": "[[$2|$1]] viki sayfasının $3 ($4) dilinden çevirisi.",
"translate-sidebar-alltrans": "Diğer dillerde",
"translations": "Bütün çeviriler",
@@ -201,8 +207,8 @@
"translate-mgs-totals": "Hepsi $1 dil birlikte",
"translate-mgs-invalid-group": "Belirtilen $1 grubu yok.",
"translate-mgs-nothing": "İstenen istatistikler için gösterilecek bir şey yok.",
- "supportedlanguages": "Desteklenen diller",
- "supportedlanguages-summary": "Bu sayfada, {{SITENAME}} tarafından desteklenen tüm dillerin bir listesi ve bu dilde çalışan çevirmenlerin adları gösterilmektedir.\nBir çevirmenin adı daha büyük görünür, çevirmenin daha fazla düzenlemesi katkıda bulunur.\nBir alt çizginin rengi, çevirmenin ne kadar süre önce aktif olduğunu gösterir.",
+ "supportedlanguages": "Aktif diller",
+ "supportedlanguages-summary": "Bu sayfa, {{SITENAME}} dilinde aktif dillerin bir listesini ve o dil üzerinde çalışan çevirmenlerin isimleriyle birlikte gösterir.\nBir çevirmenin adı daha büyük görünür, çevirmenin daha fazla düzenlemesi katkıda bulunur.\nBir alt çizginin rengi, çevirmenin ne kadar süre önce aktif olduğunu gösterir.",
"supportedlanguages-colorlegend": "Renk göstergesi: Son çeviri $1 gün önce yapıldı.",
"supportedlanguages-portallink": "[$1] $2 - $3",
"supportedlanguages-portallink-nocldr": "[$1] $2",
@@ -214,7 +220,6 @@
"translate-supportedlanguages-cached": "Bu bilgiler $1 önce önbelleğe alındı.",
"abusefilter-edit-builder-vars-translate-source-text": "Çeviri biriminin kaynak metni",
"abusefilter-edit-builder-vars-translate-target-language": "Çeviri için hedef dil",
- "translate-save": "Yayımla ($1)",
"translate-jssti-add": "Listeye ekle",
"managemessagegroups": "İleti grubu yönetimi",
"translate-smg-notallowed": "Bu eylemi yürütmeye izniniz yok.",
@@ -235,6 +240,24 @@
"translate-smg-rename-rename": "Şunun adı olarak ekle...",
"translate-smg-rename-dialog-title": "$1 için eşleşen yeniden adlandırmayı seçin",
"translate-smg-changeset-modified": "Değişiklik kümesi başka bir kullanıcı veya işlem tarafından değiştirildi. Değişikliklerinizi geçersiz kılabileceği için değişiklikleriniz yayınlanamıyor. En son değişiklikleri görmek için lütfen sayfayı yeniden yükleyin.",
+ "translate-smg-no-groups-in-sync": "Şu anda senkronizasyonda grup yok",
+ "translate-smg-strong-sync-help": "Yardım",
+ "translate-smg-groups-in-sync": "Şu anda senkronizasyonda olan gruplar",
+ "translate-smg-groups-in-sync-list": "Arka planda şu anda işlenmekte olan grupların listesi:",
+ "translate-smg-groups-with-error-title": "Eşzamanlama sırasında hata alan gruplar",
+ "translate-smg-groups-with-error-desc": "Senkronizasyon sırasında hata veren grupların ve mesajlarının listesi:",
+ "translate-smg-group-with-error-summary": "$1 hatalı {{PLURAL:$1|mesaj|mesaj}}:",
+ "translate-smg-group-message-action-history": "Geçmiş",
+ "translate-smg-group-action-resolve": "Çözümlendi olarak işaretle",
+ "translate-smg-group-message-tag-outdated": "Eski",
+ "translate-smg-group-message-tag-rename": "Yeniden adlandır",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|Etiket|Etiket}}:",
+ "translate-smg-group-message-message-content": "İçerik:",
+ "translate-smg-group-message-message-target": "Hedef:",
+ "translate-smg-group-message-message-replacement": "Değiştirilecek metin:",
+ "translate-smg-group-message-message-other-langs": "Diğer diller:",
+ "translate-smg-loading": "Yükleniyor...",
+ "translate-smg-unknown-error": "İsteğiniz işlenirken bilinmeyen bir hata oluştu.",
"translate-manage-import-diff": "$1 iletisi | Eylemler: $2",
"translate-manage-import-new": "Yeni ileti: $1",
"translate-manage-import-deleted": "Silinmiş ileti: $1",
@@ -256,6 +279,9 @@
"translate-manage-intro-other": "Aşağıda $1 dilindeki çeviri değişikliklerinin listesi bulunmaktadır.\nLütfen değişiklikleri inceleyin ve her güncelleme için yapmak istediğiniz işlemi seçin.\nDeğişiklikleri yoksaymayı seçerseniz, bu işlem yalnızca geçicidir.",
"translate-manage-import-ok": "İçe aktarılan: $1",
"translate-manage-import-done": "İçe aktarma tamamlandı!",
+ "translate-manage-empty-content": "İçerik boştur",
+ "translate-manage-key-reused": "Bu mesaj vikide zaten var. Eski bir anahtarın yanlışlıkla yeniden kullanılmasını kontrol edin.",
+ "translate-manage-source-message-not-found": "İleti açıklaması bulunamadı",
"importtranslations": "Çevirileri içe aktar",
"translate-import-from-local": "Yerel dosya yükleme:",
"translate-import-load": "Dosya yükle",
@@ -265,13 +291,6 @@
"translate-import-err-no-such-file": "<nowiki>$1</nowiki> dosyası mevcut değil ya da yerel olarak yüklenmiş.",
"translate-import-err-stale-group": "Bu dosyanın ait olduğu ileti grubu mevcut değil.",
"translate-import-err-no-headers": "Dosya Çeviri uzantısı biçiminde iyi biçimlendirilmiş bir Gettext dosyası değil:\nİleti grubu ve dil dosya başlığından belirlenemiyor.",
- "translate-js-summary": "Özet:",
- "translate-js-save": "Yayımla",
- "translate-js-next": "Yayımla ve sonrakini aç",
- "translate-js-skip": "Sonrakine geç",
- "translate-js-history": "Çeviri geçmişi",
- "translate-js-support": "Soru sor",
- "translate-js-support-title": "Bu mesajı doğru çevirmek için yeterli bilgi yoksa yardım isteyin.",
"translate-js-support-unsaved-warning": "Yayımlanmamış çevirileriniz var.",
"translate-gs-pos": "Kon.",
"translate-gs-code": "Kod",
@@ -288,7 +307,7 @@
"translate-searchprofile-note": "[$1 Çeviri araması] ile daha fazla arama seçenekleri mevcuttur.",
"translate-search-languagefilter": "Dile göre filtre uygula:",
"translate-search-nofilter": "Filtre yok",
- "log-name-translationreview": "Çeviri incleme günlüğü",
+ "log-name-translationreview": "Çeviri inceleme günlüğü",
"log-description-translationreview": "Tüm yorumların çevirilere ve mesaj gruplarına kaydedilmesi.",
"logentry-translationreview-message": "$1, $3 sayfasını {{GENDER:$2|inceledi}}",
"logentry-translationreview-group": "$1, $3 sayfasından $4 çevirileri $6 ile $7 {{GENDER:$2|değiştirdi}}",
@@ -403,7 +422,7 @@
"translate-statsbar-tooltip": "%$1 çevrildi, %$2 incelendi",
"translate-statsbar-tooltip-with-fuzzy": "%$1 çevrildi, %$2 incelendi, %$3 eski",
"translate-search-more-groups-info": "$1 tane daha grup",
- "translate-syntax-error": "Çeviri sözdizimi hataları içeriyor",
+ "translate-syntax-error": "Çeviri, sözdizim hataları içeriyor",
"tux-session-expired": "Artık oturum açmadınız. Lütfen ayrı bir sekmede giriş yapın. Alternatif olarak, kaydedilmemiş çevirilerin bir kopyasını oluşturun, oturum açın, bu sayfaya geri dönün ve çevirilerinizi tekrar girin.",
"tux-nojs": "Bu araç JavaScript olmadan çalışmaz. JavaScript devre dışı, çalışmıyor veya bu tarayıcı desteklenmiyor.",
"specialpages-group-translation": "Çeviri"
diff --git a/MLEB/Translate/i18n/core/tt-cyrl.json b/MLEB/Translate/i18n/core/tt-cyrl.json
index c97a969d..a48cb6fd 100644
--- a/MLEB/Translate/i18n/core/tt-cyrl.json
+++ b/MLEB/Translate/i18n/core/tt-cyrl.json
@@ -36,10 +36,8 @@
"translate-ignored": "(игътибарга алынмай)",
"translate-edit-title": "\"$1\" битен үзгәртү",
"translate-edit-definition": "Хәбәрнең билгеләмәсе",
- "translate-edit-translation": "Тәрҗемә",
"translate-edit-contribute": "үзгәртү",
"translate-edit-information": "Хәбәр турында мәгълүмат ($1)",
- "translate-edit-in-other-languages": "Хәбәр башка телләрдә",
"translate-edit-warnings": "Тулы булмаган тәрҗемәләр турында искәрмә",
"translate-edit-tmmatch": "$1% туры килү",
"translate-export-form-format": "Формат",
@@ -115,19 +113,12 @@
"supportedlanguages-recenttranslations": "соңгы тәрҗемәләр",
"supportedlanguages-count": "Барлыгы $1 {{PLURAL:$1|тел}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|төзәтмә}} — соңгы төзәтмә $3 {{PLURAL:$3|көн}} элек",
- "translate-save": "Саклау ($1)",
"translate-jssti-add": "Исемлеккә өстәү",
"translate-smg-rename-cancel": "Кире алу",
"translate-manage-action-import": "Кертү",
"translate-manage-action-ignore": "Игнор",
"translate-manage-submit": "Башкару",
"translate-import-load": "Файлны төяү",
- "translate-js-summary": "Кыскача аңлатма:",
- "translate-js-save": "Саклау",
- "translate-js-next": "Сакларга һәм яңасын ачарга",
- "translate-js-skip": "Киләсе биткә күчү",
- "translate-js-history": "Тәрҗемә тарихы",
- "translate-js-support": "Сорау бирү",
"translate-gs-pos": "Урын",
"translate-gs-code": "Код",
"translate-gs-continent": "Җир йөзе кисәге",
diff --git a/MLEB/Translate/i18n/core/tzm.json b/MLEB/Translate/i18n/core/tzm.json
index 52731268..418a053d 100644
--- a/MLEB/Translate/i18n/core/tzm.json
+++ b/MLEB/Translate/i18n/core/tzm.json
@@ -21,7 +21,6 @@
"translate-ls-column-group": "ⵜⴰⴱⵔⴰⵜ ⵏ ⵜⵔⴰⴱⴱⵓⵜ",
"translate-mgs-group": "ⵜⴰⴱⵔⴰⵜ ⵏ ⵜⵔⴰⴱⴱⵓⵜ:",
"translate-mgs-column-language": "ⵜⵓⵜⵍⴰⵢⵜ",
- "translate-save": "ⵣⵎⵎⴻⵎ ($1)",
"translate-manage-import-new": "ⵜⴰⴱⵔⴰⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ $1",
"translate-gs-speakers": "ⵉⵎⵙⴰⵡⴰⵍⵏ",
"translate-msggroupselector-search-recent": "ⵉⵏⴳⴳⵓⵔⴰ"
diff --git a/MLEB/Translate/i18n/core/ug-arab.json b/MLEB/Translate/i18n/core/ug-arab.json
index 056e2721..13b74604 100644
--- a/MLEB/Translate/i18n/core/ug-arab.json
+++ b/MLEB/Translate/i18n/core/ug-arab.json
@@ -40,11 +40,9 @@
"translate-ignored": "(پەرۋا قىلىنمىغان)",
"translate-edit-title": "تەھرىر \"$1\"",
"translate-edit-definition": "ئۇچۇر ئېنىقلىمىسى",
- "translate-edit-translation": "تەرجىمىسى",
"translate-edit-contribute": "تۆھپە",
"translate-edit-no-information": "''بۇ ئۇچۇرنىڭ چۈشەندۈرۈشى يوق.''\n''ئەگەر سىز بۇ ئۇچۇرنىڭ قەيەردە ياكى قانداق ئىشلىتىلىدىغانلىقىنى بىلسىڭىز، بۇ ئۇچۇرنىڭ چۈشەندۈرۈشىنى قوشۇپ باشقا تەرجىمانلارغا ياردەم قىلالايسىز.''",
"translate-edit-information": "ئۇچۇر ھەققىدىكى ئۇچۇر ($1)",
- "translate-edit-in-other-languages": "باشقا تىللاردىكى ئۇچۇرى",
"translate-edit-warnings": "تولۇق بولمىغان تەرجىمە ھەققىدىكى ئاگاھلاندۇرۇش",
"translate-edit-tmmatch-source": "تەرجىمە ئەسلى تېكىستى: $1",
"translate-edit-tmmatch": "$1% ماس كېلىدۇ",
@@ -155,7 +153,6 @@
"supportedlanguages-recenttranslations": "يېقىنقى تەرجىمىلەر",
"supportedlanguages-count": "جەمئى $1 {{PLURAL:$1|تىل|تىل}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|تەھرىر|تەھرىر}} - ئاخىرقى تەھرىر $3 {{PLURAL:$3|كۈن|كۈن}} ئىلگىرى",
- "translate-save": "ساقلا ($1)",
"translate-jssti-add": "تىزىمغا قوش",
"managemessagegroups": "ئۇچۇر گۇرۇپپا باشقۇرۇش",
"translate-smg-notallowed": "بۇ مەشغۇلاتنى ئىجرا قىلالمايسىز.",
@@ -164,6 +161,8 @@
"translate-smg-submitted": "ئۇچۇر ئېنىقلىمىسى يېڭىلاندى. ئۆزگىرىشنى ئارقا سۇپىدا بىر تەرەپ قىلىۋاتىدۇ.",
"translate-smg-left": "ۋىكىدىكى ئۇچۇر مەزمۇنى",
"translate-smg-right": "كىرگۈزگەن ئۆزگەرتىشلەر",
+ "translate-smg-group-message-message-target": "نىشان:",
+ "translate-smg-group-message-message-other-langs": "باشقا تىللار:",
"translate-manage-import-diff": "ئۇچۇر $1 | مەشغۇلات: $2",
"translate-manage-import-new": "يېڭى ئۇچۇر $1",
"translate-manage-import-deleted": "ئۆچۈرۈلگەن ئۇچۇر $1",
@@ -187,13 +186,6 @@
"translate-import-err-no-such-file": "ھۆججەت <nowiki>$1</nowiki> مەۋجۇت ئەمەس ياكى يەرلىكتىن يۈكلەنمىدى.",
"translate-import-err-stale-group": "بۇ ھۆججەت تەۋە ئۇچۇر گۇرۇپپىسى مەۋجۇت ئەمەس.",
"translate-import-err-no-headers": "بۇ ھۆججەت تەرجىمە كېڭەيتىلگەن ياخشى پىچىمدىكى Gettext ھۆججەت ئەمەس:\nھۆججەت بېشىدىن ئۇچۇر گۇرۇپپىسى ۋە تىلنى جەزملىيەلمىدى.",
- "translate-js-summary": "ئۈزۈندە",
- "translate-js-save": "ساقلا",
- "translate-js-next": "ساقلاپ كېيىنكىنى ئاچ",
- "translate-js-skip": "كېيىنكىگە ئاتلاش",
- "translate-js-history": "تەرجىمە تارىخى",
- "translate-js-support": "سوئال سورا",
- "translate-js-support-title": "ئەگەر بۇ ئۇچۇرنى توغرا تەرجىمە قىلىشقا يېتەرلىك ئۇچۇر بولمىسا ياردەم سوراڭ.",
"translate-js-support-unsaved-warning": "ساقلىمىغان تەرجىمىلىرىڭىز بار.",
"translate-gs-pos": "ئورنى",
"translate-gs-code": "كود",
diff --git a/MLEB/Translate/i18n/core/uk.json b/MLEB/Translate/i18n/core/uk.json
index b07c0bf0..462a29c3 100644
--- a/MLEB/Translate/i18n/core/uk.json
+++ b/MLEB/Translate/i18n/core/uk.json
@@ -6,6 +6,7 @@
"Ahonc",
"Aleksandrit",
"Amire80",
+ "Andriy.v",
"Andriykopanytsia",
"Apromix",
"Base",
@@ -63,11 +64,9 @@
"translate-ignored": "(ігнорується)",
"translate-edit-title": "Редагувати «$1»",
"translate-edit-definition": "Текст повідомлення",
- "translate-edit-translation": "Переклад",
"translate-edit-contribute": "редагувати",
"translate-edit-no-information": "<em>Це повідомлення не має опису.\nЯкщо ви знаєте, де чи як воно використовується, то ви можете допомогти іншим перекладачам, додавши опис для цього повідомлення.</em>",
"translate-edit-information": "Інформація про повідомлення ($1)",
- "translate-edit-in-other-languages": "Повідомлення іншими мовами",
"translate-edit-warnings": "Попередження про неповні переклади",
"translate-edit-tmmatch-source": "Текст для перекладу: $1",
"translate-edit-tmmatch": "$1% відповідність",
@@ -161,6 +160,11 @@
"translate-statsf-language": "Список кодів мови, розділених комами:",
"translate-statsf-group": "Список кодів групи мов, розділених комами:",
"translate-statsf-submit": "Перегляд",
+ "translate-statsf-unknown-error": "Сталася невідома помилка.",
+ "translate-statsf-error-message": "Сталася помилка при завантаження графіку: $1",
+ "translate-statsf-graph-alt-text-info": "Альтернативний текст для статистики перекладу доступний у таблиці з даними нижче.",
+ "translate-statsf-alt-text": "Це альтернативний текст для статистики перекладів.",
+ "translate-statsf-embed": "Код для включення графіку статистики перекладів до інших сторінок.",
"translate-tag-page-desc": "Переклад сторінки [[$2|$1]] із $3 ($4).",
"translate-sidebar-alltrans": "Іншими мовами",
"translations": "Всі переклади",
@@ -170,7 +174,7 @@
"translate-translations-count": "Знайдено {{PLURAL:$1|1=один переклад|$1 переклади|$1 перекладів}}.",
"translate-translations-fieldset-title": "Повідомлення",
"translate-translations-messagename": "Назва:",
- "translate-translations-project": "Проект:",
+ "translate-translations-project": "Проєкт:",
"translate-translations-including-no-param": "Будь ласка, вкажіть ключ повідомлення як параметр підсторінки",
"translate-translations-history-short": "і",
"languagestats": "Мовна статистика",
@@ -206,8 +210,8 @@
"translate-mgs-totals": "Всі $1 {{PLURAL:$1|мова|мови|мов}} разом",
"translate-mgs-invalid-group": "Зазначеної групи $1 не існує.",
"translate-mgs-nothing": "Немає статистики за Вашим запитом.",
- "supportedlanguages": "Підтримувані мови",
- "supportedlanguages-summary": "На цій сторінці перелічено всі мови, що підтримуються {{SITENAME}},\nразом з іменами перекладачів, що працюють цими мовами.\nІм'я перекладача буде тим більшим, що більше редагувань він зробив.\nКолір підкреслення позначає як давно було вчинено останні дії.",
+ "supportedlanguages": "Активні мови",
+ "supportedlanguages-summary": "На цій сторінці перелічено активні мови {{GRAMMAR:locative|{{SITENAME}}}},\nразом з іменами перекладачів, що працюють цими мовами.\nІм'я перекладача буде тим більшим, що більше редагувань він зробив.\nКолір підкреслення позначає як давно було вчинено останні дії.",
"supportedlanguages-colorlegend": "Кольорова легенда: останній переклад здійснено $1 днів тому.",
"supportedlanguages-sqlite-error": "SQLite не підтримується",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Перекладач|Перекладачка}}|Перекладачі}}: $1",
@@ -217,7 +221,6 @@
"translate-supportedlanguages-cached": "Ця інформація була кешована $1 тому.",
"abusefilter-edit-builder-vars-translate-source-text": "Вихідний текст одиниці перекладу",
"abusefilter-edit-builder-vars-translate-target-language": "Цільова мова для перекладу",
- "translate-save": "Опублікувати ($1)",
"translate-jssti-add": "Додати в список",
"managemessagegroups": "Керування групами повідомлень",
"translate-smg-notallowed": "Вам не дозволено виконувати цю дію.",
@@ -238,6 +241,10 @@
"translate-smg-rename-rename": "Додати як перейменування…",
"translate-smg-rename-dialog-title": "Обрати відповідне перейменування для $1",
"translate-smg-changeset-modified": "Набір змін модифіковано іншим користувачем чи процесом. Ваші зміни не можна опублікувати, оскільки це може перезаписати їхні зміни. Будь ласка, перезавантажте сторінку, щоб побачити останні зміни.",
+ "translate-smg-no-groups-in-sync": "Наразі немає груп у процесі синхронізації",
+ "translate-smg-strong-sync-help": "Довідка",
+ "translate-smg-groups-in-sync": "Групи в процесі синхронізації зараз",
+ "translate-smg-groups-in-sync-list": "Список груп, що наразі перебувають в процесі обробки на фоні:",
"translate-manage-import-diff": "Повідомлення $1 | Дії: $2",
"translate-manage-import-new": "Нове повідомлення $1",
"translate-manage-import-deleted": "Вилучено повідомлення $1",
@@ -259,6 +266,8 @@
"translate-manage-intro-other": "Далі наведено список змін перекладів мовою: $1.\nБудь ласка, перевірте ці зміни і виберіть дію, яку застосувати щодо кожного оновлення.\nЯкщо Ви оберете проігнорувати зміни, то ця дія лише тимчасова.",
"translate-manage-import-ok": "Імпортовано: $1",
"translate-manage-import-done": "Імпорт завершено!",
+ "translate-manage-empty-content": "Вміст порожній",
+ "translate-manage-key-reused": "Це повідомлення вже є в цій вікі. Перевірте чи старий ключ не використовується знову випадково.",
"importtranslations": "Імпортувати переклади",
"translate-import-from-local": "Завантажити локальний файл:",
"translate-import-load": "Завантажити файл",
@@ -268,13 +277,6 @@
"translate-import-err-no-such-file": "Файл <nowiki>$1</nowiki> не існує або не завантажений локально.",
"translate-import-err-stale-group": "Група повідомлень, до якої належить цей файл, не існує.",
"translate-import-err-no-headers": "Файл не є правильно побудованим Gettext-файлом у форматі розширення Translate: не вдалося визначити групу і мову із заголовка файлу.",
- "translate-js-summary": "Опис:",
- "translate-js-save": "Опублікувати",
- "translate-js-next": "Опублікувати й відкрити наступне",
- "translate-js-skip": "Перейти до наступного",
- "translate-js-history": "Історія перекладу",
- "translate-js-support": "Поставити запитання",
- "translate-js-support-title": "Попросіть про допомогу, якщо ви не маєте достатньої інформації для правильного перекладу цього повідомлення.",
"translate-js-support-unsaved-warning": "Маєте неопубліковані переклади.",
"translate-gs-pos": "Поз.",
"translate-gs-code": "Код",
diff --git a/MLEB/Translate/i18n/core/ur.json b/MLEB/Translate/i18n/core/ur.json
index 051db551..a1bdbdfa 100644
--- a/MLEB/Translate/i18n/core/ur.json
+++ b/MLEB/Translate/i18n/core/ur.json
@@ -43,11 +43,9 @@
"translate-ignored": "(نظر انداز شدہ)",
"translate-edit-title": "ترمیم «$1»",
"translate-edit-definition": "پیغام کی وضاحت",
- "translate-edit-translation": "ترجمہ",
"translate-edit-contribute": "میں شراکت",
"translate-edit-no-information": "<em>اس پیغام کی دستاویز نہیں ہے۔\nاگر آپ اس پیغام کے استعمال سے واقف ہیں تو اس کی دستاویز بنا کر آپ دیگر مترجمین کا تعاون کر سکتے ہیں۔</em>",
"translate-edit-information": "پیغام ($1) کے متعلق",
- "translate-edit-in-other-languages": "دیگر زبانوں میں پیغام",
"translate-edit-warnings": "نامکمل ترجموں کے متعلق انتباہات",
"translate-edit-nopermission": "پیغامات کے ترجمے کے لیے آپ کے پاس ترجمہ کاری کا اختیار ہونا لازمی ہے۔",
"translate-edit-askpermission": "اجازت حاصل کریں",
@@ -146,11 +144,6 @@
"translate-manage-import-done": "درآمد مکمل!",
"importtranslations": "تراجم درآمد کریں",
"translate-import-load": "بوجھ فائل",
- "translate-js-summary": "خلاصہ:",
- "translate-js-save": "محفوظ کریں",
- "translate-js-skip": "آگے بڑھ جائیں",
- "translate-js-history": "ترجمہ کی تاریخ",
- "translate-js-support": "سوال پوچھیں",
"translate-js-support-unsaved-warning": "آپ کے کچھ تراجم اب تک محفوظ نہیں ہوئے ہیں۔",
"translate-gs-code": "کوڈ",
"translate-gs-continent": "براعظم",
diff --git a/MLEB/Translate/i18n/core/uz.json b/MLEB/Translate/i18n/core/uz.json
index e8d7d68c..79b6fc1e 100644
--- a/MLEB/Translate/i18n/core/uz.json
+++ b/MLEB/Translate/i18n/core/uz.json
@@ -2,7 +2,8 @@
"@metadata": {
"authors": [
"CoderSI",
- "Sociologist"
+ "Sociologist",
+ "Zafar Shamsiddinov"
]
},
"translate": "Tarjima",
@@ -10,7 +11,7 @@
"translate-taskui-export-to-file": "O'z formatida eksport qilish",
"translate-taskui-export-as-po": "Off-line tarjima uchun eksport qilish",
"translate-taction-translate": "Tarjima",
- "translate-taction-proofread": "Ko'zdan kechirish",
+ "translate-taction-proofread": "Koʻrib chiqmoq",
"translate-taction-lstats": "Til statistikasi",
"translate-taction-mstats": "Xabarlar guruhlari statistikasi",
"translate-taction-export": "Eksport",
@@ -23,11 +24,11 @@
"translate-page-group": "Guruh",
"translate-page-language": "Til",
"translate-page-limit": "Chegara",
- "translate-page-limit-option": "Bir sahifaga $1 tadan xabar",
+ "translate-page-limit-option": "$1 har sahifada {{PLURAL:$1|ta xabar|ta xabar}}",
"translate-submit": "Tasvirlash",
"translate-page-navigation-legend": "Saytda harakatlanish",
"translate-page-showing": "$3 ta xabardan $1-dan $2-gacha boʻlganlari koʻrsatildi.",
- "translate-page-showing-all": "$1 ta xabar koʻrsatildi.",
+ "translate-page-showing-all": "$1 koʻrsatildi {{PLURAL:$1|ta xabar|ta xabar}}.",
"translate-page-showing-none": "Mos xabarlar mavjud emas.",
"translate-next": "Keyingi sahifa",
"translate-prev": "Oldingi sahifa",
@@ -39,19 +40,17 @@
"translate-ignored": "(e'tiborga olinmagan)",
"translate-edit-title": "Tahrir \"$1\"",
"translate-edit-definition": "Xabar ifodasi",
- "translate-edit-translation": "Tarjima",
"translate-edit-contribute": "tahrirlash",
- "translate-edit-no-information": "'Bu xabar tavsifga ega emas. Agar siz bu xabar qayerda va qanday ishlatilishini bilsangiz, u holda unga tavsif kiritib boshqa tarjimonlarga yordam berishingiz mumkin.''",
+ "translate-edit-no-information": "<em>Bu xabar tavsifga ega emas. Agar siz bu xabar qayerda va qanday ishlatilishini bilsangiz, u holda unga tavsif kiritib boshqa tarjimonlarga yordam berishingiz mumkin.</em>",
"translate-edit-information": "Xabar haqida maʼlumot ($1)",
- "translate-edit-in-other-languages": "Xabar boshqa tillarda",
"translate-edit-warnings": "Chala tarjima qilinayotgani haqida ogohlantirishlar",
"translate-edit-tmmatch-source": "Tarjima uchun manba xabar matni: $1",
"translate-edit-tmmatch": "$1% moslik",
"translate-use-suggestion": "Joriy tarjima matnini mazkur taklifga almashtirish.",
"translate-edit-nopermission": "Xabarni tarjima qilish uchun ruxsat zarur.",
- "translate-edit-askpermission": "Ruxsat so'rash",
+ "translate-edit-askpermission": "Ruxsat soʻramoq",
"translate-checks-parameters": "Quyidagi {{PLURAL:$2|koʻrsatkich|koʻrsatkichlar}} qoʻllanilmayapti:\n<strong>$1</strong>",
- "translate-checks-balance": "Juft bo'lmagan miqdordagi ochiluvchi va yopiluvchi {{PLURAL:$2|qavslar|qavslar}}:\n<strong><nowiki>$1</nowiki></strong>",
+ "translate-checks-balance": "Teng boʻlmagan miqdor mavjud {{PLURAL:$2|ta qavs|ta qavs}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-links": "Quyidagi {{PLURAL:$2|1=havola|$2 ta havola}} muammo keltirib chiqarmoqda:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-links-missing": "Quyidagi {{PLURAL:$2|havola ishlatilmayapti|$2 ta havola ishlatilmayapti}}:\n<strong><nowiki>$1</nowiki></strong>",
"translate-checks-plural": "Originalda <nowiki>{{PLURAL:}}</nowiki>dan foydalanilgan, tarjimada esa — yoʻq.",
@@ -101,7 +100,7 @@
"translate-statsf-language": "Til kodlarining roʻyxati (vergul bilan ajrating):",
"translate-statsf-group": "Guruh kodlarining roʻyxati (vergul bilan ajrating):",
"translate-statsf-submit": "Ko‘rib chiqish",
- "translate-tag-page-desc": "[[$2|$1]] viki-sahifasining tarjimasi",
+ "translate-tag-page-desc": "Viki-sahifalari tarjimalari muallifi [[$2|$1]] $3 ($4).",
"translate-sidebar-alltrans": "Boshqa tillarda",
"translations": "Barcha tarjimalar",
"translations-summary": "Barcha ruxsat etilgan tarjimalarni tasvirlash uchun xabar nomini kiriting.",
@@ -114,7 +113,7 @@
"translate-translations-history-short": "t",
"languagestats": "Til boʻyicha statistika",
"languagestats-summary": "Ushbu sahifada mazkur tilning barcha guruhlar boʻyicha tarjimalar statistikasi keltirilgan.",
- "languagestats-stats-for": "Oʻzbek tiliga tarjimalar statistikasi ($2).",
+ "languagestats-stats-for": "$1 uchun tarjimalar statistikasi ($2).",
"languagestats-recenttranslations": "yaqin oradagi tarjimalar",
"translate-langstats-incomplete": "Ushbu sahifadagi ayrim statistika ma'lumotlari to'liq emas. To'liq ma'lumotlar olish uchun sahifani qayta yuklang.",
"translate-langstats-expand": "yoyish",
@@ -142,11 +141,10 @@
"supportedlanguages": "Mavjud tillar",
"supportedlanguages-summary": "Ushbu sahifada {{SITENAME}} loyihasida qoʻllaniladigan tillar roʻyxati va shu tillarga tarjima qilish ustida ishlayotgan tarjimonlar ismi keltirilgan.\nTarjimonning ismi u qancha koʻp tahrirlar qilgan boʻlsa, shuncha yirikroq tasvirlanadi.\nTagchiziqning rangiga qarab, tarjimon bu yerda oxirgi marta qancha vaqt oldin biron-bir harakatni amalga oshirganligini tushunsa boʻladi.",
"supportedlanguages-colorlegend": "Rang sharhi: oxirgi tarjima $1 kun oldin bo'lgan.",
- "supportedlanguages-translators": "{{PLURAL:$2|Tarjimon|Tarjimonlar}}: $1",
+ "supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Tarjimon}}|Tarjimonlar}}: $1",
"supportedlanguages-recenttranslations": "yaqin oradagi tarjimalar",
- "supportedlanguages-count": "Jami $1 ta til.",
+ "supportedlanguages-count": "$1 jami {{PLURAL:$1|ta til|ta til}}.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|ta tahrir}} - oxirgi tahrir $3 {{PLURAL:$3|kun}} oldin",
- "translate-save": "Saqlash ($1)",
"translate-jssti-add": "Roʻyxatga qoʻshish",
"managemessagegroups": "Xabar guruhlarini boshqarish",
"translate-smg-nochanges": "Ishlov berish uchun mos oʻzgarishlar yoʻq.",
@@ -159,13 +157,6 @@
"translate-manage-action-conflict": "Import qilish va noaniqlik",
"translate-manage-action-ignore": "Eʼtibor berilmasin",
"translate-manage-action-fuzzy": "Import qilingan va eskirgan tarjimalar",
- "translate-js-summary": "Tavsif",
- "translate-js-save": "Saqlash",
- "translate-js-next": "Saqlash va keyingisini ochish",
- "translate-js-skip": "Keyingisiga o'tish",
- "translate-js-history": "Tarjima tarixi",
- "translate-js-support": "Savol berish",
- "translate-js-support-title": "Agar ushbu xabarni toʻgʻri tarjima qilish uchun zarur boʻlgan maʼlumotlar yoʻq boʻlsa, yordam soʻrab murojaat qiling.",
"translate-js-support-unsaved-warning": "Sizda saqlanmagan tarjimalar bor.",
"translate-gs-pos": "O'r.",
"translate-gs-code": "Kod",
diff --git a/MLEB/Translate/i18n/core/vec.json b/MLEB/Translate/i18n/core/vec.json
index 4a4fdcca..665ab2a5 100644
--- a/MLEB/Translate/i18n/core/vec.json
+++ b/MLEB/Translate/i18n/core/vec.json
@@ -9,6 +9,8 @@
"translate": "Tradusion",
"translate-extensionname": "Traduxi",
"translate-desc": "[[Special:Translate|Pàjina speçałe]] par tradure MediaWiki e altro",
+ "translate-taction-lstats": "Statìsteghe de ła łéngua",
+ "translate-taction-mstats": "Statìsteghe del grupo de mesaji",
"translate-page-no-such-language": "La lengua indicà no la xe valida.",
"translate-page-no-such-group": "El grupo indicà no'l xe valido.",
"translate-page-settings-legend": "Inpostasion",
@@ -32,7 +34,6 @@
"translate-edit-contribute": "contribuìssi",
"translate-edit-no-information": "''Sto messagio no'l gà documentassion.\nSe te sè dove o come sto messagio el vien doparà, te podi jutar altri tradutori zontando documentassion a sto messagio.''",
"translate-edit-information": "Informassion sul messagio \"$2\" ($1)",
- "translate-edit-in-other-languages": "El messagio \"$1\" in altre lengue",
"translate-edit-warnings": "Avertimenti su tradussion incomplete",
"translate-checks-parameters": "{{PLURAL:$2|El seguente parametro no'l|I seguenti parametri no i}} xe mìa doparà: <strong>$1</strong>",
"translate-checks-balance": "Ghe xe un nùmaro dispari de {{PLURAL:$2|paréntesi|paréntesi}}:\n<strong><nowiki>$1</nowiki></strong>",
@@ -62,7 +63,7 @@
"translate-translations-fieldset-title": "Messajo",
"translate-translations-messagename": "Nome:",
"translate-translations-project": "Projeto:",
- "languagestats": "Statìsteghe de łe łéngue",
+ "languagestats": "Statìsteghe de ła łéngua",
"translate-language-code": "Còdese lengoa",
"translate-language-code-field-name": "Còdese lengoa:",
"translate-language": "Lengoa",
@@ -71,8 +72,9 @@
"translate-percentage-complete": "Conpletà",
"translate-percentage-fuzzy": "Da ajornar",
"translate-ls-column-group": "Grupo de mesaji",
+ "translate-mgs-pagename": "Statìsteghe del grupo de mesaji",
"translate-mgs-group": "Grupo de mesaji",
- "translate-save": "Salva ($1)",
+ "managemessagegroups": "Xestion del grupo de mesaji",
"translate-documentation-language": "Documentasion del mesajo",
"translate-msggroupselector-projects": "Grupo de mesaji"
}
diff --git a/MLEB/Translate/i18n/core/vep.json b/MLEB/Translate/i18n/core/vep.json
index 4825f265..3262e988 100644
--- a/MLEB/Translate/i18n/core/vep.json
+++ b/MLEB/Translate/i18n/core/vep.json
@@ -36,10 +36,8 @@
"translate-ignored": "(ignoriruidud)",
"translate-edit-title": "Redaktiruida \"$1\"",
"translate-edit-definition": "Tedotusen formuliruind",
- "translate-edit-translation": "Kändmine",
"translate-edit-contribute": "ühtneda",
"translate-edit-information": "Informacii ($1)-kirjutesen polhe",
- "translate-edit-in-other-languages": "Tedotuz toižil kelil:",
"translate-edit-warnings": "Varutused täutmatomiš kändusiš",
"translate-edit-tmmatch": "Sättund om $1%",
"translate-edit-askpermission": "Pakita laskendas",
@@ -102,7 +100,6 @@
"translate-mgs-totals": "Kaik keled ühtes",
"supportedlanguages": "Pid'oiteldud keled",
"supportedlanguages-recenttranslations": "tantoižed kändmižed",
- "translate-save": "Panda muštho ($1)",
"translate-jssti-add": "Ližata nimikirjuteshe",
"managemessagegroups": "Tedotuzgruppiden ohjanduz",
"translate-manage-import-diff": "Tedotuz $1 | Tegod: $2",
@@ -114,8 +111,6 @@
"translate-manage-import-done": "Kaik om tehtud!",
"translate-import-from-local": "Jügutoitta lokaline fail:",
"translate-import-load": "Jügutoitta fail",
- "translate-js-history": "Kändmižen istorii",
- "translate-js-support": "Panda küzund",
"translate-gs-pos": "Sij.",
"translate-gs-code": "Kod",
"translate-gs-continent": "Kontinent",
diff --git a/MLEB/Translate/i18n/core/vi.json b/MLEB/Translate/i18n/core/vi.json
index d93d6040..68f3d379 100644
--- a/MLEB/Translate/i18n/core/vi.json
+++ b/MLEB/Translate/i18n/core/vi.json
@@ -3,6 +3,7 @@
"authors": [
"Leduyquang753",
"Minh Nguyen",
+ "Nghiemtrongdai VN",
"Phjtieudoc",
"Thin",
"Vinhtantran"
@@ -45,11 +46,9 @@
"translate-ignored": "(đã bỏ)",
"translate-edit-title": "Sửa đổi “$1”",
"translate-edit-definition": "Định nghĩa thông điệp",
- "translate-edit-translation": "Bản dịch",
"translate-edit-contribute": "đóng góp",
"translate-edit-no-information": "<em>Thông điệp này hiện chưa có tài liệu hướng dẫn. Nếu bạn biết thông điệp này dùng ở đâu và dùng như thế nào, bạn có thể giúp những biên dịch viên khác bằng cách thêm tài liệu hướng dẫn cho nó.</em>",
"translate-edit-information": "Thông tin về thông điệp ($1)",
- "translate-edit-in-other-languages": "Thông điệp bằng thứ tiếng khác",
"translate-edit-warnings": "Các cảnh báo về các bản dịch chưa hoàn thành",
"translate-edit-tmmatch-source": "Văn bản gốc để dịch: $1",
"translate-edit-tmmatch": "trùng $1%",
@@ -182,7 +181,6 @@
"supportedlanguages-count": "$1 ngôn ngữ tổng cộng.",
"supportedlanguages-activity": "$1: $2 lần sửa đổi – lần cuối cách đây $3 ngày",
"abusefilter-edit-builder-vars-translate-source-text": "Văn bản gốc của đơn vị biên dịch",
- "translate-save": "Lưu ($1)",
"translate-jssti-add": "Thêm vào danh sách",
"managemessagegroups": "Quản lý nhóm thông điệp",
"translate-smg-notallowed": "Bạn không được phép thực hiện thao tác này.",
@@ -192,6 +190,7 @@
"translate-smg-more": "Sẽ còn nhiều thay đổi hơn để xử lý sau khi gửi những thay đổi này.",
"translate-smg-left": "Nội dung thông điệp trong wiki",
"translate-smg-right": "Các thay đổi để duyệt",
+ "translate-smg-strong-sync-help": "Trợ giúp",
"translate-manage-import-diff": "Thông điệp $1 | Tác vụ: $2",
"translate-manage-import-new": "Thông điệp mới $1",
"translate-manage-import-deleted": "Thông điệp đã xóa $1",
@@ -218,13 +217,6 @@
"translate-import-err-no-such-file": "Tập tin <nowiki>$1</nowiki> không tồn tại hoặc chưa được tải lên đây.",
"translate-import-err-stale-group": "Tập tin này được xếp vào nhóm thông điệp không tồn tại.",
"translate-import-err-no-headers": "Tập tin không phải là tập tin Gettext định dạng đúng trong định dạng mở rộng Translate:\nKhông thể xác định nhóm và ngôn ngữ từ tiêu đề tập tin.",
- "translate-js-summary": "Tóm lược:",
- "translate-js-save": "Lưu",
- "translate-js-next": "Lưu và sang thông điệp sau",
- "translate-js-skip": "Chuyển đến thông điệp kế",
- "translate-js-history": "Lịch sử biên dịch",
- "translate-js-support": "Đặt câu hỏi",
- "translate-js-support-title": "Yêu cầu giúp đỡ nếu không có đủ thông tin để dịch thông điệp này một cách chính xác.",
"translate-js-support-unsaved-warning": "Bạn có bản dịch chưa lưu.",
"translate-gs-pos": "STT",
"translate-gs-code": "Mã",
diff --git a/MLEB/Translate/i18n/core/vo.json b/MLEB/Translate/i18n/core/vo.json
index 9f670898..09ca7ddf 100644
--- a/MLEB/Translate/i18n/core/vo.json
+++ b/MLEB/Translate/i18n/core/vo.json
@@ -29,7 +29,6 @@
"translate-edit-contribute": "keblünön",
"translate-edit-no-information": "Nun at no peplänon. If sevol, kiöpo u lio nun at pagebon, kanol yufön tradutanis votik medä penol pläni gudik dö geb onik.",
"translate-edit-information": "Plän nuna ($1)",
- "translate-edit-in-other-languages": "Nun: \"$1\" in püks votik",
"translate-edit-warnings": "Nüneds tefü tradutods no lölöfiks",
"translate-checks-parameters": "{{PLURAL:$2|Paramet|Paramets}} sököl no {{PLURAL:$2|pagebon|pagebons}}:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|Paramet|Paramets}} sököl {{PLURAL:$2|binon nesevädik|binons nesevädiks}}:\n<strong>$1</strong>",
diff --git a/MLEB/Translate/i18n/core/wa.json b/MLEB/Translate/i18n/core/wa.json
index db9023d5..a58fc399 100644
--- a/MLEB/Translate/i18n/core/wa.json
+++ b/MLEB/Translate/i18n/core/wa.json
@@ -5,11 +5,12 @@
]
},
"translate": "Ratourner",
+ "translate-extensionname": "Ratourner",
"translate-desc": "[[Special:Translate|Padje sipeciåle]] po ratourner MediaWiki et ds ôtes",
"translate-taskui-export-to-file": "Riçure e cogne native",
"translate-taskui-export-as-po": "Riçure po on ratournaedje foû raloyaedje",
"translate-taction-translate": "Ratourner",
- "translate-taction-proofread": "Verifiaedje",
+ "translate-taction-proofread": "Verifyî",
"translate-taction-lstats": "Sitatistikes do lingaedje",
"translate-taction-mstats": "Sitatistikes do groupe di messaedjes",
"translate-taction-export": "Ricopyî foû",
@@ -38,17 +39,20 @@
"translate-ignored": "(ignoré)",
"translate-edit-title": "Candjî «$1»",
"translate-edit-definition": "Definixha do messaedje",
- "translate-edit-translation": "Ratournaedje",
"translate-edit-contribute": "contribouwer",
"translate-edit-no-information": "<em>Ci messaedje ci n' a nén stî documinté.\nSi vos savoz wice ou cmint ki ç' messaedje ci est eployî, vos ploz aidî les ôtes ratourneus tot radjoutant ene documintåcion pol messaedje.</em>",
"translate-edit-information": "Infôrmåcions sol messaedje ($1)",
- "translate-edit-in-other-languages": "Messaedjes dins ds ôtes lingaedjes",
"translate-edit-warnings": "Adviertixhmints so les crons ratournaedjes",
"translate-edit-tmmatch-source": "Tecse sourdant do ratournaedje: $1",
"translate-edit-tmmatch": "rishonnant a $1%",
"translate-use-suggestion": "Replaecî l' ratournaedje do moumint avou l' propôzaedje.",
- "translate-edit-nopermission": "I vs fåt les permissions po pleur ratourner des messaedjes.",
- "translate-edit-askpermission": "Dimander les permissions",
+ "translate-edit-nopermission": "I vs fåt les permissions di ratournaedje po pleur ratourner des messaedjes.",
+ "translate-edit-askpermission": "Riçure les permissions",
+ "exporttranslations": "Copyî foû les ratournaedjes",
+ "translate-export-form-format": "Cogne",
+ "translate-export-invalid-format": "Dinez ene sôre di cogne valide.",
+ "translate-export-not-supported": "Li copiaedje-foû des ratournaedjes n' est nén sopoirté.",
+ "translate-export-format-notsupported": "Li cogne dimandêye n' est nén sopoirtêye på groupe di messaedjes.",
"translate-checks-parameters": "{{PLURAL:$2|Li paramete shuvant n' est nén eployî|Les parametes shuvant n' sont nén eployî}}:\n<strong>$1</strong>",
"translate-checks-parameters-unknown": "{{PLURAL:$2|Li paramete shuvant n' est nén cnoxhou|Les parametes shuvants n' sont nén cnoxhous}}:\n<strong>$1</strong>",
"translate-checks-balance": "I gn a {{PLURAL:$2|ene drovante åtchete|des drovantès åtchetes}} sins {{PLURAL:$2|l' cloyante ki va avou|les cloyantes ki vont avou}}, ou årvierdimint:\n<strong><nowiki>$1</nowiki></strong>",
@@ -57,7 +61,7 @@
"translate-checks-plural": "Li definixha eploye <nowiki>{{PLURAL:}}</nowiki> mins nén l' ratournaedje.",
"translate-checks-pagename": "L' espåce di lomaedje est diferin do ci dins l' definixha",
"translate-checks-format": "Ci ratournaedje ci n' shût nén l' definixha oudonbén a ene sintacse nén valide: $1",
- "translate-checks-escape": "Ça s' pout ki l' eployaedje di caracteres sipeciås shuvant soeye èn accidint: <strong>$1</strong>",
+ "translate-checks-escape": "Ça s' pout ki l' eployaedje {{PLURAL:$2|do caractere sipeciå shuvant|des caracteres sipeciås shuvants}} soeye èn accidint: <strong>$1</strong>. {{PLURAL:$4|On caractere di schapaedje valide est|Les caracteres di schapaedje valides sont:}} $3.",
"translate-checks-parametersnotequal": "Li nombe di paramets est d' {{PLURAL:$1|$1}}; adon ki ça dvreut esse {{PLURAL:$2|$2}}.",
"translate-checks-malformed": "«<nowiki>$1</nowiki>» est cron.",
"translate-checks-fudforum-syntax": "So ç' pordjet ci vos dvoz eployî <nowiki>$1</nowiki> purade ki <nowiki>$2</nowiki>.",
@@ -72,6 +76,8 @@
"action-translate-import": "ristitchî des ratournaedjes fwaits foû raloyaedje",
"right-translate-messagereview": "Verifyî les ratournaedjes",
"right-translate-groupreview": "Candjî l' estat d' ovrance des groupes di messaedjes",
+ "translate-rcfilters-translations": "Ratournaedjes",
+ "translate-rcfilters-translations-only-label": "Ratournaedjes",
"translate-rc-translation-filter": "Passete po les ratournaedjes:",
"translate-rc-translation-filter-no": "Èn rén fé",
"translate-rc-translation-filter-only": "Mostrer seulmint les ratournaedjes",
@@ -103,10 +109,10 @@
"translate-statsf-language": "Djivêye di côdes di lingaedje, dispårtis pa des comas:",
"translate-statsf-group": "Djivêye di côdes di groupes, dispårtis pa des comas:",
"translate-statsf-submit": "Vey divant",
- "translate-tag-page-desc": "Ratournaedje del pådje wiki [[$2|$1]].",
+ "translate-tag-page-desc": "Ratournaedje del pådje wiki [[$2|$1]] a pårti do $3 ($4).",
"translate-sidebar-alltrans": "Dins ds ôtes lingaedjes",
"translations": "Tos les ratournaedjes",
- "translations-summary": "Tapez on no d' messaedje chal pa dzo po vey tos les ratournaedjes k' i gn a.",
+ "translations-summary": "Tapez on no d' messaedje cial pa dzo po vey tos les ratournaedjes k' i gn a.",
"translate-translations-no-message": "«$1» n' est nén on messaedje ratournåve",
"translate-translations-none": "Nou ratournaedje po «$1»",
"translate-translations-count": "I gn a {{PLURAL:$1|on ratournaedje|$1 ratournaedjes}}.",
@@ -142,17 +148,16 @@
"translate-mgs-noempty": "Èn nén mostrer les lingaedjes sins nou ratournaedje",
"translate-mgs-submit": "Håyner les statistikes",
"translate-mgs-column-language": "Lingaedje",
- "translate-mgs-totals": "Tos les lingaedjes eshonne",
+ "translate-mgs-totals": "{{PLURAL:$1|On lingaedje|Tos les $1 lingaedjes eshonne}}",
"translate-mgs-invalid-group": "Li groupe dimandé $1 n' egzistêye nén.",
"translate-mgs-nothing": "Rén a håyner po les statistikes dimandêyes",
"supportedlanguages": "Lingaedjes sopoirtés",
"supportedlanguages-summary": "Cisse pådje ci mostere tos les lingaedjes sopoirtés pa {{SITENAME}},\navou les nos des ratourneus k' ovrèt e tchaeke lingaedje.\nLi no d'on ratourneu est metou pus grand sorlon l' cwantité di candjmints k' il a fwait.\nLi coleur do sorlignaedje mostere s' il a stî actif dierinnmint.",
"supportedlanguages-colorlegend": "Ledjinde des coleurs: Dierin ratournaedje i gn $1 djoûs.",
- "supportedlanguages-translators": "{{PLURAL:$2|Ratourneu|Ratourneus}}: $1",
+ "supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|Ratourneu|Ratourneuse}}|Ratourneus}}: $1",
"supportedlanguages-recenttranslations": "dierins ratournaedjes",
"supportedlanguages-count": "$1 {{PLURAL:$1|lingaedje|lingaedjes}} å totå.",
"supportedlanguages-activity": "$1: $2 {{PLURAL:$2|candjmint|candjmints}} - dierin candjmint i gn $3 {{PLURAL:$3|djoû|djoûs}}",
- "translate-save": "Schaper ($1)",
"translate-jssti-add": "Radjouter el djivêye",
"managemessagegroups": "Manaedjaedje des groupes",
"translate-smg-notallowed": "Vos n' poloz nén fé ciste accion ci.",
@@ -166,16 +171,10 @@
"translate-manage-action-conflict": "ristitchî et marker «fuzzy»",
"translate-manage-action-ignore": "passer houte",
"translate-manage-action-fuzzy": "Ristitchî les ratournaedjes et les marker come «fuzzy»",
+ "translate-manage-action-rename": "Rilomer",
"translate-manage-nochanges": "I n' a nou candjmint dins les definixhas des messaedjes po ç' groupe ci.",
- "translate-manage-nochanges-other": "I n' a yeu nou candjmint po ç' lingaedje ci.\nEployîz l' loyén chal pa dzo po rivni al vuwe di detays do groupe.",
- "translate-js-summary": "Rascourti:",
- "translate-js-save": "Schaper",
- "translate-js-next": "Schaper et drovi l' shuvant",
- "translate-js-skip": "Potchî å shuvant",
- "translate-js-history": "Istwere do ratournaedje",
- "translate-js-support": "Dimander åk",
- "translate-js-support-title": "Dimander des racsegnes si vos n' avoz nén assez d' infôrmåcion po ratourner a môde di djin.",
- "translate-js-support-unsaved-warning": "Vos avoz des ratournaedjes nén schapés.",
+ "translate-manage-nochanges-other": "I n' a yeu nou candjmint po ç' lingaedje ci.\nEployîz l' loyén cial pa dzo po rivni al vuwe di detays do groupe.",
+ "translate-js-support-unsaved-warning": "Vos avoz des ratournaedjes nén eplaidîs.",
"translate-gs-code": "Côde",
"translate-gs-continent": "Continint",
"translate-gs-speakers": "Cåzeus",
@@ -188,7 +187,7 @@
"translate-search-nofilter": "dins tos les lingaedjes",
"log-name-translationreview": "Djournå des verifiaedjes des ratournaedjes",
"log-description-translationreview": "Djournå di tos les verifiaedjes des ratournaedjes et groupes di messaedjes.",
- "logentry-translationreview-message": "$1 {{GENDER:$2|a-st acertiné}} l' ratournaedje $3",
+ "logentry-translationreview-message": "$1 {{GENDER:$2|a verifyî}} l' ratournaedje $3",
"translate-workflow-state-": "(dismetou)",
"translate-workflowstatus": "Estat: $1",
"translate-workflow-set-doing": "Metant en alaedje...",
@@ -198,6 +197,23 @@
"translate-workflowgroup-desc": "Ci groupe ci mostere l' estat d' ovrance des ratournaedjes.\nLes estats sont definis dins l' variåve d' apontiaedje $wgTranslateWorkflowStates.",
"translate-dynagroup-recent-label": "Dierins ratournaedjes",
"translate-dynagroup-recent-desc": "Ci groupe ci mostere les ratournaedjes fwaits dierinnmint dins l' lingaedje.\nIl est eployî copurade po les bouyes di verifiaedje.",
+ "tux-tab-untranslated": "Nén ratournés",
+ "tux-tab-outdated": "Trop vîs",
+ "tux-tab-translated": "Ratournés",
"tux-edit": "Candjî",
- "tux-proofread-edit-label": "Candjî"
+ "tux-status-fuzzy": "Trop vîs",
+ "tux-status-proofread": "Verifyîs",
+ "tux-status-translated": "Ratournés",
+ "tux-editor-placeholder": "Vosse ratournaedje",
+ "tux-editor-cancel-button-label": "Rinoncî",
+ "tux-editor-in-other-languages": "Dins ds ôtes lingaedjes",
+ "tux-notices-hide": "catchî",
+ "tux-editor-translate-mode": "Djivêye",
+ "tux-proofread-edit-label": "Candjî",
+ "tux-editor-doc-editor-cancel": "Rinoncî",
+ "tux-empty-list-translated-action": "Ratourner",
+ "tux-editor-close-tooltip": "Clôre",
+ "tux-editor-message-tools-history": "Istwere",
+ "tux-editor-message-tools-translations": "Tos les ratournaedjes",
+ "specialpages-group-translation": "Ratournaedje"
}
diff --git a/MLEB/Translate/i18n/core/xal.json b/MLEB/Translate/i18n/core/xal.json
index b4c81d7a..5e1de06b 100644
--- a/MLEB/Translate/i18n/core/xal.json
+++ b/MLEB/Translate/i18n/core/xal.json
@@ -21,8 +21,6 @@
"translate-pref-editassistlang": "Туслмҗин келс",
"translate-sidebar-alltrans": "Талдан келәр",
"translate-language": "Келн",
- "translate-js-next": "Хадһлад, дарук секх",
- "translate-js-skip": "Дарук",
"translate-documentation-language": "Зәңгин бәрмтлг",
"translate-searchprofile": "Орчуллһн"
}
diff --git a/MLEB/Translate/i18n/core/xmf.json b/MLEB/Translate/i18n/core/xmf.json
index 1e64994a..11350e00 100644
--- a/MLEB/Translate/i18n/core/xmf.json
+++ b/MLEB/Translate/i18n/core/xmf.json
@@ -2,9 +2,11 @@
"@metadata": {
"authors": [
"Malafaya",
+ "Narazeni",
"Silovan"
]
},
"translate-page-language": "ნინა",
+ "translate-smg-strong-sync-help": "მოხვარა",
"translate-documentation-language": "გინაფაშ დოკუმენტაცია"
}
diff --git a/MLEB/Translate/i18n/core/yi.json b/MLEB/Translate/i18n/core/yi.json
index 461192ce..0884439d 100644
--- a/MLEB/Translate/i18n/core/yi.json
+++ b/MLEB/Translate/i18n/core/yi.json
@@ -40,11 +40,9 @@
"translate-ignored": "(איגנאָרירט)",
"translate-edit-title": "רעדאַקטירן\"$1\"",
"translate-edit-definition": "מעלדונג דעפֿיניציע",
- "translate-edit-translation": "איבערזעצונג",
"translate-edit-contribute": "בײַשטײַערן",
"translate-edit-no-information": "<em>די מעלדונג פעלט דאקומענטאציע.\nאויב איר ווייסט וואו אדער ווי די מעלדונג ווערט געניצט, קענט איר העלפֿן אנדערע פארטייטשערס דורך צולייגן דאקומענטאציע צו דער מעלדונג.</em>",
"translate-edit-information": "אינפֿארמאציע וועגן מעלדונג ($1)",
- "translate-edit-in-other-languages": " מעלדונג אין אַנדערע שפּראַכן",
"translate-edit-warnings": "ווארענונגען וועגן אומפולשטענדיקע איבערזעצונגען",
"translate-edit-tmmatch-source": "איבערזעצונג מקור טעקסט: $1",
"translate-edit-tmmatch": "$1% צופאַסונג",
@@ -166,7 +164,6 @@
"supportedlanguages-count": "$1 {{PLURAL:$1|שפראך|שפראכן}} אינגאנצן.",
"supportedlanguages-activity": "$1 : $2 {{PLURAL:$2| רעדאַגירונג | רעדאַגירונגען}} - לעצטע רעדאַגירונג $3 {{PLURAL:$3| טאָג | טעג}} צוריק",
"abusefilter-edit-builder-vars-translate-source-text": "קוואלטעקסט פון איבערזעצונג איינהייט",
- "translate-save": "אויפֿהיטן ($1)",
"translate-jssti-add": "צולייגן צו ליסטע",
"managemessagegroups": "מעלדונג גרופּע אַדמיניסטראַציע",
"translate-smg-notallowed": "איר זענט נישט בארכעטיקט אויסצופירן די אקציע.",
@@ -193,13 +190,6 @@
"translate-import-err-invalid-title": "איינגעגעבענע טעקע נאמען <nowiki>$1</nowiki> נישט גילטיק.",
"translate-import-err-no-such-file": "די טעקע <nowiki>$1</nowiki> עקסיזטירט נישט אדער נישט ארויפגעלאדן לאקאל.",
"translate-import-err-stale-group": "די מעלדונג גרופע צו וואס די טעקע געהערט עקזיסטירט נישט.",
- "translate-js-summary": "רעזומע:",
- "translate-js-save": "אויפֿהיטן",
- "translate-js-next": "אײַנשפייכלערן און עפֿענען נעקסטע",
- "translate-js-skip": "ווײַטער צום נעקסטן",
- "translate-js-history": "איבערזעצונג געשיכטע",
- "translate-js-support": "פֿרעגן א שאלה",
- "translate-js-support-title": "בעטן הילף אויב עס איז ניט פֿאראן גענוג אינפֿאָרמאַציע איבערצוזעצן די מעלדונג געהעריק.",
"translate-js-support-unsaved-warning": "איר האט נישט אפגעהיטענע איבערזעצונגען.",
"translate-gs-pos": "פאזיציע",
"translate-gs-code": "קאד",
diff --git a/MLEB/Translate/i18n/core/yue.json b/MLEB/Translate/i18n/core/yue.json
index b6ee301c..032c6701 100644
--- a/MLEB/Translate/i18n/core/yue.json
+++ b/MLEB/Translate/i18n/core/yue.json
@@ -5,6 +5,7 @@
"Ktchankt",
"Moon0319",
"Obonggi",
+ "Roy17",
"Shinjiman",
"Yueman"
]
@@ -39,7 +40,6 @@
"translate-edit-contribute": "貢獻",
"translate-edit-no-information": "<em>呢句信息無註解。\n如果你知道呢句信息響邊同埋點用,你可以加註解去呢個信息去幫其他嘅譯者。</em>",
"translate-edit-information": "呢句信息嘅資料 ($1)",
- "translate-edit-in-other-languages": "呢個訊息嘅第啲語文",
"translate-edit-warnings": "有關未譯好嘅警告",
"translate-edit-tmmatch-source": "翻譯原文:$1",
"translate-edit-tmmatch": "$1%符合",
@@ -52,6 +52,7 @@
"translate-checks-links": "下面嘅連結有問題: <strong>$1</strong>",
"translate-checks-plural": "用 <nowiki>{{PLURAL:}}</nowiki> 嘅解解釋但係翻譯無用到。",
"languagestats": "話嘅統計",
+ "translate-percentage-fuzzy": "過咗時",
"translate-mgs-totals": "夾埋有$1個文",
"translate-gs-multiple": "多種語言",
"translate-documentation-language": "訊息說明文檔",
@@ -60,8 +61,10 @@
"tux-languageselector": "譯做",
"tux-tab-all": "全部",
"tux-tab-untranslated": "未譯",
+ "tux-tab-outdated": "過咗時",
"tux-tab-translated": "譯咗",
"tux-edit": "改",
+ "tux-status-fuzzy": "過咗時",
"tux-status-translated": "譯咗",
"tux-status-saving": "儲存緊……",
"tux-save-unknown-error": "發生未知嘅錯誤。",
diff --git a/MLEB/Translate/i18n/core/zgh.json b/MLEB/Translate/i18n/core/zgh.json
index ad4d2c11..2d558871 100644
--- a/MLEB/Translate/i18n/core/zgh.json
+++ b/MLEB/Translate/i18n/core/zgh.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Amara-Amaziɣ",
+ "Hakim1bal",
"Mdb897"
]
},
@@ -15,13 +16,14 @@
"translate-taction-lstats": "ⵉⵙⵏⵎⴽⵜⴰⵏ ⵏ ⵜⵓⵜⵍⴰⵢⵜ",
"translate-taction-mstats": "ⵉⵙⵏⵎⴽⵜⴰⵏ ⵏ ⵉⴳⵔⴰⵡⵏ ⵏ ⵜⵓⵣⵉⵏⵉⵏ",
"translate-taction-export": "ⵙⵙⵓⴼⵖ",
+ "translate-page-settings-legend": "ⵜⵉⵙⵖⴰⵍ",
"translate-page-language": "ⵜⵓⵜⵍⴰⵢⵜ",
"translate-page-limit": "ⴰⵡⵜⵜⵓ",
"right-translate": "ⵙⵏⴼⵍ ⵙ ⵓⵏⴳⵔⵓⴷⵎ ⵏ ⵓⵙⵓⵖⵍ",
"translate-statsf-count-registrations": "ⵉⵏⵙⵙⵎⵔⵙⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ",
+ "translate-translations-project": "ⴰⵙⵏⴼⴰⵕ:",
"translate-manage-import-new": "ⵜⵓⵣⵉⵏⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ $1",
"translate-manage-import-summary": "ⴰⵙⴽⵛⵎ ⵏ ⵜⵓⵏⵖⵉⵍⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵙⴳ ⵓⵙⴰⴳⵎ ⴰⴱⵔⵔⴰⵏⵉ",
- "translate-js-support-title": "ⵜⵜⵔ ⵜⵉⵡⵉⵙⵉ ⵉⵖ ⵓⵔ ⵜⵓⴼⵉⵜ ⵉⵏⵖⵎⵉⵙⵏ ⵢⵓⴷⴰⵏ ⵃⵎⴰ ⴰⵙⵓⵖⵍ ⵉⵎⵉⴷⵉ ⵏ ⵜⵓⵣⵉⵏⵜ ⴰⴷ.",
"translate-documentation-language": "ⴰⵏⵜⴰⵎ ⵏ ⵜⵓⵣⵉⵏⵜ",
"translate-dynagroup-additions-desc": "ⵜⴰⴳⵔⴰⵡⵜ ⴰⴷ ⴰⵔ ⵜⵙⵎⴰⵍ ⵜⵉⵎⵢⴰⵣⴰⵏⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ ⴷ ⵜⵉⴷ ⵉⵜⵜⵡⴰⵙⵏⴼⵍⵏ",
"translate-msggroupselector-search-all": "ⴰⴽⴽⵯ",
diff --git a/MLEB/Translate/i18n/core/zh-hans.json b/MLEB/Translate/i18n/core/zh-hans.json
index 48aec825..bacb570c 100644
--- a/MLEB/Translate/i18n/core/zh-hans.json
+++ b/MLEB/Translate/i18n/core/zh-hans.json
@@ -11,6 +11,7 @@
"Fengchao",
"Gaoxuewei",
"Gzdavidwong",
+ "Hmgrmb",
"Hudafu",
"Hydra",
"Hzy980512",
@@ -26,6 +27,7 @@
"Shirayuki",
"Shizhao",
"Shuiwater",
+ "Si109",
"Slboat",
"Supaiku",
"VulpesVulpes825",
@@ -74,11 +76,9 @@
"translate-ignored": "(已忽略)",
"translate-edit-title": "编辑“$1”",
"translate-edit-definition": "信息定义",
- "translate-edit-translation": "翻译",
"translate-edit-contribute": "贡献",
"translate-edit-no-information": "<em>这条消息没有文档。如果您知道这条消息用于何处或如何使用,您可以通过添加文档至这条消息以帮助其他译者。</em>",
"translate-edit-information": "关于信息的资料($1)",
- "translate-edit-in-other-languages": "其他语言的信息",
"translate-edit-warnings": "关于不完整翻译的警告",
"translate-edit-tmmatch-source": "翻译原文:$1",
"translate-edit-tmmatch": "$1%匹配",
@@ -211,7 +211,6 @@
"supportedlanguages-count": "共计$1种语言。",
"supportedlanguages-activity": "$1:$2个编辑 - 最后编辑于$3天前",
"abusefilter-edit-builder-vars-translate-source-text": "翻译单元的原始文本",
- "translate-save": "发布($1)",
"translate-jssti-add": "添加至列表",
"managemessagegroups": "信息组管理",
"translate-smg-notallowed": "您不被允许执行该操作。",
@@ -221,6 +220,19 @@
"translate-smg-more": "在处理这些更改后这里将会有更多更改。",
"translate-smg-left": "wiki中的信息内容",
"translate-smg-right": "即将进行的更改",
+ "translate-smg-strong-sync-help": "帮助",
+ "translate-smg-groups-in-sync": "正在同步的组",
+ "translate-smg-groups-with-error-title": "在同步化时出现错误的例组",
+ "translate-smg-groups-with-error-desc": "在同步化时有错误的列表组",
+ "translate-smg-group-message-action-history": "历史",
+ "translate-smg-group-action-resolve": "标记为已解决",
+ "translate-smg-group-message-tag-outdated": "已过时",
+ "translate-smg-group-message-tag-rename": "重命名",
+ "translate-smg-group-message-message-content": "内容:",
+ "translate-smg-group-message-message-target": "目标:",
+ "translate-smg-group-message-message-replacement": "替换:",
+ "translate-smg-group-message-message-other-langs": "其他语言:",
+ "translate-smg-loading": "正在载入...",
"translate-manage-import-diff": "信息$1|操作:$2",
"translate-manage-import-new": "新信息$1",
"translate-manage-import-deleted": "删除的信息$1",
@@ -247,13 +259,6 @@
"translate-import-err-no-such-file": "文件<nowiki>$1</nowiki>不存在或未被本地上传。",
"translate-import-err-stale-group": "该文件属于的信息组不存在。",
"translate-import-err-no-headers": "文件不是翻译扩展程序所需格式的Gettext文件:无法从文件头确定信息组和语言。",
- "translate-js-summary": "摘要:",
- "translate-js-save": "发布",
- "translate-js-next": "发布并打开下一条",
- "translate-js-skip": "跳至下一条",
- "translate-js-history": "翻译历史",
- "translate-js-support": "提问",
- "translate-js-support-title": "如果没有足够的资料帮助正确翻译该信息,请要求帮助。",
"translate-js-support-unsaved-warning": "您有未发布的翻译。",
"translate-gs-pos": "位置",
"translate-gs-code": "代码",
diff --git a/MLEB/Translate/i18n/core/zh-hant.json b/MLEB/Translate/i18n/core/zh-hant.json
index bbb494b7..4aa599d3 100644
--- a/MLEB/Translate/i18n/core/zh-hant.json
+++ b/MLEB/Translate/i18n/core/zh-hant.json
@@ -21,7 +21,8 @@
"Waihorace",
"Wehwei",
"Wrightbus",
- "Xiplus"
+ "Xiplus",
+ "列维劳德"
]
},
"translate": "翻譯",
@@ -60,11 +61,9 @@
"translate-ignored": "(已略過)",
"translate-edit-title": "編輯 \"$1\"",
"translate-edit-definition": "訊息原文",
- "translate-edit-translation": "翻譯",
"translate-edit-contribute": "貢獻",
"translate-edit-no-information": "<em>此訊息沒有任何說明資訊。\n如果您知道這個訊息使用的地方,您可以增加說明資訊以協助其他翻譯人員。</em>",
"translate-edit-information": "關於訊息的資訊 ($1)",
- "translate-edit-in-other-languages": "訊息的其他語言",
"translate-edit-warnings": "未完成翻譯的警告",
"translate-edit-tmmatch-source": "翻譯原文:$1",
"translate-edit-tmmatch": "$1% 符合",
@@ -158,6 +157,11 @@
"translate-statsf-language": "語言代碼 (以逗號分隔):",
"translate-statsf-group": "群組代碼 (以逗號分隔):",
"translate-statsf-submit": "預覽",
+ "translate-statsf-unknown-error": "發生不明錯誤。",
+ "translate-statsf-error-message": "載入此圖片時發生錯誤:$1",
+ "translate-statsf-graph-alt-text-info": "用於翻譯統計的替代文字在下方資料表。",
+ "translate-statsf-alt-text": "此為翻譯統計的替代文字。",
+ "translate-statsf-embed": "在其它頁面上內嵌翻譯統計圖的代碼。",
"translate-tag-page-desc": "wiki頁面[[$2|$1]]來自$3($4)的翻譯。",
"translate-sidebar-alltrans": "其他翻譯",
"translations": "所有翻譯",
@@ -203,8 +207,8 @@
"translate-mgs-totals": "所有$1種{{PLURAL:$1|語言}}合計",
"translate-mgs-invalid-group": "指定的群組 $1 不存在。",
"translate-mgs-nothing": "所請求的統計資訊沒有任何內容可以顯示。",
- "supportedlanguages": "支援的語言",
- "supportedlanguages-summary": "本頁顯示{{SITENAME}}所有支援的語言清單,\n連同翻譯該語言的翻譯人員姓名,\n翻譯人員的姓名越大,代表翻譯人員的編輯貢獻越多,\n底線的顏色用來表示翻譯人員最近活動的狀況。",
+ "supportedlanguages": "有效語言",
+ "supportedlanguages-summary": "本頁顯示在{{SITENAME}}上所有有效語言清單,\n連同翻譯該語言的翻譯人員姓名,\n翻譯人員的姓名越大,代表翻譯人員的編輯貢獻越多,\n底線的顏色用來表示翻譯人員最近活動的狀況。",
"supportedlanguages-colorlegend": "色彩圖例:最近一次翻譯於 $1 天前。",
"supportedlanguages-sqlite-error": "不支援 SQLite",
"supportedlanguages-translators": "{{PLURAL:$2|{{GENDER:$3|翻譯人員}}}}:$1",
@@ -214,7 +218,6 @@
"translate-supportedlanguages-cached": "此資訊在$1前被快取。",
"abusefilter-edit-builder-vars-translate-source-text": "翻譯單元的來源文字",
"abusefilter-edit-builder-vars-translate-target-language": "翻譯的目標語言",
- "translate-save": "發布 ($1)",
"translate-jssti-add": "新增至清單",
"managemessagegroups": "訊息群組管理",
"translate-smg-notallowed": "你不允許執行此操作。",
@@ -235,6 +238,21 @@
"translate-smg-rename-rename": "添加為重新命名…",
"translate-smg-rename-dialog-title": "為$1選擇符合的重新命名",
"translate-smg-changeset-modified": "變更集已被作者用戶或程序給變更。因您的變更可能會覆蓋掉它們的變更,所以無法發布。請重新載入頁面來查看最新一次的變更內容。",
+ "translate-smg-no-groups-in-sync": "目前沒有正在同步的群組",
+ "translate-smg-strong-sync-help": "說明",
+ "translate-smg-groups-in-sync": "目前正在同步的群組",
+ "translate-smg-groups-in-sync-list": "目前在背景處理的群組清單:",
+ "translate-smg-groups-with-error-title": "同步時出現錯誤的群組",
+ "translate-smg-groups-with-error-desc": "在同步時出現錯誤的群組清單:",
+ "translate-smg-group-with-error-summary": "帶有錯誤的 $1 個{{PLURAL:$1|訊息}}:",
+ "translate-smg-group-message-action-history": "歷史",
+ "translate-smg-group-message-tag-outdated": "過時",
+ "translate-smg-group-message-tag-rename": "重新命名",
+ "translate-smg-group-message-tag-label": "{{PLURAL:$1|標籤}}:",
+ "translate-smg-group-message-message-content": "內容:",
+ "translate-smg-group-message-message-target": "目標:",
+ "translate-smg-group-message-message-replacement": "替換:",
+ "translate-smg-group-message-message-other-langs": "其他語言:",
"translate-manage-import-diff": "訊息 $1 | 操作:$2",
"translate-manage-import-new": "新訊息 $1",
"translate-manage-import-deleted": "已刪除訊息 $1",
@@ -256,6 +274,9 @@
"translate-manage-intro-other": "下列是在 $1 語言的翻譯變更清單。\n請檢查變更,並選擇每一個變更所要執行的動作。\n若您不想變更,您可以選擇忽略。",
"translate-manage-import-ok": "已匯入:$1",
"translate-manage-import-done": "匯入完成!",
+ "translate-manage-empty-content": "內容為空",
+ "translate-manage-key-reused": "此訊息已存在於本 wiki 中。請檢查舊密鑰的意外重新使用。",
+ "translate-manage-source-message-not-found": "找不到訊息定義",
"importtranslations": "匯入翻譯",
"translate-import-from-local": "上傳本地檔案:",
"translate-import-load": "讀取檔案",
@@ -265,13 +286,6 @@
"translate-import-err-no-such-file": "檔案 <nowiki>$1</nowiki> 不存在或尚未上傳。",
"translate-import-err-stale-group": "此檔案所屬的訊息群組不存在。",
"translate-import-err-no-headers": "此檔案的 Gettext 翻譯擴充格式並不完整,\n無法從檔頭偵測訊息群組及語言。",
- "translate-js-summary": "摘要:",
- "translate-js-save": "發布",
- "translate-js-next": "發布並開啟下一筆",
- "translate-js-skip": "跳至下一筆",
- "translate-js-history": "翻譯歷史",
- "translate-js-support": "提出問題",
- "translate-js-support-title": "若此處沒有足夠的資訊讓您可以正確的翻譯此訊息,請提出問題。",
"translate-js-support-unsaved-warning": "您有尚未發布的翻譯。",
"translate-gs-pos": "位置",
"translate-gs-code": "代碼",
diff --git a/MLEB/Translate/i18n/pagetranslation/af.json b/MLEB/Translate/i18n/pagetranslation/af.json
index 94ae021f..ede4f22b 100644
--- a/MLEB/Translate/i18n/pagetranslation/af.json
+++ b/MLEB/Translate/i18n/pagetranslation/af.json
@@ -53,7 +53,6 @@
"tpt-tab-translate": "Vertaal",
"tpt-target-page": "Hierdie bladsy kan nie handmatig gewysig word nie.\nDie bladsy is 'n vertaling van die bladsy [[$1]].\nDie vertaling kan bygewerk word via die [$2 vertaalgereedskap].",
"tpt-unknown-page": "Hierdie naamruimte is gereserveer vir die vertalings van bladsye.\nDie bladsy wat u probeer wysig kom nie ooreen met een wat vir vertaling gemerk is nie.",
- "tpt-discouraged-language-reason": "Rede: $1",
"tpt-render-summary": "Besig met bewerkings vanweë 'n nuwe basisweergawe van die bronblad",
"tpt-aggregategroup-save": "Stoor",
"tpt-aggregategroup-new-name": "Naam:",
diff --git a/MLEB/Translate/i18n/pagetranslation/alt.json b/MLEB/Translate/i18n/pagetranslation/alt.json
new file mode 100644
index 00000000..77d38d09
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/alt.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Батыр Комдошев"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% кӧчӱрилген)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/an.json b/MLEB/Translate/i18n/pagetranslation/an.json
new file mode 100644
index 00000000..eba5ee42
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/an.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Willtron"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2 % traduciu)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/ann.json b/MLEB/Translate/i18n/pagetranslation/ann.json
index cefba957..5699b477 100644
--- a/MLEB/Translate/i18n/pagetranslation/ann.json
+++ b/MLEB/Translate/i18n/pagetranslation/ann.json
@@ -4,5 +4,6 @@
"Katelem"
]
},
+ "tps-edit-sourcepage-ve-warning-button": "ÎSO",
"tpt-languages-nonzero": "$1 (mînwene $2% itap me ofifi otu-usem)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ar.json b/MLEB/Translate/i18n/pagetranslation/ar.json
index b5724273..41eb5b46 100644
--- a/MLEB/Translate/i18n/pagetranslation/ar.json
+++ b/MLEB/Translate/i18n/pagetranslation/ar.json
@@ -76,8 +76,6 @@
"tpt-discouraged-language-header": "الترجمة إلى $1 ليست أولوية لهذه الصفحة.",
"tpt-discouraged-language-content": "قرر إداري ترجمة تركيز جهود الترجمة على $1.",
"tpt-discouraged-language-force": "<strong>هذه الصفحة لا يمكن ترجمتها إلى $2.</strong>\n\nقرر إداري ترجمة أن هذه الصفحة يمكن ترجمتها فقط إلى $3.",
- "tpt-discouraged-language": "<strong>الترجمة إلى $2 ليس أولوية لهذه الصفحة.</strong>\n\nقرر إداري ترجمة تركيز جهود الترجمة على $3.",
- "tpt-discouraged-language-reason": "السبب: $1",
"tpt-priority-languages": "إداري ترجمة ضبط لغات الأولوية لهذه المجموعة إلى $1.",
"tpt-priority-languages-force": "قام إدري ترجمة بتعيين لغات الأولوية لهذه المجموعة على $1؛ الترجمة إلى لغات أخرى غير مسموح بها.",
"tpt-render-summary": "تحديث لمطابقة نسخة صفحة المصدر الجديدة",
diff --git a/MLEB/Translate/i18n/pagetranslation/as.json b/MLEB/Translate/i18n/pagetranslation/as.json
index 8c81f606..1c058b69 100644
--- a/MLEB/Translate/i18n/pagetranslation/as.json
+++ b/MLEB/Translate/i18n/pagetranslation/as.json
@@ -4,7 +4,8 @@
"Bishnu Saikia",
"Chaipau",
"Dibya Dutta",
- "Gitartha.bordoloi"
+ "Gitartha.bordoloi",
+ "Simbu123"
]
},
"pagetranslation": "পৃষ্ঠা ভাঙনি",
@@ -22,7 +23,6 @@
"tpt-languages-zero": "এই ভাষাৰ অনুবাদ আৰম্ভ কৰক",
"tpt-languages-nonzero": "$1 ($2% অনূদিত)",
"tpt-target-page": "এই পৃষ্ঠাটো সাধাৰণভাৱে নবীকৰণ কৰিব নোৱাৰি।\nএই পৃষ্ঠাটো [[$1]] পৃষ্ঠাৰ অনুবাদ আৰু [$2 অনুবাদ সঁজুলি] ব্যৱহাৰ কৰি এই অনুবাদ নবীকৰণ কৰিব পৰা যায়।",
- "tpt-discouraged-language-reason": "কাৰণ: $1",
"tpt-aggregategroup-add": "যোগ কৰক",
"tpt-aggregategroup-save": "সাঁচি থওক",
"tpt-aggregategroup-new-name": "নাম:",
@@ -34,5 +34,6 @@
"pt-movepage-reason": "কাৰণ:",
"pt-movepage-action-perform": "স্থানান্তৰ নকৰিব",
"pt-deletepage-current": "পৃষ্ঠাৰ নাম:",
- "pt-deletepage-reason": "কাৰণ:"
+ "pt-deletepage-reason": "কাৰণ:",
+ "pm-pagetitle-placeholder": "পৃষ্ঠাৰ শিৰোনাম লিখক"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ast.json b/MLEB/Translate/i18n/pagetranslation/ast.json
index 0c040016..51f45bd7 100644
--- a/MLEB/Translate/i18n/pagetranslation/ast.json
+++ b/MLEB/Translate/i18n/pagetranslation/ast.json
@@ -69,8 +69,6 @@
"tpt-discouraged-language-header": "La traducción al $1 nun ye prioritaria pa esta páxina.",
"tpt-discouraged-language-content": "Un alministrador de traducciones decidió concentrar el trabayu de traducción nel $1.",
"tpt-discouraged-language-force": "<strong>Esta páxina nun pue traducise al $2.</strong>\n\nUn alministrador de traducciones decidió qu'esta páxina sólo pue traducise al $3.",
- "tpt-discouraged-language": "<strong>La traducción al $2 nun ye una prioridá pa esta páxina.</strong>\n\nUn alministrador de traducción decidió centrar l'esfuerzu de traducción en $3.",
- "tpt-discouraged-language-reason": "Motivu: $1",
"tpt-priority-languages": "Un alministrador de traducciones definió les llingües prioritaries d'esti grupu como $1.",
"tpt-priority-languages-force": "Un alministrador de traducciones configuró les llingües prioritaries d'esti grupu como $1. Nun se permite traducir a otres llingües.",
"tpt-render-summary": "Anovando pa casar cola nueva versión de la páxina orixinal",
@@ -185,7 +183,7 @@
"pm-pagetitle-placeholder": "Escribe'l títulu de la páxina",
"pm-pagetitle-invalid": "Escribe un títulu de páxina válidu. Tien de tener el formatu <nome-de-páxina>/<códigu-de-llingua>.",
"pm-pagetitle-missing": "Escribe'l títulu de la páxina.",
- "pm-langcode-missing": "Paez que falta'l códigu de llingua nel títulu. Escribe'l títulu de la páxina col formatu <nome-de-páxina>/<códigu-de-llingua>.",
+ "pm-langcode-missing": "Paez que falta'l códigu de llingua nel títulu. Escribe'l títulu de la páxina col formatu <page-name>/<language-code>.",
"pm-summary-import": "Traducción importada usando [[Special:PageMigration|migración de páxina]]",
"pm-on-import-message-text": "Importáronse les traducciones antigües. Usa les opciones añadir, cambiar y desaniciar p'axustar les unidaes de traducción y fai click nel botón \"{{int:pm-savepages-button-label}}\" pa guardales. Fai click nel botón \"{{int:pm-cancel-button-label}}\" pa descartales.",
"pm-on-save-message-text": "Guardáronse les unidaes de traducción. Agora puedes escribir el títulu d'una nueva páxina de traducción pa migrales o facer cambios nes unidaes de más abaxo y guardar una nueva revisión.",
diff --git a/MLEB/Translate/i18n/pagetranslation/az.json b/MLEB/Translate/i18n/pagetranslation/az.json
index 04263d33..fe893c8c 100644
--- a/MLEB/Translate/i18n/pagetranslation/az.json
+++ b/MLEB/Translate/i18n/pagetranslation/az.json
@@ -55,7 +55,6 @@
"translate-tag-translate-link-desc": "Bu layihəni tərcümə et",
"translate-tag-markthis": "Bu versiyanı tərcümə üçün işarələ",
"tpt-languages-nonzero": "$1 ($2% tərcümə edilib)",
- "tpt-discouraged-language-reason": "Təsvir: $1",
"aggregategroups": "Aqreqat qrupları",
"tpt-aggregategroup-add": "Əlavə et",
"tpt-aggregategroup-save": "Saxla",
diff --git a/MLEB/Translate/i18n/pagetranslation/azb.json b/MLEB/Translate/i18n/pagetranslation/azb.json
index 9651a85f..c3754450 100644
--- a/MLEB/Translate/i18n/pagetranslation/azb.json
+++ b/MLEB/Translate/i18n/pagetranslation/azb.json
@@ -62,8 +62,6 @@
"tpt-unknown-page": "بو آدفضاسی مقاله‌لری چئویرمگه رِزِرو اولوب‌دور.\nسیز چئویرمگه چالیشدیغینیز صحیفه، هئچ بیر چئویرمگه نیشانلانمیش صحیفه‌یه مطابق نظره گلمیر.",
"tpt-translation-restricted": "بو صحیفه‌نین بو دیله چئویرمه‌سی بیر چئویرمک ایداره‌چیسی ایله قاباغی آلینیب‌دیر.\n\nندن: $1",
"tpt-discouraged-language-force": "<strong>بو صحیفه $2-ه چئویریله بیلمز.</strong>\n\nبیر چئویرمک ایداره‌چیسی بئله قرار آلیب کی بو صحیفه یالنیز $3-ه چئویریله بیلر.",
- "tpt-discouraged-language": "<strong>بو صحیفه‌نی $2-ه چئویرمک بیر اؤنجه‌لیک دئییل.</strong>\n\nبیر چئویرمک ایداره‌چیسی بئله قرار آلیب کی چئویرمک تمرکزی $3-ه اولسون.",
- "tpt-discouraged-language-reason": "ندن: $1",
"tpt-priority-languages": "بیر چئویرمک ایداره‌چیسی، بو قروپون اؤنجه‌لیک دیلینی $1 سئچیب‌دیر.",
"tpt-render-summary": "قایناق صحیفه‌نین یئنی نوسخه‌سی ایله تطبیق اوچون گونجل‌لنیر",
"aggregategroups": "بیرلشدیریلمیش قروپلار",
diff --git a/MLEB/Translate/i18n/pagetranslation/ban.json b/MLEB/Translate/i18n/pagetranslation/ban.json
index 5ca438f6..79dec45a 100644
--- a/MLEB/Translate/i18n/pagetranslation/ban.json
+++ b/MLEB/Translate/i18n/pagetranslation/ban.json
@@ -1,8 +1,9 @@
{
"@metadata": {
"authors": [
+ "Chinamoonroll",
"Joseagush"
]
},
- "tpt-languages-nonzero": "$1 ($2% sampun salinin)"
+ "tpt-languages-nonzero": "$1 ($2% sampun kasalinin)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/bbc-latn.json b/MLEB/Translate/i18n/pagetranslation/bbc-latn.json
new file mode 100644
index 00000000..e79e4070
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/bbc-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Salomo Christian Hutajulu"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2 lapatan)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/bci.json b/MLEB/Translate/i18n/pagetranslation/bci.json
new file mode 100644
index 00000000..a9bc3385
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/bci.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kjeanclaude"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% katchili)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/bcl.json b/MLEB/Translate/i18n/pagetranslation/bcl.json
index 1ff9b950..40101f29 100644
--- a/MLEB/Translate/i18n/pagetranslation/bcl.json
+++ b/MLEB/Translate/i18n/pagetranslation/bcl.json
@@ -59,8 +59,6 @@
"tpt-unknown-page": "Ining espasyong ngaran nakareserba para sa pahina kan laman nin mga dakit-taramon.\nAn pahina na saimong boot na pagliliwaton garo habong magtutugot sa arinman na pahinang markado para ipagdakit-taramon.",
"tpt-translation-restricted": "An pagdakit-taramon kaining pahina sa lengguwaheng ini pinagpupugulan kan administrador nin pagdakit-taramon.\n\nRason: $1",
"tpt-discouraged-language-force": "<strong>Ining pahina dae puwedeng ipagdakit-taramon sa $2.</strong>\n\nAn administrador kan pagdakit-taramon nagdesisyon na ining pahina mapuwedeng sanang ipagdakit-taramon sa $3.",
- "tpt-discouraged-language": "<strong>An pagdadakit-taramon sa $2 bakong prayoridad para sa pahinang ini.</strong>\n\nAn administrador kan pagdakit-taramon nagdesisyon na itutok an gibong pagdakit-taramon sa $3.",
- "tpt-discouraged-language-reason": "Rason: $1",
"tpt-priority-languages": "An administrador kan pagdakit-taramon ikinaag an prayoridad na mga lengguwahe para kaining grupo sa $1.",
"tpt-render-summary": "Panunumpayan tanganing ipagtugma sa baguhong bersyon kan ginikanang pahina",
"aggregategroups": "Sinurumpay na mga grupo",
diff --git a/MLEB/Translate/i18n/pagetranslation/be-tarask.json b/MLEB/Translate/i18n/pagetranslation/be-tarask.json
index 184ac342..025993cf 100644
--- a/MLEB/Translate/i18n/pagetranslation/be-tarask.json
+++ b/MLEB/Translate/i18n/pagetranslation/be-tarask.json
@@ -11,13 +11,17 @@
"pagetranslation": "Пераклад старонкі",
"right-pagetranslation": "пазначэньне вэрсіяў старонак для перакладу",
"action-pagetranslation": "кіраваньне перакладам старонак",
+ "tps-edit-sourcepage-text": "Вы рэдагуеце крыніцу перакладальнай старонкі. Калі ласка, пераканайцеся, што вы знаёмыя з гэтай дакумэнтацыяй:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Рэдагаваньне крынічнага тэксту]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Прыклады выкарыстаньня разьметкі]",
+ "tps-edit-sourcepage-ve-warning-title": "Увага: непадтрымліваная старонка",
+ "tps-edit-sourcepage-ve-warning-text": "Вы рэдагуеце перакладальную старонку. Іхняе рэдагаваньне ў гэтым рэдактары афіцыйна яшчэ не падтрымліваецца. Калі ласка, скарыстайцеся рэдактарам коду.",
+ "tps-edit-sourcepage-ve-warning-button": "Добра",
"tpt-section": "Адзінка перакладу $1",
"tpt-section-new": "Новая адзінка перакладу. Назва: $1",
"tpt-section-deleted": "Адзінка перакладу $1",
"tpt-diff-old": "Папярэдні тэкст",
"tpt-diff-new": "Новы тэкст",
"tpt-submit": "Пазначыць гэту вэрсію для перакладу",
- "tpt-sections-oldnew": "Новыя і існуючыя адзінкі перакладу",
+ "tpt-sections-oldnew": "Новыя й існыя адзінкі перакладу",
"tpt-sections-deleted": "Выдаленыя адзінкі перакладу",
"tpt-sections-template": "Шаблён старонкі перакладу",
"tpt-action-nofuzzy": "Не бракаваць пераклады",
@@ -28,23 +32,31 @@
"tpt-saveok": "Старонка «$1» была пазначаная для перакладу з $2 {{PLURAL:$2|адзінкай перакладу|адзінкамі перакладу|адзінкамі перакладу}}.\nЗараз старонка можа быць <span class=\"plainlinks\">[$3 перакладзеная]</span>.",
"tpt-saveok-first": "Вы можаце [[Special:PageMigration|імпартаваць існыя пераклады]] для гэтай старонкі (калі ёсьць).",
"tpt-offer-notify": "Вы можаце <span class=\"plainlinks\">[$1 паведаміць перакладчыкам]</span> пра гэтую старонку.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Паглядзець сьпіс перакладальных старонак.]]",
"tpt-showpage-intro": "Ніжэй знаходзяцца новыя, існуючыя і выдаленыя сэкцыі.\nПерад пазначэньнем гэтай вэрсіі для перакладу праверце зьмены ў сэкцыях для таго, каб пазьбегнуць непатрэбнай працы для перакладчыкаў.",
"tpt-mark-summary": "Пазначыў гэтую вэрсію для перакладу",
"tpt-mark-nochanges": "Няма зьмяненьняў для прагляду. Пазначэньне гэтай старонкі для перакладу не адрэдагуе ні яе, ні любыя модулі перакладу.",
"tpt-edit-failed": "Немагчыма абнавіць старонку: $1",
"tpt-duplicate": "Назва адзінкі перакладу «$1» скарыстаная больш за адзін раз.",
+ "tpt-invalid": "Назва блёку перакладу $1 не павінна мець сымбаляў падкрэсьліваньня і нахільных рысак.",
"tpt-unmarked": "Старонка [[:$1]] болей не пазначаная для перакладу.",
"tpt-list-nopages": "Старонкі для перакладу не пазначаныя альбо не падрыхтаваныя.",
"tpt-new-pages-title": "Старонкі, прапанаваныя да перакладу",
"tpt-old-pages-title": "Старонкі на стадыі перакладу",
"tpt-other-pages-title": "Сапсаваныя старонкі",
+ "tpt-outdated-pages-title": "Старонкі з нерэцэнзаванымі зьменамі",
"tpt-new-pages": "{{PLURAL:$1|1=Гэтая старонка ўтрымлівае|Гэтыя старонкі ўтрымліваюць}} тэкст зь меткамі перакладу, але {{PLURAL:$1|1=пазначанай для перакладу вэрсіі гэтай старонкі|пазначаных для перакладу вэрсіяў гэтых старонак}} няма.",
- "tpt-old-pages": "Некаторыя вэрсіі {{PLURAL:$1|1=гэтай старонкі|гэтых старонак}} былі пазначаныя для перакладу.",
+ "tpt-old-pages": "Апошняя вэрсія {{PLURAL:$1|1=гэтай старонкі|гэтых старонак}} была пазначаная для перакладу.",
"tpt-other-pages": "{{PLURAL:$1|1=Старая вэрсія гэтай старонкі пазначаная|Старыя вэрсіі гэтых старонак пазначаныя}} для перакладу, але {{PLURAL:$1|1=апошняя вэрсія ня можа быць пазначаная|апошнія вэрсіі ня могуць быць пазначаныя}} для перакладу.",
+ "tpt-outdated-pages": "{{PLURAL:$1|Гэтая старонка мае|Гэтыя старонкі маюць}} зьмены, не пазначаныя да перакладу.",
+ "tpt-tag-oldsyntax": "стары сынтакс",
"tpt-select-prioritylangs": "Сьпіс прыярытэтных кодаў моваў, падзеленых коскамі:",
"tpt-select-prioritylangs-force": "Запабегчы перакладам на адрозныя ад прыярытэтных мовы",
"tpt-select-prioritylangs-reason": "Прычына:",
"tpt-sections-prioritylangs": "Прыярытэтныя мовы",
+ "tpt-sections-syntaxversion": "Вэрсія сынтаксу",
+ "tpt-syntaxversion-text": "На гэтай старонцы цяпер выкарыстаная старая вэрсія крынічнага сынтаксу перакладальных старонак. Новая вэрсія агартацьмеце неперакладзеныя разьдзелы HTML-цэтлікам, які пазначацьме слушную мову тэксту. Прыклад: $1. Новым сынтаксам разьметкі $2 можна скарыстацца, каб пазьбегнуць усялякага абгортваньня ў непрымальных месцах, напрыклад пры перакладзе атрыбуту <code>title</code> элемэнтаў. Вярнуцца да старой вэрсіі сынтаксу немагчыма.",
+ "tpt-syntaxversion-label": "Выкарыстаць для гэтай старонкі найноўшую вэрсію сынтаксу",
"tpt-rev-mark": "пазначыць да перакладу",
"tpt-rev-unmark": "выдаліць зь перакладу",
"tpt-rev-discourage": "адхіліць",
@@ -66,14 +78,13 @@
"tpt-tab-translate": "Перакладаць",
"tpt-target-page": "Гэта старонка ня можа быць абноўлена ўручную.\nГэта старонка зьяўляецца перакладам старонкі [[$1]], пераклад можа быць абноўлены з выкарыстаньнем [$2 інструмэнта перакладу].",
"tpt-unknown-page": "Гэтая прастора назваў зарэзэрваваная для перакладаў старонак зьместу.\nСтаронка, якую Вы спрабуеце рэдагаваць, верагодна, не зьвязана зь якой-небудзь старонкай, пазначанай для перакладу.",
- "tpt-translation-restricted": "Пераклад гэтай старонкі на дадзеную мову быў папярэджаны адміністратарам паракладаў.\n\nПрычына: $1",
+ "tpt-translation-restricted": "Пераклад гэтай старонкі на дадзеную мову быў заблякаваны адміністратарам перакладаў.\n\nПрычына: $1",
+ "tpt-translation-restricted-no-reason": "Пераклад гэтай старонкі на дадзеную мову быў заблякаваны адміністратарам перакладаў.",
"tpt-discouraged-language-force-header": "Гэтую старонку немагчыма перакласьці на $1.",
"tpt-discouraged-language-force-content": "Адміністратар перакладу пастанавіў, што гэта старонка можа быць перакладзеная толькі на $1.",
"tpt-discouraged-language-header": "Пераклад на $1 ня ёсьць прыярытэтным для гэтай старонкі.",
"tpt-discouraged-language-content": "Адміністратар перакладу вырашыў засяродзіць высілкі па перакладзе на $1.",
"tpt-discouraged-language-force": "<strong>Гэтая старонка ня можа быць перакладзеная на мову $2.</strong>\n\nАдміністратар перакладу вырашыў, што гэтая старонка можа быць перакладзеная толькі на мовы: $3.",
- "tpt-discouraged-language": "<strong>Пераклад на мову $2 не зьяўляецца прыярытэтным.</strong>\n\nАдміністратар перакладу вырашыў сканцэнтраваць перакладніцкія высілкі на мовах $3.",
- "tpt-discouraged-language-reason": "Прычына: $1",
"tpt-priority-languages": "Адміністратар перакладаў вызначыў прыярытэтныя мовы для гэтай групы: $1.",
"tpt-priority-languages-force": "Адміністратар перакладу вызначыў для гэтай групы прыярытэтнымі мовамі $1. Пераклад на іншыя мовы не дазволены.",
"tpt-render-summary": "Абнаўленьне для адпаведнасьці новай вэрсіі крынічнай старонкі",
@@ -139,6 +150,7 @@
"pt-movepage-list-translatable-note": "Гэтыя старонкі мусяць быць перайменаваныя асобна.",
"pt-movepage-list-other": "{{PLURAL:$1|1=Іншая падстаронка|Іншыя падстаронкі}}",
"pt-movepage-list-count": "Агулам $1 {{PLURAL:$1|старонка|старонкі|старонак}} і {{PLURAL:$2|падстаронка|падстаронкі|падстаронак}} для пераносу.",
+ "pt-movepage-list-no-pages": "Старонкі ня знойдзеныя.",
"pt-movepage-legend": "Перанесьці старонкі, якія магчыма перакласьці",
"pt-movepage-current": "Цяперашняя назва:",
"pt-movepage-new": "Новая назва:",
@@ -169,6 +181,7 @@
"pt-deletepage-list-section": "Старонкі адзінкі перакладу",
"pt-deletepage-list-other": "Іншыя падстаронкі",
"pt-deletepage-list-count": "Агулам $1 {{PLURAL:$1|старонка|старонкі|старонак}} і {{PLURAL:$2|падстаронка|падстаронкі|падстаронак}} да выдаленьня.",
+ "pt-deletepage-list-no-pages": "Старонкі ня знойдзеныя.",
"pt-deletepage-full-logreason": "Частка старонкі для перакладу «$1»",
"pt-deletepage-lang-logreason": "Частка старонкі для перакладу «$1»",
"pt-deletepage-started": "Калі ласка, праверце [[Special:Log/pagetranslation|старонку журнала перакладаў]] адносна памылак і паведамленьняў пра выкананьне.",
diff --git a/MLEB/Translate/i18n/pagetranslation/bg.json b/MLEB/Translate/i18n/pagetranslation/bg.json
index 793d70b7..d76b45b1 100644
--- a/MLEB/Translate/i18n/pagetranslation/bg.json
+++ b/MLEB/Translate/i18n/pagetranslation/bg.json
@@ -20,7 +20,6 @@
"tpt-translation-intro": "Тази страница е <span class=\"plainlinks\">[$1 преведена версия]</span> на страницата [[$2]] и преводът е завършен на $3%.",
"tpt-languages-legend": "Други езици:",
"tpt-languages-nonzero": "$1 ($2% преведено)",
- "tpt-discouraged-language-reason": "Причина: $1",
"tpt-aggregategroup-add": "Добавяне",
"tpt-aggregategroup-save": "Съхраняване",
"tpt-aggregategroup-new-name": "Име:",
diff --git a/MLEB/Translate/i18n/pagetranslation/bn.json b/MLEB/Translate/i18n/pagetranslation/bn.json
index 4ed98829..212b7439 100644
--- a/MLEB/Translate/i18n/pagetranslation/bn.json
+++ b/MLEB/Translate/i18n/pagetranslation/bn.json
@@ -9,7 +9,6 @@
]
},
"pagetranslation": "পাতা অনুবাদ",
- "tps-edit-sourcepage-title": "একটি অনুবাদযোগ্য পাতা সম্পাদন করা হচ্ছে",
"tps-edit-sourcepage-ve-warning-title": "সাবধান: অসমর্থনপ্রাপ্ত পাতা",
"tps-edit-sourcepage-ve-warning-text": "আপনি একটি অনুবাদযোগ্য পাতা সম্পাদনা করছেন। এইগুলি এই সম্পাদকের মাধ্যমে সম্পাদনা করা এখনও আনুষ্ঠানিকভাবে সমর্থিত নয়। অনুগ্রহপূর্বক উৎস সম্পাদক ব্যবহার করুন।",
"tps-edit-sourcepage-ve-warning-button": "ঠিক আছে",
@@ -29,7 +28,7 @@
"tpt-old-pages-title": "অনুবাদে থাকা পাতা",
"tpt-other-pages-title": "ভাঙ্গা পাতা",
"tpt-outdated-pages-title": "অমীমাংসিত পরিবর্তনসহ পাতাসমূহ",
- "tpt-old-pages": "{{PLURAL:$1|এই পাতাটির|এই পাতাগুলির}} কিছু সংস্করণ অনুবাদের জন্য চিহ্নিত করা হয়েছে।",
+ "tpt-old-pages": "{{PLURAL:$1|এই পাতাটির|এই পাতাগুলির}} সর্বশেষ সংস্করণ অনুবাদের জন্য চিহ্নিত করা হয়েছে।",
"tpt-tag-discouraged": "নিরুৎসাহিত করা হচ্ছে",
"tpt-select-prioritylangs-reason": "কারণ:",
"tpt-sections-prioritylangs": "অগ্রাধিকারের ভাষাগুলি",
@@ -39,8 +38,9 @@
"tpt-rev-encourage": "পুনরুদ্ধার",
"tpt-rev-mark-tooltip": "অনুবাদের জন্য এই পৃষ্ঠার সর্বশেষ সংস্করণ চিহ্নিত করুন।",
"tpt-rev-unmark-tooltip": "অনুবাদ থেকে এই পাতাটি সরান।",
- "translate-tag-translate-link-desc": "এই পাতা অনুবাদ করুন",
+ "translate-tag-translate-link-desc": "এই পাতাটি অনুবাদ করুন",
"translate-tag-markthis": "অনুবাদের জন্য এই পাতা চিহ্নিত করুন",
+ "translate-tag-markthisagain": "<span class=\"plainlinks\">[$2 অনুবাদের জন্য সর্বশেষ চিহ্নিত করার]</span> পর থেকে এই পাতাটিতে <span class=\"plainlinks\">[$1 পরিবর্তন ঘটেছে]</span>।",
"translate-tag-hasnew": "এই পাতায় <span class=\"plainlinks\">[$1 পরিবর্তন]</span> রয়েছে যা অনুবাদ করার জন্য চিহ্নিত করা হয় নি।",
"tpt-translation-intro": "এই পাতাটি [[$2]] পাতার একটি <span class=\"plainlinks\">[$1 অনূদিত সংস্করণ]</span> এবং অনুবাদ $3% সম্পূর্ণ হয়েছে।",
"tpt-translation-intro-fuzzy": "পুরাতন অনুবাদ এটির মত চিহ্নিত করা হয়েছে।",
@@ -49,7 +49,6 @@
"tpt-languages-nonzero": "$1 ($2% অনূদিত)",
"tpt-tab-translate": "অনুবাদ",
"tpt-target-page": "এই পাতাটি ম্যানুয়ালি হালনাগাদ করা যাবে না।\nএই পাতাটি [[$1]] পাতার একটি অনুবাদ এবং [$2 অনুবাদ সরঞ্জাম] ব্যবহার করে অনুবাদ হালনাগাদ করা যাবে।",
- "tpt-discouraged-language-reason": "কারণ: $1",
"tpt-render-summary": "উৎস পাতার নতুন সংস্করণের সাথে মেলাতে হালনাগাদ করা হচ্ছে",
"tpt-aggregategroup-add": "যোগ",
"tpt-aggregategroup-save": "সংরক্ষণ",
@@ -61,7 +60,7 @@
"tpt-aggregategroup-update-cancel": "বাতিল",
"log-name-pagetranslation": "পাতা অনুবাদ লগ",
"logentry-pagetranslation-mark": "$1 $3 অনুবাদের জন্য {{GENDER:$2|চিহ্নিত করেছেন}}",
- "logentry-pagetranslation-unmark": "$1 অনুবাদ থেকে $3 {{GENDER:$2|সরিয়ে ফেলেছেন}}",
+ "logentry-pagetranslation-unmark": "$1 অনুবাদ ব্যবস্থা থেকে $3 {{GENDER:$2|সরিয়ে ফেলেছেন}}",
"logentry-pagetranslation-deletefok": "$1 অনুবাদযোগ্য $3 পাতার অপসারণ {{GENDER:$2|সম্পন্ন}} করেছেন",
"logentry-pagetranslation-deletelok": "$1 অনুবাদের পাতা $3 অপসারণ {{GENDER:$2|করেছেন}}",
"log-action-filter-pagetranslation": "কাজের ধরন:",
diff --git a/MLEB/Translate/i18n/pagetranslation/bo.json b/MLEB/Translate/i18n/pagetranslation/bo.json
index e5c16bb3..ec8b7076 100644
--- a/MLEB/Translate/i18n/pagetranslation/bo.json
+++ b/MLEB/Translate/i18n/pagetranslation/bo.json
@@ -2,12 +2,14 @@
"@metadata": {
"authors": [
"Freeyak",
- "Phurbutsering"
+ "Phurbutsering",
+ "TaDhondup"
]
},
"pagetranslation": "ཤོག་ངོས་ཡིག་སྒྱུར།",
"tpt-diff-old": "ཡིག་འབྲུ་གོང་མ།",
"tpt-diff-new": "ཡིག་འབྲུ་གསར་བ།",
+ "tpt-list-pages-in-translations": "[[དམིགས་བསལ། ལོ་ཙཱའི་ཤོག་ངོས། ལོ་ཙཱ་བྱ་དགོས་པའི་ཤོག་ངོས་རྣམས་སྟོན།]]",
"translate-tag-translate-link-desc": "ཤོག་ངོས་འདི་བསྒྱུར་བ།",
"tpt-languages-legend": "སྐད་རིགས་གཞན།",
"pt-movepage-list-translation": "ཡིག་སྒྱུར་ {{PLURAL:$1|ཤོག་ངོས།}}",
diff --git a/MLEB/Translate/i18n/pagetranslation/br.json b/MLEB/Translate/i18n/pagetranslation/br.json
index 780959d8..3a94fbe0 100644
--- a/MLEB/Translate/i18n/pagetranslation/br.json
+++ b/MLEB/Translate/i18n/pagetranslation/br.json
@@ -58,7 +58,6 @@
"tpt-languages-nonzero": "$1 ($2% troet)",
"tpt-target-page": "N'hall ket ar bajenn-mañ bezañ hizivaet gant an dorn.\nUr stumm troet eus [[$1]] eo ar bajenn-mañ; gallout a ra bezañ hizivaet en ur implijout [$2 an ostilh treiñ].",
"tpt-unknown-page": "Miret eo an esaouenn anv-mañ evit troidigezh ar pajennoù.\nAr bajenn hoc'h eus klasket kemm ne seblant ket klotañ gant pajenn ebet bet merket evit bezañ troet.",
- "tpt-discouraged-language-reason": "Abeg : $1",
"tpt-render-summary": "Hizivadenn da glotañ gant stumm nevez mammenn ar bajenn",
"tpt-aggregategroup-add": "Ouzhpennañ",
"tpt-aggregategroup-save": "Enrollañ",
diff --git a/MLEB/Translate/i18n/pagetranslation/bs.json b/MLEB/Translate/i18n/pagetranslation/bs.json
index 2d1fe699..7d9356a6 100644
--- a/MLEB/Translate/i18n/pagetranslation/bs.json
+++ b/MLEB/Translate/i18n/pagetranslation/bs.json
@@ -71,8 +71,6 @@
"tpt-discouraged-language-header": "Prevođenje na $1 nije prioritet za ovu stranicu.",
"tpt-discouraged-language-content": "Prevodilački administrator odlučio je da se prevođenje treba usredotočiti na $1.",
"tpt-discouraged-language-force": "<strong>Stranica se ne može prevesti na $2.</strong>\n\nPrevodilački administrator odlučio je da se stranica može prevesti samo na $3.",
- "tpt-discouraged-language": "<strong>Prevođenje ove stranice na $2 nije prioritet.</strong>\n\nPrevodilački administrator odlučio je da se treba usredotočiti na $3.",
- "tpt-discouraged-language-reason": "Razlog: $1",
"tpt-priority-languages": "Prevodilački administrator ovoj grupi je postavio sljedeće prioritetne jezike: $1.",
"tpt-render-summary": "Ažuriram na novu verziju izvorne stranice",
"aggregategroups": "Zbirne grupe",
diff --git a/MLEB/Translate/i18n/pagetranslation/ca.json b/MLEB/Translate/i18n/pagetranslation/ca.json
index 351545f4..54b48501 100644
--- a/MLEB/Translate/i18n/pagetranslation/ca.json
+++ b/MLEB/Translate/i18n/pagetranslation/ca.json
@@ -8,6 +8,7 @@
"Joan manel",
"Jordi Roqué",
"Macofe",
+ "Mguix",
"SMP",
"Solde",
"Ssola",
@@ -32,6 +33,7 @@
"tpt-badtitle": "El nom de pàgina donat ($1) no és un títol vàlid",
"tpt-nosuchpage": "La pàgina $1 no existeix",
"tpt-notsuitable": "La pàgina $1 no està preparada per a la seva traducció.\nAssegureu-vos que té les etiquetes <nowiki><translate></nowiki> i una sintaxi vàlida.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Vegeu la llista de pàgines traduïbles.]]",
"tpt-mark-summary": "S'ha marcat aquesta versió per traduir",
"tpt-edit-failed": "No s'ha pogut actualitzar la pàgina: $1",
"tpt-unmarked": "La pàgina $1 ja no està marcada per traduir.",
@@ -39,7 +41,7 @@
"tpt-old-pages-title": "Pàgines en traducció",
"tpt-other-pages-title": "Pàgines trencades",
"tpt-new-pages": "{{PLURAL:$1|Aquesta pàgina conté|Aquestes pàgines contenen}} text amb etiquetes de traducció, però cap versió d'{{PLURAL:$1|aquesta pàgina està|aquestes pàgines estan}} marcades actualment per traduir.",
- "tpt-old-pages": "S'ha marcat per traduir alguna versió d'{{PLURAL:$1|aquesta pàgina|aquestes pàgines}}.",
+ "tpt-old-pages": "L'última versió d'{{PLURAL:$1|aquesta pàgina s'ha|aquestes pàgines s'han}} marcat per a traduir.",
"tpt-select-prioritylangs": "Llista separada per comes dels codis de les llengües prioritàries:",
"tpt-select-prioritylangs-force": "Evita traduccions a llengües que no siguin les llengües prioritàries",
"tpt-select-prioritylangs-reason": "Motiu:",
@@ -63,7 +65,6 @@
"tpt-tab-translate": "Tradueix",
"tpt-target-page": "Aquesta pàgina no es pot editar manualment.\nÉs una traducció de la pàgina [[$1]] i la traducció es realitza amb [$2 l'eina de traducció].",
"tpt-discouraged-language-force-header": "Aquesta pàgina no es pot traduir a $1.",
- "tpt-discouraged-language-reason": "Motiu: $1",
"tpt-render-summary": "S'està actualitzant per a coincidir amb la nova versió de la pàgina font",
"aggregategroups": "Grups d'agregació",
"tpt-aggregategroup-add": "Afegeix",
diff --git a/MLEB/Translate/i18n/pagetranslation/ceb.json b/MLEB/Translate/i18n/pagetranslation/ceb.json
new file mode 100644
index 00000000..83fb6978
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/ceb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "MuratTheTurkish"
+ ]
+ },
+ "tpt-languages-legend": "Uban pang mga sinultian:"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/cs.json b/MLEB/Translate/i18n/pagetranslation/cs.json
index 4bd1f81f..283371c9 100644
--- a/MLEB/Translate/i18n/pagetranslation/cs.json
+++ b/MLEB/Translate/i18n/pagetranslation/cs.json
@@ -12,6 +12,7 @@
"Michaelbrabec",
"Mormegil",
"Patriccck",
+ "Patrik L.",
"Vks",
"Want"
]
@@ -76,8 +77,6 @@
"tpt-discouraged-language-header": "Překlad do jazyka $1 není pro tuto stránku prioritou.",
"tpt-discouraged-language-content": "Správce překladů se rozhodl zacílit překladatelské úsilí na $1.",
"tpt-discouraged-language-force": "<strong>Tuto stránku nelze překládat do jazyka $2.</strong>\n\nSprávce překladů se rozhodl, že tuto stránku lze překládat pouze do $3.",
- "tpt-discouraged-language": "<strong>Překlad do jazyka $2 není pro tuto stránku prioritní.</strong>\n\nSprávce překladů se rozhodl zaměřit překladatelské úsilí na $3.",
- "tpt-discouraged-language-reason": "Zdůvodnění: $1",
"tpt-priority-languages": "Správce překladů nastavil prioritní jazyky pro tuto skupinu na $1.",
"tpt-render-summary": "Stránka aktualizována, aby odpovídala nové verzi zdrojové stránky",
"tpt-aggregategroup-add": "Přidat",
@@ -128,7 +127,7 @@
"pm-add-icon-hover-text": "Přidat část níže",
"pm-swap-icon-hover-text": "Prohodit s částí níže",
"pm-delete-icon-hover-text": "Smazat položku",
- "pm-langcode-missing": "Vypadá to, že za názvem stránky schází kód jazyka. Zadejte prosím název stránky ve tvaru <název-stránky>/<kód-jazyka>.",
+ "pm-langcode-missing": "Vypadá to, že za názvem stránky schází kód jazyka. Zadejte prosím název stránky ve tvaru <page-name>/<language-code>.",
"tpt-translate-title": "Umožnit překlad názvu stránky",
"pp-prepare-button-label": "Připravit",
"pp-save-button-label": "Uložit",
diff --git a/MLEB/Translate/i18n/pagetranslation/cy.json b/MLEB/Translate/i18n/pagetranslation/cy.json
index 8fe15380..7863894a 100644
--- a/MLEB/Translate/i18n/pagetranslation/cy.json
+++ b/MLEB/Translate/i18n/pagetranslation/cy.json
@@ -21,7 +21,6 @@
"tpt-sections-prioritylangs": "Blaenoriaethau ymhlith yr ieithoedd",
"tpt-languages-legend": "Ieithoedd eraill:",
"tpt-languages-nonzero": "$1 ($2% wedi'i gyfieithu)",
- "tpt-discouraged-language-reason": "Rheswm: $1",
"tpt-aggregategroup-add": "Ychwaneger",
"tpt-aggregategroup-save": "Cadw",
"tpt-aggregategroup-new-name": "Enw:",
diff --git a/MLEB/Translate/i18n/pagetranslation/da.json b/MLEB/Translate/i18n/pagetranslation/da.json
index 0cf47eae..43ae674c 100644
--- a/MLEB/Translate/i18n/pagetranslation/da.json
+++ b/MLEB/Translate/i18n/pagetranslation/da.json
@@ -71,8 +71,6 @@
"tpt-discouraged-language-force-header": "Denne side kan ikke oversættes til $1.",
"tpt-discouraged-language-header": "Oversættelser til $1 er ikke en prioritet for denne side.",
"tpt-discouraged-language-force": "<strong>Denne side kan ikke oversættes til $2.</strong>\n\nEn oversættelsesadministrator besluttede at denne side kun kan oversættes til $3.",
- "tpt-discouraged-language": "<strong>Oversættelse til $2 er ikke en prioritet for denne side.</strong>\n\nEn oversættelsesadministrator besluttede at fokusere oversættelsesarbejdet på $3.",
- "tpt-discouraged-language-reason": "Begrundelse: $1",
"tpt-priority-languages": "En oversættelsesadministrator har sat prioritetssprogene for denne gruppe til $1.",
"tpt-render-summary": "Opdaterer for at passe til en ny version af kildesiden",
"aggregategroups": "Samlegrupper",
diff --git a/MLEB/Translate/i18n/pagetranslation/dag.json b/MLEB/Translate/i18n/pagetranslation/dag.json
new file mode 100644
index 00000000..e0d5f35d
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/dag.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ruky Wunpini"
+ ]
+ },
+ "tpt-languages-nonzero": "$1($2% lɛbgubu)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/de-formal.json b/MLEB/Translate/i18n/pagetranslation/de-formal.json
index 7d94c1e9..d9b01617 100644
--- a/MLEB/Translate/i18n/pagetranslation/de-formal.json
+++ b/MLEB/Translate/i18n/pagetranslation/de-formal.json
@@ -10,6 +10,7 @@
},
"tpt-action-nofuzzy": "Setzen Sie die Übersetzungen nicht außer Kraft",
"tpt-notsuitable": "Die Seite $1 ist nicht zum Übersetzen geeignet.\nStellen Sie sicher, dass ein <nowiki><translate></nowiki>-Tag und gültige Syntax verwendet wird.",
+ "tpt-offer-notify": "Sie können über diese Seite <span class=\"plainlinks\">[$1 Übersetzer benachrichtigen]</span>.",
"tpt-showpage-intro": "Untenstehend sind neue, vorhandene und gelöschte Übersetzungseinheiten aufgelistet.\nBevor Sie diese Version zur Übersetzung freigeben, stellen Sie bitte sicher, dass die Änderungen an den Übersetzungseinheiten minimal sind. Damit verhindern Sie unnötige Arbeit für die Übersetzer.",
"pt-movepage-started": "Die Basisseite wurde nunmehr verschoben.\nBitte prüfen Sie das [[Special:Log/pagetranslation|Übersetzungs-Logbuch]] auf Fehlermeldungen, bzw. die Vollzugsnachricht."
}
diff --git a/MLEB/Translate/i18n/pagetranslation/de.json b/MLEB/Translate/i18n/pagetranslation/de.json
index 07d1d1a7..e7405b69 100644
--- a/MLEB/Translate/i18n/pagetranslation/de.json
+++ b/MLEB/Translate/i18n/pagetranslation/de.json
@@ -7,6 +7,7 @@
"MF-Warburg",
"McDutchie",
"Metalhead64",
+ "Pols12",
"Purodha",
"Sebastian Wallroth",
"Shirayuki",
@@ -18,7 +19,6 @@
"pagetranslation": "Seiten übersetzen",
"right-pagetranslation": "Seitenversionen zur Übersetzung freigeben",
"action-pagetranslation": "übersetzbare Seiten zu verwalten",
- "tps-edit-sourcepage-title": "Bearbeiten einer übersetzbaren Seite",
"tps-edit-sourcepage-text": "Du bearbeitest die Quelle einer übersetzbaren Seite. Bitte stelle sicher, dass du mit der folgenden Dokumentation vertraut bist:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Ändern des Quelltextes] \n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Beispiel für zu verwendendes Markup]",
"tps-edit-sourcepage-ve-warning-title": "Warnung: Nicht unterstützte Seite",
"tps-edit-sourcepage-ve-warning-text": "Du bearbeitest eine übersetzbare Seite. Die Bearbeitung in diesem Editor wird noch nicht offiziell unterstützt. Bitte verwende den Quelltexteditor.",
@@ -40,6 +40,7 @@
"tpt-saveok": "Die Seite [[:$1]] wurde mit {{PLURAL:$2|einem übersetzbaren Abschnitt|$2 übersetzbaren Abschnitten}} zur Übersetzung freigegeben.\nDiese Seite kann nun <span class=\"plainlinks\">[$3 übersetzt]</span> werden.",
"tpt-saveok-first": "Du kannst [[Special:PageMigration|bereits vorhandene Übersetzungen]] für diese Seite importieren (falls vorhanden).",
"tpt-offer-notify": "Du kannst über diese Seite <span class=\"plainlinks\">[$1 Übersetzer benachrichtigen]</span>.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Die Liste übersetzbarer Seiten ansehen.]]",
"tpt-showpage-intro": "Untenstehend sind neue, vorhandene und gelöschte Übersetzungseinheiten aufgelistet.\nBevor du diese Version zur Übersetzung freigibst, stelle bitte sicher, dass die Änderungen an den Übersetzungseinheiten minimal sind. Damit verhinderst du unnötige Arbeit für die Übersetzer.",
"tpt-mark-summary": "Diese Seite wurde zum Übersetzen freigegeben",
"tpt-mark-nochanges": "Es gibt keine Änderungen zum Überprüfen. Das Markieren dieser Seite zur Übersetzung wird weder die Seite noch eine vorhandene Übersetzungseinheit bearbeiten.",
@@ -58,6 +59,7 @@
"tpt-outdated-pages": "{{PLURAL:$1|Diese Seite hat|Diese Seiten haben}} nicht zur Übersetzung markierte Änderungen.",
"tpt-tag-discouraged": "abgeraten",
"tpt-tag-oldsyntax": "alte Syntax",
+ "tpt-tag-no-transclusion-support": "keine Transklusionsunterstützung",
"tpt-select-prioritylangs": "Komma-getrennte Liste der Codes der zu priorisierenden Sprachen:",
"tpt-select-prioritylangs-force": "Übersetzungen in andere Sprachen als die priorisierte Sprache verhindern",
"tpt-select-prioritylangs-reason": "Grund:",
@@ -65,6 +67,8 @@
"tpt-sections-syntaxversion": "Syntaxversion",
"tpt-syntaxversion-text": "Diese Seite verwendet derzeit eine alte Version der übersetzbaren Seitenquellsyntax. Die neue Version schließt unübersetzte Abschnitte mit einem HTML-Tag ein, um die korrekte Sprache des Textes anzuzeigen. Beispiel: $1. Du kannst die neue Auszeichnungssyntax $2 verwenden, um jede Art von Umbruch an Stellen zu verhindern, an denen er nicht angemessen ist, wie z.B. bei der Übersetzung von <code>title</code>-Attribut eines Elements. Es ist nicht möglich, zu einer alten Syntaxversion zurückzugehen.",
"tpt-syntaxversion-label": "Neueste Syntaxversion für diese Seite verwenden",
+ "tpt-transclusion": "Vorlagen-Transklusion",
+ "tpt-transclusion-label": "Aktivieren der übersetzungsfähigen Transklusion für diese Seite",
"tpt-rev-mark": "Zum Übersetzen freigeben",
"tpt-rev-unmark": "Freigabe zum Übersetzen entfernen",
"tpt-rev-discourage": "Freigabe zurückziehen",
@@ -86,13 +90,12 @@
"tpt-target-page": "Diese Seite kann nicht manuell aktualisiert werden.\nDiese Seite ist eine Übersetzung der Seite [[$1]] und die Übersetzung kann mithilfe des [$2 Übersetzungswerkzeuges] aktualisiert werden.",
"tpt-unknown-page": "Dieser Namensraum ist für das Übersetzen von Wikiseiten reserviert.\nDie Seite, die gerade bearbeitet wird, hat keine Verbindung zu einer übersetzbaren Seite.",
"tpt-translation-restricted": "Das Übersetzen dieser Seite in diese Sprache wurde durch einen Übersetzungsadministrator deaktiviert.\n\nGrund: $1",
+ "tpt-translation-restricted-no-reason": "Die Übersetzung dieser Seite in diese Sprache wurde von einem Übersetzungsadministrator deaktiviert.",
"tpt-discouraged-language-force-header": "Diese Seite kann nicht auf $1 übersetzt werden.",
- "tpt-discouraged-language-force-content": "Ein Übersetzungsadministrator hat sich dazu entschieden, dass diese Seite nur auf $1 übersetzt werden sollte.",
- "tpt-discouraged-language-header": "Das Übersetzen auf $1 wird für diese Seite nicht bevorzugt.",
- "tpt-discouraged-language-content": "Ein Übersetzungsadministrator hat sich dazu entschieden, die Übersetzungsarbeiten auf $1 zu richten.",
+ "tpt-discouraged-language-force-content": "Ein Übersetzungsadministrator hat entschieden, dass diese Seite nur auf $1 übersetzt werden sollte.",
+ "tpt-discouraged-language-header": "Das Übersetzen dieser Seite auf $1 hat keine Priorität.",
+ "tpt-discouraged-language-content": "Ein Übersetzungsadministrator hat entschieden, die Übersetzungsarbeiten auf $1 zu konzentrieren.",
"tpt-discouraged-language-force": "<strong>Diese Seite kann nicht auf $2 übersetzt werden.</strong>\n\nEin Übersetzungsadministrator hat sich entschieden, dass diese Seite nur auf $3 übersetzt werden kann.",
- "tpt-discouraged-language": "<strong>$2 ist keine priorisierte Sprache für diese Seite.</strong>\n\nEin Übersetzungsadministrator hat sich entschieden, die Übersetzungsarbeiten auf $3 zu fokussieren.",
- "tpt-discouraged-language-reason": "Grund: $1",
"tpt-priority-languages": "Ein Übersetzungsadministrator hat die priorisierte Sprachen für diese Nachrichtengruppe auf $1 festgelegt.",
"tpt-priority-languages-force": "Ein Übersetzungsadministrator hat die priorisierten Sprachen für diese Gruppe auf $1 festgelegt. Das Übersetzen in andere Sprachen ist nicht erlaubt.",
"tpt-render-summary": "Übernehme Bearbeitung einer neuen Version der Quellseite",
@@ -112,7 +115,7 @@
"pt-parse-open": "Eine &lt;translate&gt;-Markierung hat kein Gegenstück.\nÜbersetzungsvorlage: <pre>$1</pre>",
"pt-parse-close": "Eine &lt;/translate>-Markierung hat kein Gegenstück.\nÜbersetzungsvorlage: <pre>$1</pre>",
"pt-parse-nested": "Verschachtelte &lt;translate>-Übersetzungseinheiten sind nicht möglich.\nText des Tags: <pre>$1</pre>",
- "pt-shake-multiple": "Mehrere Übersetzungseinheitenmarker für eine Übersetzungseinheit.\nText der Übersetzungseinheit: <pre>$1</pre>",
+ "pt-shake-multiple": "Mehrere Übersetzungseinheitenmarker für eine Übersetzungseinheit.\nAchte darauf, dass die Übersetzungseinheiten durch Leerzeilen getrennt sind.\nText der Übersetzungseinheit: <pre>$1</pre>",
"pt-shake-position": "Übersetzungseinheitenmarker befinden sich an unerwarteter Stelle.\nText der Übersetzungseinheit: <pre>$1</pre>",
"pt-shake-empty": "Die Übersetzungseinheit für Marker „$1“ ist leer.",
"log-description-pagetranslation": "Logbuch der Änderungen im Zusammenhang mit dem Übersetzungssystem für Seiten",
@@ -158,6 +161,7 @@
"pt-movepage-list-translatable-note": "Diese Seiten müssen getrennt verschoben werden.",
"pt-movepage-list-other": "Andere {{PLURAL:$1|Unterseite|Unterseiten}}",
"pt-movepage-list-count": "Insgesamt gibt es $1 zu verschiebende {{PLURAL:$1|Seite|Seiten}} und $2 {{PLURAL:$2|Unterseite|Unterseiten}}.",
+ "pt-movepage-page-count-limit": "Diese übersetzbare Seite besteht aus über $1 {{PLURAL:$1|Seite|Seiten}}. Das Verschieben so vieler Seiten hat sich als unzuverlässig erwiesen. Bitte kontaktiere den Administrator, um dies über ein Wartungsskript durchzuführen.",
"pt-movepage-list-no-pages": "Es wurden keine Seiten gefunden.",
"pt-movepage-legend": "Übersetzungsseite verschieben",
"pt-movepage-current": "Aktueller Seitenname:",
@@ -209,13 +213,14 @@
"pm-pagetitle-placeholder": "Gib den Seitentitel ein",
"pm-pagetitle-invalid": "Bitte einen gültigen Seitentitel eingeben. Dieser sollte im Format <Seitenname>/<Sprachcode> sein.",
"pm-pagetitle-missing": "Bitte gib den Seitentitel ein.",
- "pm-langcode-missing": "Es scheint, als ob der Sprachcode im Titel fehlt. Bitte gib den Seitentitel im Format <Seitenname>/<Sprachcode> ein.",
+ "pm-langcode-missing": "Es scheint, als ob der Sprachcode im Titel fehlt. Bitte gib den Seitentitel im Format <page-name>/<language-code> ein.",
"pm-summary-import": "Übersetzung importiert mithilfe der [[Special:PageMigration|Seitenmigration]]",
"pm-on-import-message-text": "Die alten Übersetzungen wurden importiert. Verwende die Hinzufügungs-, Tausch- und Löschoptionen, um die Übersetzungseinheiten anzupassen und klicke auf die Schaltfläche „{{int:pm-savepages-button-label}}“, um sie zu speichern oder zum Verwerfen auf die Schaltfläche „{{int:pm-cancel-button-label}}“.",
"pm-on-save-message-text": "Die Übersetzungseinheiten wurden gespeichert. Du kannst jetzt zur Migration den Titel einer neuen Übersetzungsseite eingeben oder unten Änderungen an den Einheiten durchführen und eine neue Version speichern.",
"tpt-translate-title": "Übersetzung eines Seitentitels erlauben",
"pp-save-summary": "Bereitete die Seite zur Übersetzung vor",
"pagepreparation": "Seite zur Übersetzung vorbereiten",
+ "pagepreparation-summary": "Gib einen einen Seitentitel an, der für die Übersetzung vorbereitet werden soll.",
"pp-pagename-placeholder": "Den Seitennamen eingeben",
"pp-prepare-button-label": "Vorbereiten",
"pp-save-button-label": "Veröffentlichen",
diff --git a/MLEB/Translate/i18n/pagetranslation/diq.json b/MLEB/Translate/i18n/pagetranslation/diq.json
index ac9db158..ddb3d1d2 100644
--- a/MLEB/Translate/i18n/pagetranslation/diq.json
+++ b/MLEB/Translate/i18n/pagetranslation/diq.json
@@ -15,13 +15,12 @@
"tpt-section-deleted": "Yewronê açarnayışê $1",
"tpt-diff-old": "Metno verên",
"tpt-diff-new": "Metno newe",
- "tpt-old-pages-title": "Pela açarnayışi",
+ "tpt-old-pages-title": "Pelê çarnayışi",
"tpt-other-pages-title": "Pela şahtiyayi",
"tpt-select-prioritylangs-reason": "Sebeb:",
"translate-tag-translate-link-desc": "Na perer açarnê",
"tpt-languages-legend": "Zıwanê bini:",
"tpt-languages-nonzero": "$1 ($2% çarniyayi)",
- "tpt-discouraged-language-reason": "Sebeb: $1",
"aggregategroups": "Grubi pêro",
"tpt-aggregategroup-add": "Cı ke",
"tpt-aggregategroup-save": "Qeyd ke",
@@ -41,7 +40,7 @@
"pt-deletepage-action-other": "Hedefi bıvurne",
"pt-deletepage-current": "Nameyê pele:",
"pt-deletepage-reason": "Sebeb:",
- "pt-deletepage-list-translation": "Pelê açarnayışi",
+ "pt-deletepage-list-translation": "Pelê çarnayışi",
"pt-deletepage-list-other": "Bınpelê bini",
"pm-savepages-button-label": "Qeyd ke",
"pm-cancel-button-label": "Bıtexelne",
diff --git a/MLEB/Translate/i18n/pagetranslation/dsb.json b/MLEB/Translate/i18n/pagetranslation/dsb.json
index 5cc9ec1a..64c4b2ca 100644
--- a/MLEB/Translate/i18n/pagetranslation/dsb.json
+++ b/MLEB/Translate/i18n/pagetranslation/dsb.json
@@ -60,8 +60,6 @@
"tpt-unknown-page": "Toś ten mjenjowy rum jo za pśełožki wopśimjeśowych bokow wuměnjony.\nZda se, až bok, kótaryž wopytujoš wobźěłaś, njewótpowědujo bokoju, kótaryž jo za pśełožowanje markěrowany.",
"tpt-translation-restricted": "Pśełožowański administrator jo pśełožowanjeju toś togo boka do toś teje rěcy jo zajźował.\n\nPśicyna: $1",
"tpt-discouraged-language-force": "<strong>Toś ten bok njedajo se do $2 pśełožyś.</strong>\n\nPśełožowański administrator jo rozsuźił, až toś ten bok dajo se jano do $3 pśełožowaś.",
- "tpt-discouraged-language": "<strong>Pśełožowanje do $2 njama prioritu za toś ten bok.</strong>\n\nPśełožowański administrator jo rozsuźił, fokus pśełožowańskich procowanjow na $3 stajiś.",
- "tpt-discouraged-language-reason": "Pśicyna: $1",
"tpt-priority-languages": "Pśełožowański administrator jo primarne rěcy za toś tu kupku ako $1 nastajił.",
"tpt-render-summary": "Aktualizacija pó nowej wersiji žrědłowego boka",
"aggregategroups": "Metakupki",
diff --git a/MLEB/Translate/i18n/pagetranslation/el.json b/MLEB/Translate/i18n/pagetranslation/el.json
index c754992d..444f9bbe 100644
--- a/MLEB/Translate/i18n/pagetranslation/el.json
+++ b/MLEB/Translate/i18n/pagetranslation/el.json
@@ -8,6 +8,7 @@
"Geraki",
"Giorgos456",
"Lou",
+ "NikosLikomitros",
"Nikosgranturismogt",
"Norhorn",
"Protnet",
@@ -77,8 +78,6 @@
"tpt-discouraged-language-header": "Η μετάφραση στα $1 δεν δεν αποτελεί προτεραιότητα για αυτήν τη σελίδα.",
"tpt-discouraged-language-content": "Κάποιος από τους διαχειριστές μετάφρασης έκρινε σκόπιμο να επικεντρωθεί η προσπάθεια μετάφρασης στα $1.",
"tpt-discouraged-language-force": "<strong>Αυτή η σελίδα δεν μπορεί να μεταφραστεί σε $2.</strong>\n\nΈνας διαχειριστής μετάφρασης έχει επιλέξει για αυτήν τη σελίδα να μπορεί να μεταφραστεί μόνο σε $3.",
- "tpt-discouraged-language": "<strong>Η μετάφραση σε $2 δεν αποτελεί προτεραιότητα για αυτήν τη σελίδα.</strong>\n\nΚάποιος από τους διαχειριστές μετάφρασης έκρινε σκόπιμο να επικεντρωθεί η προσπάθεια μετάφρασης στα $3.",
- "tpt-discouraged-language-reason": "Αιτία: $1",
"tpt-priority-languages": "Ένας διαχειριστής μετάφρασης έχει ορίσει ως γλώσσες που έχουν προτεραιότητα τα $1 για αυτήν την ομάδα.",
"tpt-priority-languages-force": "Ένας διαχειριστής μεταφράσεων όρισε την προτεραιότητα γλωσσών της ομάδας σε $1. Δεν επιτρέπεται η μετάφραση σε άλλες.",
"tpt-render-summary": "Γίνεται ενημέρωση για να αντιστοιχεί στη νέα έκδοση της πηγαίας σελίδας",
diff --git a/MLEB/Translate/i18n/pagetranslation/en.json b/MLEB/Translate/i18n/pagetranslation/en.json
index 50142777..53b3cfc5 100644
--- a/MLEB/Translate/i18n/pagetranslation/en.json
+++ b/MLEB/Translate/i18n/pagetranslation/en.json
@@ -9,7 +9,6 @@
"pagetranslation": "Page translation",
"right-pagetranslation": "Mark versions of pages for translation",
"action-pagetranslation": "manage translatable pages",
- "tps-edit-sourcepage-title": "Editing a translatable page",
"tps-edit-sourcepage-text": "You are editing a source translation page. Please make sure that you are familiar with the following documentation:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Changing the source text]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Example of markup to use]",
"tps-edit-sourcepage-ve-warning-title": "Warning: Unsupported page",
"tps-edit-sourcepage-ve-warning-text": "You are editing a translatable page. Editing these in this editor is not yet officially supported. Please use the source editor.",
@@ -31,6 +30,7 @@
"tpt-saveok": "The page [[:$1]] has been marked up for translation with $2 {{PLURAL:$2|translation unit|translation units}}.\nThe page can now be <span class=\"plainlinks\">[$3 translated]</span>.",
"tpt-saveok-first": "You can [[Special:PageMigration|import pre-existing translation]] for this page (if any).",
"tpt-offer-notify": "You can <span class=\"plainlinks\">[$1 notify translators]</span> about this page.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|View the list of translatable pages.]]",
"tpt-showpage-intro": "Below new, existing and deleted translation units are listed.\nBefore marking this version for translation, check that the changes to translation units are minimized to avoid unnecessary work for translators.",
"tpt-mark-summary": "Marked this version for translation",
"tpt-mark-nochanges": "No changes to review. Marking this page for translation will not edit the page nor any existing translation unit.",
@@ -49,6 +49,7 @@
"tpt-outdated-pages": "{{PLURAL:$1|This page has|These pages have}} changes not marked for translation.",
"tpt-tag-discouraged": "discouraged",
"tpt-tag-oldsyntax": "old syntax",
+ "tpt-tag-no-transclusion-support": "no transclusion support",
"tpt-select-prioritylangs": "Comma-separated list of priority language codes:",
"tpt-select-prioritylangs-force": "Prevent translations to languages other than the priority languages",
"tpt-select-prioritylangs-reason": "Reason:",
@@ -56,6 +57,8 @@
"tpt-sections-syntaxversion": "Syntax version",
"tpt-syntaxversion-text": "This page currently uses an old version of translatable page source syntax. The new version will wrap untranslated sections with an HTML tag to indicate the correct language of the text. Example: $1. You can use a new markup syntax $2 to prevent any kind of wrapping in places where it is not appropriate, such as when translating <code>title</code> attribute of an element. It is not possible to go back to an old syntax version.",
"tpt-syntaxversion-label": "Use latest syntax version for this page",
+ "tpt-transclusion": "Template transclusion",
+ "tpt-transclusion-label": "Enable translation aware transclusion for this page",
"tpt-rev-mark": "mark for translation",
"tpt-rev-unmark": "remove from translation",
"tpt-rev-discourage": "discourage",
@@ -79,13 +82,12 @@
"tpt-target-page": "This page cannot be updated manually.\nThis page is a translation of the page [[$1]] and the translation can be updated using [$2 the translation tool].",
"tpt-unknown-page": "This namespace is reserved for content page translations.\nThe page you are trying to edit does not seem to correspond to any page marked for translation.",
"tpt-translation-restricted": "Translation of this page to this language has been prevented by a translation administrator.\n\nReason: $1",
+ "tpt-translation-restricted-no-reason": "Translation of this page to this language has been prevented by a translation administrator.",
"tpt-discouraged-language-force-header": "This page cannot be translated to $1.",
"tpt-discouraged-language-force-content": "A translation administrator decided that this page can only be translated to $1.",
"tpt-discouraged-language-header": "Translating to $1 is not a priority for this page.",
"tpt-discouraged-language-content": "A translation administrator decided to focus the translation efforts on $1.",
"tpt-discouraged-language-force": "<strong>This page cannot be translated to $2.</strong>\n\nA translation administrator decided that this page can only be translated to $3.",
- "tpt-discouraged-language": "<strong>Translating to $2 is not a priority for this page.</strong>\n\nA translation administrator decided to focus the translation efforts on $3.",
- "tpt-discouraged-language-reason": "Reason: $1",
"tpt-priority-languages": "A translation administrator has set the priority languages for this group to $1.",
"tpt-priority-languages-force": "A translation administrator has set the priority languages for this group to $1. Translating to other languages is not allowed.",
"tpt-render-summary": "Updating to match new version of source page",
@@ -105,7 +107,7 @@
"pt-parse-open": "Unbalanced &lt;translate> tag.\nTranslation template: <pre>$1</pre>",
"pt-parse-close": "Unbalanced &lt;/translate> tag.\nTranslation template: <pre>$1</pre>",
"pt-parse-nested": "Nested &lt;translate> translation units are not allowed.\nTag text: <pre>$1</pre>",
- "pt-shake-multiple": "Multiple translation unit markers for one translation unit.\nTranslation unit text: <pre>$1</pre>",
+ "pt-shake-multiple": "Multiple translation unit markers for one translation unit.\nMake sure that translation units are separated by blank lines.\nTranslation unit text: <pre>$1</pre>",
"pt-shake-position": "Translation unit markers in unexpected position.\nTranslation unit text: <pre>$1</pre>",
"pt-shake-empty": "Empty translation unit for marker \"$1\".",
"log-description-pagetranslation": "Log for actions related to the page translation system",
@@ -151,6 +153,7 @@
"pt-movepage-list-translatable-note": "These pages must be moved separately.",
"pt-movepage-list-other": "Other {{PLURAL:$1|subpage|subpages}}",
"pt-movepage-list-count": "In total $1 {{PLURAL:$1|page|pages}} to move and $2 {{PLURAL:$2|subpage|subpages}}.",
+ "pt-movepage-page-count-limit": "This translatable page consists of over $1 {{PLURAL:$1|page|pages}}. Moving this many pages has been found to be unreliable. Please contact the administrator to do this via a maintenance script.",
"pt-movepage-list-no-pages": "No pages found.",
"pt-movepage-legend": "Move translatable page",
"pt-movepage-current": "Current name:",
@@ -210,6 +213,7 @@
"tpt-translate-title": "Allow translation of page title",
"pp-save-summary": "Prepared the page for translation",
"pagepreparation": "Prepare page for translation",
+ "pagepreparation-summary": "Specify a page title to prepare for translation.",
"pp-pagename-placeholder": "Enter the page name",
"pp-prepare-button-label": "Prepare",
"pp-save-button-label": "Publish",
diff --git a/MLEB/Translate/i18n/pagetranslation/eo.json b/MLEB/Translate/i18n/pagetranslation/eo.json
index 957e255b..dd851d4c 100644
--- a/MLEB/Translate/i18n/pagetranslation/eo.json
+++ b/MLEB/Translate/i18n/pagetranslation/eo.json
@@ -13,6 +13,8 @@
"pagetranslation": "Paĝa traduko",
"right-pagetranslation": "Marki versiojn de paĝoj por traduki",
"action-pagetranslation": "mastrumi tradukeblajn paĝojn",
+ "tps-edit-sourcepage-ve-warning-title": "Averto: nesubtenata paĝo",
+ "tps-edit-sourcepage-ve-warning-button": "Bone",
"tpt-section": "Tradukada unuo $1",
"tpt-section-new": "Nova tradukada unuo.\nNomo: $1",
"tpt-section-deleted": "Tradukada unuo $1",
@@ -32,19 +34,24 @@
"tpt-edit-failed": "Ne eblis ĝisdatigi la paĝon: $1",
"tpt-old-pages-title": "Paĝoj en traduko",
"tpt-other-pages-title": "Rompitaj paĝoj",
+ "tpt-tag-oldsyntax": "malnova sintakso",
"tpt-select-prioritylangs-reason": "Kialo:",
"tpt-sections-prioritylangs": "Primadaj lingvoj",
+ "tpt-sections-syntaxversion": "Sintaksa versio",
"tpt-rev-mark": "marki por traduki",
"tpt-rev-unmark": "forigi el traduko",
"tpt-rev-discourage": "malinstigi",
"tpt-rev-encourage": "restarigi",
"translate-tag-translate-link-desc": "Traduki ĉi tiun paĝon",
"translate-tag-markthis": "Marki ĉi tiun paĝon por tradukado",
+ "tpt-translation-intro": "Ĉi tiu paĝo estas <span class=\"plainlinks\">[$1 tradukita versio]</span> de la paĝo [[$2]] kaj la traduko estas kompleta por $3%.",
"tpt-languages-legend": "Aliaj lingvoj:",
+ "tpt-languages-separator": "&#160;•&#32;",
"tpt-languages-zero": "Ektraduki por ĉi tiu lingvo",
"tpt-languages-nonzero": "$1 ($2% {{PLURAL:$2|tradukita|tradukitaj}})",
"tpt-tab-translate": "Traduki",
- "tpt-discouraged-language-reason": "Kialo: $1",
+ "tpt-discouraged-language-force-header": "Ĉi tiu paĝo ne povas esti tradukita al $1.",
+ "tpt-discouraged-language-header": "Tradukado al $1 ne estas prioritato por ĉi tiu paĝo.",
"tpt-aggregategroup-add": "Aldoni",
"tpt-aggregategroup-save": "Konservi",
"tpt-aggregategroup-new-name": "Nomo:",
@@ -71,6 +78,7 @@
"pt-movepage-list-section": "{{PLURAL:$1|Paĝo|Paĝoj}} de tradukaj unuoj",
"pt-movepage-list-other": "{{PLURAL:$1|Alia subpaĝo|Aliaj subpaĝoj}}",
"pt-movepage-list-count": "Entute $1 {{PLURAL:$1|paĝo|paĝoj}} por movi.",
+ "pt-movepage-list-no-pages": "Neniu paĝo trovita.",
"pt-movepage-legend": "Movi tradukeblan paĝon",
"pt-movepage-current": "Nuna nomo:",
"pt-movepage-new": "Nova nomo:",
@@ -101,6 +109,7 @@
"pt-deletepage-list-section": "Paĝoj de tradukada unuo",
"pt-deletepage-list-other": "Aliaj subpaĝoj",
"pt-deletepage-list-count": "Entute $1 {{PLURAL:$1|paĝo|paĝoj}} por forigi.",
+ "pt-deletepage-list-no-pages": "Neniu paĝo trovita.",
"pt-deletepage-full-logreason": "Pato de la tradukebla paĝo \"$1\"",
"pt-deletepage-lang-logreason": "Pato de la tradukpaĝo \"$1\"",
"pt-deletepage-started": "Bonvolu rekontroli la [[Special:Log/pagetranslation|protokolon pri paĝotradukado]] por eraroj kaj mesaĝo pri kompletiĝo.",
@@ -108,7 +117,9 @@
"pm-import-button-label": "Enporti",
"pm-savepages-button-label": "Konservi",
"pm-cancel-button-label": "Nuligi",
+ "pm-page-does-not-exist": "$1 ne ekzistas.",
"pp-save-button-label": "Konservi",
"pp-cancel-button-label": "Nuligi",
+ "pp-diff-old-header": "Fonta teksto",
"tpt-generic-button": "Konfirmi"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/es.json b/MLEB/Translate/i18n/pagetranslation/es.json
index 6b74e5ef..1cf07f1b 100644
--- a/MLEB/Translate/i18n/pagetranslation/es.json
+++ b/MLEB/Translate/i18n/pagetranslation/es.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Antur",
+ "ArenaL5",
"Armando-Martin",
"Crazymadlover",
"Cuatro Remos",
@@ -20,7 +21,9 @@
"McDutchie",
"Mgpena",
"Mor",
+ "Pols12",
"Purodha",
+ "Rodney Araujo",
"Sanbec",
"Translationista",
"Vivaelcelta"
@@ -29,13 +32,12 @@
"pagetranslation": "Traducción de páginas",
"right-pagetranslation": "Marcar versiones de páginas para traducción",
"action-pagetranslation": "administrar páginas traducibles",
- "tps-edit-sourcepage-title": "Editar una página traducible",
"tps-edit-sourcepage-ve-warning-title": "Atención: página no admitida",
"tps-edit-sourcepage-ve-warning-button": "Aceptar",
"tpt-section": "Unidad de traducción $1",
"tpt-section-new": "Nueva unidad de traducción. \nNombre: $1",
"tpt-section-deleted": "Unidad de traducción $1",
- "tpt-diff-old": "Texto previo",
+ "tpt-diff-old": "Texto anterior",
"tpt-diff-new": "Texto nuevo",
"tpt-submit": "Marcar esta versión para traducción",
"tpt-sections-oldnew": "Unidades de traducción nuevas y existentes",
@@ -48,6 +50,7 @@
"tpt-notsuitable": "La página $1 no es adecuada para traducción.\nAsegúrate que tiene etiquetas <nowiki><translate></nowiki> y tiene una sintaxis válida.",
"tpt-saveok": "La página [[:$1]] ha sido marcada para traducción con $2 {{PLURAL:$2|unidad|unidades}} de traducción.\nLa página puede ser ahora <span class=\"plainlinks\">[$3 traducida]</span>.",
"tpt-offer-notify": "Puedes <span class=\"plainlinks\">[$1 notificar a los traductores]</span> de esta página.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Ver la lista de páginas traducibles.]]",
"tpt-showpage-intro": "Debajo están listadas las unidades de traducción nuevas, existentes y borradas.\nAntes de marcar esta versión para traducción, verifica que los cambios a las unidades de traducción son mínimos para evitar trabajo innecesario a los traductores.",
"tpt-mark-summary": "Se marcó esta sección para su traducción",
"tpt-mark-nochanges": "No hay cambios para revisar. Marcar esta página para su traducción no editará la página ni ninguna de las unidades de traducción existentes.",
@@ -94,8 +97,6 @@
"tpt-discouraged-language-header": "La traducción al $1 no es una prioridad para esta página.",
"tpt-discouraged-language-content": "Un administrador de traducción decidió centrar los esfuerzos de traducción en $1.",
"tpt-discouraged-language-force": "<strong>Esta página no puede ser traducida a $2.</strong>\n\nUna administración de traducción decidió que sólo puede traducirse a $3.",
- "tpt-discouraged-language": "<strong>La traducción al $2 no es una prioridad para esta página.</strong>\n\nUn administrador de traducción decidió enfocar los esfuerzos de traducción en: $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "Un administrador de traducciones ha definido los idiomas prioritarios de este grupo: $1.",
"tpt-render-summary": "Actualizando para coincidir con nueva versión de la página fuente",
"aggregategroups": "Grupos de agregación",
@@ -208,7 +209,7 @@
"pm-pagetitle-placeholder": "Escribe el título de la página",
"pm-pagetitle-invalid": "Escribe un título válido para la página. Debe tener el formato <nombre-de-página>/<código-de-idioma>.",
"pm-pagetitle-missing": "Escribe el título de la página.",
- "pm-langcode-missing": "El código de idioma parece faltar en el título. Escribe el título de la página en el formato <nombre-de-página>/<código-de-idioma>.",
+ "pm-langcode-missing": "El código de idioma parece faltar en el título. Escribe el título de la página en el formato <page-name>/<language-code>.",
"pm-summary-import": "Se importó la traducción usando [[Special:PageMigration|migración de página]]",
"tpt-translate-title": "Permitir la traducción del título de la página",
"pp-save-summary": "Preparada la página para la traducción",
@@ -217,7 +218,7 @@
"pp-prepare-button-label": "Preparar",
"pp-save-button-label": "Publicar",
"pp-cancel-button-label": "Cancelar",
- "pp-save-message": "Se guardó la página. Puedes [$1 editarla].",
+ "pp-save-message": "Se publicó la página. Puedes [$1 editarla].",
"pp-prepare-message": "Se preparó la página para la traducción. Mira los cambios más abajo. ¡Haz clic en el botón \"{{int:pp-save-button-label}}\" si está todo bien!",
"pp-already-prepared-message": "Parece que la página ya se ha preparado para la traducción. No hay cambios respecto a la versión anterior.",
"pp-diff-error": "Se produjo un error al recuperar las diferencias del servidor.",
diff --git a/MLEB/Translate/i18n/pagetranslation/et.json b/MLEB/Translate/i18n/pagetranslation/et.json
index 1f8e4922..59491399 100644
--- a/MLEB/Translate/i18n/pagetranslation/et.json
+++ b/MLEB/Translate/i18n/pagetranslation/et.json
@@ -33,9 +33,14 @@
"tpt-new-pages-title": "Tõlkimiseks esitatud leheküljed",
"tpt-old-pages-title": "Tõlgitavad leheküljed",
"tpt-other-pages-title": "Katkised leheküljed",
+ "tpt-outdated-pages-title": "Ootel muudatustega leheküljed",
"tpt-new-pages": "{{PLURAL:$1|See lehekülg sisaldab|Need leheküljed sisaldavad}} tõlkesiltidega teksti,\naga ükski {{PLURAL:$1|selle lehekülje|nende lehekülgede}} versioon pole praegu märgitud tõlkimiseks.",
- "tpt-old-pages": "Mõned {{PLURAL:$1|selle lehekülje|nende lehekülgede}} versioonid on märgitud tõlkimiseks.",
+ "tpt-old-pages": "{{PLURAL:$1|Selle lehekülje viimane versioon|Nende lehekülgede viimased versioonid}} on märgitud tõlkimiseks.",
"tpt-other-pages": "{{PLURAL:$1|Selle lehekülje vana versioon|Nende lehekülgede vanad versioonid}} on märgitud tõlkimiseks\nja {{PLURAL:$1|uusimat versiooni|uusimaid versioone}} ei saa tõlgitavaks teha.",
+ "tpt-outdated-pages": "{{PLURAL:$1|Sellel leheküljel|Neil lehekülgedel}} on muudatusi, mida pole tõlkimiseks märgitud.",
+ "tpt-tag-discouraged": "ei soovitata tõlkida",
+ "tpt-tag-oldsyntax": "vana süntaks",
+ "tpt-tag-no-transclusion-support": "ei toeta mallina kasutamist",
"tpt-select-prioritylangs": "Olulisemate keelte koodide komaga eraldatud loetelu:",
"tpt-select-prioritylangs-force": "Enneta tõlkimist teistesse keeltesse peale olulisemate keelte",
"tpt-select-prioritylangs-reason": "Põhjus:",
@@ -61,8 +66,6 @@
"tpt-unknown-page": "See nimeruum on sisulehekülgede tõlkimiseks.\nLehekülg, mida redigeerida üritad, ei paista olevat seotud ühegi tõlkimiseks märgitud leheküljega.",
"tpt-translation-restricted": "Tõlkeadministraator on tõkestanud selle lehekülje tõlkimise sellesse keelde.\n\nPõhjus: $1",
"tpt-discouraged-language-force": "<strong>Seda lehekülge ei saa tõlkida $2 keelde.</strong>\n\nTõlkeadministraator otsustas, et seda lehekülge saab tõlkida vaid järgmistesse keeltesse: $3.",
- "tpt-discouraged-language": "<strong>Selle lehekülje tõlkimine $2 keelde pole oluline.</strong>\n\nTõlkeadministraator otsustas, et keskendutakse järgmistesse keeltesse tõlkimisele: $3.",
- "tpt-discouraged-language-reason": "Põhjus: $1",
"tpt-priority-languages": "Tõlkeadministraator määras, et on oluline tõlkida see rühm järgmistesse keeltesse: $1.",
"tpt-render-summary": "Uuendatud, et vastata lähtelehekülje uuele versioonile",
"aggregategroups": "Ühendrühmad",
@@ -78,13 +81,35 @@
"pt-parse-open": "Puudub sildile &lt;translate> vastav lõpusilt.\nTõlkemall: <pre>$1</pre>",
"pt-parse-close": "Puudub sildile &lt;/translate> vastav algussilt.\nTõlkemall: <pre>$1</pre>",
"pt-parse-nested": "Pesastatud &lt;translate>-tõlkeüksused pole lubatud.\nSildi tekst: <pre>$1</pre>",
- "pt-shake-multiple": "Ühel tõlkeüksusel on mitu tähist.\nTõlkeüksuse tekst: <pre>$1</pre>",
+ "pt-shake-multiple": "Ühel tõlkeüksusel on mitu tähist.\nVeendu, et tõlkeüksusi eraldavad tühjad read.\nTõlkeüksuse tekst: <pre>$1</pre>",
"pt-shake-position": "Tõlkeüksuse tähis on ootamatu koha peal.\nTõlkeüksuse tekst: <pre>$1</pre>",
"pt-shake-empty": "Tõlkeüksus tähisega \"$1\" on tühi.",
"log-description-pagetranslation": "Lehekülgede tõlkesüsteemiga seotud toimingute logi",
"log-name-pagetranslation": "Lehekülgede tõlkelogi",
"logentry-pagetranslation-mark": "$1 {{GENDER:$2|märkis}} lehekülje \"$3\" tõlkimiseks",
"logentry-pagetranslation-unmark": "$1 {{GENDER:$2|eemaldas}} lehekülje \"$3\" tõlkesüsteemist",
+ "logentry-pagetranslation-moveok": "$1 {{GENDER:$2|viis lõpule}} tõlgitava lehekülje $3 ümbernimetamise leheküljeks $4",
+ "logentry-pagetranslation-movenok": "$1 {{GENDER:$2|sattus}} probleemile lehekülje $3 teisaldamisel kohta $4",
+ "logentry-pagetranslation-deletefok": "$1 {{GENDER:$2|viis lõpule}} tõlgitava lehekülje $3 kustutamise",
+ "logentry-pagetranslation-deletefnok": "$1 {{GENDER:$2|ei saanud}} kustutada lehekülge $3, mis kuulub tõlgitava lehekülje $4 juurde",
+ "logentry-pagetranslation-deletelok": "$1 {{GENDER:$2|viis lõpule}} tõlkelehekülje $3 kustutamise",
+ "logentry-pagetranslation-deletelnok": "$1 {{GENDER:$2|ei saanud}} kustutada lehekülge $3, mis kuulub tõlkelehekülje $4 juurde",
+ "logentry-pagetranslation-encourage": "$1 {{GENDER:$2|märkis}} soovitatavaks lehekülje $3 tõlkimise",
+ "logentry-pagetranslation-discourage": "$1 {{GENDER:$2|märkis}} ebasoovitatavaks lehekülje $3 tõlkimise",
+ "logentry-pagetranslation-prioritylanguages-unset": "$1 {{GENDER:$2|eemaldas}} eelisseisundis keeled tõlgitava lehekülje $3 juurest",
+ "logentry-pagetranslation-prioritylanguages": "$1 {{GENDER:$2|määras}} eelisseisundis keelteks tõlgitava lehekülje $3 juures järgmised keeled: $5",
+ "logentry-pagetranslation-prioritylanguages-force": "$1 {{GENDER:$2|lubas}} tõlgitava lehekülje $3 tõlkimise ainult järgmistesse keeltesse: $5",
+ "logentry-pagetranslation-associate": "$1 {{GENDER:$2|lisas}} tõlgitava lehekülje $3 ühendrühma $4",
+ "logentry-pagetranslation-dissociate": "$1 {{GENDER:$2|eemaldas}} tõlgitava lehekülje $3 ühendrühmast $4",
+ "log-action-filter-pagetranslation": "Toimingu tüüp:",
+ "log-action-filter-pagetranslation-mark": "Tõlkimiseks märkmine",
+ "log-action-filter-pagetranslation-unmark": "Tõlkimisest eemaldamine",
+ "log-action-filter-pagetranslation-move": "Lehekülgede teisaldamine",
+ "log-action-filter-pagetranslation-delete": "Lehekülgede kustutamine",
+ "log-action-filter-pagetranslation-encourage": "Tõlkimise soovitatavaks märkimine",
+ "log-action-filter-pagetranslation-discourage": "Tõlkimise ebasoovitatavaks märkimine",
+ "log-action-filter-pagetranslation-prioritylanguages": "Eelisseisundis keelte muutmine",
+ "log-action-filter-pagetranslation-aggregategroups": "Ühendrühmade muutmine",
"pt-movepage-title": "Tõlgitava lehekülje \"$1\" teisaldamine",
"pt-movepage-blockers": "{{PLURAL:$1|Järgmise tõrke|Järgmiste tõrgete}} tõttu ei saa tõlgitavat lehekülge uue pealkirja alla teisaldada:",
"pt-movepage-block-base-exists": "Sihtkohaks määratud tõlgitav lehekülg \"[[:$1]]\" on olemas.",
diff --git a/MLEB/Translate/i18n/pagetranslation/eu.json b/MLEB/Translate/i18n/pagetranslation/eu.json
index 212292d5..df5cf9fc 100644
--- a/MLEB/Translate/i18n/pagetranslation/eu.json
+++ b/MLEB/Translate/i18n/pagetranslation/eu.json
@@ -20,7 +20,6 @@
"tpt-languages-legend": "Beste hizkuntzak:",
"tpt-languages-nonzero": "$1 (%$2 itzulita)",
"tpt-tab-translate": "Itzuli",
- "tpt-discouraged-language-reason": "Arrazoia: $1",
"tpt-aggregategroup-add": "Gehitu",
"tpt-aggregategroup-save": "Gorde",
"tpt-aggregategroup-new-name": "Izena:",
diff --git a/MLEB/Translate/i18n/pagetranslation/fa.json b/MLEB/Translate/i18n/pagetranslation/fa.json
index 6a878140..09c55433 100644
--- a/MLEB/Translate/i18n/pagetranslation/fa.json
+++ b/MLEB/Translate/i18n/pagetranslation/fa.json
@@ -12,6 +12,7 @@
"Ladsgroup",
"Mjbmr",
"Omid.koli",
+ "Pols12",
"Reza1615",
"ZxxZxxZ",
"پاناروما"
@@ -79,8 +80,6 @@
"tpt-discouraged-language-header": "ترجمه به $1 برای این صفحه اولویت ندارد.",
"tpt-discouraged-language-content": "یک مدیر ترجمه تصمیم گرفته که تلاش‌های ترجمه را به $1 متمرکز کند.",
"tpt-discouraged-language-force": "<strong> این صفحه نمی‌تواند به $2 ترجمه شود.</strong>\n\nمدیر ترجمه تصمیم گرفت که این صفحه می‌تواند تنها به $3 ترجمه شود.",
- "tpt-discouraged-language": "<strong> ترجمه به $2 اولویتی برای این صفحه نیست.<strong>\n\nمدیر ترجمه تصمیم به تمرکز تلاش‌های ترجمه بر روی $3 گرفت.",
- "tpt-discouraged-language-reason": "دلیل: $1",
"tpt-priority-languages": "مدیر ترجمه اولویت زبان‌ها را برای این گروه به $1 تنظیم کرده‌است.",
"tpt-render-summary": "روزآمدسازی برای انطباق با نسخهٔ تازهٔ صفحهٔ اصلی",
"aggregategroups": "گروه‌های تجمیعی",
diff --git a/MLEB/Translate/i18n/pagetranslation/ff.json b/MLEB/Translate/i18n/pagetranslation/ff.json
index 9004dc85..4029c401 100644
--- a/MLEB/Translate/i18n/pagetranslation/ff.json
+++ b/MLEB/Translate/i18n/pagetranslation/ff.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Ibrahima"
+ "Ibrahima",
+ "Ibrahima Malal Sarr"
]
},
"tpt-languages-nonzero": "$1 ($2% firaama)"
diff --git a/MLEB/Translate/i18n/pagetranslation/fi.json b/MLEB/Translate/i18n/pagetranslation/fi.json
index be9423f5..0d06d8ac 100644
--- a/MLEB/Translate/i18n/pagetranslation/fi.json
+++ b/MLEB/Translate/i18n/pagetranslation/fi.json
@@ -19,6 +19,7 @@
"pagetranslation": "Sivujen kääntäminen",
"right-pagetranslation": "Merkitä sivuja käännettäviksi",
"action-pagetranslation": "hallita käännettäviä sivuja",
+ "tps-edit-sourcepage-ve-warning-button": "OK",
"tpt-section": "Käännösosio $1",
"tpt-section-new": "Uusi käännösosio.\nNimi: $1",
"tpt-section-deleted": "Käännösosio $1",
@@ -41,18 +42,20 @@
"tpt-mark-nochanges": "Ei tarkistettavia muutoksia. Tämän sivun merkitseminen käännettäväksi ei muokkaa sivua eikä olemassa olevia käännösyksiköitä.",
"tpt-edit-failed": "Sivun päivittäminen epäonnistui: $1",
"tpt-duplicate": "Käännösosion nimeä $1 on käytetty useammin kuin kerran.",
- "tpt-unmarked": "Sivu $1 ei ole enää käännettävänä.",
+ "tpt-unmarked": "Sivu [[:$1]] ei ole enää käännettävänä.",
"tpt-list-nopages": "Yhtään sivua ei ole merkitty käännettäväksi eikä yhtään sivua ole valmiina käännettäväksi merkitsemistä varten.",
"tpt-new-pages-title": "Käännettäväksi ehdotetut sivut",
"tpt-old-pages-title": "Käännettävät sivut",
"tpt-other-pages-title": "Rikkoutuneet sivut",
"tpt-new-pages": "{{PLURAL:$1|Tämä sivu sisältää|Nämä sivut sisältävät}} tekstiä, joka on valmis merkittäväksi kääntämistä varten,\nmutta mikään versio {{PLURAL:$1|tästä sivusta|näistä sivuista}} ei ole tällä hetkellä merkitty käännettäväksi.",
- "tpt-old-pages": "Jokin versio {{PLURAL:$1|tästä sivusta on|näistä sivuista on}} merkitty käännettäväksi.",
+ "tpt-old-pages": "Viimeisin versio {{PLURAL:$1|tästä sivusta on|näistä sivuista on}} merkitty käännettäväksi.",
"tpt-other-pages": "Vanha versio {{PLURAL:$1|tästä sivusta|näistä sivuista}} on merkitty käännettäväksi,\nmutta viimeisintä versiota ei voi merkitä käännettäväksi.",
+ "tpt-tag-oldsyntax": "vanha syntaksi",
"tpt-select-prioritylangs": "Pilkuin erotettu lista ensisijaisista kielikoodeista:",
"tpt-select-prioritylangs-force": "Estä kääntäminen muille kuin ensisijaisille kielille",
"tpt-select-prioritylangs-reason": "Syy:",
"tpt-sections-prioritylangs": "Ensisijaiset kielet",
+ "tpt-sections-syntaxversion": "Syntaksiversio",
"tpt-rev-mark": "merkitse käännettäväksi",
"tpt-rev-unmark": "poista käännettävistä sivuista",
"tpt-rev-discourage": "vältä uusia käännöksiä",
@@ -79,8 +82,6 @@
"tpt-discouraged-language-header": "Tämän sivun ensisijainen käännöskieli ei ole $1.",
"tpt-discouraged-language-content": "Käännösylläpitäjä on päättänyt, että tämä sivu tulee ensisijaisesti kääntää kielille $1.",
"tpt-discouraged-language-force": "<strong>Tätä sivua ei voi kääntää kielelle $2.</strong>\n\nKäännösylläpitäjä on päättänyt, että tämän sivun voi kääntää vain kielille $3.",
- "tpt-discouraged-language": "<strong>Tämän sivun ensijainen käännöskieli ei ole $2.</strong>\n\nKäännösylläpitäjä on päättänyt, että tämä sivu tulee ensisijaisesti kääntää kielille $3.",
- "tpt-discouraged-language-reason": "Syy: $1",
"tpt-priority-languages": "Käännösylläpitäjä on asettanut tämän ryhmän ensisijaisiksi käännöskieliksi $1.",
"tpt-priority-languages-force": "Käännösylläpitäjä on määritellyt tämän ryhmän prioriteettikieliksi $1. Kääntäminen muille kielille ei ole mahdollista.",
"tpt-render-summary": "Päivitetty vastaamaan uutta versiota lähdesivusta",
@@ -145,7 +146,8 @@
"pt-movepage-list-translatable": "{{PLURAL:$1|Käännettävä alasivu|Käännettävät alasivut}}",
"pt-movepage-list-translatable-note": "Nämä sivut on siirrettävä erikseen.",
"pt-movepage-list-other": "{{PLURAL:$1|Muu alasivu|Muut alasivut}}",
- "pt-movepage-list-count": "Yhteensä $1 {{PLURAL:$1|siirrettävä sivu|siirrettävää sivua}}.",
+ "pt-movepage-list-count": "Yhteensä $1 {{PLURAL:$1|siirrettävä sivu|siirrettävää sivua}} ja $2 {{PLURAL:$2|alasivu|alasivua}}.",
+ "pt-movepage-list-no-pages": "Sivuja ei löytynyt.",
"pt-movepage-legend": "Siirrä käännettävä sivu",
"pt-movepage-current": "Nykyinen nimi",
"pt-movepage-new": "Uusi nimi",
@@ -175,7 +177,8 @@
"pt-deletepage-list-translation": "Käännössivut",
"pt-deletepage-list-section": "Käännösosiosivut",
"pt-deletepage-list-other": "Muut alasivut",
- "pt-deletepage-list-count": "Yhteensä $1 {{PLURAL:$1|poistettava sivu|poistettavaa sivua}}.",
+ "pt-deletepage-list-count": "Yhteensä $1 {{PLURAL:$1|poistettava sivu|poistettavaa sivua}} ja $2 {{PLURAL:$2|alasivu|alasivua}}.",
+ "pt-deletepage-list-no-pages": "Sivuja ei löytynyt.",
"pt-deletepage-full-logreason": "Osa käännettävää sivua ”$1”",
"pt-deletepage-lang-logreason": "Osa käännössivua ”$1”",
"pt-deletepage-started": "Virheet ja valmistusviesti löytyvät [[Special:Log/pagetranslation|sivunkääntölokista]].",
@@ -201,9 +204,9 @@
"pagepreparation": "Valmista sivu kääntämistä varten",
"pp-pagename-placeholder": "Anna sivun nimi",
"pp-prepare-button-label": "Valmistele",
- "pp-save-button-label": "Tallenna",
+ "pp-save-button-label": "Julkaise",
"pp-cancel-button-label": "Peru",
- "pp-save-message": "Sivu on tallennettu. Voit [$1 muokata sivua].",
+ "pp-save-message": "Sivu on julkaistu. Voit [$1 muokata sivua].",
"pp-pagename-missing": "Anna sivun nimi.",
"pp-diff-old-header": "Lähdeteksti",
"pp-diff-new-header": "Valmisteltu teksti",
diff --git a/MLEB/Translate/i18n/pagetranslation/fr.json b/MLEB/Translate/i18n/pagetranslation/fr.json
index 134ac2a9..12427c21 100644
--- a/MLEB/Translate/i18n/pagetranslation/fr.json
+++ b/MLEB/Translate/i18n/pagetranslation/fr.json
@@ -38,13 +38,12 @@
"pagetranslation": "Traduction de pages",
"right-pagetranslation": "Marquer des versions de pages à traduire",
"action-pagetranslation": "gérer les pages traduisibles",
- "tps-edit-sourcepage-title": "Modification d’une page traduisible.",
- "tps-edit-sourcepage-text": "Vous modifiez une page de traduction source. Veuillez vous assurer que vous êtes familiarisé avec la documentation suivante: \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Modification du texte source] \n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Exemples de marquage à utiliser]",
- "tps-edit-sourcepage-ve-warning-title": "Attention : page non supportée",
- "tps-edit-sourcepage-ve-warning-text": "Vous modifiez une page traduisible. La modifier dans cet éditeur n’est pas supporté officiellement. Veuillez utiliser l’éditeur source.",
+ "tps-edit-sourcepage-text": "Vous modifiez une page de traduction source. Veuillez vous assurer que vous êtes familiarisé avec la documentation suivante :\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Modification du texte source]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Exemples de balisage à suivre]",
+ "tps-edit-sourcepage-ve-warning-title": "Attention : page non prise en charge",
+ "tps-edit-sourcepage-ve-warning-text": "Vous modifiez une page traduisible. La modifier dans cet éditeur n’est pas encore officiellement pris en charge. Veuillez utiliser l’éditeur de wikicode.",
"tps-edit-sourcepage-ve-warning-button": "OK",
"tpt-section": "Unité de traduction $1",
- "tpt-section-new": "Nouvelle unité de traduction. Nom : $1",
+ "tpt-section-new": "Nouvelle unité de traduction. Nom : $1",
"tpt-section-deleted": "Unité de traduction $1",
"tpt-diff-old": "Texte précédent",
"tpt-diff-new": "Nouveau texte",
@@ -60,31 +59,35 @@
"tpt-saveok": "La page [[:$1]] a été marquée à traduire avec $2 {{PLURAL:$2|unité|unités}} de traduction.\nLa page peut être <span class=\"plainlinks\">[$3 traduite]</span> dès maintenant.",
"tpt-saveok-first": "Vous pouvez [[Special:PageMigration|importer une traduction préexistante]] pour cette page (si elle existe).",
"tpt-offer-notify": "Vous pouvez <span class=\"plainlinks\">[$1 notifier les traducteurs]</span> au sujet de cette page.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Afficher la liste des pages traduisibles.]]",
"tpt-showpage-intro": "Ci-dessous, les nouvelles traductions, celles existantes et supprimées.\nAvant de marquer cette version comme étant à traduire, vérifiez que les modifications des unités de traduction ont été minimisées afin d’éviter du travail inutile aux traducteurs.",
"tpt-mark-summary": "Cette version a été marquée à traduire",
"tpt-mark-nochanges": "Aucune modification à relire. Marquer cette page à traduire ne va modifier ni la page, ni aucune unité de traduction existante.",
- "tpt-edit-failed": "Impossible de mettre à jour la page : $1",
+ "tpt-edit-failed": "Impossible de mettre à jour la page « $1 »",
"tpt-duplicate": "Le nom de l’unité traduction $1 est utilisé plus d’une fois.",
- "tpt-invalid": "Le nom « $1 » de l’unité de traduction ne peut contenir aucun tiret de soulignement (_) ni aucune barre oblique (/).",
+ "tpt-invalid": "Le nom « $1 » de l’unité de traduction ne peut contenir aucun tiret de soulignement (_), ni aucune barre oblique (/).",
"tpt-unmarked": "La page [[:$1]] n’est plus marquée à traduire.",
"tpt-list-nopages": "Aucune page n’a été marquée à traduire ni n’est prête à l’être.",
"tpt-new-pages-title": "Pages proposées à la traduction",
"tpt-old-pages-title": "Pages en cours de traduction",
"tpt-other-pages-title": "Pages cassées",
"tpt-outdated-pages-title": "Pages avec des modifications en attente",
- "tpt-new-pages": "{{PLURAL:$1|Cette page contient|Ces pages contiennent}} du texte avec des balises de traduction, mais aucune version de {{PLURAL:$1|cette page n’est marquée|ces pages ne sont marquées}} à traduire.",
+ "tpt-new-pages": "{{PLURAL:$1|Cette page contient|Ces pages contiennent}} du texte avec des balises de traduction, mais aucune {{PLURAL:$1|version de cette page|des versions de ces pages}} n’a été marquée à traduire.",
"tpt-old-pages": "La dernière version de {{PLURAL:$1|cette page|chacune de ces pages}} a été marquée à traduire.",
- "tpt-other-pages": "Une ancienne version de {{PLURAL:$1|la page suivante|chacune des pages suivantes}} a été marquée pour être traduite,\nmais {{PLURAL:$1|sa dernière version|leur dernière version respective}} ne peut pas être marquée ainsi :",
- "tpt-outdated-pages": "{{PLURAL:$1|Cette page a|Ces pages ont}} des modifications non marquées pour la traduction.",
+ "tpt-other-pages": "Une ancienne version de {{PLURAL:$1|la page suivante|chacune des pages suivantes}} a été marquée pour être traduite, mais {{PLURAL:$1|sa dernière version|leur dernière version respective}} ne peut pas être marquée ainsi :",
+ "tpt-outdated-pages": "{{PLURAL:$1|Cette page a|Ces pages ont}} des modifications non marquées à traduire.",
"tpt-tag-discouraged": "dissuadé",
"tpt-tag-oldsyntax": "ancienne syntaxe",
- "tpt-select-prioritylangs": "Liste de codes de langues prioritaires séparés par des virgules :",
+ "tpt-tag-no-transclusion-support": "transclusion non prise en charge",
+ "tpt-select-prioritylangs": "Liste de codes de langues prioritaires séparés par des virgules :",
"tpt-select-prioritylangs-force": "Empêcher les traductions en d’autres langues que les langues prioritaires",
- "tpt-select-prioritylangs-reason": "Motif :",
+ "tpt-select-prioritylangs-reason": "Motif :",
"tpt-sections-prioritylangs": "Langues prioritaires",
"tpt-sections-syntaxversion": "Version de la syntaxe",
- "tpt-syntaxversion-text": "Cette page utilise actuellement une ancienne version de la syntaxe de la page source traductible. La nouvelle version encapsulera les sections non traduites avec une balise HTML pour indiquer la langue correcte du texte. Exemple : $1. Vous pouvez utiliser une nouvelle syntaxe de balisage $2 pour empêcher tout type d’habillage aux endroits où cela n’est pas approprié, comme lors de la traduction de l’attribut <code>title</code> d’un élément. Il n’est pas possible de revenir à une ancienne version de syntaxe.",
+ "tpt-syntaxversion-text": "Cette page utilise actuellement une ancienne version de la syntaxe de la page source traductible. La nouvelle version encapsulera les sections non traduites avec une balise HTML pour indiquer la langue correcte du texte. Exemple : $1. Vous pouvez utiliser une nouvelle syntaxe de balisage $2 pour empêcher tout type d’encapsulation aux endroits où cela n’est pas approprié, comme lors de la traduction de l’attribut <code>title</code> d’un élément. Il n’est pas possible de revenir à une version utilisant l’ancienne syntaxe.",
"tpt-syntaxversion-label": "Utiliser la dernière version de la syntaxe pour cette page",
+ "tpt-transclusion": "Inclusion de modèle",
+ "tpt-transclusion-label": "Utiliser automatiquement une traduction lors de l’inclusion de cette page",
"tpt-rev-mark": "marquer à traduire",
"tpt-rev-unmark": "retirer la possibilité de traduire",
"tpt-rev-discourage": "dissuader",
@@ -99,43 +102,42 @@
"translate-tag-hasnew": "Cette page contient <span class=\"plainlinks\">[$1 des modifications]</span> qui ne sont pas marquées à traduire.",
"tpt-translation-intro": "Cette page est une <span class=\"plainlinks\">[$1 version traduite]</span> de la page [[$2]] et la traduction est terminée à $3 %.",
"tpt-translation-intro-fuzzy": "Les traductions désuètes sont identifiées ainsi.",
- "tpt-languages-legend": "Autres langues :",
+ "tpt-languages-legend": "Autres langues :",
"tpt-languages-separator": "&#160;·&#32;",
"tpt-languages-zero": "Commencer la traduction dans cette langue",
- "tpt-languages-nonzero": "$1 ($2 % traduit{{PLURAL:$2||s}})",
+ "tpt-languages-nonzero": "$1 ($2 % traduit{{PLURAL:$2||s}})",
"tpt-tab-translate": "Traduire",
"tpt-target-page": "Cette page ne peut pas être mise à jour manuellement.\nC’est une traduction de la page [[$1]] et la traduction peut être mise à jour en utilisant [$2 l’outil de traduction].",
"tpt-unknown-page": "Cet espace de noms est réservé pour les traductions des pages de contenu.\nLa page que vous essayez de modifier ne semble correspondre à aucune page marquée à traduire.",
- "tpt-translation-restricted": "La traduction de cette page dans cette langue a été empêchée par un administrateur de traduction.\n\nMotif : $1",
+ "tpt-translation-restricted": "La traduction de cette page dans cette langue a été empêchée par un administrateur de traduction.\n\nMotif : $1",
+ "tpt-translation-restricted-no-reason": "La traduction de cette page dans cette langue a été empêchée par un administrateur de traduction.",
"tpt-discouraged-language-force-header": "Cette page ne peut pas être traduite en $1.",
"tpt-discouraged-language-force-content": "Un administrateur de traduction a décidé que cette page ne pouvait être traduite qu’en $1.",
"tpt-discouraged-language-header": "Traduire en $1 n’est pas une priorité pour cette page.",
- "tpt-discouraged-language-content": "Un administrateur de traduction a décidé de focaliser les efforts de traduction sur les langues suivantes : $1.",
+ "tpt-discouraged-language-content": "Un administrateur de traduction a décidé de focaliser les efforts de traduction sur les langues suivantes : $1.",
"tpt-discouraged-language-force": "<strong>Cette page ne peut pas être traduite en $2.</strong>\n\nUn administrateur des traductions a décidé que cette page ne peut être traduite qu’en $3.",
- "tpt-discouraged-language": "<strong>Traduire en $2 n’est pas une priorité pour cette page.</strong>\n\nUn administrateur des traductions a décidé de concentrer l’effort de traduction sur les langues suivantes : $3.",
- "tpt-discouraged-language-reason": "Raison : $1",
- "tpt-priority-languages": "Un administrateur de traduction a défini les langues prioritaires suivantes pour ce groupe : $1.",
- "tpt-priority-languages-force": "Un administrateur de traduction a fixé les langues prioritaires suivantes pour ce groupe : $1. La traduction dans d’autres langues n’est pas autorisée.",
+ "tpt-priority-languages": "Un administrateur de traduction a défini les langues prioritaires suivantes pour ce groupe : $1.",
+ "tpt-priority-languages-force": "Un administrateur de traduction a fixé les langues prioritaires suivantes pour ce groupe : $1. La traduction dans d’autres langues n’est pas autorisée.",
"tpt-render-summary": "Mise à jour pour être en accord avec la nouvelle version de la source de la page",
"aggregategroups": "Groupes d’agrégation",
"tpt-aggregategroup-add": "Ajouter",
"tpt-aggregategroup-save": "Enregistrer",
"tpt-aggregategroup-add-new": "Ajouter un nouveau groupe d’agrégation",
- "tpt-aggregategroup-new-name": "Nom :",
- "tpt-aggregategroup-new-description": "Description (facultative) :",
- "tpt-aggregategroup-remove-confirm": "Êtes-vous sûr de vouloir supprimer ce groupe agrégé ?",
+ "tpt-aggregategroup-new-name": "Nom :",
+ "tpt-aggregategroup-new-description": "Description (facultative) :",
+ "tpt-aggregategroup-remove-confirm": "Êtes-vous {{GENDER:|sûr|sure}} de vouloir supprimer ce groupe d’agrégation ?",
"tpt-aggregategroup-invalid-group": "Le groupe n’existe pas",
- "tpt-aggregategroup-edit-name": "Nom :",
- "tpt-aggregategroup-edit-description": "Description :",
+ "tpt-aggregategroup-edit-name": "Nom :",
+ "tpt-aggregategroup-edit-description": "Description :",
"tpt-aggregategroup-update": "Enregistrer",
"tpt-aggregategroup-update-cancel": "Annuler",
"tpt-invalid-group": "Groupe non valide",
- "pt-parse-open": "Balise <tt>&lt;translate></tt> asymétrique.\nModèle de traduction : <pre>$1</pre>",
- "pt-parse-close": "Balise &lt;/translate> asymétrique.\nModèle de traduction : <pre>$1</pre>",
- "pt-parse-nested": "L’imbrication des sections <tt>&lt;translate></tt> n’est pas autorisée.\nTexte de la balise : <pre>$1</pre>",
- "pt-shake-multiple": "Multiples marqueurs d’unité de traduction pour une même unité de traduction.\nTexte de l’unité de traduction : <pre>$1</pre>",
- "pt-shake-position": "Marqueurs d’unité de traduction à une position inattendue.\nTexte de l’unité de traduction : <pre>$1</pre>",
- "pt-shake-empty": "Unité de traduction vide pour le marqueur « $1 ».",
+ "pt-parse-open": "Balise &lt;translate> asymétrique.\nModèle de traduction : <pre>$1</pre>",
+ "pt-parse-close": "Balise &lt;/translate> asymétrique.\nModèle de traduction : <pre>$1</pre>",
+ "pt-parse-nested": "L’imbrication des sections <tt>&lt;translate></tt> n’est pas autorisée.\nTexte de la balise : <pre>$1</pre>",
+ "pt-shake-multiple": "Multiples marqueurs d’unité de traduction pour une même unité de traduction.\nAssurez-vous que les unités de traduction sont séparées par des lignes vides.\nTexte de l’unité de traduction : <pre>$1</pre>",
+ "pt-shake-position": "Marqueurs d’unité de traduction à une position inattendue.\nTexte de l’unité de traduction : <pre>$1</pre>",
+ "pt-shake-empty": "Unité de traduction vide pour le marqueur « $1 ».",
"log-description-pagetranslation": "Journal des actions liées au système de traduction de pages",
"log-name-pagetranslation": "Journal des traductions de pages",
"logentry-pagetranslation-mark": "$1{{GENDER:$2|}} a marqué $3 à traduire",
@@ -152,8 +154,8 @@
"logentry-pagetranslation-prioritylanguages": "$1{{GENDER:$2|}} a défini les langues prioritaires pour la page traduisible $3 à $5",
"logentry-pagetranslation-prioritylanguages-force": "$1{{GENDER:$2|}} a limité les langues pour la page traduisible $3 à $5",
"logentry-pagetranslation-associate": "$1{{GENDER:$2|}} a ajouté la page traduisible $3 au groupe agrégé $4",
- "logentry-pagetranslation-dissociate": "$1{{GENDER:$2|}} a supprimé la page traduisible $3 du groupe agrégé $4",
- "log-action-filter-pagetranslation": "Type d’action :",
+ "logentry-pagetranslation-dissociate": "$1{{GENDER:$2|}} a retiré la page traduisible $3 du groupe agrégé $4",
+ "log-action-filter-pagetranslation": "Type d’action :",
"log-action-filter-pagetranslation-mark": "Marquage comme étant à traduire",
"log-action-filter-pagetranslation-unmark": "Retrait de la possibilité de traduire",
"log-action-filter-pagetranslation-move": "Déplacements de pages",
@@ -162,16 +164,16 @@
"log-action-filter-pagetranslation-discourage": "Dissuasion de traduire",
"log-action-filter-pagetranslation-prioritylanguages": "Modification de la priorité des langues",
"log-action-filter-pagetranslation-aggregategroups": "Modification de groupes agrégés",
- "pt-movepage-title": "Déplacer la page traduisible « $1 »",
- "pt-movepage-blockers": "La page à traduire ne peut pas être renommée à cause {{PLURAL:$1|de l’erreur suivante|des erreurs suivantes}} :",
- "pt-movepage-block-base-exists": "La page traduisible cible « [[:$1]] » existe.",
+ "pt-movepage-title": "Déplacer la page traduisible « $1 »",
+ "pt-movepage-blockers": "La page à traduire ne peut pas être renommée à cause {{PLURAL:$1|de l’erreur suivante|des erreurs suivantes}} :",
+ "pt-movepage-block-base-exists": "La page traduisible cible « [[:$1]] » existe.",
"pt-movepage-block-base-invalid": "Le nom de la page traduisible cible n’est pas un titre correct.",
- "pt-movepage-block-tp-exists": "La page de traduction cible « [[:$2]] » existe.",
- "pt-movepage-block-tp-invalid": "Le titre de la page de traduction cible pour « [[:$1]] » serait incorrect (trop long ?).",
- "pt-movepage-block-section-exists": "La page cible « [[:$2]] » pour l’unité de traduction existe.",
- "pt-movepage-block-section-invalid": "Le titre de page cible pour « [[:$1]] » pour l’unité de traduction serait incorrect (trop long ?).",
- "pt-movepage-block-subpage-exists": "La sous-page cible « [[:$2]] » existe.",
- "pt-movepage-block-subpage-invalid": "Le titre de la sous-page cible pour « [[:$1]] » serait incorrect (trop long ?).",
+ "pt-movepage-block-tp-exists": "La page de traduction cible « [[:$2]] » existe.",
+ "pt-movepage-block-tp-invalid": "Le titre de la page de traduction cible pour « [[:$1]] » serait incorrect (trop long ?).",
+ "pt-movepage-block-section-exists": "La page cible « [[:$2]] » pour l’unité de traduction existe.",
+ "pt-movepage-block-section-invalid": "Le nouveau titre de l’unité de traduction pour la page « [[:$1]] » serait incorrect (trop long ?).",
+ "pt-movepage-block-subpage-exists": "La sous-page cible « [[:$2]] » existe.",
+ "pt-movepage-block-subpage-invalid": "Le titre de la sous-page cible pour « [[:$1]] » serait incorrect (trop long ?).",
"pt-movepage-list-pages": "Liste des pages à déplacer",
"pt-movepage-list-translation": "Page{{PLURAL:$1||s}} de traduction",
"pt-movepage-list-section": "{{PLURAL:$1|Page de l’unité|Pages des unités}} de traduction",
@@ -179,21 +181,22 @@
"pt-movepage-list-translatable-note": "Ces pages doivent être renommées séparément.",
"pt-movepage-list-other": "Autre{{PLURAL:$1||s}} sous-page{{PLURAL:$1||s}}",
"pt-movepage-list-count": "Au total, $1 page{{PLURAL:$1||s}} et $2 sous-page{{PLURAL:$2||s}} à déplacer.",
+ "pt-movepage-page-count-limit": "La page traduisible consiste en plus de $1 page{{PLURAL:$1||s}}. Déplacer en même temps un si grand nombre de pages s’est avéré peu fiable. Veuillez contacter un administrateur pour réaliser ceci par un script de maintenance.",
"pt-movepage-list-no-pages": "Aucune page trouvée.",
"pt-movepage-legend": "Déplacer la page traduisible",
- "pt-movepage-current": "Nom actuel :",
- "pt-movepage-new": "Nouveau nom :",
- "pt-movepage-reason": "Motif :",
+ "pt-movepage-current": "Nom actuel :",
+ "pt-movepage-new": "Nouveau nom :",
+ "pt-movepage-reason": "Motif :",
"pt-movepage-subpages": "Renommer toutes les sous-pages",
"pt-movepage-action-check": "Vérifier si le renommage est possible",
"pt-movepage-action-perform": "Effectuer le renommage",
"pt-movepage-action-other": "Changer la cible",
"pt-movepage-intro": "Cette page spéciale vous permet de renommer des pages qui sont marquées comme étant à traduire.\nL’action de renommage ne sera pas immédiate car de nombreuses pages devront être déplacées.\nTant que les pages seront en cours de déplacement, il ne sera pas possible d’interagir avec elles.\nLes échecs seront enregistrés dans le [[Special:Log/pagetranslation|journal de traduction]] et devront être corrigés manuellement.",
- "pt-movepage-logreason": "Extrait de la page traduisible « $1 ».",
+ "pt-movepage-logreason": "Extrait de la page traduisible « $1 »",
"pt-movepage-started": "Veuillez ouvrir le [[Special:Log/pagetranslation|journal des traductions de pages]] dans quelques instants pour vérifier les erreurs éventuelles et lire le message de complétion.",
"pt-locked-page": "Cette page est verrouillée parce que la page traduisible est en cours de renommage.",
- "pt-deletepage-lang-title": "Suppression de la page de traduction « $1 »",
- "pt-deletepage-full-title": "Suppression de la page traduisible « $1 »",
+ "pt-deletepage-lang-title": "Suppression de la page de traduction « $1 »",
+ "pt-deletepage-full-title": "Suppression de la page traduisible « $1 »",
"pt-deletepage-invalid-title": "La page spécifiée n’est pas valide.",
"pt-deletepage-invalid-text": "La page spécifiée n’est pas une page traduisible, ni une traduction de celle-ci.",
"pt-deletepage-action-check": "Lister les pages à supprimer",
@@ -202,8 +205,8 @@
"pt-deletepage-lang-legend": "Supprimer la page de traduction",
"pt-deletepage-full-legend": "Supprimer la page traduisible",
"pt-deletepage-any-legend": "Supprimer la page traduisible ou la page de traduction",
- "pt-deletepage-current": "Nom de la page :",
- "pt-deletepage-reason": "Motif :",
+ "pt-deletepage-current": "Nom de la page :",
+ "pt-deletepage-reason": "Motif :",
"pt-deletepage-subpages": "Supprimer tous les sous-pages",
"pt-deletepage-list-pages": "Liste des pages à supprimer",
"pt-deletepage-list-translation": "Pages de traduction",
@@ -211,8 +214,8 @@
"pt-deletepage-list-other": "Autres sous-pages",
"pt-deletepage-list-count": "$1 page{{PLURAL:$1||s}} en tout à supprimer et $2 sous-page{{PLURAL:$2||s}}.",
"pt-deletepage-list-no-pages": "Aucune page trouvée.",
- "pt-deletepage-full-logreason": "Partie de la page à traduire « $1 ».",
- "pt-deletepage-lang-logreason": "Partie de la page de traduction « $1 ».",
+ "pt-deletepage-full-logreason": "Partie de la page à traduire « $1 »",
+ "pt-deletepage-lang-logreason": "Partie de la page de traduction « $1 »",
"pt-deletepage-started": "Veuillez vérifier le [[Special:Log/pagetranslation|journal des traductions]] pour les erreurs et le message de la fin.",
"pt-deletepage-intro": "Cette page spéciale vous permet de supprimer entièrement une page traduisible ou une page d’une traduction dans une langue particulière.\nL’action de suppression n’est pas instantanée car plusieurs pages dépendantes de celle-ci seront aussi supprimées.\nLes échecs seront inscrits dans le [[Special:Log/pagetranslation|journal des traductions]] et ils doivent être corrigés à la main.",
"pagemigration": "Migration de page de traduction",
@@ -230,19 +233,20 @@
"pm-pagetitle-placeholder": "Entrer le titre de la page",
"pm-pagetitle-invalid": "Veuillez entrer un titre de page valide. Il doit être de la forme ‹Nom de la page›/‹code-de-langue›.",
"pm-pagetitle-missing": "Veuillez entrer le titre de la page.",
- "pm-langcode-missing": "Le code de langue semble manquer dans le titre. Veuillez entrer le titre de la page au format ‹Nom de la page›/‹code-de-langue›.",
+ "pm-langcode-missing": "Le code de langue semble manquer dans le titre. Veuillez entrer le titre de la page au format <page-name>/<language-code>.",
"pm-summary-import": "Traduction importée en utilisant la [[Special:PageMigration|migration de page]]",
- "pm-on-import-message-text": "Les anciennes traductions ont été importées. Utilisez les options ajouter, échanger et supprimer pour ajuster les unités de traduction et cliquez sur le bouton « {{int:pm-savepages-button-label}} » pour les enregistrer. Cliquez sur le bouton « {{int:pm-cancel-button-label}} » pour annuler.",
+ "pm-on-import-message-text": "Les anciennes traductions ont été importées. Utilisez les options ajouter, échanger et supprimer pour ajuster les unités de traduction et cliquez sur le bouton « {{int:pm-savepages-button-label}} » pour les enregistrer. Cliquez sur le bouton « {{int:pm-cancel-button-label}} » pour annuler.",
"pm-on-save-message-text": "Les unités de traduction ont été enregistrées. Vous pouvez maintenant entrer le titre d’une nouvelle page de traduction pour la faire migrer ou modifier les unités ci-dessous et enregistrer les changements dans une nouvelle version.",
"tpt-translate-title": "Autoriser la traduction du titre de la page",
"pp-save-summary": "Page préparée pour la traduction",
"pagepreparation": "Préparer la page pour sa traduction",
+ "pagepreparation-summary": "Spécifier un titre de page à préparer pour la traduction.",
"pp-pagename-placeholder": "Entrer le nom de la page",
"pp-prepare-button-label": "Préparer",
"pp-save-button-label": "Publier",
"pp-cancel-button-label": "Annuler",
"pp-save-message": "La page a été publiée. Vous pouvez la [$1 modifier].",
- "pp-prepare-message": "La page a été préparée pour sa traduction. Consultez les différences ci-dessous. Cliquez sur le bouton « {{int:pp-save-button-label}} » si cela vous convient !",
+ "pp-prepare-message": "La page a été préparée pour sa traduction. Consultez les différences ci-dessous. Cliquez sur le bouton « {{int:pp-save-button-label}} » si cela vous convient !",
"pp-already-prepared-message": "Il semble que la page ait déjà été préparée pour sa traduction. Il n’y a eu aucune modification depuis sa version précédente.",
"pp-diff-error": "Une erreur est survenue lors de la récupération des différences sur le serveur.",
"pp-pagename-missing": "Veuillez entrer le nom de la page.",
@@ -251,6 +255,6 @@
"tpt-unlink-confirm": "Veuillez confirmer que vous voulez vraiment supprimer cette page du système de traduction.\nLe sélecteur de langue et les noms des pages traduites cesseront de fonctionner.\nLes pages traduites deviendront modifiables.",
"tpt-unlink-button": "Retirer la possibilité de traduire",
"tpt-unlink-summary": "Possibilité retirée de traduire la page",
- "tpt-generic-confirm": "Veuillez confirmer l'action.",
+ "tpt-generic-confirm": "Veuillez confirmer l’action.",
"tpt-generic-button": "Confirmer"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/frp.json b/MLEB/Translate/i18n/pagetranslation/frp.json
index 307cb836..421e2afc 100644
--- a/MLEB/Translate/i18n/pagetranslation/frp.json
+++ b/MLEB/Translate/i18n/pagetranslation/frp.json
@@ -48,7 +48,6 @@
"tpt-languages-nonzero": "$1 ($2% traduit)",
"tpt-target-page": "Ceta pâge pôt pas étre betâye a jorn a la man.\nEl est na traduccion de la pâge [[$1]] et la traduccion pôt étre betâye a jorn en empleyent l’[$2 outil de traduccion].",
"tpt-unknown-page": "Cet’èspâço de noms est resèrvâ por la traduccion de pâges de contegnu.\nLa pâge que vos tâchiéd de changiér semble corrèspondre a gins de pâge marcâye por étre traduita.",
- "tpt-discouraged-language-reason": "Rêson : $1",
"tpt-render-summary": "Misa a jorn por étre en acôrd avouéc la novèla vèrsion de la pâge sôrsa",
"tpt-aggregategroup-add": "Apondre",
"tpt-aggregategroup-save": "Encartar",
diff --git a/MLEB/Translate/i18n/pagetranslation/fur.json b/MLEB/Translate/i18n/pagetranslation/fur.json
index ed943ccb..9cfdac25 100644
--- a/MLEB/Translate/i18n/pagetranslation/fur.json
+++ b/MLEB/Translate/i18n/pagetranslation/fur.json
@@ -15,7 +15,6 @@
"tpt-languages-zero": "Scomence a tradusi in cheste lenghe",
"tpt-languages-nonzero": "$1 ($2% traduzude)",
"tpt-tab-translate": "Tradûs",
- "tpt-discouraged-language-reason": "Reson: $1",
"tpt-aggregategroup-add": "Zonte",
"tpt-aggregategroup-save": "Salve",
"tpt-aggregategroup-new-name": "Non:",
diff --git a/MLEB/Translate/i18n/pagetranslation/fy.json b/MLEB/Translate/i18n/pagetranslation/fy.json
index 5db2b1bf..2c6ae22d 100644
--- a/MLEB/Translate/i18n/pagetranslation/fy.json
+++ b/MLEB/Translate/i18n/pagetranslation/fy.json
@@ -6,20 +6,220 @@
"Robin0van0der0vliet"
]
},
+ "pagetranslation": "Oersetten fan siden",
+ "right-pagetranslation": "Sideferzjes foar oersetten frijjaan",
+ "action-pagetranslation": "oersetbere siden te behearen",
+ "tps-edit-sourcepage-text": "Jo bewurkje de grûntekst fan in oersettingsside. Soargje asjebleaft dat jo bekend binne mei de neikommende dokumintaasje:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Feroarjen fan 'e grûntekst]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Foarbyld fan te brûken opmaak]",
+ "tps-edit-sourcepage-ve-warning-title": "Warskôging: Net-stipe side",
+ "tps-edit-sourcepage-ve-warning-text": "Jo bewurkje in oersetbere side. Yn dizze bewurker wurdt dat offisjeel noch net stipe. Graach de boarnebewurker brûke.",
+ "tps-edit-sourcepage-ve-warning-button": "Bêst",
+ "tpt-section": "Oersetienheid $1",
+ "tpt-section-new": "Nije oersetienheid.\nNamme: $1",
+ "tpt-section-deleted": "Oersetienheid $1",
+ "tpt-diff-old": "Eardere tekst",
+ "tpt-diff-new": "Nije tekst",
+ "tpt-submit": "Dizze ferzje foar oersetten frijjaan",
+ "tpt-sections-oldnew": "Nije en besteande oersetienheden",
+ "tpt-sections-deleted": "Wiske oersetienheden",
+ "tpt-sections-template": "Berjocht fan 'e oersettingsside",
+ "tpt-action-nofuzzy": "Oersettings net as ferâldere merkbite",
+ "tpt-badtitle": "De opjûne sidenamme ($1) is gjin jildige titel",
+ "tpt-nosuchpage": "De side $1 bestiet net",
+ "tpt-oldrevision": "$2 is net de lêste ferzje fan 'e side [[:$1]].\nInkeld de lêste ferzjes kinne foar oersetten frijjûn wurde.",
+ "tpt-notsuitable": "De side $1 is net gaadlik foar oersetten.\nSoargje dat er <nowiki><translate></nowiki>-oantsjuttings kriget, en in jildige syntaks.",
+ "tpt-saveok": "De side [[:$1]] is foar oersetten opmakke mei $2 {{PLURAL:$2|oersetienheid|oersetienheden}}.\nDe side kin no <span class=\"plainlinks\">[$3 oerset]</span> wurde.",
+ "tpt-saveok-first": "Jo kinne foar dizze side in [[Special:PageMigration|al besteande oersetting ymportearje]] (at dy der is).",
+ "tpt-offer-notify": "Jo kinne <span class=\"plainlinks\">[$1 oersetters in melding jaan]</span> oer dizze side.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|De list fan oersetbere siden besjen.]]",
+ "tpt-showpage-intro": "Hjirûnder steane de nije, besteande en wiske oersetienheden fermeld.\nBesjoch, foar't dizze ferzje foar oersetten frijjûn wurdt, oft de wizigings oan 'e oersetienheden sa lyts mooglik holden binne, om 'e oersetters ûnnedich wurk te besparjen.",
+ "tpt-mark-summary": "Dizze ferzje foar oersetten frijjûn",
+ "tpt-mark-nochanges": "Neat nijs om te feroarjen. It foar oersetten frijjaan fan dizze side, smyt gjin bewurking op foar de side en de besteande oersetienheden.",
+ "tpt-edit-failed": "Koe de side net bywurkje: $1",
+ "tpt-duplicate": "De namme fan oersetienheid $1 wurdt mear as ien kear brûkt.",
+ "tpt-invalid": "De namme fan oersetienheid $1 mei gjin ûnderstreek of skeane streek befetsje.",
+ "tpt-unmarked": "De side [[:$1]] is net langer foar oersetten frijjûn.",
+ "tpt-list-nopages": "Der binne gjin siden foar oersetten frijjûn, of ree om frijjûn te wurden.",
+ "tpt-new-pages-title": "Siden foar oersetten oanbean",
+ "tpt-old-pages-title": "Siden yn oersetting",
+ "tpt-other-pages-title": "Misse siden",
+ "tpt-outdated-pages-title": "Siden mei feroarings yn 'e wacht",
+ "tpt-new-pages": "Dizze {{PLURAL:$1|side befettet|siden befetsje}} tekst mei oersetoantsjuttings,\nmar gjinien ferzje fan 'e {{PLURAL:$1|side|siden}} is op it stuit foar oersetten frijjûn.",
+ "tpt-old-pages": "De lêste {{PLURAL:$1|ferzje fan dizze side is|ferzjes fan dizze siden binne}} foar oersetten frijjûn.",
+ "tpt-other-pages": "{{PLURAL:$1|In âlde ferzje fan dizze side is|Aldere ferzjes fan dizze siden binne}} foar oersetten frijjûn,\nmar de lêste {{PLURAL:$1|ferzje kin|ferzjes kinne}} net foar oersetten frijjûn wurde.",
+ "tpt-outdated-pages": "{{PLURAL:$1|Dizze side hat|Dizze siden hawwe}} net foar oersetten frijjûne feroarings.",
+ "tpt-tag-discouraged": "ûntmoedige",
+ "tpt-tag-oldsyntax": "âlde syntaks",
+ "tpt-select-prioritylangs": "List fan taalkoades mei prioriteit, skaat mei komma's:",
+ "tpt-select-prioritylangs-force": "Oersettings yn talen dy't gjin prioriteit hawwe tsjingean",
"tpt-select-prioritylangs-reason": "Reden:",
+ "tpt-sections-prioritylangs": "Talen mei prioriteit",
+ "tpt-sections-syntaxversion": "Syntaksferzje",
+ "tpt-syntaxversion-text": "Dizze side brûkt noch in âlde ferzje fan 'e boarnesyntaks foar oersetbere siden. De nije ferzje set ûnoersette seksjes tusken HTML-oantsjuttings, om 'e krekte taal fan 'e tekst oan te jaan. Foarbyld: $1. Jo kinne de nije opmaaksyntaks $2 brûke, om beskate foarmen fan ynsluten op plakken der't it net gaadlik is tefoaren te kommen, lykas mei it oersetten fan 'e <code>title</code>-eigenskip fan in elemint. It is net mooglik en gean werom nei in âlde syntaksferzje.",
+ "tpt-syntaxversion-label": "De nijste syntaksferzje foar dizze side brûke",
+ "tpt-rev-mark": "foar oersetten frijjaan",
+ "tpt-rev-unmark": "oersetting ynlûke",
+ "tpt-rev-discourage": "ûntmoedigje",
+ "tpt-rev-encourage": "werombringe",
+ "tpt-rev-mark-tooltip": "De lêste ferzje fan dizze side foar oersetten frijjaan.",
+ "tpt-rev-unmark-tooltip": "Oersetting fan dizze side ynlûke.",
+ "tpt-rev-discourage-tooltip": "It fierder oersetten fan dizze side ûntmoedigje.",
+ "tpt-rev-encourage-tooltip": "It normaal oersetten fan dizze side werombringe.",
"translate-tag-translate-link-desc": "Dizze side oersette",
+ "translate-tag-markthis": "Dizze side foar oersetten frijjaan",
+ "translate-tag-markthisagain": "Dizze side hat <span class=\"plainlinks\">[$1 feroarings]</span> ûndergien, nei't er de lêste kear <span class=\"plainlinks\">[$2 foar oersetten frijjûn]</span> is.",
+ "translate-tag-hasnew": "Dizze side befettet <span class=\"plainlinks\">[$1 feroarings]</span> dy't net foar oersetten frijjûn binne.",
"tpt-translation-intro": "Dizze side is in <span class=\"plainlinks\">[$1 oersette ferzje]</span> fan 'e side [[$2]], en de oersetting is $3% kompleet.",
+ "tpt-translation-intro-fuzzy": "Ferâldere oersettings wurde op dizze wize merkbiten.",
"tpt-languages-legend": "Oare talen:",
+ "tpt-languages-zero": "Begjin de oersetting foar dizze taal",
"tpt-languages-nonzero": "$1 ($2% oerset)",
"tpt-tab-translate": "Oersette",
- "tpt-discouraged-language-reason": "Reden: $1",
+ "tpt-target-page": "Dizze side kin net hânmjittich bywurke wurde.\nIt is in oersetting fan 'e side [[$1]], en kin bywurke wurde mei [$2 it oersettingsark].",
+ "tpt-unknown-page": "Dizze nammeromte is ornearre foar oersettings fan ynhâldlike siden.\nDe side dy't jo besykje te bewurkjen, liket gjin foar oersetten frijjûne side te wêzen.",
+ "tpt-translation-restricted": "It oersetten fan 'e side yn dizze taal, is troch in oersettingsbehearder tsjingien.\n\nReden: $1",
+ "tpt-translation-restricted-no-reason": "It oersetten fan 'e side yn dizze taal, is troch in oersettingsbehearder tsjingien.",
+ "tpt-discouraged-language-force-header": "Dizze side kin net yn it $1 oerset wurde.",
+ "tpt-discouraged-language-force-content": "In oersettingsbehearder hat besletten dat dizze side inkeld yn it $1 oerset wurde kin.",
+ "tpt-discouraged-language-header": "Oersetten yn it $1 hat gjin prioriteit foar dizze side.",
+ "tpt-discouraged-language-content": "In oersettingsbehearder hat besletten om 'e oersetynspanning te rjochtsjen op $1.",
+ "tpt-discouraged-language-force": "<strong>Dizze side kin net yn it $2 oerset wurde.</strong>\n\nIn oersettingsbehearder hat besletten dat dizze side inkeld yn it $3 oerset wurde kin.",
+ "tpt-priority-languages": "In oersettingsbehearder hat de talen mei prioriteit foar dizze groep ynsteld op $1.",
+ "tpt-priority-languages-force": "In oersettingsbehearder hat de talen mei prioriteit foar dizze groep ynsteld op $1. Oersetten yn oare talen is net tastien.",
+ "tpt-render-summary": "Oanpassing oan nije ferzje fan 'e grûntekstside",
+ "aggregategroups": "Sammelgroepen",
+ "tpt-aggregategroup-add": "Taheakje",
"tpt-aggregategroup-save": "Bewarje",
+ "tpt-aggregategroup-add-new": "Nije sammelgroep taheakje",
"tpt-aggregategroup-new-name": "Namme:",
+ "tpt-aggregategroup-new-description": "Beskriuwing (opsjoneel):",
+ "tpt-aggregategroup-remove-confirm": "Wolle jo wier dizze sammelgroep wiskje?",
+ "tpt-aggregategroup-invalid-group": "Groep bestiet net",
"tpt-aggregategroup-edit-name": "Namme:",
+ "tpt-aggregategroup-edit-description": "Beskriuwing:",
"tpt-aggregategroup-update": "Bewarje",
"tpt-aggregategroup-update-cancel": "Annulearje",
+ "tpt-invalid-group": "Unjildige groep",
+ "pt-parse-open": "Wanwichtige &lt;translate>-oantsjutting.\nOersettingsberjocht: <pre>$1</pre>",
+ "pt-parse-close": "Wanwichtige &lt;/translate>-oantsjutting.\nOersettingsberjocht: <pre>$1</pre>",
+ "pt-parse-nested": "Neske &lt;translate>-oersetienheden binne net tastien.\nTekst fan 'e oantsjutting: <pre>$1</pre>",
+ "pt-shake-multiple": "Ferskate oersetienheid-markearders foar ien oersetienheid.\nTekst fan 'e oersetienheid: <pre>$1</pre>",
+ "pt-shake-position": "Oersetienheid-markearders op in nuver plak.\nTekst fan 'e oersetienheid: <pre>$1</pre>",
+ "pt-shake-empty": "Lege oersetienheid foar markearder \"$1\".",
+ "log-description-pagetranslation": "Loch foar hannelings oangeande it side-oersetsysteem",
+ "log-name-pagetranslation": "Side-oersettingsloch",
+ "logentry-pagetranslation-mark": "$1 hat $3 foar oersetten {{GENDER:$2|frijjûn}}",
+ "logentry-pagetranslation-unmark": "$1 hat $3 foar it oersetsysteem {{GENDER:$2|ynlutsen}}",
+ "logentry-pagetranslation-moveok": "$1 hat it omneamen fan 'e oersetbere side $3 ta $4 {{GENDER:$2|foltôge}}",
+ "logentry-pagetranslation-movenok": "$1 {{GENDER:$2|stjitte}} ûnder it omneamen fan 'e side $3 ta $4 op in probleem",
+ "logentry-pagetranslation-deletefok": "$1 hat it wiskjen fan 'e oersetbere side $3 {{GENDER:$2|foltôge}}",
+ "logentry-pagetranslation-deletefnok": "$1 {{GENDER:$2|koe}} $3, hearrend by de oersetbere side $4, net wiskje",
+ "logentry-pagetranslation-deletelok": "$1 hat it wiskjen fan 'e oersettingsside $3 {{GENDER:$2|foltôge}}",
+ "logentry-pagetranslation-deletelnok": "$1 {{GENDER:$2|koe}} $3, hearrend by de oersettingsside $4, net wiskje",
+ "logentry-pagetranslation-encourage": "$1 hat it oersetten fan $3 {{GENDER:$2|oanmoedige}}",
+ "logentry-pagetranslation-discourage": "$1 hat it oersetten fan $3 {{GENDER:$2|ûntmoedige}}",
+ "logentry-pagetranslation-prioritylanguages-unset": "$1 hat de taalprioriteit foar de oersetbere side $3 {{GENDER:$2|ynlutsen}}",
+ "logentry-pagetranslation-prioritylanguages": "$1 hat de taalprioriteit foar de oersetbere side $3 {{GENDER:$2|ynsteld}} op $5",
+ "logentry-pagetranslation-prioritylanguages-force": "$1 hat de talen foar de oersetbere side $3 {{GENDER:$2|beheind}} ta $5",
+ "logentry-pagetranslation-associate": "$1 hat de oersetbere side $3 {{GENDER:$2|taheakke}} oan sammelgroep $4",
+ "logentry-pagetranslation-dissociate": "$1 hat de oersetbere side $3 {{GENDER:$2|fuorthelle}} út sammelgroep $4",
+ "log-action-filter-pagetranslation": "Type fan hanneling:",
+ "log-action-filter-pagetranslation-mark": "Oersetting frijjaan",
+ "log-action-filter-pagetranslation-unmark": "Oersetting ynlûken",
+ "log-action-filter-pagetranslation-move": "Siden omneamen",
+ "log-action-filter-pagetranslation-delete": "Siden wiskjen",
+ "log-action-filter-pagetranslation-encourage": "Oersetten oanmoedigjen",
+ "log-action-filter-pagetranslation-discourage": "Oersetten ûntmoedigjen",
+ "log-action-filter-pagetranslation-prioritylanguages": "Taalprioriteit wizigjen",
+ "log-action-filter-pagetranslation-aggregategroups": "Sammelgroepen wizigjen",
+ "pt-movepage-title": "Omneamen fan oersetbere side \"$1\"",
+ "pt-movepage-blockers": "De oersetbere side kin net omneamd wurde om de neikommende {{PLURAL:$1|flater|flaters}}:",
+ "pt-movepage-block-base-exists": "De beëage oersetbere side \"[[:$1]]\" bestiet al.",
+ "pt-movepage-block-base-invalid": "De beëage namme foar de oersetbere side, is gjin jildige titel.",
+ "pt-movepage-block-tp-exists": "De beëage oersettingsside \"[[:$2]]\" bestiet al.",
+ "pt-movepage-block-tp-invalid": "De beëage titel foar de oersettingsside fan \"[[:$1]]\", is ûnjildich (te lang?).",
+ "pt-movepage-block-section-exists": "De beëage side foar de oersetienheid \"[[:$2]]\" bestiet al.",
+ "pt-movepage-block-section-invalid": "De beëage sidetitel foar de oersetienheid fan \"[[:$1]]\", is ûnjildich (te lang?).",
+ "pt-movepage-block-subpage-exists": "De beëage subside \"[[:$2]]\" bestiet al.",
+ "pt-movepage-block-subpage-invalid": "De beëage titel foar de subside fan \"[[:$1]]\", is ûnjildich (te lang?).",
+ "pt-movepage-list-pages": "List fan om te neamen siden",
+ "pt-movepage-list-translation": "Oersettings{{PLURAL:$1|side|siden}}",
+ "pt-movepage-list-section": "{{PLURAL:$1|Side fan oersetienheid|Siden fan oersetienheden}}",
+ "pt-movepage-list-translatable": "Foar oersetten frijjûne {{PLURAL:$1|subside|subsiden}}",
+ "pt-movepage-list-translatable-note": "Dizze siden moatte apart omneamd wurde.",
+ "pt-movepage-list-other": "Oare {{PLURAL:$1|subside|subsiden}}",
+ "pt-movepage-list-count": "Yn totaal $1 {{PLURAL:$1|side|siden}} en $2 {{PLURAL:$2|subside|subsiden}} om te neamen.",
+ "pt-movepage-list-no-pages": "Gjin siden fûn.",
+ "pt-movepage-legend": "Oersetbere side omneame",
+ "pt-movepage-current": "Hjoeddeiske namme:",
+ "pt-movepage-new": "Nije namme:",
"pt-movepage-reason": "Reden:",
+ "pt-movepage-subpages": "Alle subsiden omneame",
+ "pt-movepage-action-check": "Gean nei oft omneamen wol mooglik is",
+ "pt-movepage-action-perform": "Omneamen útfiere",
+ "pt-movepage-action-other": "Doel feroarje",
+ "pt-movepage-intro": "Dizze bysûndere side lit jo siden omneame dy't foar oersetten frijjûn binne.\nDe omneamhanneling giet net yn in omsjoch, om't in protte siden omneamd wurde moatte.\nUnder it omneamen fan 'e siden is it net mooglik wat mei de oanbelangjende siden te dwaan.\nMislearrings wurde logd yn it [[Special:Log/pagetranslation|side-oersettingsloch]], en moatte mei de hân opholpen wurde.",
+ "pt-movepage-logreason": "Part fan 'e oersetbere side \"$1\"",
+ "pt-movepage-started": "Besjoch oer in lyts hoartsje it [[Special:Log/pagetranslation|side-oersettingsloch]] foar flaters en de dienmelding.",
+ "pt-locked-page": "Dizze side is skoattele om't de oersetbere side op it stuit omneamd wurdt.",
+ "pt-deletepage-lang-title": "Wiskjen fan oersettingsside \"$1\"",
+ "pt-deletepage-full-title": "Wiskjen fan oersetbere side \"$1\"",
+ "pt-deletepage-invalid-title": "De opjûne side is net jildich.",
+ "pt-deletepage-invalid-text": "De opjûne side is gjin oersetbere side of oersettingsside.",
+ "pt-deletepage-action-check": "Te wiskjen siden oanjaan",
+ "pt-deletepage-action-perform": "Wiskjen útfiere",
+ "pt-deletepage-action-other": "Doel feroarje",
+ "pt-deletepage-lang-legend": "Oersettingsside wiskje",
+ "pt-deletepage-full-legend": "Oersetbere side wiskje",
+ "pt-deletepage-any-legend": "Oersetbere side of oersettingsside wiskje",
+ "pt-deletepage-current": "Sidenamme:",
"pt-deletepage-reason": "Reden:",
+ "pt-deletepage-subpages": "Alle subsiden wiskje",
+ "pt-deletepage-list-pages": "List fan te wiskjen siden",
+ "pt-deletepage-list-translation": "Oersettingssiden",
+ "pt-deletepage-list-section": "Siden fan oersetienheden",
+ "pt-deletepage-list-other": "Oare subsiden",
+ "pt-deletepage-list-count": "Yn totaal $1 {{PLURAL:$1|side|siden}} en $2 {{PLURAL:$2|subside|subsiden}} te wiskjen.",
+ "pt-deletepage-list-no-pages": "Gjin siden fûn.",
+ "pt-deletepage-full-logreason": "Part fan 'e oersetbere side \"$1\"",
+ "pt-deletepage-lang-logreason": "Part fan 'e oersettingsside \"$1\"",
+ "pt-deletepage-started": "Besjoch it [[Special:Log/pagetranslation|side-oersettingsloch]] foar flaters en de dienmelding.",
+ "pt-deletepage-intro": "Dizze bysûndere side lit jo in folsleine oersetbere side wiskje, of in ôfsûnderlike oersettingsside yn in taal.\nDe wiskhanneling giet net yn in omsjoch, om't alle siden dy't fan har ôfhinklik binne ek wiske wurde.\nMislearrings wurde logd yn it [[Special:Log/pagetranslation|side-oersettingsloch]], en moatte mei de hân opholpen wurde.",
+ "pagemigration": "Oersettingssiden migrearje",
+ "pagemigration-summary": "Jou in oersettingsside op, en bring de oersettings werom dy't makke binne foar't dit oersetsysteem op 'e side ynskeakele waard.",
+ "pm-import-button-label": "Ymportearje",
"pm-savepages-button-label": "Bewarje",
- "pm-cancel-button-label": "Annulearje"
+ "pm-cancel-button-label": "Annulearje",
+ "pm-page-does-not-exist": "$1 bestiet net.",
+ "pm-old-translations-missing": "$1 befettet gjin âlde oersettings.",
+ "pm-extra-units-warning": "Der binne mooglik ekstra ienheden oanwêzich. Graach de grûntekst- en oersetienheden passend meitsje.",
+ "pm-pagename-missing": "Graach de sidenamme yntype.",
+ "pm-add-icon-hover-text": "Hjirûnder in ienheid taheakje",
+ "pm-swap-icon-hover-text": "Mei de ienheid hjirûnder wikselje",
+ "pm-delete-icon-hover-text": "De ienheid wiskje",
+ "pm-pagetitle-placeholder": "Typ de sidetitel yn",
+ "pm-pagetitle-invalid": "Graach in jildige sidetitel yntype. De yndieling moat <sidenamme>/<taalkoade> wêze.",
+ "pm-pagetitle-missing": "Graach de sidetitel yntype.",
+ "pm-langcode-missing": "De taalkoade liket te missen yn 'e titel. Graach de sidetitel yntype mei de yndieling <sidenamme>/<taalkoade>.",
+ "pm-summary-import": "Ymportearre oersetting by [[Special:PageMigration|migrearjen side]]",
+ "pm-on-import-message-text": "De âlde oersettings binne ymportearre. Brûk de taheak-, wiksel- en wiskopsjes om 'e oersetienheden goed te setten, en klik de knop \"{{int:pm-savepages-button-label}}\" om se fêst te lizzen. Klik de knop \"{{int:pm-cancel-button-label}}\" om se fuort te smiten.",
+ "pm-on-save-message-text": "De oersetienheden binne bewarre. Jo kinne no de titel fan in nije oersettingsside yntype om him te migrearjen, of hjirûnder feroarings oan 'e ienheden meitsje en in nije ferzje bewarje.",
+ "tpt-translate-title": "Oersetting fan 'e sidetitel tastean",
+ "pp-save-summary": "Side foar oersetten foarbewurke",
+ "pagepreparation": "Side foar oersetten foarbewurkje",
+ "pp-pagename-placeholder": "Typ de sidenamme yn",
+ "pp-prepare-button-label": "Foarbewurkje",
+ "pp-save-button-label": "Publisearje",
+ "pp-cancel-button-label": "Annulearje",
+ "pp-save-message": "De side is publisearre. Jo kinne him [$1 bewurkje].",
+ "pp-prepare-message": "De side is foar oersetten foarbewurke. Bejoch hjirûnder it ferzjeferskil. Klik de knop \"{{int:pp-save-button-label}}\" at it yn oarder is!",
+ "pp-already-prepared-message": "It liket dat de side al foar oersetten foarbewurke is. Der binne gjin feroarings ferlike mei de foarige ferzje.",
+ "pp-diff-error": "Der gong wat mis mei it ferzjeferskil fan 'e server heljen.",
+ "pp-pagename-missing": "Graach de sidenamme yntype.",
+ "pp-diff-old-header": "Boarnetekst",
+ "pp-diff-new-header": "Foarbewurke tekst",
+ "tpt-unlink-confirm": "Graach befêstigje dat jo wier dizze side foar it oersetsysteem ynlûke wolle.\nIt taalkarmenu en de oersette sidenammen sille net mear wurkje.\nDe oersettingssiden wurde bewurkber.",
+ "tpt-unlink-button": "Oersetting ynlûke",
+ "tpt-unlink-summary": "Oersetting fan 'e side ynlutsen",
+ "tpt-generic-confirm": "Graach de hanneling befêstigje.",
+ "tpt-generic-button": "Befêstigje"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/gl.json b/MLEB/Translate/i18n/pagetranslation/gl.json
index 30069654..8dd3c23f 100644
--- a/MLEB/Translate/i18n/pagetranslation/gl.json
+++ b/MLEB/Translate/i18n/pagetranslation/gl.json
@@ -1,9 +1,11 @@
{
"@metadata": {
"authors": [
+ "ArenaL5",
"Banjo",
"Elisardojm",
"Fisterraeomar",
+ "Pols12",
"Toliño"
]
},
@@ -31,13 +33,13 @@
"tpt-mark-nochanges": "Non hai cambios para revisar. Marcando esta páxina para tradución non editará a páxina nen nengunha unidade de tradución existente.",
"tpt-edit-failed": "Non se puido actualizar a páxina: $1",
"tpt-duplicate": "O nome da unidade de tradución \"$1\" úsase máis dunha vez.",
- "tpt-unmarked": "A páxina \"$1\" xa non está marcada para traducir.",
+ "tpt-unmarked": "A páxina [[:$1]] xa non está marcada para traducir.",
"tpt-list-nopages": "Non hai ningunha páxina marcada para ser traducida, nin preparada para ser marcada para ser traducida.",
"tpt-new-pages-title": "Páxinas propostas para a súa tradución",
"tpt-old-pages-title": "Páxinas en tradución",
"tpt-other-pages-title": "Páxinas rotas",
"tpt-new-pages": "{{PLURAL:$1|Esta páxina contén|Estas páxinas conteñen}} texto con etiquetas de tradución, pero ningunha versión {{PLURAL:$1|desta páxina|destas páxinas}} está actualmente marcada para ser traducida.",
- "tpt-old-pages": "Algunha versión {{PLURAL:$1|desta páxina|destas páxinas}} foi marcada para ser traducida.",
+ "tpt-old-pages": "A última versión {{PLURAL:$1|desta páxina|destas páxinas}} foi marcada para ser traducida.",
"tpt-other-pages": "{{PLURAL:$1|Hai marcada para traducir unha a versión vella desta páxina|Hai marcadas para traducir algunhas versións vellas destas páxinas}}, pero {{PLURAL:$1|a última versión|as últimas versións}} non se {{PLURAL:$1|pode|poden}} marcar.",
"tpt-select-prioritylangs": "Lista dos códigos das linguas prioritarias (separados por comas):",
"tpt-select-prioritylangs-force": "Impedir as traducións noutras linguas que non sexan as prioritarias",
@@ -69,8 +71,6 @@
"tpt-discouraged-language-header": "A tradución desta páxina ao $1 non é unha tarefa prioritaria.",
"tpt-discouraged-language-content": "Un administrador de traducións decidiu centrar os esforzos en traducir a páxina ao $1.",
"tpt-discouraged-language-force": "<strong>Esta páxina non se pode traducir ao $2.</strong>\n\nUn administrador de traducións decidiu que esta páxina só se pode traducir ao $3.",
- "tpt-discouraged-language": "<strong>A tradución ao $2 non é unha prioridade para esta páxina.</strong>\n\nUn administrador de traducións decidiu centrar os esforzos en traducir a páxina ao $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "Un administrador de traducións definiu as linguas prioritarias deste grupo a $1.",
"tpt-render-summary": "Actualizando para coincidir coa nova versión da páxina de orixe",
"aggregategroups": "Grupos de agregación",
@@ -95,7 +95,7 @@
"log-description-pagetranslation": "Rexistro de accións e operacións relacionadas co sistema de tradución de páxinas",
"log-name-pagetranslation": "Rexistro de tradución de páxinas",
"logentry-pagetranslation-mark": "$1 {{GENDER:$2|marcou}} \"$3\" para a súa tradución",
- "logentry-pagetranslation-unmark": "$1 {{GENDER:$2|eliminou}} \"$3\" das páxinas para traducir",
+ "logentry-pagetranslation-unmark": "$1 {{GENDER:$2|eliminou}} \"$3\" do sistema de tradución",
"logentry-pagetranslation-moveok": "$1 {{GENDER:$2|completou}} o cambio de nome da páxina traducible \"$3\" a \"$4\"",
"logentry-pagetranslation-movenok": "$1 {{GENDER:$2|atopou}} un problema ao mover a páxina \"$3\" a \"$4\"",
"logentry-pagetranslation-deletefok": "$1 {{GENDER:$2|completou}} o borrado da páxina traducible \"$3\"",
@@ -182,7 +182,7 @@
"pm-pagetitle-placeholder": "Insira o nome da páxina",
"pm-pagetitle-invalid": "Achegue un título de páxina válido. Debe ter o formato <nome-de-páxina>/<código-de-lingua>.",
"pm-pagetitle-missing": "Por favor, insira o título da páxina.",
- "pm-langcode-missing": "O código de lingua parece faltar no título. Escriba o título da páxina no formato <nombe-de-páxina>/<código-de-lingua>.",
+ "pm-langcode-missing": "O código de lingua parece faltar no título. Escriba o título da páxina no formato <page-name>/<language-code>.",
"pm-summary-import": "Importouse a tradución usando [[Special:PageMigration|migración de páxina]]",
"pm-on-import-message-text": "As traducións antigas foron importadas. Use as opcións engadir, cambiar e borrar para axustar as unidades de tradución e prema no botón \"{{int:pm-savepages-button-label}}\" para gardalas. Prema o botón \"{{int:pm-cancel-button-label}}\" para cancelar.",
"pm-on-save-message-text": "As unidades de tradución foron gardadas. Agora pode indicar o título dunha nova páxina de tradución a migrar ou facer cambios ás unidades de abaixo e gardar unha nova revisión.",
@@ -191,9 +191,9 @@
"pagepreparation": "Preparar a páxina para a tradución",
"pp-pagename-placeholder": "Insira o nome da páxina",
"pp-prepare-button-label": "Preparar",
- "pp-save-button-label": "Gardar",
+ "pp-save-button-label": "Publicar",
"pp-cancel-button-label": "Cancelar",
- "pp-save-message": "A páxina foi gardada. Pode [$1 editala].",
+ "pp-save-message": "A páxina foi publicada. Pode [$1 editala].",
"pp-prepare-message": "Preparouse a páxina para a tradución. Consulte os cambios abaixo. Prema no botón \"{{int:pp-save-button-label}}\" se está todo ben!",
"pp-already-prepared-message": "Parece que a páxina xa se preparou para a tradución. Non hai cambios respecto á versión anterior.",
"pp-pagename-missing": "Insira o nome da páxina",
diff --git a/MLEB/Translate/i18n/pagetranslation/gom-latn.json b/MLEB/Translate/i18n/pagetranslation/gom-latn.json
index a3e2d654..c0e67e7f 100644
--- a/MLEB/Translate/i18n/pagetranslation/gom-latn.json
+++ b/MLEB/Translate/i18n/pagetranslation/gom-latn.json
@@ -6,7 +6,7 @@
},
"tpt-languages-nonzero": "$1 ($2% onkarla)",
"pt-movepage-list-other": "{{PLURAL:$1|Dusrem up-pan|Her up-panam}}",
- "pt-movepage-list-count": "Sogllem mellun $1 {{PLURAL:$1|pan|pana}} halovpachim.",
+ "pt-movepage-list-count": "Sogllem mellun $1 {{PLURAL:$1|pan|panam}} ani $2 {{PLURAL:$2|up-pan|up-panam}} halovpachim.",
"pt-movepage-current": "Sodhyachem nanv:",
"pt-movepage-new": "Novem nanv:",
"pt-movepage-reason": "Karonn:",
diff --git a/MLEB/Translate/i18n/pagetranslation/grc.json b/MLEB/Translate/i18n/pagetranslation/grc.json
index 4cc55cd5..14d1ef67 100644
--- a/MLEB/Translate/i18n/pagetranslation/grc.json
+++ b/MLEB/Translate/i18n/pagetranslation/grc.json
@@ -1,8 +1,9 @@
{
"@metadata": {
"authors": [
- "Gts-tg"
+ "Gts-tg",
+ "PastelKos"
]
},
- "tpt-languages-nonzero": "$1 ($2% μεταφράσθηκε)"
+ "tpt-languages-nonzero": "$1 ($2% μεταγλωττίσθη)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/gsw.json b/MLEB/Translate/i18n/pagetranslation/gsw.json
index 0b20c556..2d4f04b1 100644
--- a/MLEB/Translate/i18n/pagetranslation/gsw.json
+++ b/MLEB/Translate/i18n/pagetranslation/gsw.json
@@ -61,8 +61,6 @@
"tpt-unknown-page": "Dää Namensruum isch reserviert fir Ibersetzige vu Inhaltssyte.\nD Syte, wu Du witt bearbeite, ghert schyns zue keire Syte, wu zum Ibersetze markiert isch.",
"tpt-translation-restricted": "S Ibersetze vu däre Syte in die Sproch isch vun eme Ibersetzigsadministrator deaktiviert wore.\n\nGrund: $1",
"tpt-discouraged-language-force": "<strong>Die Syte cha nit in $2 ibersetzt wäre.</strong>\n\nEn Ibersetzigsadministrator het entschide, dass die Syte nume in $3 cha ibersetzt wäre.",
- "tpt-discouraged-language": "<strong>En Ibersetzig in $2 isch kei Prioritet vu däre Syte.</strong>\n\nEn Ibersetzigsadministrator het entschide, dass die Syte vor allem in $3 sott ibersetzt wäre.",
- "tpt-discouraged-language-reason": "Grund: $1",
"tpt-priority-languages": "En Ibersetzigsadministrator het di priorisierte Sproche fir die Nochrichtegruppe uf $1 feschtgleit.",
"tpt-render-summary": "Aktualisiere zum e neji Version vu dr Quällsyte z finde",
"aggregategroups": "Sammelgruppe",
diff --git a/MLEB/Translate/i18n/pagetranslation/gu.json b/MLEB/Translate/i18n/pagetranslation/gu.json
index d6d5fec4..70a5d623 100644
--- a/MLEB/Translate/i18n/pagetranslation/gu.json
+++ b/MLEB/Translate/i18n/pagetranslation/gu.json
@@ -35,5 +35,8 @@
"tpt-languages-legend": "અન્ય ભાષાઓ:",
"tpt-languages-nonzero": "$1 ($2% ભાષાંતરીત)",
"tpt-tab-translate": "ભાષાંતર કરો",
- "tpt-invalid-group": "અયોગ્ય સમૂહ"
+ "tpt-aggregategroup-update-cancel": "રદ કરો",
+ "tpt-invalid-group": "અયોગ્ય સમૂહ",
+ "pm-cancel-button-label": "રદ કરો",
+ "pp-cancel-button-label": "રદ કરો"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/guc.json b/MLEB/Translate/i18n/pagetranslation/guc.json
new file mode 100644
index 00000000..addfe7f7
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/guc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Leonfd1992"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% pütchi alatünüipaka)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/ha.json b/MLEB/Translate/i18n/pagetranslation/ha.json
index 6fbe9db5..41a3787b 100644
--- a/MLEB/Translate/i18n/pagetranslation/ha.json
+++ b/MLEB/Translate/i18n/pagetranslation/ha.json
@@ -1,6 +1,9 @@
{
"@metadata": {
- "authors": []
+ "authors": [
+ "Kambai Akau"
+ ]
},
+ "tpt-languages-nonzero": "$1 (an fassara $2%)",
"pt-movepage-reason": "Dalili:"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/he.json b/MLEB/Translate/i18n/pagetranslation/he.json
index b933ca35..d3a90049 100644
--- a/MLEB/Translate/i18n/pagetranslation/he.json
+++ b/MLEB/Translate/i18n/pagetranslation/he.json
@@ -6,16 +6,17 @@
"Deror avi",
"Guycn2",
"Inkbug",
+ "Pols12",
"Rotemliss",
"YaronSh",
+ "דגש",
"דגש חזק"
]
},
"pagetranslation": "תרגום דפים",
"right-pagetranslation": "סימון גרסאות של דפים כגרסאות שצריך לתרגם",
"action-pagetranslation": "לנהל דפים שאפשר לתרגם",
- "tps-edit-sourcepage-title": "עריכת דף שאפשר לתרגם",
- "tps-edit-sourcepage-text": "{{GENDER:|אתה עורך|את עורכת}} את המקור של דף התרגום. נא לוודא {{GENDER:|שאתה מכיר|שאת מכירה}} את המסמכים הבאים:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text שינוי טקסט המקור]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples דוגמה לשימוש בשפת עיצוב]",
+ "tps-edit-sourcepage-text": "{{GENDER:|אתה עורך|את עורכת}} את המקור של דף שאפשר לתרגם. נא לוודא {{GENDER:|שאתה מכיר|שאת מכירה}} את המסמכים הבאים:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text שינוי טקסט המקור]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples דוגמה לשימוש בשפת עיצוב]",
"tps-edit-sourcepage-ve-warning-title": "אזהרה: דף שאינו נתמך",
"tps-edit-sourcepage-ve-warning-text": "{{GENDER:|אתה עורך|את עורכת}} דף שאפשר לתרגם. עריכה של דפים כאלה בתוכנת העריכה הזאת עדיין לא נתמכת. נא להשתמש בעורך קוד המקור.",
"tps-edit-sourcepage-ve-warning-button": "אישור",
@@ -34,10 +35,11 @@
"tpt-oldrevision": "$2 היא לא הגרסה האחרונה של הדף [[:$1]].\nרק הגרסאות האחרונות יכולות להיות מסומנות לתרגום.",
"tpt-notsuitable": "הדף $1 אינו מתאים לתרגום.\nנא לוודא שהוא מכיל תגי <nowiki><translate></nowiki> ושהתחביר שלו תקין.",
"tpt-saveok": "הדף [[:$1]] סומן לתרגום עם {{PLURAL:$2|יחידת תרגום אחת|$2 יחידות תרגום}}.\nעכשיו אפשר <span class=\"plainlinks\">[$3 לתרגם]</span> את הדף.",
- "tpt-saveok-first": "באפשרותך [[Special:PageMigration|לייבר תרגום שכבר קיים]] לדף הזה (אם יש כזה).",
+ "tpt-saveok-first": "באפשרותך [[Special:PageMigration|לייבא תרגום שכבר קיים]] לדף הזה (אם יש כזה).",
"tpt-offer-notify": "באפשרותך <span class=\"plainlinks\">[$1 להודיע למתרגמים]</span> על הדף הזה.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|להציג את רשימת הדפים לתרגום.]]",
"tpt-showpage-intro": "להלן רשימת יחידות תרגום חדשות, קיימות ומחוקות.\nלפני סימון גרסה זו לתרגום, בדקו שהשינויים ליחידות התרגום קטנים ככל שאפשר, כדי למנוע עבודה מיותרת של מתרגמים.",
- "tpt-mark-summary": "גרסה זו סומנה לתרגום",
+ "tpt-mark-summary": "הגרסה הזאת סומנה לתרגום",
"tpt-mark-nochanges": "אין שינויים שצריך לסקור. סימון הדף הזה לתרגום לא יערוך את הדף הזה וגם לא שום יחידת תרגום קיימת.",
"tpt-edit-failed": "לא ניתן לעדכן את הדף: $1",
"tpt-duplicate": "נעשה שימוש מרובה בשם יחידת התרגום $1.",
@@ -50,10 +52,11 @@
"tpt-outdated-pages-title": "דפים עם שינויים ממתינים",
"tpt-new-pages": "{{PLURAL:$1|הדף הזה מכיל|הדפים האלה מכילים}} טקסט עם תגי תרגום,\nאבל שום גרסה של {{PLURAL:$1|הדף הזה|הדפים האלה}} אינה מסומנת כעת לתרגום.",
"tpt-old-pages": "{{PLURAL:$1|הגרסה האחרונה|הגרסאות האחרונות}} של {{PLURAL:$1|הדף הזה סומנה|הדפים האלה סומנו}} לתרגום.",
- "tpt-other-pages": "{{PLURAL:$1|גרסה ישנה של דף זה סומנה|גרסאות ישנות של דפים אלה סומנו}} לתרגום,\nאבל {{PLURAL:$1|הגרסה האחרונה אינה יכולה להיות מסומנת|הגרסאות האחרונות אינן יכולות להיות מסומנות}} לתרגום.",
+ "tpt-other-pages": "{{PLURAL:$1|גרסה ישנה של הדף הזה סומנה|גרסאות ישנות של הדפים האלה סומנו}} לתרגום,\nאבל {{PLURAL:$1|הגרסה האחרונה אינה יכולה להיות מסומנת|הגרסאות האחרונות אינן יכולות להיות מסומנות}} לתרגום.",
"tpt-outdated-pages": "{{PLURAL:$1|בדף הזה|בדפים האלה}} יש שינויים שלא סומנו לתרגום.",
"tpt-tag-discouraged": "לא מומלץ",
"tpt-tag-oldsyntax": "תחביר ישן",
+ "tpt-tag-no-transclusion-support": "ללא תמיכה בהכללה",
"tpt-select-prioritylangs": "רשימת מופרדת בפסיקים של קודי שפות מועדפות:",
"tpt-select-prioritylangs-force": "למנוע תרגום לשפות שאינן מוגדרות כמועדפות",
"tpt-select-prioritylangs-reason": "סיבה:",
@@ -61,12 +64,14 @@
"tpt-sections-syntaxversion": "גרסת תחביר",
"tpt-syntaxversion-text": "הדף הזה משתמש עכשיו בגרסה הישנה של תחביר לדפים שאפשר לתרגם. הגרסה החדשה תעטוף קטעים שאינם מתורגמים בתג HTML כדי לציין את השפה הנכונה של הטקסט. דוגמה: $1. אפשר להשתמש בתחביר הסימון החדש $2 כדי למנוע כל סוג של עיטוף במקומות שבהם זה לא מתאים, למשל בעת תרגום מאפיין <code>title</code> של רכיב. לא יהיה אפשר לחזור לגרסה הישנה של התחביר.",
"tpt-syntaxversion-label": "להשתמש בתחביר החדש לדף הזה",
+ "tpt-transclusion": "הכללת תבניות",
+ "tpt-transclusion-label": "הפעלת הכללה מודעת לתרגום עבור הדף הזה",
"tpt-rev-mark": "לסמן לתרגום",
"tpt-rev-unmark": "הסרה מהתרגום",
"tpt-rev-discourage": "לסמן כלא מומלץ",
"tpt-rev-encourage": "שחזור",
- "tpt-rev-mark-tooltip": "סימון הגרסה האחרונה של דף זה לתרגום",
- "tpt-rev-unmark-tooltip": "להסרת דף זה מרשימת התרגום.",
+ "tpt-rev-mark-tooltip": "סימון הגרסה האחרונה של הדף הזה לתרגום.",
+ "tpt-rev-unmark-tooltip": "הסרת הדף הזה מרשימת התרגום.",
"tpt-rev-discourage-tooltip": "להמליץ לא לתרגם את הדף הזה עוד.",
"tpt-rev-encourage-tooltip": "לשחזר את הדף הזה לתרגום רגיל.",
"translate-tag-translate-link-desc": "תרגום דף זה",
@@ -81,14 +86,13 @@
"tpt-tab-translate": "תרגום",
"tpt-target-page": "לא ניתן לעדכן דף זה ידנית.\nדף זה הוא תרגום של הדף [[$1]] וניתן לעדכן את התרגום באמצעות [$2 כלי התרגום].",
"tpt-unknown-page": "מרחב השם הזה שמור לצורך תרגום דפי תוכן.\nהדף {{GENDER:|שאתה מנסה לערוך|שאת מנסה לערוך|שאתם מנסים לערוך}} אינו תואם לשום דף המסומן לתרגום.",
- "tpt-translation-restricted": "מנהל תרגומים נעל את תרגום קבוצת ההודעות הזאת לשפה הזאת.\n\nסיבה להגבלה: $1",
+ "tpt-translation-restricted": "תרגום הדף הזה לשפה הזאת נמנע על־ידי מנהל תרגום.\n\nסיבה: $1",
+ "tpt-translation-restricted-no-reason": "תרגום הדף הזה לשפה הזאת נמנע על־ידי מנהל תרגום.",
"tpt-discouraged-language-force-header": "לא ניתן לתרגם את הדף הזה ל{{GRAMMAR:תחילית|$1}}.",
"tpt-discouraged-language-force-content": "מנהל התרגום החליט שאפשר לתרגם את הדף הזה רק ל{{GRAMMAR:תחילית|$1}}.",
"tpt-discouraged-language-header": "תרגום הדף ל{{GRAMMAR:תחילית|$1}} אינו בעדיפות.",
"tpt-discouraged-language-content": "מנהל התרגום החליט לרכז את מאמץ התרגום ב{{GRAMMAR:תחילית|$1}}.",
"tpt-discouraged-language-force": "<strong>לא ניתן לתרגם את הדף הזה ל$2</strong>\n\nמנהל התרגום החליט שאפשר לתרגם את הדף הזה רק לשפות הבאות: $3.",
- "tpt-discouraged-language": "<strong>תרגום ל$2 לא מוגדר בתור עדיפות גבוהה עבור הדף הזה.</strong>\n\nמנהל התרגום החליט שצריך לרכז את מאמצי בתרגום בשפות הבאות: $3.",
- "tpt-discouraged-language-reason": "סיבה: $1",
"tpt-priority-languages": "מנהל תרגום הגדיר שהשפות המועדפות לקבוצה הזאת הן $1.",
"tpt-priority-languages-force": "מנהל התרגום הגדיר שהשפות המועדפות לקבוצה הזאת הן $1. תרגום לשפות אחרות אסור.",
"tpt-render-summary": "עדכון להתאמת הגרסה החדשה של דף המקור",
@@ -108,7 +112,7 @@
"pt-parse-open": "תג &lt;translate> לא מאוזן.\nתבנית תרגום: <pre>$1</pre>",
"pt-parse-close": "תג &lt;/translate> לא מאוזן.\nתבנית תרגום: <pre>$1</pre>",
"pt-parse-nested": "קטעי &lt;translate> מקוננים אינם מורשים.\nתוכן התג: <pre>$1</pre>",
- "pt-shake-multiple": "סמני יחידות תרגום מרובים עבור קטע אחד.\nטקסט יחידת התרגום: <pre>$1</pre>",
+ "pt-shake-multiple": "סמני יחידות תרגום מרובים עבור קטע אחד.\nנא לוודא שיחידות התרגום מופרדים באמצעות שורות ריקות.\nטקסט יחידת התרגום: <pre>$1</pre>",
"pt-shake-position": "סמני יחידות תרגום במיקום בלתי־צפוי.\nתוכן היחידת התרגום: <pre>$1</pre>",
"pt-shake-empty": "יחידת תרגום ריקה עבור סמן \"$1\".",
"log-description-pagetranslation": "יומן של פעולות שמיוחדות למערכת תרגום דפים",
@@ -137,16 +141,16 @@
"log-action-filter-pagetranslation-discourage": "המלצות לא לתרגם",
"log-action-filter-pagetranslation-prioritylanguages": "שינויים בעדיפויות של שפות",
"log-action-filter-pagetranslation-aggregategroups": "שינויים בקבוצות משולבות",
- "pt-movepage-title": "להעביר את הדף הניתן לתרגום $1",
+ "pt-movepage-title": "להעביר את הדף הניתן לתרגום \"$1\"",
"pt-movepage-blockers": "דף שניתן לתרגום אינו יכול להיות מועבר לשם חדש בגלל {{PLURAL:$1|השגיאה הבאה|השגיאות הבאות}}:",
"pt-movepage-block-base-exists": "כבר קיים דף לתרגום בשם [[:$1]].",
"pt-movepage-block-base-invalid": "לדף התרגום המיועד אין כותרת תקינה.",
- "pt-movepage-block-tp-exists": "דף התרגום המיועד [[:$2]] קיים.",
- "pt-movepage-block-tp-invalid": "כותרת דף התרגום המיועד עבור [[:$1]] אינה תקינה (אולי ארוכה מדי).",
+ "pt-movepage-block-tp-exists": "דף התרגום המיועד \"[[:$2]]\" קיים.",
+ "pt-movepage-block-tp-invalid": "כותרת דף התרגום המיועד עבור \"[[:$1]]\" אינה תקינה (אולי ארוכה מדי).",
"pt-movepage-block-section-exists": "דף יחידת התרגום המיועד [[:$2]] קיים.",
"pt-movepage-block-section-invalid": "כותרת הדף המיועדת עבור \"[[:$1]]\" ליחידת התרגום תהיה בלתי־תקינה (אולי ארוכה מדי?).",
- "pt-movepage-block-subpage-exists": "דף המשנה המיועד [[:$2]] קיים.",
- "pt-movepage-block-subpage-invalid": "כותרת דף המשנה המיועד עבור [[:$1]] אינה תקינה (אולי ארוכה מדי).",
+ "pt-movepage-block-subpage-exists": "דף המשנה המיועד \"[[:$2]]\" קיים.",
+ "pt-movepage-block-subpage-invalid": "כותרת דף המשנה המיועד עבור \"[[:$1]]\" אינה תקינה (אולי ארוכה מדי).",
"pt-movepage-list-pages": "רשימת הדפים להעברה",
"pt-movepage-list-translation": "{{PLURAL:$1|דף|דפי}} תרגום",
"pt-movepage-list-section": "{{PLURAL:$1|דף|דפי}} יחידת תרגום",
@@ -154,12 +158,13 @@
"pt-movepage-list-translatable-note": "צריך להעביר את הדפים האלה בנפרד.",
"pt-movepage-list-other": "{{PLURAL:$1|דף־משנה אחר|דפי־משנה אחרים}}",
"pt-movepage-list-count": "בסך הכול יש {{PLURAL:$1|דף אחד|$1 דפים}} להעברה {{PLURAL:$2|ודף־משנה אחד}}.",
+ "pt-movepage-page-count-limit": "הדף המתורגם הזה מכיל יותר {{PLURAL:$1|מדף אחד|מ־$1 דפים}}. מצאנו שהעברה של כל־כך הרבה דפים אינה אמינה. נא ליצור קשר עם מנהל מערכת כדי לעשות את זה באמצעות סקריפט תחזוקה.",
"pt-movepage-list-no-pages": "לא נמצאו דפים.",
"pt-movepage-legend": "העברת דף שניתן לתרגום",
"pt-movepage-current": "השם הנוכחי:",
"pt-movepage-new": "השם החדש:",
"pt-movepage-reason": "סיבה:",
- "pt-movepage-subpages": "העברת כל עמודי המשנה",
+ "pt-movepage-subpages": "העברת כל דפי־המשנה",
"pt-movepage-action-check": "לבדוק אם ההעברה אפשרית",
"pt-movepage-action-perform": "לבצע את ההעברה",
"pt-movepage-action-other": "שינוי יעד",
@@ -183,7 +188,7 @@
"pt-deletepage-list-pages": "רשימת דפים למחיקה",
"pt-deletepage-list-translation": "דפי תרגום",
"pt-deletepage-list-section": "דפי יחידת תרגום",
- "pt-deletepage-list-other": "דפי משנה אחרים",
+ "pt-deletepage-list-other": "דפי־משנה אחרים",
"pt-deletepage-list-count": "סך הכול {{PLURAL:$1|דף אחד|$1 דפים}} למחוק {{PLURAL:$2|ודף־משנה אחד}}.",
"pt-deletepage-list-no-pages": "לא נמצאו דפים.",
"pt-deletepage-full-logreason": "חלק מהדף הניתן לתרגום \"$1\"",
@@ -195,8 +200,8 @@
"pm-import-button-label": "ייבוא",
"pm-savepages-button-label": "שמירה",
"pm-cancel-button-label": "ביטול",
- "pm-page-does-not-exist": "הדף $1 אינו קיים",
- "pm-old-translations-missing": "$1 אינו מכיל תרגומים ישנים",
+ "pm-page-does-not-exist": "הדף $1 אינו קיים.",
+ "pm-old-translations-missing": "$1 אינו מכיל תרגומים ישנים.",
"pm-extra-units-warning": "ייתכן שקיימות כאן יחידות נספות. נא להתאים את המקור ואת יחידות התרגום.",
"pm-pagename-missing": "נא להזין את שם הדף",
"pm-add-icon-hover-text": "להוסיף יחידה למטה",
@@ -205,13 +210,14 @@
"pm-pagetitle-placeholder": "נא להזין את שם הדף",
"pm-pagetitle-invalid": "נא להזין כותרת דף תקינה. היא צריכה להיות בצורת <שם הדף>/<קוד השפה>.",
"pm-pagetitle-missing": "נא להזין את שם הדף.",
- "pm-langcode-missing": "נראה שקוד השפה חסר בכותרת. נא להזין את שם הדף בצורת <שם הדף>/<קוד השפה>",
+ "pm-langcode-missing": "נראה שקוד השפה חסר בכותרת. נא להזין את שם הדף בצורת <page-name>/<language-code>",
"pm-summary-import": "דף מיובא באמצעות [[Special:PageMigration|העברת דף מתורגם]]",
"pm-on-import-message-text": "התרגומים הישנים יובאו. יש להשתמש באפשרויות ההוספה, ההחלפה והמחיקה כדי להתאים את יחידות התרגום וללחוץ על כפתור \"{{int:pm-savepages-button-label}}\" כדי לשמור אותם. יש ללחוץ על כפתור \"{{int:pm-cancel-button-label}}\" כדי לזרוק.",
"pm-on-save-message-text": "יחידות התרגום נשמרו. עכשיו אפשר להזין את כותרת התרגום החדש כדי להעביר אותו, או לעשות שינויים ליחידות להלן ולשמור גרסה חדשה.",
"tpt-translate-title": "לאפשר תרגום של כותרת הדף",
"pp-save-summary": "הדף הוכן לתרגום",
"pagepreparation": "הכנת דף",
+ "pagepreparation-summary": "נא להגדיר איזה דף להכין לתרגום.",
"pp-pagename-placeholder": "נא להזין את שם הדף",
"pp-prepare-button-label": "הכנה",
"pp-save-button-label": "פרסום",
diff --git a/MLEB/Translate/i18n/pagetranslation/hi.json b/MLEB/Translate/i18n/pagetranslation/hi.json
index 14637774..67413c2d 100644
--- a/MLEB/Translate/i18n/pagetranslation/hi.json
+++ b/MLEB/Translate/i18n/pagetranslation/hi.json
@@ -24,7 +24,6 @@
"tpt-languages-zero": "इस भाषा हेतु अनुवाद करना शुरू करें",
"tpt-languages-nonzero": "$1 ($2% अनूदित)",
"tpt-tab-translate": "अनुवाद करें",
- "tpt-discouraged-language-reason": "कारण : $1",
"tpt-aggregategroup-add": "जोडें",
"tpt-aggregategroup-save": "सहेजे",
"tpt-aggregategroup-new-name": "नाम:",
diff --git a/MLEB/Translate/i18n/pagetranslation/hr.json b/MLEB/Translate/i18n/pagetranslation/hr.json
index fa56536b..1df6c270 100644
--- a/MLEB/Translate/i18n/pagetranslation/hr.json
+++ b/MLEB/Translate/i18n/pagetranslation/hr.json
@@ -13,7 +13,6 @@
"pagetranslation": "Prijevod stranice",
"right-pagetranslation": "Označi inačice stranica za prijevod",
"action-pagetranslation": "upravljanje prevodivim stranicama",
- "tps-edit-sourcepage-title": "Uređujete prevodljivu stranicu",
"tps-edit-sourcepage-text": "Uređujete izvornik prevodljive stranice. Molimo Vas, budite sigurni da ste upoznati sa sljedećom dokumentacijom: \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Mijenjanje teksta izvornika] \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Primjeri upotrebe načina označavanja]",
"tps-edit-sourcepage-ve-warning-title": "Upozorenje: Stranica nije podržana",
"tps-edit-sourcepage-ve-warning-text": "Uređujete prevodljivu stranicu. Uređivanje tih stranica pomoću ovoga uređivača još uvijek nije službeno podržano. Molimo Vas, rabite uređivač izvornika.",
@@ -32,6 +31,7 @@
"tpt-nosuchpage": "Stranica $1 ne postoji",
"tpt-oldrevision": "$2 nije posljednja inačica stranice [[:$1]].\nJedino posljednje inačice mogu se označiti za prevođenje.",
"tpt-notsuitable": "Stranica $1 nije pogodna za prevođenje.\nUtvrdite, postoje li oznake <nowiki><translate></nowiki> i ispravna sintaksa.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Vidi popis prevodljivih stranica.]]",
"tpt-mark-summary": "Ova inačica označena je za prevođenje",
"tpt-edit-failed": "Ažuriranje stranice nije moguće: $1",
"tpt-new-pages-title": "Stranice predložene za prevođenje",
@@ -59,7 +59,6 @@
"tpt-translation-restricted": "Prevoditeljski administrator spriječio je prevođenje stranice na ovaj jezik.\n\nRazlog: $1",
"tpt-discouraged-language-force-header": "Ova se stranica ne može prevoditi na $1.",
"tpt-discouraged-language-force-content": "Prevoditeljski administrator odlučio je da se stranica može prevesti samo na $1.",
- "tpt-discouraged-language-reason": "Razlog: $1",
"tpt-priority-languages": "Prevoditeljski administrator ovoj grupi je postavio sljedeće prioritetne jezike: $1.",
"aggregategroups": "Spojene skupine",
"tpt-aggregategroup-add": "Dodaj",
diff --git a/MLEB/Translate/i18n/pagetranslation/hrx.json b/MLEB/Translate/i18n/pagetranslation/hrx.json
new file mode 100644
index 00000000..b350e0ec
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/hrx.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iohanen"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% iwersetzd)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/hsb.json b/MLEB/Translate/i18n/pagetranslation/hsb.json
index 79b9405e..73243923 100644
--- a/MLEB/Translate/i18n/pagetranslation/hsb.json
+++ b/MLEB/Translate/i18n/pagetranslation/hsb.json
@@ -62,8 +62,6 @@
"tpt-unknown-page": "Tutón mjenowy rum je za přełožki wobsahowych stronow wuměnjeny.\nStrona, kotruž pospytuješ wobdźěłać, po wšěm zdaću stronje markěrowanej za přełožowanje njewotpowěduje.",
"tpt-translation-restricted": "Přełožowanski administrator je přełožowanju tuteje strony do tuteje rěče zadźěwał.\n\nPřičina: $1",
"tpt-discouraged-language-force": "<strong>Tuta strona njehodźi so do $2 přełožić.</strong>\n\nPřełožowanski administrator je rozsudźił, zo tuta strona hodźi so jenož do $3 přełožować.",
- "tpt-discouraged-language": "<strong>Přełožowanje do $2 nima prioritu za tutu stronu.</strong>\n\nPřełožowanski administrator je rozsudźił, fokus přełožowanskich procowanjow na $3 stajić.",
- "tpt-discouraged-language-reason": "Přičina: $1",
"tpt-priority-languages": "Přełožowanski administrator je primarne rěče za tutu skupinu jako $1 nastajił.",
"tpt-render-summary": "Aktualizacija po nowej wersiji žórłoweje strony",
"aggregategroups": "Skupiny zjednoćić",
diff --git a/MLEB/Translate/i18n/pagetranslation/hu.json b/MLEB/Translate/i18n/pagetranslation/hu.json
index d6008874..6b6840f4 100644
--- a/MLEB/Translate/i18n/pagetranslation/hu.json
+++ b/MLEB/Translate/i18n/pagetranslation/hu.json
@@ -5,8 +5,10 @@
"Dani",
"Dj",
"Glanthor Reviol",
+ "Hanna Tardos",
"Misibacsi",
"Máté",
+ "Pols12",
"R-Joe",
"Tacsipacsi",
"Tgr",
@@ -16,7 +18,6 @@
"pagetranslation": "Lap fordítása",
"right-pagetranslation": "Lapok változatainak megjelölése fordítandónak",
"action-pagetranslation": "fordítható oldalak kezelése",
- "tps-edit-sourcepage-title": "Lefordítható lap szerkesztése",
"tps-edit-sourcepage-ve-warning-title": "Figyelmeztetés: nem támogatott lap",
"tps-edit-sourcepage-ve-warning-text": "Egy lefordítható lapot szerkesztesz. Ezeket még nem támogatja hivatalosan ez a szerkesztő, használd a forráskódszerkesztőt.",
"tps-edit-sourcepage-ve-warning-button": "OK",
@@ -37,6 +38,7 @@
"tpt-saveok": "A(z) [[:$1]] lap $2 fordítási egységgel megjelölve fordításra.\nA lap mostantól <span class=\"plainlinks\">[$3 lefordítható]</span>.",
"tpt-saveok-first": "[[Special:PageMigration|Importálhatsz már létező fordításokat]] ehhez a laphoz (ha vannak).",
"tpt-offer-notify": "<span class=\"plainlinks\">[$1 Értesítheted a fordítókat]</span> erről a lapról.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Lefordítható lapok listájának megtekintése.]]",
"tpt-showpage-intro": "Alább az új, már létező és törölt szakaszok felsorolása látható.\nMielőtt fordításra jelölöd ezt a változatot, ellenőrizd hogy a szakaszok változásai minimálisak, elkerülendő a felesleges munkát a fordítóknak.",
"tpt-mark-summary": "Változat megjelölve fordításra",
"tpt-mark-nochanges": "Nincs átnézendő változtatás. A lap megjelölése fordításra nem fogja módosítani se a lapot, sem bármilyen létező fordítási egységet.",
@@ -51,17 +53,19 @@
"tpt-outdated-pages-title": "Lapok függőben lévő változásokkal.",
"tpt-new-pages": "{{PLURAL:$1|Ez a lap tartalmaz|Ezek a lapok tartalmaznak}} fordítási tagekkel ellátott szöveget, de jelenleg egyik {{PLURAL:$1|változata|változatuk}} sincs megjelölve fordításra.",
"tpt-old-pages": "{{PLURAL:$1|Ennek a lapnak|Ezeknek a lapoknak}} a legfrissebb {{PLURAL:$1|változata meg van|változatai meg vannak}} jelölve fordításra.",
- "tpt-other-pages": "A lap korábbi {{PLURAL:$1|változata|változatai}} fordíthatónak voltak megjelölve, de a legutóbbi {{PLURAL:$1|változatot|változatokat}} nem lehet megjelölni fordításra.",
+ "tpt-other-pages": "Ezen {{PLURAL:$1|lap egy korábbi változata fordíthatónak volt|lapok korábbi változatai fordíthatónak voltak}} megjelölve, de a legutóbbi {{PLURAL:$1|változatot|változatokat}} nem lehet megjelölni fordításra.",
"tpt-outdated-pages": "{{PLURAL:$1|Ezen a lapon|Ezeken a lapokon}} vannak fordításra meg nem jelölt változtatások.",
"tpt-tag-discouraged": "nem javasolt",
"tpt-tag-oldsyntax": "régi szintaxis",
- "tpt-select-prioritylangs": "A kiemelt nyelvek vesszővel elválasztott listája",
+ "tpt-tag-no-transclusion-support": "nincs beillesztési támogatás",
+ "tpt-select-prioritylangs": "A kiemelt nyelvek vesszővel elválasztott listája:",
"tpt-select-prioritylangs-force": "A nem kiemelt nyelvekre történő fordítás megakadályozása",
"tpt-select-prioritylangs-reason": "Ok:",
"tpt-sections-prioritylangs": "Kiemelt nyelvek",
"tpt-sections-syntaxversion": "Szintaxisverzió",
"tpt-syntaxversion-text": "Ez a lap jelenleg egy régebbi forráslapszintaxist használ. Az új verzió a lefordítatlan fordítási egységeket egy HTML-elembe fogja burkolni a szöveg helyes nyelvét jelzendő. Például: $1. Az új $2 szintaxis használható ennek a burkolásnak a megakadályozására olyan esetekben, amikor az problémát okozna, például egy HTML-elem <code>title</code> attribútumának fordításakor. Nincs lehetőség a régi szintaxisverzióhoz való visszatérésre.",
"tpt-syntaxversion-label": "A legújabb szintaxisverzió használata ezen a lapon",
+ "tpt-transclusion": "Sablonbeillesztés",
"tpt-rev-mark": "megjelölés fordításra",
"tpt-rev-unmark": "lap eltávolítása a fordításból",
"tpt-rev-discourage": "nem javasolt",
@@ -83,13 +87,12 @@
"tpt-target-page": "Ezt a lapot nem lehet kézzel frissíteni.\nA(z) [[$1]] lap fordítása, és a fordítását [$2 a fordítás segédeszköz] segítségével lehet frissíteni.",
"tpt-unknown-page": "Ez a névtér a tartalmi lapok fordításainak van fenntartva.\nÚgy tűnik, a szerkeszteni kívánt lap nem egyezik egyetlen fordításra jelölt lappal sem.",
"tpt-translation-restricted": "Ennek a lapnak a fordítását ezen nyelvre megakadályozta egy fordítási adminisztrátor.\n\nIndoklás: $1",
+ "tpt-translation-restricted-no-reason": "A lap megadott nyelvre való fordítását megakadályozta egy fordítási adminisztrátor.",
"tpt-discouraged-language-force-header": "Ez a lap nem fordítható $1 nyelvre.",
"tpt-discouraged-language-force-content": "Egy fordítási adminisztrátor úgy döntött, hogy ez a lap csak $1 nyelvre fordítható.",
"tpt-discouraged-language-header": "A fordítás $1 nyelvre nem a legfontosabb feladat ennél a lapnál.",
"tpt-discouraged-language-content": "Egy fordítási adminisztrátor úgy döntött, hogy elsődlegesen $1 nyelvre kell fordítani.",
"tpt-discouraged-language-force": "<strong>Ez a lap nem fordítható $2 nyelvre.</strong>\n\nEgy fordítási adminisztrátor úgy döntött, hogy ez a lap csak $3 nyelvre fordítható.",
- "tpt-discouraged-language": "<strong>$2 — a fordítás erre a nyelvre nem a legfontosabb feladat.</strong>\n\nAz adminisztrátori javaslat szerint a legfontosabb nyelvek a következők: $3.\n\nKérjük, ha beszéled ezek közül valamelyiket, fontold meg, hogy inkább arra a nyelvre fordítasz előbb: munkádnak így többek láthatják hasznát.",
- "tpt-discouraged-language-reason": "Indoklás: $1",
"tpt-priority-languages": "Egy fordítási adminisztrátor ennek a csoportnak a kiemelt célnyelveit a következő(k)re állította: $1",
"tpt-priority-languages-force": "Egy fordítási adminisztrátor ennek a csoportnak az elsőbbségi nyelveit a következőkre állította: $1. Más nyelvekre nem engedélyezett a fordítás.",
"tpt-render-summary": "Frissítés, hogy megegyezzen a forráslap új változatával",
@@ -109,7 +112,7 @@
"pt-parse-open": "Páratlan &lt;translate> tag.\nFordítási sablon: <pre>$1</pre>",
"pt-parse-close": "Páratlan &lt;/translate> tag.\nFordítási sablon: <pre>$1</pre>",
"pt-parse-nested": "Egymásba ágyazott &lt;translate> szakaszok nem engedélyezettek.\nElem szövege: <pre>$1</pre>",
- "pt-shake-multiple": "Több fordításiegység-jelző egy fordítási egységhez.\nA fordítási egység szövege: <pre>$1</pre>",
+ "pt-shake-multiple": "Több fordításiegység-jelző egy fordítási egységhez.\nFigyelj rá, hogy a fordítási egységeket üres sorok válasszák el.\nA fordítási egység szövege: <pre>$1</pre>",
"pt-shake-position": "Fordításiegység-jelzők váratlan helyen.\nA fordítási egység szövege: <pre>$1</pre>",
"pt-shake-empty": "Üres fordítási egység a(z) „$1” jelzőhöz.",
"log-description-pagetranslation": "A lapfordító rendszerhez kapcsolódó műveletek naplója",
@@ -204,7 +207,7 @@
"pm-pagetitle-placeholder": "Írd be a lap címét",
"pm-pagetitle-invalid": "Írj be egy érvényes címet. <code><lapcím>/<nyelvkód></code> formátumban kell lennie.",
"pm-pagetitle-missing": "Írd be a lap címét.",
- "pm-langcode-missing": "Úgy tűnik, hiányzik a nyelvkód a címből. Kérjük, írd be a lap címét code><lapcím>/<nyelvkód></code> formátumban.",
+ "pm-langcode-missing": "Úgy tűnik, hiányzik a nyelvkód a címből. Kérjük, írd be a lap címét <page-name>/<language-code> formátumban.",
"pm-summary-import": "Importálva a [[Special:PageMigration|lapmigráció]] segítségével",
"pm-on-import-message-text": "A régi fordítások importálva lettek. Használd a hozzáadás, csere és törlés opciókat a fordítási egységek igazításához, és kattints a „{{int:pm-savepages-button-label}}“ gombra a mentésükhöz, vagy a „{{int:pm-cancel-button-label}}” az elvetésükhöz.",
"pm-on-save-message-text": "A fordítási egységek elmentve. Most beírhatod egy új fordítási lap címét a migrációhoz, vagy lentebb módosíthatod az egységeket a mentés előtt.",
diff --git a/MLEB/Translate/i18n/pagetranslation/hy.json b/MLEB/Translate/i18n/pagetranslation/hy.json
index ab8405e0..6df26afa 100644
--- a/MLEB/Translate/i18n/pagetranslation/hy.json
+++ b/MLEB/Translate/i18n/pagetranslation/hy.json
@@ -7,6 +7,10 @@
},
"tps-edit-sourcepage-ve-warning-button": "Լավ",
"tpt-languages-nonzero": "$1 ($2% թարգմանված)",
+ "tpt-aggregategroup-add": "Ավելացնել",
+ "tpt-aggregategroup-update-cancel": "Չեղարկել",
"pt-deletepage-list-no-pages": "Ոչ մի էջ չի գտնվել։",
- "pp-save-button-label": "Հրապարակել"
+ "pm-cancel-button-label": "Չեղարկել",
+ "pp-save-button-label": "Հրապարակել",
+ "pp-cancel-button-label": "Չեղարկել"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ia.json b/MLEB/Translate/i18n/pagetranslation/ia.json
index 2c133f9c..2159860f 100644
--- a/MLEB/Translate/i18n/pagetranslation/ia.json
+++ b/MLEB/Translate/i18n/pagetranslation/ia.json
@@ -33,7 +33,7 @@
"tpt-old-pages-title": "Paginas in traduction",
"tpt-other-pages-title": "Paginas defectuose",
"tpt-new-pages": "Iste {{PLURAL:$1|pagina|paginas}} contine texto con etiquettas de traduction, ma nulle version de iste {{PLURAL:$1|pagina|paginas}} es actualmente marcate pro traduction.",
- "tpt-old-pages": "Alcun {{PLURAL:$1|version de iste pagina|versiones de iste paginas}} ha essite marcate pro traduction.",
+ "tpt-old-pages": "Le ultime version de iste {{PLURAL:$1|pagina|paginas}} ha essite marcate pro traduction.",
"tpt-other-pages": "{{PLURAL:$1|Un ancian version de iste pagina|Ancian versiones de iste paginas}} es marcate pro traduction,\nma le ultime {{PLURAL:$1|version|versiones}} non pote esser marcate pro traduction.",
"tpt-select-prioritylangs": "Lista de linguas prioritari separate per commas:",
"tpt-select-prioritylangs-force": "Impedir le traduction in linguas non prioritari",
@@ -65,8 +65,6 @@
"tpt-discouraged-language-header": "Le traduction in $1 non es un prioritate pro iste pagina.",
"tpt-discouraged-language-content": "Un administrator de traductiones ha decidite de concentrar le effortios al traduction in $1.",
"tpt-discouraged-language-force": "<strong>Iste pagina non pote esser traducite in $2.</strong>\n\nUn administrator de traductiones ha decidite que iste pagina pote esser traducite solmente in $3.",
- "tpt-discouraged-language": "<strong>Le traduction in $2 non es un prioritate pro iste paigna.</strong>\n\nUn administrator de traductiones ha decidite de concentrar le effortios al traduction in $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "Un administrator de traduction ha definite le linguas prioritari pro iste gruppo como $1.",
"tpt-render-summary": "Actualisation a un nove version del pagina de origine",
"aggregategroups": "Gruppos aggregate",
@@ -83,7 +81,7 @@
"pt-parse-open": "Etiquetta &lt;translate> asymmetric.\nPatrono de traduction: <pre>$1</pre>",
"pt-parse-close": "Etiquetta &lt;/translate> asymmetric.\nPatrono de traduction: <pre>$1</pre>",
"pt-parse-nested": "Le unitates de traduction &lt;translate> annidate non es permittite.\nTexto del etiquetta: <pre>$1</pre>",
- "pt-shake-multiple": "Il ha multiple marcatores de unitate de traduction pro un sol unitate de traduction.\nTexto del unitate de traduction: <pre>$1</pre>",
+ "pt-shake-multiple": "Il ha multiple marcatores de unitate de traduction pro un sol unitate de traduction.\nAssecura te que le unitates de traduction es separate per lineas vacue.\nTexto del unitate de traduction: <pre>$1</pre>",
"pt-shake-position": "Il ha marcatores de unitate de traduction in un position inexpectate.\nTexto del unitate de traduction: <pre>$1</pre>",
"pt-shake-empty": "Unitate de traduction vacue pro le marcator \"$1\".",
"log-description-pagetranslation": "Registro de actiones ligate al systema de traduction de paginas",
@@ -117,7 +115,7 @@
"pt-movepage-list-translation": "{{PLURAL:$1|Pagina|Paginas}} de traduction",
"pt-movepage-list-section": "{{PLURAL:$1|Pagina|Paginas}} de unitate de traduction",
"pt-movepage-list-other": "Altere {{PLURAL:$1|subpagina|subpaginas}}",
- "pt-movepage-list-count": "In total $1 {{PLURAL:$1|pagina|paginas}} a renominar.",
+ "pt-movepage-list-count": "In total $1 {{PLURAL:$1|pagina|paginas}} a renominar e $2 {{PLURAL:$2|subpagina|subpaginas}}.",
"pt-movepage-legend": "Renominar pagina traducibile",
"pt-movepage-current": "Nomine actual:",
"pt-movepage-new": "Nove nomine:",
@@ -147,7 +145,7 @@
"pt-deletepage-list-translation": "Paginas traducite",
"pt-deletepage-list-section": "Paginas de unitate de traduction",
"pt-deletepage-list-other": "Altere subpaginas",
- "pt-deletepage-list-count": "In total $1 {{PLURAL:$1|pagina|paginas}} a deler.",
+ "pt-deletepage-list-count": "In total $1 {{PLURAL:$1|pagina|paginas}} a deler e $2 {{PLURAL:$2|subpagina|subpaginas}}.",
"pt-deletepage-full-logreason": "Parte del pagina traducibile \"$1\"",
"pt-deletepage-lang-logreason": "Parte del pagina traducite \"$1\"",
"pt-deletepage-started": "Per favor verifica in le [[Special:Log/pagetranslation|registro de traduction de paginas]] le existentia de errores e del message de completion.",
@@ -163,7 +161,7 @@
"pm-add-icon-hover-text": "Adde un unitate hic infra",
"pm-swap-icon-hover-text": "Excambiar con le unitate hic infra",
"pm-delete-icon-hover-text": "Deler unitate",
- "pm-langcode-missing": "Le codice de lingua manca in le titulo. Per favor, entra le titulo in formato <nomine-de-pagina>/<codice-de-lingua>.",
+ "pm-langcode-missing": "Le codice de lingua manca in le titulo. Per favor, entra le titulo in formato <page-name>/<language-code>.",
"tpt-translate-title": "Permitter le traduction del titulo del pagina",
"pp-diff-error": "Un error ha occurrite durante le obtention del diff ab le servitor."
}
diff --git a/MLEB/Translate/i18n/pagetranslation/id.json b/MLEB/Translate/i18n/pagetranslation/id.json
index 1a1970e8..a36b8285 100644
--- a/MLEB/Translate/i18n/pagetranslation/id.json
+++ b/MLEB/Translate/i18n/pagetranslation/id.json
@@ -3,12 +3,15 @@
"authors": [
"Anakmalaysia",
"Bennylin",
+ "Daud I.F. Argana",
"Farras",
"Irwangatot",
"IvanLanin",
"Iwan Novirion",
"Naufal06",
"Pebaryan",
+ "Pols12",
+ "Rachmat04",
"Raynasution",
"Rex",
"William Surya Permana",
@@ -17,6 +20,11 @@
},
"pagetranslation": "Penerjemahan halaman",
"right-pagetranslation": "Menandai revisi-revisi halaman untuk diterjemahkan",
+ "action-pagetranslation": "mengelola halaman-halaman yang bisa diterjemahkan",
+ "tps-edit-sourcepage-text": "Anda sedang menyunting sebuah halaman sumber terjemahan. Tolong pastikan bahwa Anda memahami dokumentasi berikut:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Mengubah teks sumber]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Contoh markah yang digunakan]",
+ "tps-edit-sourcepage-ve-warning-title": "Peringatan: Halaman tidak didukung",
+ "tps-edit-sourcepage-ve-warning-text": "Anda sedang menyunting sebuah halaman yang dapat diterjemahkan. Menyunting halaman seperti ini melalui penyunting ini belum didukung secara resmi. Tolong gunakan penyunting sumber.",
+ "tps-edit-sourcepage-ve-warning-button": "Oke",
"tpt-section": "Unit penerjemahan $1",
"tpt-section-new": "Unit penerjemahan baru. Nama: $1",
"tpt-section-deleted": "Unit penerjemahan $1",
@@ -33,15 +41,41 @@
"tpt-notsuitable": "Halaman $1 tidak dapat diterjemahkan.\nPastikan bahwa halaman ini memiliki tag <nowiki><translate></nowiki> dan memiliki sintaksis yang valid.",
"tpt-saveok": "Halaman [[:$1]] telah ditandai untuk diterjemahkan dengan $2 {{PLURAL:$2|unit penerjemahan|unit penerjemahan}}.\nHalaman ini sekarang dapat <span class=\"plainlinks\">[$3 diterjemahkan]</span>.",
"tpt-saveok-first": "Anda dapat [[Special:PageMigration|mengimpor terjemahan yang sudah tersedia]] untuk halaman ini (jika ada).",
- "tpt-showpage-intro": "Berikut adalah daftar bagian baru, bagian yang telah ada, dan bagian yang dihapus.\nSebelum menandai revisi ini untuk diterjemahkan, harap periksa agar perubahan ke bagian-bagian dapat diminimalisasi guna menghindarkan para penerjemah dari melakukan pekerjaan yang tidak diperlukan.",
+ "tpt-offer-notify": "Anda bisa <span class=\"plainlinks\">[$1 memberitahu penerjemah]</span> mengenai halaman ini.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Tampilkan daftar halaman yang bisa diterjemahkan.]]",
+ "tpt-showpage-intro": "Berikut adalah daftar satuan baru, satuan yang telah ada, dan satuan yang dihapus.\nSebelum menandai revisi ini untuk diterjemahkan, harap periksa agar perubahan ke satuan terjemahan dapat diminimalkan guna menghindarkan para penerjemah dari melakukan pekerjaan yang tidak diperlukan.",
"tpt-mark-summary": "Menandai revisi ini untuk diterjemahkan",
+ "tpt-mark-nochanges": "Tidak ada perubahan untuk ditinjau. Memandai halaman ini untuk diterjemahkan tidak akan menyunting halaman atau satuan terjemahan yang ada.",
"tpt-edit-failed": "Tidak dapat memperbarui halaman: $1",
- "tpt-unmarked": "Halaman $1 tidak lagi ditandai untuk diterjemahkan.",
+ "tpt-duplicate": "Nama satuan terjemahan $1 digunakan lebih dari sekali.",
+ "tpt-invalid": "Nama satuan terjemahan $1 tidak boleh berisi tanda garis bawah atau garis miring.",
+ "tpt-unmarked": "Halaman [[:$1]] tidak lagi ditandai untuk diterjemahkan.",
"tpt-list-nopages": "Tidak ada halaman yang ditandai untuk diterjemahkan atau siap ditandai untuk diterjemahkan.",
+ "tpt-new-pages-title": "Halaman yang diusulkan untuk diterjemahkan",
+ "tpt-old-pages-title": "Halaman yang diterjemahkan",
+ "tpt-other-pages-title": "Halaman rusak",
+ "tpt-outdated-pages-title": "Halaman dengan perubahan tertunda",
"tpt-new-pages": "{{PLURAL:$1|Halaman ini berisikan|Halaman-halaman ini berisikan}} teks dengan tag terjemahan, tetapi tidak ada versi {{PLURAL:$1|halaman ini|halaman-halaman ini}} yang sudah ditandai untuk diterjemahkan.",
- "tpt-old-pages": "Beberapa revisi dari {{PLURAL:$1|halaman ini|halaman-halaman ini}} telah ditandai untuk diterjemahkan.",
+ "tpt-old-pages": "Revisi terbaru dari {{PLURAL:$1|halaman ini|halaman-halaman ini}} telah ditandai untuk diterjemahkan.",
"tpt-other-pages": "{{PLURAL:$1|Versi lama dari halaman ini|Versi lama dari halaman ini}} ditandai untuk diterjemahkan,\ntetapi {{PLURAL:$1|versi|versi}} terakhir tidak dapat ditandai untuk diterjemahkan.",
- "tpt-rev-unmark": "singkirkan halaman ini dari penerjemahan",
+ "tpt-outdated-pages": "{{PLURAL:$1|Halaman|Halaman-halaman}} ini memiliki perubahan yang tidak ditandai untuk diterjemahkan.",
+ "tpt-tag-discouraged": "tidak disarankan",
+ "tpt-tag-oldsyntax": "sintaksis lama",
+ "tpt-select-prioritylangs": "Daftar kode bahasa prioritas yang dipisahkan dengan koma:",
+ "tpt-select-prioritylangs-force": "Melarang terjemahan ke bahasa-bahasa selain bahasa prioritas",
+ "tpt-select-prioritylangs-reason": "Alasan:",
+ "tpt-sections-prioritylangs": "Bahasa prioritas",
+ "tpt-sections-syntaxversion": "Versi sintaksis",
+ "tpt-syntaxversion-text": "Halaman ini sedang menggunakan versi lama dari sintaksis sumber halaman yang bisa diterjemahkan. Versi yang baru akan membungkus bagian tidak diterjemahkan dengan tag HTML untuk menandakan bahasa teks yang benar. Contoh: $1. Anda bisa menggunakan sintaksis markah baru $2 untuk menghindari terjadinya pembungkusan di tempat yang tidak tepat, seperti ketika menerjemahkan atribut <code>title</code> dari suatu elemen. Tidak mungkin kembali ke versi sintaksis yang lama.",
+ "tpt-syntaxversion-label": "Gunakan versi sintaksis terbaru untuk halaman ini",
+ "tpt-rev-mark": "tandai untuk diterjemahkan",
+ "tpt-rev-unmark": "singkirkan dari penerjemahan",
+ "tpt-rev-discourage": "tidak disarankan",
+ "tpt-rev-encourage": "kembalikan",
+ "tpt-rev-mark-tooltip": "Tempah versi terbaru halaman ini untuk diterjemahkan.",
+ "tpt-rev-unmark-tooltip": "Singkirkan halaman ini dari penerjemahan.",
+ "tpt-rev-discourage-tooltip": "Cegah penerjemahan lebih lanjut di halaman ini.",
+ "tpt-rev-encourage-tooltip": "Kembalikan halaman ini ke terjemahan yang normal.",
"translate-tag-translate-link-desc": "Terjemahkan halaman ini",
"translate-tag-markthis": "Tandai halaman ini untuk diterjemahkan",
"translate-tag-markthisagain": "Halaman ini telah diubah <span class=\"plainlinks\">[$1 kali]</span> sejak terakhir <span class=\"plainlinks\">[$2 ditandai untuk diterjemahkan]</span>.",
@@ -49,33 +83,81 @@
"tpt-translation-intro": "Halaman ini adalah sebuah <span class=\"plainlinks\">[$1 versi terjemahan]</span> dari halaman [[$2]] dan terjemahannya telah selesai $3% dari sumber terkini.",
"tpt-translation-intro-fuzzy": "Terjemahan usang ditandai seperti ini.",
"tpt-languages-legend": "Bahasa lain:",
- "tpt-languages-nonzero": "$1 ($2% terjemahan)",
+ "tpt-languages-zero": "Mulai terjemahan dalam bahasa ini",
+ "tpt-languages-nonzero": "$1 ($2% diterjemahkan)",
+ "tpt-tab-translate": "Terjemahkan",
"tpt-target-page": "Halaman ini tidak dapat diperbarui secara manual.\nHalaman ini adalah terjemahan dari halaman [[$1]] dan terjemahannya dapat diperbarui menggunakan [$2 peralatan penerjemahan].",
- "tpt-unknown-page": "Ruang nama ini dicadangkan untuk terjemahan halaman isi.\nHalaman yang ingin Anda sunting ini tampaknya tidak memiliki hubungan dengan halaman mana pun yang ditandai untuk diterjemahkan.",
+ "tpt-unknown-page": "Ruang nama ini dicadangkan untuk terjemahan isi halaman.\nHalaman yang ingin Anda sunting ini tampaknya tidak memiliki hubungan dengan halaman mana pun yang ditandai untuk diterjemahkan.",
+ "tpt-translation-restricted": "Penerjemahan halaman ini ke bahasa ini telah dilarang oleh seorang pengurus terjemahan.\n\nAlasan: $1",
+ "tpt-discouraged-language-force-header": "Halaman ini tidak bisa diterjemahkan ke $1.",
+ "tpt-discouraged-language-force-content": "Seorang pengurus terjemahan telah memutuskan bahwa halaman ini hanya bisa diterjemahkan ke $1.",
+ "tpt-discouraged-language-header": "Menerjemahkan ke $1 bukanlah prioritas untuk halaman ini.",
+ "tpt-discouraged-language-content": "Seorang pengurus terjemahan telah memutuskan untuk memfokuskan usaha penerjemahan ke $1.",
+ "tpt-discouraged-language-force": "<strong>Halaman ini tidak bisa diterjemahkan ke $2.</strong>\n\nSeoarng pengurus terjemahan telah memutuskan bahwa halaman ini hanya bisa diterjemahkan ke $3.",
+ "tpt-priority-languages": "Seorang pengurus terjemahan telah mengatur bahasa prioritas untuk kelompok ini ke $1.",
+ "tpt-priority-languages-force": "Seorang pengurus terjemahan telah mengatur bahasa prioritas untuk kelompok ini menjadi $1. Menerjemahkan ke bahasa lain tidak diperbolehkan.",
"tpt-render-summary": "Memperbarui ke revisi terbaru halaman sumber",
+ "aggregategroups": "Kelompok agregat",
+ "tpt-aggregategroup-add": "Tambahkan",
+ "tpt-aggregategroup-save": "Simpan",
+ "tpt-aggregategroup-add-new": "Tambahkan kelompok agregat baru",
+ "tpt-aggregategroup-new-name": "Nama:",
+ "tpt-aggregategroup-new-description": "Deskripsi (opsional):",
+ "tpt-aggregategroup-remove-confirm": "Apakah Anda yakin ingin menghapus kelompok agregat ini?",
+ "tpt-aggregategroup-invalid-group": "Kelompok tidak ada",
+ "tpt-aggregategroup-edit-name": "Nama:",
+ "tpt-aggregategroup-edit-description": "Deskripsi:",
+ "tpt-aggregategroup-update": "Simpan",
+ "tpt-aggregategroup-update-cancel": "Batal",
+ "tpt-invalid-group": "Kelompok tidak valid",
"pt-parse-open": "Tag &lt;translate> tidak seimbang.\nTemplat terjemahan: <pre>$1</pre>",
"pt-parse-close": "Tag &lt;/translate> tidak seimbang.\nTemplat terjemahan: <pre>$1</pre>",
- "pt-parse-nested": "Bagian &lt;translate> bersarang tidak diizinkan.\nTeks tanda: <pre>$1</pre>",
- "pt-shake-multiple": "Penanda bagian ganda untuk satu bagian.\nTeks bagian: <pre>$1</pre>",
+ "pt-parse-nested": "Satuan terjemahan &lt;translate> bersarang tidak diizinkan.\nTeks tanda: <pre>$1</pre>",
+ "pt-shake-multiple": "Penanda satuan terjemahan ganda untuk satu bagian.\nTeks bagian: <pre>$1</pre>",
"pt-shake-position": "Penanda satuan terjemahan di tempat tak terduga.\nTeks satuan terjemahan: <pre>$1</pre>",
- "pt-shake-empty": "Bagian kosong untuk penanda $1.",
+ "pt-shake-empty": "Satuan terjemahan kosong untuk penanda \"$1\".",
"log-description-pagetranslation": "Log tindakan yang berhubungan dengan sistem penerjemahan halaman",
"log-name-pagetranslation": "Log penerjemahan halaman",
- "pt-movepage-title": "Pindahkan halaman yang dapat diterjemahkan $1",
+ "logentry-pagetranslation-mark": "$1 {{GENDER:$2|menandai}} $3 untuk diterjemahkan",
+ "logentry-pagetranslation-unmark": "$1 {{GENDER:$2|menghapus}} $3 dari sistem penerjemahan",
+ "logentry-pagetranslation-moveok": "$1 {{GENDER:$2|menyelesaikan}} pengubahan nama halaman yang bisa diterjemahkan $3 ke $4",
+ "logentry-pagetranslation-movenok": "$1 {{GENDER:$2|menghadapi}} masalah saat memindahkan halaman $3 ke $4",
+ "logentry-pagetranslation-deletefok": "$1 {{GENDER:$2|menyelesaikan}} penghapusan halaman yang bisa diterjemahkan $3",
+ "logentry-pagetranslation-deletefnok": "$1 {{GENDER:$2|gagal}} menghapus $3 yang dimiliki oleh halaman bisa diterjemahkan $4",
+ "logentry-pagetranslation-deletelok": "$1 {{GENDER:$2|menyelesaikan}} penghapusan halaman terjemahan $3",
+ "logentry-pagetranslation-deletelnok": "$1 {{GENDER:$2|gagal}} menghapus $3 yang dimiliki oleh halaman terjemahan $4",
+ "logentry-pagetranslation-encourage": "$1 {{GENDER:$2|menyarankan}} penerjemahan $3",
+ "logentry-pagetranslation-discourage": "$1 {{GENDER:$2|tidak menyarankan}} penerjemahan $3",
+ "logentry-pagetranslation-prioritylanguages-unset": "$1 {{GENDER:$2|menghapus}} bahasa prioritas dari halaman bisa diterjemahkan $3",
+ "logentry-pagetranslation-prioritylanguages": "$1 {{GENDER:$2|mengatur}} bahasa prioritas untuk halaman bisa diterjemahkan $3 menjadi $5",
+ "logentry-pagetranslation-prioritylanguages-force": "$1 {{GENDER:$2|membatasi}} bahasa untuk halaman bisa diterjemahkan $3 menjadi $5",
+ "logentry-pagetranslation-associate": "$1 {{GENDER:$2|menambahkan}} halaman bisa diterjemahkan $3 ke kelompok agregat $4",
+ "logentry-pagetranslation-dissociate": "$1 {{GENDER:$2|menghapus}} halaman bisa diterjemahkan $3 dari kelompok agregat $4",
+ "log-action-filter-pagetranslation": "Jenis tindakan:",
+ "log-action-filter-pagetranslation-mark": "Tandai untuk diterjemahkan",
+ "log-action-filter-pagetranslation-unmark": "Singkirkan dari penerjemahan",
+ "log-action-filter-pagetranslation-move": "Pemindahan halaman",
+ "log-action-filter-pagetranslation-delete": "Penghapusan halaman",
+ "log-action-filter-pagetranslation-prioritylanguages": "Pengubahan bahasa prioritas",
+ "log-action-filter-pagetranslation-aggregategroups": "Pengubahan kelompok agregat",
+ "pt-movepage-title": "Pindahkan halaman yang dapat diterjemahkan \"$1\"",
"pt-movepage-blockers": "Halaman yang dapat diterjemahkan tidak dapat dipindahkan ke nama baru karena {{PLURAL:$1|kesalahan|kesalahan}} berikut:",
- "pt-movepage-block-base-exists": "Halaman dasar target [[:$1]] ditemukan.",
- "pt-movepage-block-base-invalid": "Halaman dasar target memiliki judul yang tidak sah.",
- "pt-movepage-block-tp-exists": "Halaman penerjemahan target [[:$2]] ditemukan.",
- "pt-movepage-block-tp-invalid": "Judul halaman penerjemahan target untuk [[:$1]] salah (terlalu panjang?).",
- "pt-movepage-block-section-exists": "Halaman bagian target [[:$2]] ditemukan.",
- "pt-movepage-block-section-invalid": "Judul halaman bagian target untuk [[:$1]] salah (terlalu panjang?).",
- "pt-movepage-block-subpage-exists": "Subhalaman taget [[:$2]] ditemukan.",
- "pt-movepage-block-subpage-invalid": "Judul subhalaman target untuk [[:$1]] salah (terlalu panjang?).",
+ "pt-movepage-block-base-exists": "Halaman yang bisa diterjemahkan target \"[[:$1]]\" ditemukan.",
+ "pt-movepage-block-base-invalid": "Nama halaman yang bisa diterjemahkan target bukanlah judul yang tidak sah.",
+ "pt-movepage-block-tp-exists": "Halaman penerjemahan target \"[[:$2]]\" ditemukan.",
+ "pt-movepage-block-tp-invalid": "Judul halaman penerjemahan target untuk \"[[:$1]]\" salah (terlalu panjang?).",
+ "pt-movepage-block-section-exists": "Halaman target \"[[:$2]]\" untuk satuan terjemahan ditemukan.",
+ "pt-movepage-block-section-invalid": "Judul halaman target untuk \"[[:$1]]\" untuk satuan terjemahan salah (terlalu panjang?).",
+ "pt-movepage-block-subpage-exists": "Subhalaman target \"[[:$2]]\" ditemukan.",
+ "pt-movepage-block-subpage-invalid": "Judul subhalaman target untuk \"[[:$1]]\" salah (terlalu panjang?).",
"pt-movepage-list-pages": "Daftar halaman yang akan dipindahkan",
- "pt-movepage-list-translation": "Halaman penerjemahan",
- "pt-movepage-list-section": "Halaman bagian",
- "pt-movepage-list-other": "Subhalaman lain",
- "pt-movepage-list-count": "Secara keseluruhan ada $1 {{PLURAL:$1|halaman|halaman}} yang akan dipindahkan.",
+ "pt-movepage-list-translation": "{{PLURAL:$1|Halaman|Halaman-halaman}} penerjemahan",
+ "pt-movepage-list-section": "{{PLURAL:$1|Halaman|Halaman-halaman}} satuan terjemahan",
+ "pt-movepage-list-translatable": "{{PLURAL:$1|Subhalaman|Subhalaman-subahalaman}} ditandai untuk diterjemahkan",
+ "pt-movepage-list-translatable-note": "Halaman-halaman ini harus dipindahkan secara terpisah.",
+ "pt-movepage-list-other": "{{PLURAL:$1|Subhalaman|Subahalaman-subhalaman}} lain",
+ "pt-movepage-list-count": "Secara keseluruhan ada $1 {{PLURAL:$1|halaman|halaman}} yang akan dipindahkan ditambah $2 {{PLURAL:$2|subhalaman|subhalaman}}.",
+ "pt-movepage-list-no-pages": "Halaman tidak ditemukan.",
"pt-movepage-legend": "Pindahkan halaman yang dapat diterjemahkan",
"pt-movepage-current": "Nama sekarang:",
"pt-movepage-new": "Nama baru:",
@@ -85,13 +167,68 @@
"pt-movepage-action-perform": "Lakukan langkah ini",
"pt-movepage-action-other": "Ubah target",
"pt-movepage-intro": "Halaman istimewa ini memungkinkan Anda untuk memindahkan halaman yang ditandai untuk diterjemahkan.\nTindakan pemindahan tidak akan berlangsung seketika karena banyak halaman yang perlu dipindahkan.\nSaat halaman dipindahkan, tidak dimungkinkan untuk berinteraksi dengan halaman yang bersangkutan.\nKegagalan akan dicatat di [[Special:Log/pagetranslation|log terjemahan halaman]] dan perlu diperbaiki secara manual.",
- "pt-movepage-logreason": "Bagian dari halaman yang dapat diterjemahkan $1.",
- "pt-movepage-started": "Halaman dasar telah dipindahkan.\nSilakan periksa [[Special:Log/pagetranslation|log penerjemahan halaman]] untuk pesan kesalahan dan penyelesaian.",
+ "pt-movepage-logreason": "Bagian dari halaman yang dapat diterjemahkan \"$1\".",
+ "pt-movepage-started": "Silakan periksa [[Special:Log/pagetranslation|log penerjemahan halaman]] untuk pesan kesalahan dan penyelesaian.",
"pt-locked-page": "Halaman ini dikunci karena halaman yang dapat diterjemahkan saat ini sedang dipindahkan.",
+ "pt-deletepage-lang-title": "Menghapus halaman terjemahan \"$1\"",
+ "pt-deletepage-full-title": "Menghapus halaman yang dapat diterjemahkan \"$1\"",
+ "pt-deletepage-invalid-title": "Halaman yang diberikan tidak valid.",
+ "pt-deletepage-invalid-text": "Halaman yang diberikan bukanlah sebuah halaman yang bisa diterjemahkan ataupun sebuah halaman terjemahan.",
+ "pt-deletepage-action-check": "Daftarkan halaman yang akan dihapus",
+ "pt-deletepage-action-perform": "Lakukan penghapusan",
+ "pt-deletepage-action-other": "Ubah target",
+ "pt-deletepage-lang-legend": "Hapus halaman terjemahan",
+ "pt-deletepage-full-legend": "Hapus halaman yang dapat diterjemahkan",
+ "pt-deletepage-any-legend": "Hapus halaman yang dapat diterjemahkan atau halaman terjemahan",
+ "pt-deletepage-current": "Nama halaman:",
"pt-deletepage-reason": "Alasan:",
+ "pt-deletepage-subpages": "Hapus semua subhalaman",
+ "pt-deletepage-list-pages": "Daftar halaman yang akan dihapus",
+ "pt-deletepage-list-translation": "Halaman terjemahan",
+ "pt-deletepage-list-section": "Halaman satuan terjemahan",
+ "pt-deletepage-list-other": "Subhalaman lainnya",
+ "pt-deletepage-list-count": "Secara keseluruhan ada $1 {{PLURAL:$1|halaman|halaman}} yang akan dihapus ditambah $2 {{PLURAL:$2|subhalaman|subhalaman}}.",
"pt-deletepage-list-no-pages": "Tidak ditemukan halaman yang cocok",
- "pagemigration": "Perpindahan halaman",
+ "pt-deletepage-full-logreason": "Bagian dari halaman yang dapat diterjemahkan \"$1\".",
+ "pt-deletepage-lang-logreason": "Bagian dari halaman terjemahan \"$1\".",
+ "pt-deletepage-started": "Silakan periksa [[Special:Log/pagetranslation|log penerjemahan halaman]] untuk pesan kesalahan dan penyelesaian.",
+ "pt-deletepage-intro": "Halaman istimewa ini memungkinkan Anda menghapus seluruh halaman yang dapat diterjemahkan, atau halaman terjemahan tertentu dalam sebuah bahasa.\nTindakan penghapusan tidak bersifat instan, karena semua halaman yang bergantung padanya juga akan dihapus.\nKegagalan akan dicatat dalam [[Special:Log/pagetranslation|log penerjemahan halaman]] dan harus perbaiki secara manual.",
+ "pagemigration": "Perpindahan halaman terjemahan",
+ "pagemigration-summary": "Tentukan halaman terjemahannya dan kembalikan semua terjemahan yang dibuat sebelum sistem Translate dinyalakan di halaman tersebut.",
"pm-import-button-label": "Impor",
"pm-savepages-button-label": "Simpan",
- "pm-cancel-button-label": "Batalkan"
+ "pm-cancel-button-label": "Batalkan",
+ "pm-page-does-not-exist": "$1 tidak ada.",
+ "pm-old-translations-missing": "$1 tidak mengandung terjemahan lama.",
+ "pm-extra-units-warning": "Mungkin ada satuan berlebih. Tolong cocokkan satuan sumber dan terjemahan dengan benar.",
+ "pm-pagename-missing": "Tolong masukkan nama halamannya.",
+ "pm-add-icon-hover-text": "Tambahkan satuan di bawah",
+ "pm-swap-icon-hover-text": "Tukar dengan satuan di bawah",
+ "pm-delete-icon-hover-text": "Hapus satuan",
+ "pm-pagetitle-placeholder": "Masukkan judul halaman",
+ "pm-pagetitle-invalid": "Tolong masukkan judul halaman yang sah. Judulnya harus mengikuti format <nama-halaman>/<kode-bahasa>.",
+ "pm-pagetitle-missing": "Tolong masukkan judul halamannya.",
+ "pm-langcode-missing": "Kode bahasa kelihatannya tidak ada di judulnya. Tolong masukkan judul halaman dengan format <page-name>/<language-code>.",
+ "pm-summary-import": "Terjemahan diimpor menggunakan [[Special:PageMigration|migrasi halaman]]",
+ "pm-on-import-message-text": "Terjemahan lama telah diimpor. Gunakan pilihan tambahkan, tukar dan hapus untuk menyesuaikan satuan terjemahan dan tekan tombol \"{{int:pm-savepages-button-label}}\" untuk menyimpannya. Tekan tombol \"{{int:pm-cancel-button-label}}\" untuk membuangnya.",
+ "pm-on-save-message-text": "Satuan terjemahan telah disimpan. Anda sekarang dapat memasukkan judul dari halaman terjemahan yang baru untuk memigrasikannya, atau mengubah satuan di bawah dan menyimpan revisi baru.",
+ "tpt-translate-title": "Membolehkan penerjemahan judul halaman",
+ "pp-save-summary": "Menyiapkan halaman untuk diterjemahkan",
+ "pagepreparation": "Menyiapkan halaman untuk diterjemahkan",
+ "pp-pagename-placeholder": "Masukkan nama halaman",
+ "pp-prepare-button-label": "Siapkan",
+ "pp-save-button-label": "Terbitkan",
+ "pp-cancel-button-label": "Batal",
+ "pp-save-message": "Halaman telah diterbitkan. Anda dapat [$1 menyuntingnya].",
+ "pp-prepare-message": "Halaman telah disiapkan untuk diterjemahkan. Lihat ''diff'' di bawah. Tekan tombol \"{{int:pp-save-button-label}}\" jika tidak ada masalah!",
+ "pp-already-prepared-message": "Kelihatannya halaman sudah pernah disiapkan untuk terjemahkan. Tidak ada perubahan untuk dibandingkan dengan versi sebelumnya.",
+ "pp-diff-error": "Terjadi sebuah galat ketika mengambil ''diff'' dari peladen.",
+ "pp-pagename-missing": "Tolong masukkan nama halamannya.",
+ "pp-diff-old-header": "Teks sumber",
+ "pp-diff-new-header": "Teks yang disiapkan",
+ "tpt-unlink-confirm": "Tolong konfirmasi bahwa Anda benar-benar ingin menghapus halaman ini dari sistem penerjemahan.\nPemilih bahasa dan nama halaman yang diterjemahkan akan berhenti bekerja.\nHalaman terjemahan akan bisa disunting.",
+ "tpt-unlink-button": "Singkirkan dari penerjemahan",
+ "tpt-unlink-summary": "Menyingkirkan halaman dari penerjemahan",
+ "tpt-generic-confirm": "Tolong konfirmasi tindakan ini.",
+ "tpt-generic-button": "Konfirmasi"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ie.json b/MLEB/Translate/i18n/pagetranslation/ie.json
index 5dbee0fb..82c8d4be 100644
--- a/MLEB/Translate/i18n/pagetranslation/ie.json
+++ b/MLEB/Translate/i18n/pagetranslation/ie.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Renan",
"Stavanger7"
]
},
- "tpt-languages-nonzero": "$1 ($2% traductet)"
+ "tpt-languages-nonzero": "$1 ($2% traductet)",
+ "pt-deletepage-current": "Nómine del págine:"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/io.json b/MLEB/Translate/i18n/pagetranslation/io.json
index e69ef301..83856b4b 100644
--- a/MLEB/Translate/i18n/pagetranslation/io.json
+++ b/MLEB/Translate/i18n/pagetranslation/io.json
@@ -5,6 +5,8 @@
"Malafaya"
]
},
+ "tpt-diff-old": "Antea texto",
+ "tpt-diff-new": "Nova texto",
"tpt-tag-oldsyntax": "anciena sintaxo",
"tpt-select-prioritylangs-reason": "Motivo:",
"tpt-sections-syntaxversion": "Versiono di la sintaxo",
@@ -13,7 +15,6 @@
"tpt-languages-legend": "Altra lingui:",
"tpt-languages-nonzero": "$1 ($2% tradukita)",
"tpt-tab-translate": "Tradukar",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-aggregategroup-new-description": "Deskripto (fakultativa):",
"tpt-aggregategroup-update-cancel": "Nuligar",
"log-name-pagetranslation": "Protokolo ('log') pri tradukajo",
diff --git a/MLEB/Translate/i18n/pagetranslation/is.json b/MLEB/Translate/i18n/pagetranslation/is.json
index 5dd2935a..fe175411 100644
--- a/MLEB/Translate/i18n/pagetranslation/is.json
+++ b/MLEB/Translate/i18n/pagetranslation/is.json
@@ -68,8 +68,6 @@
"tpt-discouraged-language-header": "Að þýða á $1 er ekki í forgangi fyrir þessa síðu.",
"tpt-discouraged-language-content": "Kerfisstjóri þýðinga ákvað að áhersla sé lögð á að þýða á $1.",
"tpt-discouraged-language-force": "<strong>Þessa síðu er ekki hægt að þýða á $2.</strong>\n\nKerfisstjóri þýðinga ákvað að þessa síðu sé einungis hægt að þýða á $3.",
- "tpt-discouraged-language": "<strong>Að þýða á $2 er ekki í forgangi fyrir þessa síðu.</strong>\n\nKerfisstjóri þýðinga ákvað að áhersla sé lögð á að þýða á $3.",
- "tpt-discouraged-language-reason": "Ástæða: $1",
"tpt-priority-languages": "Kerfisstjóri þýðinga stillti forgangstungumál þessa hóps sem $1.",
"tpt-render-summary": "Uppfæri til að samsvara nýrri útgáfu grunnsíðunnar",
"aggregategroups": "Safna saman hópum",
diff --git a/MLEB/Translate/i18n/pagetranslation/it.json b/MLEB/Translate/i18n/pagetranslation/it.json
index 850d4302..c8ed2d6c 100644
--- a/MLEB/Translate/i18n/pagetranslation/it.json
+++ b/MLEB/Translate/i18n/pagetranslation/it.json
@@ -20,7 +20,6 @@
"pagetranslation": "Traduzione pagine",
"right-pagetranslation": "Segna le pagine come da tradurre",
"action-pagetranslation": "gestire le pagine traducibili",
- "tps-edit-sourcepage-title": "Modifica una pagina traducibile",
"tps-edit-sourcepage-ve-warning-title": "Attenzione: pagina non supportata",
"tps-edit-sourcepage-ve-warning-text": "Stai modificando una pagina traducibile. La modifica di queste pagine con questo editor non è ancora ufficialmente supportata. Usa l'editor sorgente.",
"tps-edit-sourcepage-ve-warning-button": "OK",
@@ -40,6 +39,7 @@
"tpt-notsuitable": "La pagina $1 non è adatta per la traduzione.\nAssicurarsi che abbia i tag <nowiki><translate></nowiki> e una sintassi valida.",
"tpt-saveok": "La pagina [[:$1]] è stata segnalata per la traduzione con $2 {{PLURAL:$2|elemento di traduzione|elementi di traduzione}}.\nLa pagina può ora essere <span class=\"plainlinks\">[$3 tradotta]</span>.",
"tpt-offer-notify": "Puoi <span class=\"plainlinks\">[$1 notificare questa pagina]</span> ai traduttori.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Vedi l'elenco delle pagine traducibili.]]",
"tpt-showpage-intro": "Di seguito sono elencate gli elementi di traduzione nuovi, esistenti e cancellati.\nPrima di segnare questa versione per la traduzione, controllare che i cambiamenti per gli elementi di traduzione siano ridotti al minimo per evitare lavoro superfluo ai traduttori.",
"tpt-mark-summary": "Versione segnata per la traduzione",
"tpt-mark-nochanges": "Nessuna modifica da rivedere. Contrassegnare questa pagina per la traduzione non modificherà la pagina, né alcuna unità di traduzione esistente.",
@@ -58,6 +58,7 @@
"tpt-select-prioritylangs-reason": "Motivo:",
"tpt-sections-prioritylangs": "Lingue prioritarie",
"tpt-sections-syntaxversion": "Versione sintassi",
+ "tpt-transclusion": "Transclusioni template",
"tpt-rev-mark": "segna per la traduzione",
"tpt-rev-unmark": "rimuovi dalla traduzione",
"tpt-rev-discourage": "scoraggia",
@@ -84,8 +85,6 @@
"tpt-discouraged-language-header": "La traduzione in $1 non è prioritaria per questa pagina.",
"tpt-discouraged-language-content": "Un amministratore di traduzione ha deciso di concentrare gli sforzi per la traduzione in $1.",
"tpt-discouraged-language-force": "<strong>Questa pagina non può essere tradotta in $2.</strong>\n\nUn amministratore delle traduzioni ha deciso che questa pagina può essere tradotta solo in $3.",
- "tpt-discouraged-language": "<strong>La traduzione in $2 non è una priorità per questa pagina.</strong>\n\nUn amministratore delle traduzioni ha deciso di concentrare gli sforzi traduzioni in $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "L'amministratore ha impostato le lingue prioritarie per questo gruppo in $1.",
"tpt-render-summary": "Aggiornamento come da nuova versione della pagina di origine",
"aggregategroups": "Gruppi aggregati",
@@ -104,7 +103,7 @@
"pt-parse-open": "Marcatore &lt;translate> sbilanciato.\nStruttura della traduzione: <pre>$1</pre>",
"pt-parse-close": "Marcatore &lt;/translate> sbilanciato.\nStruttura della traduzione: <pre>$1</pre>",
"pt-parse-nested": "Non sono ammessi elementi di traduzione &lt;translate> nidificati.\nTesto del marcatore: <pre>$1</pre>",
- "pt-shake-multiple": "Sono presenti più marcatori di elementi di traduzione per un singolo elemento.\nTesto dell'elemento di traduzione: <pre>$1</pre>",
+ "pt-shake-multiple": "Sono presenti più marcatori di elementi di traduzione per un singolo elemento.\nAssicurati che gli elementi di traduzione siano separati da linee vuote.\nTesto dell'elemento di traduzione: <pre>$1</pre>",
"pt-shake-position": "Sono presenti marcatori di elementi di traduzione in una posizione inaspettata.\nTesto della sezione: <pre>$1</pre>",
"pt-shake-empty": "Elemento di traduzione vuoto per il marcatore $1.",
"log-description-pagetranslation": "Registro per le azioni inerenti al sistema di traduzione delle pagine",
diff --git a/MLEB/Translate/i18n/pagetranslation/ja.json b/MLEB/Translate/i18n/pagetranslation/ja.json
index aa3b9809..d527eab9 100644
--- a/MLEB/Translate/i18n/pagetranslation/ja.json
+++ b/MLEB/Translate/i18n/pagetranslation/ja.json
@@ -20,7 +20,6 @@
"pagetranslation": "ページ翻訳",
"right-pagetranslation": "ページの版を翻訳対象に指定",
"action-pagetranslation": "翻訳対象ページの管理",
- "tps-edit-sourcepage-title": "翻訳対象ページの編集",
"tps-edit-sourcepage-text": "翻訳元ページを編集しています。以下の説明文書の内容を理解していることを確認してください:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text 翻訳元テキストの変更]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples マークアップの使用例]",
"tps-edit-sourcepage-ve-warning-button": "OK",
"tpt-section": "翻訳単位 $1",
@@ -36,10 +35,11 @@
"tpt-badtitle": "指定したページ名 ($1) は無効です",
"tpt-nosuchpage": "ページ $1 は存在しません",
"tpt-oldrevision": "$2 はページ [[:$1]] の最新版ではありません。\n翻訳対象に指定できるのは最新版のみです。",
- "tpt-notsuitable": "ページ $1 は翻訳に対応していません。\n<nowiki><translate></nowiki> タグが含まれていて、かつ文法的に正しいことをを確認してください。",
+ "tpt-notsuitable": "ページ $1 は翻訳に対応していません。\n<nowiki><translate></nowiki> タグが含まれていて、かつ構文が正しいことをを確認してください。",
"tpt-saveok": "ページ [[:$1]] は翻訳対象に指定されており、$2 {{PLURAL:$2|個の翻訳単位}}を含んでいます。\nこのページを<span class=\"plainlinks\">[$3 翻訳]</span>できます。",
"tpt-saveok-first": "このページの[[Special:PageMigration|既存の翻訳を取り込む]]こともできます (存在する場合)。",
"tpt-offer-notify": "このページについて<span class=\"plainlinks\">[$1 翻訳者に通知]</span>できます。",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|翻訳対象ページの一覧を閲覧する。]]",
"tpt-showpage-intro": "以下は、新規・既存の、または削除された翻訳単位の一覧です。\nこの版を翻訳対象に指定する前に、翻訳単位の変更を最小限にすることで不要な翻訳作業を回避できないか確認してください。",
"tpt-mark-summary": "この版を翻訳対象に指定しました",
"tpt-mark-nochanges": "査読対象の変更がありません。このページを翻訳対象に指定しても、ページや既存の翻訳単位のいずれも変更されません。",
@@ -56,11 +56,17 @@
"tpt-old-pages": "{{PLURAL:$1|このページ|これらのページ}}は最新の版が翻訳対象に指定されています。",
"tpt-other-pages": "{{PLURAL:$1|このページの古い版|このページの複数の古い版}}が翻訳対象に指定されていますが、\n最新の{{PLURAL:$1|版}}は翻訳対象に指定できません。",
"tpt-outdated-pages": "{{PLURAL:$1|このページ|これらのページ}}には翻訳対象に指定されていない変更があります。",
- "tpt-tag-oldsyntax": "旧文法",
+ "tpt-tag-oldsyntax": "旧構文",
+ "tpt-tag-no-transclusion-support": "参照読み込み未対応",
"tpt-select-prioritylangs": "優先言語のコードを列挙 (カンマ区切り):",
"tpt-select-prioritylangs-force": "優先言語以外への翻訳を禁止",
"tpt-select-prioritylangs-reason": "理由:",
"tpt-sections-prioritylangs": "優先言語",
+ "tpt-sections-syntaxversion": "構文のバージョン",
+ "tpt-syntaxversion-text": "このページは現在、翻訳対象ページの古いバージョンのソース構文を使用しています。新しいバージョンは、翻訳されていない節を HTML タグで囲んで、テキストの正しい言語を示します。例: $1。新しいマークアップ構文 $2 を使用して、要素のタイトル属性を翻訳する際など、適切ではない場所での折り返しを防止できます。古い構文バージョンに戻すことはできません。",
+ "tpt-syntaxversion-label": "このページでは構文の最新バージョンを使用",
+ "tpt-transclusion": "テンプレートの参照読み込み",
+ "tpt-transclusion-label": "このページの翻訳を意識した参照読み込みを有効にする",
"tpt-rev-mark": "翻訳対象に指定",
"tpt-rev-unmark": "翻訳対象から除去",
"tpt-rev-discourage": "翻訳中止",
@@ -87,8 +93,6 @@
"tpt-discouraged-language-header": "このページでは$1への翻訳は優先課題ではありません。",
"tpt-discouraged-language-content": "翻訳管理者は、翻訳作業は$1に注力すべきだと考えています。",
"tpt-discouraged-language-force": "<strong>このページは $2 に翻訳できません。</strong>\n\n翻訳管理者がこのページの翻訳先言語を $3 のみに制限しています。",
- "tpt-discouraged-language": "<strong>このページの $2 への翻訳は重要ではありません。</strong>\n翻訳管理者が $3 への翻訳作業に重点を置くことを決めました。",
- "tpt-discouraged-language-reason": "理由: $1",
"tpt-priority-languages": "翻訳管理者が、このメッセージ群の優先言語を $1 に設定しました。",
"tpt-priority-languages-force": "翻訳管理者によって優先すべき言語が$1に指定されました。その他の言語への翻訳は認められていません。",
"tpt-render-summary": "翻訳元ページの新版に適合するように更新",
diff --git a/MLEB/Translate/i18n/pagetranslation/jv.json b/MLEB/Translate/i18n/pagetranslation/jv.json
index 81c5c82e..e73bbca1 100644
--- a/MLEB/Translate/i18n/pagetranslation/jv.json
+++ b/MLEB/Translate/i18n/pagetranslation/jv.json
@@ -58,30 +58,28 @@
"tpt-languages-zero": "Wiwiti pertalan tumrap basa iki",
"tpt-languages-nonzero": "$1 ($2% kapertal)",
"tpt-tab-translate": "Pertal",
- "tpt-target-page": "Kaca iki ora bisa dianyari manual.\nKaca iki kaca terjemahan [[$1]] lan terjemahan bisa dianyari nganggo [$2 prangkat terjemahan].",
+ "tpt-target-page": "Kaca iki ora bisa dianyari manual.\nKaca iki kaca pertalan [[$1]] lan pertalan bisa dianyari nganggo [$2 piranti pertalan].",
"tpt-unknown-page": "Mandhala aran iki kacawisaké tumrap pertalan kaca kontèn.\nKaca kang arep kobesut katoné ora ana gayutané karo kaca kang tinengeran pertalan.",
- "tpt-translation-restricted": "Terjemahan kaca iki nèng basa iki ditolak déning panata pertalan.\n\nAlesan: $1",
+ "tpt-translation-restricted": "Pertalan kaca iki ing basa iki ditulak déning panata pertalan.\n\nDhedhasar: $1",
"tpt-discouraged-language-force-header": "Kaca iki ora bisa kapertal menyang $1.",
"tpt-discouraged-language-force": "<strong>Kaca iki ora bisa diterjemahaké menyang $2.</strong>\n\nPanata pertalan milih supaya kaca iki namung bisa diterjemahaké menyang $3.",
- "tpt-discouraged-language": "<strong>Mertal menyang $2 dudu prioritas kanggo kaca iki.</strong>\n\nPanata pertalan milih fokus mertal nang $3.",
- "tpt-discouraged-language-reason": "Alesan: $1",
"tpt-priority-languages": "Panata pertalan nyetèl basa prioritas kanggo klompok iki dadi $1.",
"tpt-render-summary": "Nganyari kanggo nyocokaké vèrsi anyar kaca sumber",
"tpt-aggregategroup-add": "Tambah",
"tpt-aggregategroup-save": "Simpen",
"tpt-aggregategroup-add-new": "Tambah klompok agrégat anyar",
"tpt-aggregategroup-new-name": "Jeneng:",
- "tpt-aggregategroup-new-description": "Katrangan (pilihan):",
+ "tpt-aggregategroup-new-description": "Katerangan (manasuka):",
"tpt-aggregategroup-remove-confirm": "Panjenengan yakin arep mbusak klompok agrégat iki?",
"tpt-aggregategroup-invalid-group": "Klompok ora ana",
"tpt-aggregategroup-edit-name": "Jeneng:",
"tpt-aggregategroup-edit-description": "Wedharan:",
"tpt-aggregategroup-update": "Simpen",
"tpt-aggregategroup-update-cancel": "Wurung",
- "pt-parse-open": "Tag &lt;translate> ora imbang.\nCithakan terjemahan: <pre>$1</pre>",
- "pt-parse-close": "Tag &lt;/translate> ora imbang.\nCithakan terjemahan: <pre>$1</pre>",
- "log-description-pagetranslation": "Log laku sing ana kaitané karo sistem terjemahan kaca",
- "log-name-pagetranslation": "Log terjemahan kaca",
+ "pt-parse-open": "Tenger &lt;translate> ora imbang.\nCithakan pertalan: <pre>$1</pre>",
+ "pt-parse-close": "Tenger &lt;/translate> ora imbang.\nCithakan pertalan: <pre>$1</pre>",
+ "log-description-pagetranslation": "Log laku sing ana kaitané karo sistem pertalan kaca",
+ "log-name-pagetranslation": "Log pertalan kaca",
"logentry-pagetranslation-mark": "$1 {{GENDER:$2|nengeri}} $3 supaya kapertal",
"logentry-pagetranslation-unmark": "$1 {{GENDER:$2|mbuwang}} $3 saka pertalan",
"logentry-pagetranslation-moveok": "$1 {{GENDER:$2|rampung}} ngowahi jeneng kaca kang bisa kapertal $3 dadi $4",
@@ -99,7 +97,7 @@
"pt-movepage-blockers": "Kaca sing bisa diterjemahaké ora bisa dipindhah nèng jeneng anyar amarga {{PLURAL:$1|kasalahan|kasalahan}} iki:",
"pt-movepage-block-base-exists": "Kaca jujugan \"[[:$1]]\" kang bisa kapertal ana.",
"pt-movepage-block-base-invalid": "Jeneng kaca jujugan kang bisa kapertal dudu sesirah kang sah.",
- "pt-movepage-block-tp-exists": "Kaca terjemahan patujon \"[[:$2]]\" ana.",
+ "pt-movepage-block-tp-exists": "Kaca pertalan patujon \"[[:$2]]\" ana.",
"pt-movepage-block-tp-invalid": "Sesirah kaca pertalan tujuan kanggo \"[[:$1]]\" ora sah (kadawan?).",
"pt-movepage-block-section-exists": "Kaca jujugan \"[[:$2]]\" kanggo unit pertalan ana.",
"pt-movepage-block-section-invalid": "Sesirah kaca paran kanggo \"[[:$1]]\" ngenani ékan pertalan bakal ora trep (kedawan?).",
@@ -118,7 +116,7 @@
"pt-movepage-action-check": "Priksa yèn pangalihé bisa diayahi",
"pt-movepage-action-perform": "Pindhahaké",
"pt-movepage-action-other": "Ganti patujon",
- "pt-movepage-intro": "Kaca mirunggan iki nglilakaké panjenengan mindhahaké kaca sing ditandhai kanggo terjemahan.\nPamidhahan ora bakal gelis, amarga akèh kaca sing kudu dipindhahaké.\nNalika kaca dipindhahaké, ora bisa interaksi karo kaca sing dimaksud.\nKagagalan bakal dilebokaké nèng [[Special:Log/pagetranslation|log terjemahan kaca]] lan ora perlu dibenahi manual.",
+ "pt-movepage-intro": "Kaca mirunggan iki nglilakaké panjenengan mindhahaké kaca sing ditandhai kanggo pertalan.\nPamidhahan ora bakal gelis, amarga akèh kaca sing kudu dipindhahaké.\nNalika kaca dipindhahaké, ora bisa interaksi karo kaca sing dimaksud.\nKagagalan bakal dilebokaké nèng [[Special:Log/pagetranslation|log pertalan kaca]] lan ora perlu dibenahi manual.",
"pt-movepage-logreason": "Pérangan kaca \"$1\" kang bisa kapertal",
"pt-movepage-started": "Mangga priksanen [[Special:Log/pagetranslation|log pertalan kaca]] sadhéla bokmanawa ana masalah lan layang rampungan.",
"pt-locked-page": "Kaca iki digembok amarga kaca sing bisa diterjemahaké saiki wis dipindhah.",
@@ -129,21 +127,21 @@
"pt-deletepage-action-check": "Daptar kaca sing arep dibusak",
"pt-deletepage-action-perform": "Busak",
"pt-deletepage-action-other": "Ganti patujon",
- "pt-deletepage-lang-legend": "Busak kaca terjemahan",
+ "pt-deletepage-lang-legend": "Busak kaca pertalan",
"pt-deletepage-full-legend": "Busak kaca sing bisa diterjemahaké",
"pt-deletepage-any-legend": "Busak kaca sing bisa diterjemahaké utawa terjemahan saka kaca sing bisa diterjemahaké",
"pt-deletepage-current": "Jeneng kaca:",
"pt-deletepage-reason": "Alesan:",
"pt-deletepage-subpages": "Busak kabèh anak kaca",
"pt-deletepage-list-pages": "Daptar kaca sing arep dibusak",
- "pt-deletepage-list-translation": "Kaca terjemahan",
+ "pt-deletepage-list-translation": "Kaca pertalan",
"pt-deletepage-list-section": "Kaca iji pertalan",
"pt-deletepage-list-other": "Anak kaca liya",
"pt-deletepage-list-count": "Kabèhé $1 {{PLURAL:$1|kaca|kaca}} sing arep dibusak.",
"pt-deletepage-list-no-pages": "Ora ditemokaké kaca sing cocog",
"pt-deletepage-full-logreason": "Perangan kaca \"$1\" kang bisa kapertal",
"pt-deletepage-lang-logreason": "Pérangan kaca pertalan \"$1\"",
- "pt-deletepage-started": "Mangga priksa [[Special:Log/pagetranslation|log terjemahan kaca]] kanggo layang kasalahan lan parampungan.",
+ "pt-deletepage-started": "Mangga priksa [[Special:Log/pagetranslation|log pertalan kaca]] kanggo layang kasalahan lan parampungan.",
"pagemigration": "Migrasi kaca pertalan",
"pm-import-button-label": "Impor",
"pm-savepages-button-label": "Simpen",
diff --git a/MLEB/Translate/i18n/pagetranslation/ka.json b/MLEB/Translate/i18n/pagetranslation/ka.json
index a55b916b..f2ac52ba 100644
--- a/MLEB/Translate/i18n/pagetranslation/ka.json
+++ b/MLEB/Translate/i18n/pagetranslation/ka.json
@@ -26,7 +26,6 @@
"tpt-languages-zero": "ამ ენაზე თარგმნის დაწყება",
"tpt-languages-nonzero": "$1 ($2% ნათარგმნი)",
"tpt-tab-translate": "თარგმნა",
- "tpt-discouraged-language-reason": "მიზეზი: $1",
"tpt-aggregategroup-add": "დამატება",
"tpt-aggregategroup-save": "შენახვა",
"tpt-aggregategroup-new-name": "სახელი:",
@@ -43,7 +42,7 @@
"pt-movepage-block-subpage-exists": "სამიზნე ქვეგვერდი \"[[:$2]]\" უკვე არსებობს.",
"pt-movepage-list-pages": "გადასატანი გვერდების სია",
"pt-movepage-list-translation": "სათარგმნი {{PLURAL:$1|გვერდი|გვერდები}}",
- "pt-movepage-list-other": "სხვა ქვე{{PLURAL:$1|გვერდი|გვერდები}}",
+ "pt-movepage-list-other": "სხვა {{PLURAL:$1|ქვეგვერდი|ქვეგვერდი}}",
"pt-movepage-legend": "თარგმნადი გვერდის გადატანა",
"pt-movepage-current": "მიმდინარე სახელი:",
"pt-movepage-new": "ახალი სახელი:",
@@ -92,7 +91,7 @@
"pagepreparation": "გვერდის სათარგმნად მომზადება",
"pp-pagename-placeholder": "შეიყვანეთ გვერდის სახელი",
"pp-prepare-button-label": "მომზადება",
- "pp-save-button-label": "შენახვა",
+ "pp-save-button-label": "გამოქვეყნება",
"pp-cancel-button-label": "გაუქმება",
"pp-save-message": "გვერდი შენახულია. თქვენ შეგიძლიათ მისი [$1 რედაქტირება].",
"pp-pagename-missing": "გთხოვთ, შეიყვანოთ გვერდის სახელი.",
diff --git a/MLEB/Translate/i18n/pagetranslation/kab.json b/MLEB/Translate/i18n/pagetranslation/kab.json
index 2f44f088..8989842b 100644
--- a/MLEB/Translate/i18n/pagetranslation/kab.json
+++ b/MLEB/Translate/i18n/pagetranslation/kab.json
@@ -43,7 +43,6 @@
"tpt-discouraged-language-force-header": "Asebter-agi ur yezmir ara ad yettwasuqle ar $1.",
"tpt-discouraged-language-force-content": "Anebdal n tsuqilt igzem-itt d iṛṛay d akken asebter-agi ur yezmir ara ad yettwsuqel ar $1.",
"tpt-discouraged-language-header": "Tasuqilt ar $1 mačči d ayen yezwaren deg usebter-agi.",
- "tpt-discouraged-language-reason": "Taɣzint: $1",
"tpt-aggregategroup-add": "Rnu",
"tpt-aggregategroup-save": "Sekles",
"tpt-aggregategroup-new-name": "Isem:",
diff --git a/MLEB/Translate/i18n/pagetranslation/kcg.json b/MLEB/Translate/i18n/pagetranslation/kcg.json
new file mode 100644
index 00000000..91aefcf1
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/kcg.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 (á̱ bwuak $2%)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/kk-cyrl.json b/MLEB/Translate/i18n/pagetranslation/kk-cyrl.json
index d0f7699b..3e6c5098 100644
--- a/MLEB/Translate/i18n/pagetranslation/kk-cyrl.json
+++ b/MLEB/Translate/i18n/pagetranslation/kk-cyrl.json
@@ -41,7 +41,6 @@
"tpt-languages-zero": "Мына тілде аударманы бастау",
"tpt-languages-nonzero": "$1 ($2% аударылды)",
"tpt-tab-translate": "Аудару",
- "tpt-discouraged-language-reason": "Себебі: $1",
"tpt-render-summary": "Қайнар беттің жаңа нұсқасына сәйкестігін жаңарту",
"tpt-aggregategroup-add": "Қосу",
"tpt-aggregategroup-save": "Сақтау",
diff --git a/MLEB/Translate/i18n/pagetranslation/kn.json b/MLEB/Translate/i18n/pagetranslation/kn.json
index 94353baa..3c8fb0ba 100644
--- a/MLEB/Translate/i18n/pagetranslation/kn.json
+++ b/MLEB/Translate/i18n/pagetranslation/kn.json
@@ -20,7 +20,6 @@
"tpt-languages-legend": "ಇತರ ಭಾಷೆಗಳು:",
"tpt-languages-nonzero": "$1 ($2% ಅನುವಾದಿಸಲಾಗಿದೆ)",
"tpt-tab-translate": "ಭಾಷಾಂತರಿಸಲು",
- "tpt-discouraged-language-reason": "ಕಾರಣ: $1",
"tpt-aggregategroup-add": "ಸೇರಿಸಿ",
"tpt-aggregategroup-save": "ಉಳಿಸಿ",
"tpt-aggregategroup-new-name": "ಹೆಸರು:",
diff --git a/MLEB/Translate/i18n/pagetranslation/ko.json b/MLEB/Translate/i18n/pagetranslation/ko.json
index 0eab221d..f920a1fd 100644
--- a/MLEB/Translate/i18n/pagetranslation/ko.json
+++ b/MLEB/Translate/i18n/pagetranslation/ko.json
@@ -36,6 +36,7 @@
"tpt-notsuitable": "$1 문서는 번역에 적합하지 않습니다.\n<nowiki><translate></nowiki> 태그가 있고 올바른 문법인지 확인하세요.",
"tpt-saveok": "[[:$1]] 문서는 $2 {{PLURAL:$2|번역 단위}}로 번역하도록 표시했습니다.\n문서는 지금 <span class=\"plainlinks\">[$3 번역]</span>할 수 있습니다.",
"tpt-offer-notify": "이 문서에 대해 <span class=\"plainlinks\">[$1 번역자 알림]</span>을 받을 수 있습니다.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|번역 가능한 문서 목록을 봅니다.]]",
"tpt-showpage-intro": "아래에 기존, 추가 및 삭제된 번역 단위가 나열되어 있습니다.\n\n이 판을 번역하도록 표시하기 전에, 번역자가 불필요한 작업을 하지 않도록 번역 단위에 대한 바뀜이 최소화되어 있는지 확인하세요.",
"tpt-mark-summary": "이 판을 번역하도록 표시",
"tpt-edit-failed": "문서를 업데이트를 할 수 없습니다: $1",
@@ -48,10 +49,12 @@
"tpt-new-pages": "{{PLURAL:$1|이 문서는}} 번역하도록 태그된 문자를 포함하지만,\n번역하도록 표시된 {{PLURAL:$1|이 문서}}의 판이 없습니다.",
"tpt-old-pages": "{{PLURAL:$1|이 문서}}의 최신 판은 번역하도록 표시되었습니다.",
"tpt-other-pages": "{{PLURAL:$1|이 문서의 오래된 판}}은 번역하도록 표시했습니다,\n하지만 최신 {{PLURAL:$1|판}}은 번역하도록 표시할 수 없었습니다.",
+ "tpt-tag-no-transclusion-support": "끼워넣기 지원 없음",
"tpt-select-prioritylangs": "우선 언어 코드의 쉼표로 구분한 목록:",
"tpt-select-prioritylangs-force": "우선 언어 이외의 언어로 번역 방지",
"tpt-select-prioritylangs-reason": "이유:",
"tpt-sections-prioritylangs": "우선 언어",
+ "tpt-transclusion": "틀 끼워넣기",
"tpt-rev-mark": "번역한 것으로 표시",
"tpt-rev-unmark": "번역에서 제거",
"tpt-rev-discourage": "번역 중단",
@@ -78,8 +81,6 @@
"tpt-discouraged-language-header": "$1 언어로의 번역은 우선순위가 아닙니다.",
"tpt-discouraged-language-content": "번역 관리자는 $1 언어에 번역 노력을 집중하기로 결정했습니다.",
"tpt-discouraged-language-force": "<strong>이 문서는 $2로 번역할 수 없습니다.</strong>\n\n번역 관리자가 이 문서가 $3로만 번역할 수 있도록 결정했습니다.",
- "tpt-discouraged-language": "<strong>$2 언어로의 번역은 우선순위가 아닙니다.</strong>\n\n번역 관리자는 $3에 번역 노력을 집중하기로 결정했습니다.",
- "tpt-discouraged-language-reason": "이유: $1",
"tpt-priority-languages": "번역 관리자가 이 그룹에 대해 우선 언어를 $1(으)로 설정했습니다.",
"tpt-render-summary": "원본 문서의 새 판에 맞게 업데이트",
"aggregategroups": "집계 그룹",
@@ -188,6 +189,7 @@
"pm-langcode-missing": "언어 코드가 제목에 없는 것 같습니다. <page-name>/<language-code> 형식으로 문서 제목을 입력해 주십시오.",
"tpt-translate-title": "문서 제목을 번역할 수 있음",
"pagepreparation": "문서를 번역할 수 있게 준비",
+ "pagepreparation-summary": "번역 준비를 위한 문서 제목을 지정합니다.",
"pp-pagename-placeholder": "문서 이름을 입력하세요",
"pp-prepare-button-label": "준비",
"pp-save-button-label": "게시",
diff --git a/MLEB/Translate/i18n/pagetranslation/ksh.json b/MLEB/Translate/i18n/pagetranslation/ksh.json
index 7a4dbe09..156989c1 100644
--- a/MLEB/Translate/i18n/pagetranslation/ksh.json
+++ b/MLEB/Translate/i18n/pagetranslation/ksh.json
@@ -68,8 +68,6 @@
"tpt-discouraged-language-header": "Heh di Sigg op $1 ze övversäze es nit weschtesch.",
"tpt-discouraged-language-content": "Ene translation administrator häd äntschihde, de Övversäzong op $1 ze konzäntrehre.",
"tpt-discouraged-language-force": "<strong>Heh di Sigg kam_mer nit op $2 övversäze.</strong>\n\nEne Verwallder vum Övversäzze hät faßjelaat, dat di Sigg bloß op $3 övversaz wääde sull.",
- "tpt-discouraged-language": "<strong>Heh di Sigg op $2 övversäze hät keine Vörrang.</strong>\n\nEne Verwallder vum Övversäzze hät faßjelaat, dat di Sigg en de Houpsaach op $3 övversaz wääde sull.",
- "tpt-discouraged-language-reason": "Jrond: $1",
"tpt-priority-languages": "Ene Verwallder vum Övversäzze hät de Houpschprooche för heh di Jropp op $1 jesaz.",
"tpt-render-summary": "Ändere, öm op de neue Version fun de Ojinaal_Sigg ze kumme",
"aggregategroups": "Sammeljroppe",
diff --git a/MLEB/Translate/i18n/pagetranslation/ku-latn.json b/MLEB/Translate/i18n/pagetranslation/ku-latn.json
index 469811d7..5a4f3cf3 100644
--- a/MLEB/Translate/i18n/pagetranslation/ku-latn.json
+++ b/MLEB/Translate/i18n/pagetranslation/ku-latn.json
@@ -22,7 +22,6 @@
"tpt-languages-nonzero": "$1 ($2% hate wergerandin)",
"tpt-tab-translate": "Wergerîne",
"tpt-discouraged-language-force-header": "Ev rûpel ji bo $1 nayê wergerandin",
- "tpt-discouraged-language-reason": "Sedem: $1",
"tpt-aggregategroup-add": "Lê zêde bike",
"tpt-aggregategroup-save": "Tomar bike",
"tpt-aggregategroup-new-name": "Nav:",
@@ -36,7 +35,7 @@
"log-name-pagetranslation": "Têketina wergerandina rûpelan",
"log-action-filter-pagetranslation-delete": "Jêbirinên rûpelan",
"pt-movepage-list-translation": "{{PLURAL:$1|Rûpel|Rûpelên}} wergerê",
- "pt-movepage-list-other": "Bin{{PLURAL:$1|rûpela|rûpelên}} din",
+ "pt-movepage-list-other": "{{PLURAL:$1|Binrûpela|Binrûpelên}} din",
"pt-movepage-current": "Navê niha:",
"pt-movepage-new": "Navê nû:",
"pt-movepage-reason": "Sedem:",
diff --git a/MLEB/Translate/i18n/pagetranslation/ky.json b/MLEB/Translate/i18n/pagetranslation/ky.json
index 457eb310..35f34d55 100644
--- a/MLEB/Translate/i18n/pagetranslation/ky.json
+++ b/MLEB/Translate/i18n/pagetranslation/ky.json
@@ -12,7 +12,6 @@
"translate-tag-markthis": "Бул баракты которуу үчүн белгилөө",
"tpt-languages-legend": "Башка тилдер:",
"tpt-languages-zero": "Ушул тилге которууну баштоо",
- "tpt-discouraged-language-reason": "Себеп: $1",
"tpt-aggregategroup-save": "Сактоо",
"tpt-aggregategroup-new-name": "Аталышы:",
"tpt-aggregategroup-new-description": "Баяндамасы (милдеттүү эмес):",
diff --git a/MLEB/Translate/i18n/pagetranslation/lb.json b/MLEB/Translate/i18n/pagetranslation/lb.json
index c9b7a5c6..26fd1aed 100644
--- a/MLEB/Translate/i18n/pagetranslation/lb.json
+++ b/MLEB/Translate/i18n/pagetranslation/lb.json
@@ -28,6 +28,7 @@
"tpt-notsuitable": "D'Säit $1 ass net geeegent fir iwwersat ze ginn.\nVergewëssert Iech ob se <nowiki><translate></nowiki>-Taggen an eng valabel Syntax huet.",
"tpt-saveok": "D'Säit [[:$1]] gouf fir d'Iwwersetzung mat $2 {{PLURAL:$2|Iwwersetzungseenheet|Iwwersetzungseenheete}} markéiert.\nD'Säit kann elo <span class=\"plainlinks\">[$3 iwwersat]</span> ginn.",
"tpt-offer-notify": "Dir kënnt iwwer dës Säit <span class=\"plainlinks\">[$1 Iwwersetzer informéieren]</span>.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Lëscht vun den iwwersetzbare Säite weisen.]]",
"tpt-showpage-intro": "Ënnendrënner stinn déi nei, aktuell a geläscht Abschnitter.\nIer Dir dës Versioun fir d'iwwersetze markéiert, kuckt wgl. no datt d'Ännerunge vun den Abschnitter déi iwwersat solle ginn op e Minimum reduzéiert gi fir onnëtz Aarbecht vun den Iwwersetzer ze vermeiden.",
"tpt-mark-summary": "huet dës Versioun fir d'Iwwersetzung markéiert",
"tpt-mark-nochanges": "Keng Ännerunge fir nozekucken. D'Markéiere fir z'iwwersetze vun dëser Säit ännert weder d'Säit nach eng Iwwersetzungseenheet déi et scho gëtt.",
@@ -47,6 +48,7 @@
"tpt-select-prioritylangs-reason": "Grond:",
"tpt-sections-prioritylangs": "Prioritär Sproochen",
"tpt-sections-syntaxversion": "Versioun vun der Syntax",
+ "tpt-syntaxversion-label": "Déi lescht Versioun vun der Syntax fir dës Säit",
"tpt-rev-mark": "markéiere fir z'iwwersetzen",
"tpt-rev-unmark": "Vum Iwwersetzen ewechhuelen",
"tpt-rev-discourage": "Vun der Iwwersetzung zréckzéien",
@@ -73,8 +75,6 @@
"tpt-discouraged-language-header": "D'Iwwersetzen op $1 ass keng Prioritéit fir dës Säit.",
"tpt-discouraged-language-content": "Een Iwwersetzungsadministrateur huet decidéiert d'Iwwersetzungen op $1 ze konzentréieren.",
"tpt-discouraged-language-force": "<strong>Dës Säit kann net op $2 iwwersat ginn.</strong>\n\nEn Iwwersetzungs-Administrateur huet decidéiert datt dës Säit nëmmen op $3 iwwersat ka ginn.",
- "tpt-discouraged-language": "<strong>D'Iwwersetzung op $2 ass keng Prioritéit fir dës Säit.</strong>\n\nEn Iwwersetzungs-Administrateur huet decidéiert fir d'Iwwersetzungs-Efforten op $3 ze konzentréieren.",
- "tpt-discouraged-language-reason": "Grond: $1",
"tpt-priority-languages": "En Iwwersetzungs-Administrateur huet déi prioritiséiert Sprooche fir dëse Grupp op $1 agestallt.",
"tpt-render-summary": "Aktualiséieren fir mat der neier Versioun vun der Quellsäit iwwereneenzestëmmen",
"aggregategroups": "Gruppe fusionéieren",
@@ -100,7 +100,7 @@
"log-name-pagetranslation": "Logbuch vun de Säiteniwwersetzungen",
"logentry-pagetranslation-mark": "$1 {{GENDER:$2|huet}} d'Säit $3 markéiert fir z'iwwersetzen",
"logentry-pagetranslation-unmark": "$1 {{GENDER:$2|huet}} d'Säit $3 aus der Lëscht vun den Iwwersetzungen erausgeholl",
- "logentry-pagetranslation-movenok": "$1 {{GENDER:$2|hat}} e Problem beim Réckele vun der Säit $3 op $4",
+ "logentry-pagetranslation-movenok": "$1 {{GENDER:$2|hat}} e Probleem beim Réckele vun der Säit $3 op $4",
"logentry-pagetranslation-deletefok": "$1 {{GENDER:$2|huet}} d'iwwersetzbar Säit $3 geläscht",
"logentry-pagetranslation-deletelok": "$1 {{GENDER:$2|huet}} d'Läsche vun der Iwwersetzungssäit $3 ofgeschloss",
"logentry-pagetranslation-encourage": "$1 {{GENDER:$2|huet}} d'Iwwersetzung vun $3 recommandéiert",
diff --git a/MLEB/Translate/i18n/pagetranslation/lmo.json b/MLEB/Translate/i18n/pagetranslation/lmo.json
new file mode 100644
index 00000000..7c24eda9
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/lmo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Salvemm el lombard"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% voltada)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/lt.json b/MLEB/Translate/i18n/pagetranslation/lt.json
index 98053413..30d93368 100644
--- a/MLEB/Translate/i18n/pagetranslation/lt.json
+++ b/MLEB/Translate/i18n/pagetranslation/lt.json
@@ -45,8 +45,6 @@
"tpt-discouraged-language-header": "Vertimas į $1 nėra prioritetas šiam puslapiui.",
"tpt-discouraged-language-content": "Vertimų administratorius nusprendė sutelkti pastangas ties $1.",
"tpt-discouraged-language-force": "<strong>Šis puslapis negali būti išverstas į $2.</strong>\n\nVertimų administratorius nusprendė, kad šis puslapis gali būti išverstas tik į $3.",
- "tpt-discouraged-language": "<strong>Vertimas į $2 nėra prioritetas šiam puslapiui.</strong>\n\nVertimų administratorius nusprendė sutelkti vertimų pastangas ties $3.",
- "tpt-discouraged-language-reason": "Priežastis: $1",
"tpt-priority-languages": "Vertimų administratorius nustatė šios grupes prioritetines kalbas į $1.",
"aggregategroups": "Bendros grupės",
"tpt-aggregategroup-add": "Pridėti",
diff --git a/MLEB/Translate/i18n/pagetranslation/lv.json b/MLEB/Translate/i18n/pagetranslation/lv.json
index 849da377..aaffdc5c 100644
--- a/MLEB/Translate/i18n/pagetranslation/lv.json
+++ b/MLEB/Translate/i18n/pagetranslation/lv.json
@@ -23,7 +23,6 @@
"tpt-languages-separator": "&#160;•&#32;",
"tpt-languages-nonzero": "$1 ($2% iztulkots)",
"tpt-tab-translate": "Tulkot",
- "tpt-discouraged-language-reason": "Iemesls: $1",
"tpt-aggregategroup-add": "Pievienot",
"tpt-aggregategroup-save": "Saglabāt",
"tpt-aggregategroup-new-name": "Nosaukums:",
diff --git a/MLEB/Translate/i18n/pagetranslation/mad.json b/MLEB/Translate/i18n/pagetranslation/mad.json
new file mode 100644
index 00000000..76271f04
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/mad.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Boesenbergia"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% èpertal)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/mk.json b/MLEB/Translate/i18n/pagetranslation/mk.json
index 297dc0ac..b4159ea2 100644
--- a/MLEB/Translate/i18n/pagetranslation/mk.json
+++ b/MLEB/Translate/i18n/pagetranslation/mk.json
@@ -8,8 +8,7 @@
"pagetranslation": "Превод на страници",
"right-pagetranslation": "Обележување на верзии на страници за преведување",
"action-pagetranslation": "раководење со преводливи страници",
- "tps-edit-sourcepage-title": "Уредување на преводлива страница",
- "tps-edit-sourcepage-text": "Уредувате изворна преводна страница. Осигурајте се дека сте запознаени со следнава документација: \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Промена на изворен текст] \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Markup_examples Пример за употреба на ознаки]",
+ "tps-edit-sourcepage-text": "Уредувате изворна преводна страница. Осигурајте се дека сте запознаени со следнава документација: \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Промена на изворен текст] \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Markup_examples Пример за употреба на ознаки]",
"tps-edit-sourcepage-ve-warning-title": "Предупредување: Неподдржана страница",
"tps-edit-sourcepage-ve-warning-text": "Уредувате преводлива страница. Овој уредник сè уште не поддржува работа со вакви страници. Користете го изворниот уредник.",
"tps-edit-sourcepage-ve-warning-button": "ОК",
@@ -30,6 +29,7 @@
"tpt-saveok": "Оваа страница [[:$1]] е обележана за преведување со $2 {{PLURAL:$2|преводна единица|преводни единици}}.\nСтраницата сега може да се <span class=\"plainlinks\">[$3 преведува]</span>.",
"tpt-saveok-first": "Можете да [[Special:PageMigration|увезете постоечки превод]] за оваа страница (ако го има).",
"tpt-offer-notify": "Можете да ги <span class=\"plainlinks\">[$1 известите преведувачите]</span> за оваа страница.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Погл. список на преводливи страници.]]",
"tpt-showpage-intro": "Подолу се наведени нови, постоечки и избришани преводни единици.\nПред да ја обележите оваа верзија за преведување, проверете дали промените во деловите се сведени на минимум со што би се избегнала непотреба работа за преведувачите.",
"tpt-mark-summary": "Ја означи оваа верзија за преведување",
"tpt-mark-nochanges": "Нема промени за оценување. Ако ја означите страницава за преведување, истата нема да можете да ја измените, а истото важи за било која друга постоечка преводна единица.",
@@ -48,6 +48,7 @@
"tpt-outdated-pages": "{{PLURAL:$1|Оваа страница има|Овие страници имаат}} промени кои не се означени за преведување.",
"tpt-tag-discouraged": "непрепорачана",
"tpt-tag-oldsyntax": "стара синтакса",
+ "tpt-tag-no-transclusion-support": "не е поддржано превметнување",
"tpt-select-prioritylangs": "Список на кодови на приоритетните јазици, одделени со запирка:",
"tpt-select-prioritylangs-force": "Спречи преведување на јазици што не се приоритетни",
"tpt-select-prioritylangs-reason": "Причина:",
@@ -55,6 +56,8 @@
"tpt-sections-syntaxversion": "Верзија на синтаксата",
"tpt-syntaxversion-text": "Страницава тековно користи стара верзија на изворна синтакса за преводливи страници. Новата верзија ќе ги стави непреведените делови во HTML-ознака за да се укаже исправниот јазик на текстот. Пример: $1. Новата синтакса $2 можете да ја употребите за да спречите секакво ставање во ознаки на места кајшто тоа е несакано, како да речеме кога се преведува атрибутот <code>title</code> на еден елемент. Не е возможно враќање на старата верзија на синтаксата.",
"tpt-syntaxversion-label": "Користи ја најновата верзија на синтаксата за страницава",
+ "tpt-transclusion": "Превметнување на предлошки",
+ "tpt-transclusion-label": "Овозможи преводоспособно превметнување за страницава",
"tpt-rev-mark": "означи за преведување",
"tpt-rev-unmark": "отстрани од преводот",
"tpt-rev-discourage": "непрепорачана",
@@ -77,13 +80,12 @@
"tpt-target-page": "Оваа страница не може да се обнови рачно.\nСтраницава е превод на страницата [[$1]], а преводот може да се обнови само со помош на [$2 алатката за преведување].",
"tpt-unknown-page": "Овој именски простор е резервиран за преводи на содржински страници.\nСтраницата која се обидувате да ја уредите не соодветствува со ниедна страница обележана за преведување.",
"tpt-translation-restricted": "Преведувањето на страницата на овој јазик е спречено од преводен администратор.\n\nПричина: $1",
+ "tpt-translation-restricted-no-reason": "Преведувањето на страницава на овој јазик е спречено од преводен администратор.",
"tpt-discouraged-language-force-header": "Страницава не може да се преведува на $1.",
"tpt-discouraged-language-force-content": "Преводен администратор решил страницава да може да се преведува само на $1.",
"tpt-discouraged-language-header": "Преведувањето на $1 не претставува приоритет за страницава.",
"tpt-discouraged-language-content": "Преводен администратор решил преведувањето да се задржи на $1.",
"tpt-discouraged-language-force": "<strong>Страницава не може да се преведува на $2.</strong>\n\nПреводен администратор одлучил дека страницата може да се преведува само на $3.",
- "tpt-discouraged-language": "<strong>Преводот на $2 не претставува приоритет за страницава.</strong>\n\nПреводен администратор реши дека преведувањето треба да се задржи на $3.",
- "tpt-discouraged-language-reason": "Причина: $1",
"tpt-priority-languages": "Преводен администратор на групата ѝ ги зададе приоритетните јазици: $1.",
"tpt-priority-languages-force": "Преводен администратор ги зададе $1 како приоритетни јазици на групава. Преведувањето на други јазици не е допуштено.",
"tpt-render-summary": "Обнова за усогласување со новата верзија на изворната страница",
@@ -103,7 +105,7 @@
"pt-parse-open": "Неврамнотежена &lt;translate> ознака.\nПредлошка за преводот: <pre>$1</pre>",
"pt-parse-close": "Неврамнотежена &lt;/translate> ознака.\nПредлошка за преводот: <pre>$1</pre>",
"pt-parse-nested": "Не се дозволени гвнездени &lt;translate> преводни единици.\nТекст на ознаката: <pre>$1</pre>",
- "pt-shake-multiple": "Повеќекратни означувачи за преводни единици во во една единица.\nТекст на единицата: <pre>$1</pre>",
+ "pt-shake-multiple": "Повеќекратни означувачи за преводни единици во во една единица.\nПреводните единици мора да бидат одделени со празни редови.\nТекст на единицата: <pre>$1</pre>",
"pt-shake-position": "Неочекувана положба на означувачите за преводни единици.\nТекст во преводната единица: <pre>$1</pre>",
"pt-shake-empty": "Празна преводна единица за означувачот „$1“.",
"log-description-pagetranslation": "Дневник на дејства кои се однесуваат на системот за превод на страници",
@@ -149,6 +151,7 @@
"pt-movepage-list-translatable-note": "Овие страници мора да се преместат одделно.",
"pt-movepage-list-other": "{{PLURAL:$1|Друга потстраница|Други потстраници}}",
"pt-movepage-list-count": "Вкупно $1 {{PLURAL:$1|страница|страници}} за преместување и $2 {{PLURAL:$2|потстраница|потстраници}}.",
+ "pt-movepage-page-count-limit": "Оваа преводлива страница се состои од преку $1 {{PLURAL:$1|страница|страници}}. Утврдено е дека преместувањето на олкав број страници е непоуздано. Побарајте од администратор да го направи ова со скрипта за одржување.",
"pt-movepage-list-no-pages": "Не пронајдов ниедна страница.",
"pt-movepage-legend": "Премести преводлива страница",
"pt-movepage-current": "Сегашен назив:",
@@ -207,6 +210,7 @@
"tpt-translate-title": "Дозволи превод на насловот на страницата",
"pp-save-summary": "Подготвена страница за превод",
"pagepreparation": "Подготвена страница за превод",
+ "pagepreparation-summary": "Укажете наслов на страница за преведување.",
"pp-pagename-placeholder": "Внесете име на страницата",
"pp-prepare-button-label": "Подготви",
"pp-save-button-label": "Објави",
diff --git a/MLEB/Translate/i18n/pagetranslation/ml.json b/MLEB/Translate/i18n/pagetranslation/ml.json
index 06f9544a..5e48ec5f 100644
--- a/MLEB/Translate/i18n/pagetranslation/ml.json
+++ b/MLEB/Translate/i18n/pagetranslation/ml.json
@@ -34,7 +34,6 @@
"tpt-languages-nonzero": "$1 ($2% പരിഭാഷപ്പെടുത്തി)",
"tpt-tab-translate": "പരിഭാഷപ്പെടുത്തുക",
"tpt-target-page": "ഈ താൾ താങ്കൾക്ക് പുതുക്കാൻ കഴിയില്ല.\nഈ താൾ [[$1]] എന്ന താളിന്റെ പരിഭാഷയാണ്, പരിഭാഷ പുതുക്കാൻ [$2 പരിഭാഷാ ഉപകരണം] ഉപയോഗിക്കുക.",
- "tpt-discouraged-language-reason": "കാരണം: $1",
"tpt-aggregategroup-add": "കൂട്ടിച്ചേർക്കുക",
"tpt-aggregategroup-save": "സേവ് ചെയ്യുക",
"tpt-aggregategroup-new-name": "പേര്:",
diff --git a/MLEB/Translate/i18n/pagetranslation/mnc.json b/MLEB/Translate/i18n/pagetranslation/mnc.json
new file mode 100644
index 00000000..b8f99ac9
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/mnc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Foavi33"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% aifini ubaliyabuhe)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/mr.json b/MLEB/Translate/i18n/pagetranslation/mr.json
index a4e060cd..499aca88 100644
--- a/MLEB/Translate/i18n/pagetranslation/mr.json
+++ b/MLEB/Translate/i18n/pagetranslation/mr.json
@@ -61,8 +61,6 @@
"tpt-discouraged-language-header": "$1 ला भाषांतर करणे ही या पानाची प्राथमिकता नाही.",
"tpt-discouraged-language-content": "भाषांतर प्रशासकाने भाषांतराचे प्रयत्न $1 वर केंद्रित करण्याचे ठरविले आहे.",
"tpt-discouraged-language-force": "<strong>हे पान $2 भाषेत भाषांतरीत करता येणार नाही.</strong>भाषांतर प्रशासकाने निर्णय घेतला आहे कि या पानाचे भाषांतर फक्त $3 मध्ये करता येईल.",
- "tpt-discouraged-language": "<strong>$2 मधील भाषांतर या पानाची प्राथमिकता नाही.</strong>$3 वर भाषांतरासाठीचे प्रयत्न केंद्रित करण्याचा भाषांतर प्रशासकाने निर्णय घेतला आहे.",
- "tpt-discouraged-language-reason": "कारण:$1",
"tpt-priority-languages": "भाषांतर प्रशासकाने, या गटाची $1 ही प्राथमिकता-भाषा निश्चित केली आहे.",
"tpt-render-summary": "स्रोत-पानाच्या नविन आवृत्तीस अनुरुपनासाठी अद्यतन करीत आहे.",
"aggregategroups": "एकवित गट",
diff --git a/MLEB/Translate/i18n/pagetranslation/mrh.json b/MLEB/Translate/i18n/pagetranslation/mrh.json
index 0ad5282e..dfa36777 100644
--- a/MLEB/Translate/i18n/pagetranslation/mrh.json
+++ b/MLEB/Translate/i18n/pagetranslation/mrh.json
@@ -1,13 +1,13 @@
{
"@metadata": {
"authors": [
+ "Kiathy",
"Teitei Para"
]
},
"pagetranslation": "Châhmia reihpaleina",
"right-pagetranslation": "Reihpaleina châta châhmiazy vâsiezy âbina tao",
"action-pagetranslation": "reihpalei theipa châhmiazy kha tiehparaih teih",
- "tps-edit-sourcepage-title": "Reihpalei theipa châhmia sâkha taopathina",
- "tps-edit-sourcepage-text": "Nâ cha reihpaleina châhmia hnawh sâkha na taopathi hai. Ary lâta piepa châhna-rahvozy nata hmia nâ pahnopa pasia bei mah y: \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Changing the source text] \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Markup_examples Example of markup to use]",
+ "tps-edit-sourcepage-text": "Nâ cha reihpaleina châhmia hnawh sâkha na taopathi hai. Ary lâta piepa châhna-rahvozy nata hmia nâ pahnopa pasia bei mah y: \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Changing the source text] \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Markup_examples Example of markup to use]",
"tpt-languages-nonzero": "$1 (reihpalei hawpa $2)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ms.json b/MLEB/Translate/i18n/pagetranslation/ms.json
index abef520f..f8b5a509 100644
--- a/MLEB/Translate/i18n/pagetranslation/ms.json
+++ b/MLEB/Translate/i18n/pagetranslation/ms.json
@@ -61,7 +61,7 @@
"tpt-languages-legend": "Bahasa lain:",
"tpt-languages-separator": "&#160;•&#32;",
"tpt-languages-zero": "Mulakan terjemahan dalam bahasa ini",
- "tpt-languages-nonzero": "$1 ($2% terterjemah)",
+ "tpt-languages-nonzero": "$1 ($2% diterjemah)",
"tpt-tab-translate": "Terjemah",
"tpt-target-page": "Laman ini tidak boleh dikemaskini secara manual.\nLaman ini merupakan terjemahan laman [[$1]], dan terjemahannya boleh dikemas kini dengan menggunakan [$2 alatan penterjemahan].",
"tpt-unknown-page": "Ruang nama ini ditempah untuk penterjemahan laman kandungan.\nLaman yang anda cuba sunting itu nampaknya tidak berpadan dengan sebarang laman yang ditandai untuk diterjemah.",
@@ -71,8 +71,6 @@
"tpt-discouraged-language-header": "Penterjemahan ke $1 bukan keutamaan bagi halaman ini.",
"tpt-discouraged-language-content": "Seorang penyelia penterjemahan telah memutuskan untuk menumpukan usaha penterjemahan kepada $1.",
"tpt-discouraged-language-force": "<strong>Halaman ini tidak boleh diterjemahkan kepada bahasa $2.</strong>\n\nPenyelia penterjemahan telah memutuskan bahawa halaman ini boleh diterjemahkan kepada bahasa $3 sahaja.",
- "tpt-discouraged-language": "<strong>Penterjemahan kepada bahasa $2 bukan keutamaan bagi halaman ini.</strong>\n\nPenyelia penterjemahan telah memutuskan untuk menumpukan usaha penterjemahan kepada bahasa $3.",
- "tpt-discouraged-language-reason": "Sebab: $1",
"tpt-priority-languages": "Seorang penyelia penterjemahan telah menetapkan bahasa-bahasa utama kumpulan ini kepada: $1",
"tpt-render-summary": "Mengemas kini agar sepadan dengan versi baru laman sumber",
"aggregategroups": "Kumpulan agregat",
diff --git a/MLEB/Translate/i18n/pagetranslation/my.json b/MLEB/Translate/i18n/pagetranslation/my.json
index d6c4cd6a..fff6bb8d 100644
--- a/MLEB/Translate/i18n/pagetranslation/my.json
+++ b/MLEB/Translate/i18n/pagetranslation/my.json
@@ -9,7 +9,6 @@
"pagetranslation": "စာမျက်နှာ ဘာသာပြန်ခြင်း",
"right-pagetranslation": "စာမျက်နှာများ၏ဗားရှင်းကို ဘာသာပြန်အတွက် မှတ်သားရန်",
"action-pagetranslation": "ဘာသာပြန်နိုင်သော စာမျက်နှာများကို စီမံရန်",
- "tps-edit-sourcepage-title": "ဘာသာပြန်၍ရသော စာမျက်နှာတစ်ခုကို တည်းဖြတ်ခြင်း",
"tps-edit-sourcepage-ve-warning-title": "သတိပေးချက်: မထောက်ခံသော စာမျက်နှာ",
"tps-edit-sourcepage-ve-warning-button": "အိုကေ",
"tpt-diff-old": "ယခင်စာသား",
@@ -41,8 +40,6 @@
"tpt-discouraged-language-header": "$1 သို့ ဘာသာပြန်ခြင်းသည် ဤစာမျက်နှာအတွက် ဦးစားပေးမဟုတ်ပါ။",
"tpt-discouraged-language-content": "ဘာသာပြန် စီမံခန့်ခွဲသူတစ်ဦးမှ ဘာသာပြန်ခြင်းကို $1 တွင် အာရုံစိုက်ကြရန် ဆုံးဖြတ်ခဲ့သည်။",
"tpt-discouraged-language-force": "<strong>ဤစာမျက်နှာကို $2 သို့ ဘာသာမပြန်နိုင်ပါ။</strong>\n\nဘာသာပြန် စီမံခန့်ခွဲသူတစ်ဦးက ဤစာမျက်နှာကို $3 တစ်ခုတည်းသို့သာ ဘာသာပြန်နိုင်သည်ဟု ဆုံးဖြတ်ခဲ့သည်။",
- "tpt-discouraged-language": "<strong>ဤစာမျက်နှာအတွက် $2 သို့ ဘာသာပြန်ခြင်းသည် ဦးစားပေးမဟုတ်ပါ။</strong>\n\nဘာသာပြန် စီမံခန့်ခွဲသူတစ်ဦးက $3 သို့ ဘာသာပြန်ဆိုခြင်းအတွက် အာရုံစူးစိုက်ကြရန် ဆုံးဖြတ်ခဲ့သည်။",
- "tpt-discouraged-language-reason": "အကြောင်းပြချက်: $1",
"tpt-priority-languages": "ဘာသာပြန် စီမံခန့်ခွဲသူတစ်ဦးက ဤအုပ်စုအတွက် ဦးစားပေးဘာသာစကားများကို $1 သို့ သတ်မှတ်ထားသည်။",
"aggregategroups": "စုပေါင်း အုပ်စုများ",
"tpt-aggregategroup-add": "ပေါင်းထည့်ရန်",
diff --git a/MLEB/Translate/i18n/pagetranslation/nb.json b/MLEB/Translate/i18n/pagetranslation/nb.json
index de5dd30c..534ed05f 100644
--- a/MLEB/Translate/i18n/pagetranslation/nb.json
+++ b/MLEB/Translate/i18n/pagetranslation/nb.json
@@ -7,13 +7,13 @@
"Laaknor",
"Nghtwlkr",
"Njardarlogar",
+ "Pols12",
"Purodha"
]
},
"pagetranslation": "Sideoversetting",
"right-pagetranslation": "Merk versjoner av sider for oversettelse",
"action-pagetranslation": "behandle oversettbare sider",
- "tps-edit-sourcepage-title": "Redigerer en oversettbar side",
"tps-edit-sourcepage-text": "Du redigerer kilden til en oversettbar side. Sørg for at du er kjent med følgende dokumentasjon:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Endring av kildeteksten]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Eksempler på oppmerking som kan brukes]",
"tps-edit-sourcepage-ve-warning-title": "Advarsel: Ikke-støttet side",
"tps-edit-sourcepage-ve-warning-text": "Du redigerer en oversettbar side. Redigering av disse med denne redigeringsmodusen støttes ennå ikke. Vennligst bruk kilderedigering.",
@@ -35,6 +35,7 @@
"tpt-saveok": "Siden [[:$1]] har blitt markert for oversettelse med {{PLURAL:$2|én oversettelsesenhet|$2 oversettelsesenheter}}.\nDen kan nå <span class=\"plainlinks\">[$3 oversettes]</span>.",
"tpt-saveok-first": "Du kan [[Special:PageMigration|importere en eksisterende oversettelse]] for denne siden (hvis det fins).",
"tpt-offer-notify": "Du kan <span class=\"plainlinks\">[$1 varsle oversettere]</span> om denne siden.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Vis listen over oversettbare sider.]]",
"tpt-showpage-intro": "Nedenfor listes nye, eksisterende og slettede avsnitt opp.\nFør denne versjonen merkes for oversettelse, sjekk at endringene i avsnittene er minimert for å unngå unødvendig arbeid for oversetterne.",
"tpt-mark-summary": "Markerte denne versjonen for oversettelse",
"tpt-mark-nochanges": "Ingen endringer å godkjenne. Å markere denne siden for oversettelse vil ikke redigere siden eller noen eksisterende oversettelsesenheter.",
@@ -81,13 +82,12 @@
"tpt-target-page": "Denne siden kan ikke oppdateres manuelt.\nDenne siden er en oversettelse av siden [[$1]] og oversettelsen kan bli oppdatert ved å bruke [$2 oversettelsesverktøyet].",
"tpt-unknown-page": "Dette navnerommet er reservert for oversettelser av innholdssider.\nDenne siden som du prøver å redigere ser ikke ut til å samsvare med noen av sidene som er markert for oversettelse.",
"tpt-translation-restricted": "Oversettelse av denne siden til dette språket har blitt forhindret av en oversettelsesadministrator.\n\nÅrsak: $1",
+ "tpt-translation-restricted-no-reason": "Oversettelse av denne siden til dette språket har blitt forhindret av en oversettelsesadministrator.",
"tpt-discouraged-language-force-header": "Denne siden kan ikke oversettes til $1.",
"tpt-discouraged-language-force-content": "En oversettelsesadministrator har bestemt at denne siden kun kan oversettes til $1.",
"tpt-discouraged-language-header": "Oversettelser til $1 er ikke en prioritet for denne siden.",
"tpt-discouraged-language-content": "En oversettelsesadministrator har bestemt at oversettelsene skal fokuseres på $1.",
"tpt-discouraged-language-force": "<strong>Denne siden kan ikke oversettes til $2.</strong>\n\nEn oversettelsesadministrator har bestemt at denne siden bare kan oversettes til $3.",
- "tpt-discouraged-language": "<strong>Oversettelse til $2 er ikke prioritert for denne siden.</strong>\n\nEn oversettelsesadministrator har besluttet å fokusere oversettelsesarbeidet på $3.",
- "tpt-discouraged-language-reason": "Årsak: $1",
"tpt-priority-languages": "En oversettelsesadministrator har satt prioritetsspråkene for denne gruppen til $1.",
"tpt-priority-languages-force": "En oversettelsesadministrator har satt de prioriterte språkene for denne gruppa til $1. Å oversette til andre språk er ikke tillatt.",
"tpt-render-summary": "Oppdaterer for å svare til ny versjon av kildesiden",
@@ -204,7 +204,7 @@
"pm-pagetitle-placeholder": "Skriv inn sidetittelen",
"pm-pagetitle-invalid": "Skriv inn en gyldig sidetittel. Den bør være i formatet <sidenavn>/<språkkode>.",
"pm-pagetitle-missing": "Skriv inn sidetittelen.",
- "pm-langcode-missing": "Språkkoden mangler i tittelen. Skriv inn sidetittelen i formatet <sidenavn>/<språkkode>.",
+ "pm-langcode-missing": "Språkkoden mangler i tittelen. Skriv inn sidetittelen i formatet <page-name>/<language-code>.",
"pm-summary-import": "Importerte oversettelse med [[Special:PageMigration|sidemigrasjon]]",
"pm-on-import-message-text": "De gamle oversettelsene har blitt importert. Bruk add-, swap- og delete-valgene for å justere oversettelsesenhetene og klikk på «{{int:pm-savepages-button-label}}»-knappen for å lagre dem. Klikk på «{{unt:pm-cancel-button-label}}» for å forkaste.",
"pm-on-save-message-text": "Oversettelsesenhetene har blitt lagret. Du kan nå skrive inn tittelen på en ny oversettelsesside for å migrere den, eller gjøre endringer i enhetene nedenfor og lagre en ny versjon.",
@@ -222,7 +222,7 @@
"pp-pagename-missing": "Skriv inn sidenavnet.",
"pp-diff-old-header": "Kildetekst",
"pp-diff-new-header": "Forberedt tekst",
- "tpt-unlink-confirm": "Bekreft at du ønsker å fjerne siden fra oversettelsessystemet.\nSpråkvelgeren og oversatte sidenavn vil slutte å fungere.\nDe enkelte oversatte sidene vil kunne ridegeres direkte.",
+ "tpt-unlink-confirm": "Bekreft at du ønsker å fjerne siden fra oversettelsessystemet.\nSpråkvelgeren og oversatte sidenavn vil slutte å fungere.\nDe enkelte oversatte sidene vil kunne redigeres direkte.",
"tpt-unlink-button": "Fjern fra oversettelse",
"tpt-unlink-summary": "Fjernet side fra oversettelse",
"tpt-generic-confirm": "Bekreft handlingen.",
diff --git a/MLEB/Translate/i18n/pagetranslation/nia.json b/MLEB/Translate/i18n/pagetranslation/nia.json
new file mode 100644
index 00000000..20892604
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/nia.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Slaia"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% tefo'ali)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/nl.json b/MLEB/Translate/i18n/pagetranslation/nl.json
index 4ec8cff9..42cf1b78 100644
--- a/MLEB/Translate/i18n/pagetranslation/nl.json
+++ b/MLEB/Translate/i18n/pagetranslation/nl.json
@@ -1,12 +1,15 @@
{
"@metadata": {
"authors": [
+ "Aranka",
"Dutchy45",
"HanV",
"Kippenvlees1",
"Mainframe98",
"Mar(c)",
+ "McDutchie",
"Nieuwsgierige Gebruiker",
+ "Pols12",
"Robin van der Vliet",
"Robin0van0der0vliet",
"SPQRobin",
@@ -19,7 +22,6 @@
"pagetranslation": "Paginavertaling",
"right-pagetranslation": "Versies van pagina's voor de vertaling markeren",
"action-pagetranslation": "vertaalbare pagina's te beheren",
- "tps-edit-sourcepage-title": "Bewerk een vertaalbare pagina",
"tps-edit-sourcepage-ve-warning-title": "Waarschuwing: Niet-ondersteunde pagina",
"tps-edit-sourcepage-ve-warning-text": "U probeert een vertaalbare pagina te bewerken. Het bewerken van deze pagina's in deze editor wordt nog niet ondersteund. Gebruik de brontekst editor alstublieft.",
"tps-edit-sourcepage-ve-warning-button": "OK",
@@ -52,7 +54,7 @@
"tpt-other-pages-title": "Kapot",
"tpt-outdated-pages-title": "Pagina's met hangende veranderingen",
"tpt-new-pages": "Deze {{PLURAL:$1|pagina bevat|pagina's bevatten}} tekst met vertalingslabels, maar van deze {{PLURAL:$1|pagina|pagina's}} is geen versie gemarkeerd voor vertaling.",
- "tpt-old-pages": "Er is al een versie van deze {{PLURAL:$1|pagina|pagina's}} gemarkeerd voor vertaling.",
+ "tpt-old-pages": "De nieuwste versie van deze {{PLURAL:$1|pagina|pagina's}} is gemarkeerd voor vertaling.",
"tpt-other-pages": "{{PLURAL:$1|Een oude versie van deze pagina is|Oude versies van deze pagina zijn}} gemarkeerd voor vertaling,\nmaar de laatste {{PLURAL:$1|versie kan|versies kunnen}} niet gemarkeerd worden voor vertaling.",
"tpt-outdated-pages": "{{PLURAL:$1|Deze pagina heeft|Deze pagina's hebben}} niet voor vertaling gemarkeerde veranderingen.",
"tpt-tag-discouraged": "ontmoedigd",
@@ -89,8 +91,6 @@
"tpt-discouraged-language-header": "Vertalen in het $1 is geen prioriteit voor deze pagina.",
"tpt-discouraged-language-content": "Een vertalingenbeheerder heeft besloten om prioriteit te leggen bij de volgende talen: $1.",
"tpt-discouraged-language-force": "<strong>Deze pagina kan niet vertaald worden in het $2.</strong>\n\nEen vertalingenbeheerder heeft de talen waarin deze pagina vertaald kan worden beperkt tot de volgende talen: $3.",
- "tpt-discouraged-language": "<strong>Het vertalen van deze pagina in het $2 heeft geen prioriteit.</strong>\n\nEen vertalingenbeheerder heeft besloten prioriteit te leggen bij de volgende talen: $3.",
- "tpt-discouraged-language-reason": "Reden: $1",
"tpt-priority-languages": "Een vertalingenbeheerder heeft de prioriteitstalen voor deze groep ingesteld op $1.",
"tpt-priority-languages-force": "Een vertalingsbeheerder heeft de prioriteitstalen voor deze groep ingesteld op $1. Vertalen naar andere talen is niet toegestaan.",
"tpt-render-summary": "Bijgewerkt vanwege een nieuwe basisversie van de bronpagina",
@@ -205,7 +205,7 @@
"pm-swap-icon-hover-text": "Verwissel met de eenheid hier beneden",
"pm-delete-icon-hover-text": "Eenheid verwijderen",
"pm-pagetitle-placeholder": "Geef de paginatitel op",
- "pm-pagetitle-invalid": "Geef een geldige paginanaam op. De indeling is <paginanaam>/<taalcode>.",
+ "pm-pagetitle-invalid": "Gelieve een geldige paginanaam op te geven. De indeling is <paginanaam>/<taalcode>.",
"pm-pagetitle-missing": "Voer een paginanaam in.",
"pm-langcode-missing": "De taal lijkt te ontbreken in de titel. Voer de titel van de pagina in de opmaak <page-name>/<language-code> in.",
"pm-summary-import": "Vertaling geïmporteerd met [[Special:PageMigration|pagina migratie]]",
@@ -224,6 +224,7 @@
"pp-pagename-missing": "Voer een paginanaam in.",
"pp-diff-old-header": "Brontekst",
"pp-diff-new-header": "Voorbereide tekst",
+ "tpt-unlink-confirm": "Bevestig dat u deze pagina daadwerkelijk uit het vertalingssysteem wilt verwijderen.\nDe taalbalk en vertaalde paginanamen zullen niet meer werken. \nDe vertaalde pagina's zullen bewerkbaar worden.",
"tpt-unlink-button": "Verwijderen uit vertaling",
"tpt-unlink-summary": "Verwijderd als vertaalbare pagina",
"tpt-generic-confirm": "Bevestig de handeling.",
diff --git a/MLEB/Translate/i18n/pagetranslation/nn.json b/MLEB/Translate/i18n/pagetranslation/nn.json
index f26cbcfb..bcbb6924 100644
--- a/MLEB/Translate/i18n/pagetranslation/nn.json
+++ b/MLEB/Translate/i18n/pagetranslation/nn.json
@@ -54,7 +54,6 @@
"tpt-tab-translate": "Set om",
"tpt-translation-restricted": "Omsetjing av sida til dette språket er stogga av ein omsetjingsadministrator.\n\nÅrsak: $1",
"tpt-discouraged-language-force": "<strong>Sida kan ikkje setjast om til $2.</strong>\n\nEin omsetjingsadministrator har avgjort at sida berre kan setjast om til $3.",
- "tpt-discouraged-language-reason": "Årsak: $1",
"tpt-render-summary": "Oppdatering for å svara til ny versjon av kjeldesida",
"tpt-aggregategroup-add": "Legg til",
"tpt-aggregategroup-save": "Lagra",
diff --git a/MLEB/Translate/i18n/pagetranslation/ojb.json b/MLEB/Translate/i18n/pagetranslation/ojb.json
new file mode 100644
index 00000000..1aeb899a
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/ojb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aandeginini"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% aanji' inwewin)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/om.json b/MLEB/Translate/i18n/pagetranslation/om.json
new file mode 100644
index 00000000..ad36ec9a
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/om.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Maammee"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% hiikameera)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/pap.json b/MLEB/Translate/i18n/pagetranslation/pap.json
new file mode 100644
index 00000000..a49131e0
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/pap.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ObaTango"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2% tradusí)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/pfl.json b/MLEB/Translate/i18n/pagetranslation/pfl.json
index e7c8e613..cba17c83 100644
--- a/MLEB/Translate/i18n/pagetranslation/pfl.json
+++ b/MLEB/Translate/i18n/pagetranslation/pfl.json
@@ -58,7 +58,6 @@
"tpt-unknown-page": "D'Noamensraum isch fas Iwasedze vun Wikisaide reswawiad.\nDie Said, wu grad schaffe duschd, enschbrischd käna iwasedbari Said.",
"tpt-translation-restricted": "S'Iwasedze vunde Said in die Schbrooch isch duaschn Administrator vahinad worre.\n\nGrund: $1",
"tpt-discouraged-language-force": "S'Iwasedze vunde Said in Schbrooche isch duaschn Administrator oigschrängd worre. Die Schbrooch isch laida ned unade ealaubde Schbrooche.\n\nGrund: $1",
- "tpt-discouraged-language": "Die Schbrooch isch käni vunde voaroangischi Schbrooche, wuen Administrator va die Said gsedzd kabd hod.\n\nGrund: $1",
"tpt-priority-languages": "Än Administrator hoddie voaroangischi Schbrooche fa die Grubb uff $1 gsedzd.",
"tpt-render-summary": "Iwanemm die naijschd Ausgab vunde Qwellsaid",
"aggregategroups": "Grubbe zsommefasse",
diff --git a/MLEB/Translate/i18n/pagetranslation/pl.json b/MLEB/Translate/i18n/pagetranslation/pl.json
index a18151f2..b91e6e3d 100644
--- a/MLEB/Translate/i18n/pagetranslation/pl.json
+++ b/MLEB/Translate/i18n/pagetranslation/pl.json
@@ -23,7 +23,6 @@
"pagetranslation": "Tłumaczenie stron",
"right-pagetranslation": "Oznaczanie wersji stron do przetłumaczenia",
"action-pagetranslation": "zarządzanie stronami do tłumaczenia",
- "tps-edit-sourcepage-title": "Edytowanie strony do tłumaczenia",
"tps-edit-sourcepage-text": "Edytujesz stronę źródłową do przetłumaczenia. Upewnij się, że zapoznałeś się z poniższą dokumentacją:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Zmienianie treści strony źródłowej]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Przykład znaczników]",
"tps-edit-sourcepage-ve-warning-title": "Uwaga: Niewspierana strona",
"tps-edit-sourcepage-ve-warning-text": "Edytujesz stronę przeznaczoną do tłumaczenia. Jej edycja w tym edytorze nie jest jeszcze oficjalnie obsługiwana. Użyj edytora kodu źródłowego.",
@@ -45,6 +44,7 @@
"tpt-saveok": "Strona [[:$1]] została oznaczona do tłumaczenia razem z $2 {{PLURAL:$2|jednostką|jednostkami}} tłumaczenia.\nMożna ją teraz <span class=\"plainlinks\">[$3 przetłumaczyć]</span>.",
"tpt-saveok-first": "Możesz [[Special:PageMigration|zaimportować istniejące tłumaczenia]] dla tej strony (jeżeli istnieją).",
"tpt-offer-notify": "Możesz <span class=\"plainlinks\">[$1 powiadomić tłumaczy]</span> o tej stronie.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Zobacz listę stron do przetłumaczenia.]]",
"tpt-showpage-intro": "Poniżej wypisane są nowe, istniejące i usunięte sekcje.\nPrzed oznaczeniem tej wersji do tłumaczenia, aby uniknąć niepotrzebnej pracy tłumaczy, sprawdź czy zmiany w sekcjach zostały zminimalizowane.",
"tpt-mark-summary": "Oznaczono tę wersję do tłumaczenia",
"tpt-mark-nochanges": "Nie ma zmian do przejrzenia. Oznaczenie tej strony do tłumaczenia nie spowoduje jej zmiany ani żadnej istniejącej jednostki tłumaczeń.",
@@ -90,14 +90,13 @@
"tpt-tab-translate": "Przetłumacz",
"tpt-target-page": "Ta strona nie może zostać zaktualizowana ręcznie.\nJest ona tłumaczeniem strony [[$1]], a tłumaczenie może zostać zmienione za pomocą [$2 narzędzia tłumacza].",
"tpt-unknown-page": "Ta przestrzeń nazw jest zarezerwowana dla tłumaczeń stron z zawartością.\nStrona, którą próbujesz edytować, prawdopodobnie nie odpowiada żadnej stronie oznaczonej do tłumaczenia.",
- "tpt-translation-restricted": "Tłumaczenie tej strony na ten język zostało zablokowane przez administratora tłumaczenia.\n\nPowód: $1",
+ "tpt-translation-restricted": "Tłumaczenie tej strony na ten język zostało zablokowane przez administratora tłumaczeń.\n\nPowód: $1",
+ "tpt-translation-restricted-no-reason": "Tłumaczenie tej strony na ten język zostało zablokowane przez administratora tłumaczeń.",
"tpt-discouraged-language-force-header": "Ta strona nie może być przetłumaczona na $1.",
"tpt-discouraged-language-force-content": "Administrator tłumaczeń zdecydował, że ta strona może być tłumaczona tylko na $1.",
"tpt-discouraged-language-header": "Tłumaczenie na $1 nie jest priorytetem dla tej strony.",
"tpt-discouraged-language-content": "Administrator tłumaczeń zdecydował, aby skupić się na tłumaczeniu na $1.",
"tpt-discouraged-language-force": "<strong>Ta strona nie może być przetłumaczona na $2.</strong>\n\nAdministrator tłumaczeń ograniczył języki, na które ta strona może być tłumaczona do $3.",
- "tpt-discouraged-language": "<strong>Tłumaczenie na $2 jest priorytetowe dla tej strony.</strong>\n\nAdministrator tłumaczeń zdecydował, aby tłumaczenie wykonać przede wszystkim dla $3.",
- "tpt-discouraged-language-reason": "Powód: $1",
"tpt-priority-languages": "Administrator tłumaczenia ustawił języki priorytetowe dla tej grupy jako $1 .",
"tpt-priority-languages-force": "Administrator tłumaczeń oznaczył języki $1 jako priorytetowe dla tej grupy. Tłumaczenie na inne języki nie jest dozwolone.",
"tpt-render-summary": "Aktualizowanie w celu dopasowania do nowej wersji strony źródłowej",
@@ -214,7 +213,7 @@
"pm-pagetitle-placeholder": "Podaj tytuł strony",
"pm-pagetitle-invalid": "Podaj poprawny tytuł strony. Powinien być w formacie <page-name>/<language-code>.",
"pm-pagetitle-missing": "Podaj tytuł strony.",
- "pm-langcode-missing": "Wydaje się, że w tytule brakuje kodu języka. Wprowadź tytuł strony w formacie <nazwa strony>/<kod języka>.",
+ "pm-langcode-missing": "Wydaje się, że w tytule brakuje kodu języka. Wprowadź tytuł strony w formacie <page-name>/<language-code>.",
"pm-summary-import": "Importowane tłumaczenie za pomocą [[Special:PageMigration|migracji strony]]",
"pm-on-import-message-text": "Zaimportowano stare tłumaczenia. Użyj opcji dodaj, zamień i usuń, aby dopasować jednostki tłumaczenia, a następnie kliknij przycisk \"{{int:pm-savepages-button-label}}\", aby je zapisać. Kliknij przycisk \"{{int:pm-cancel-button-label}}\", aby je odrzucić.",
"pm-on-save-message-text": "Jednostki tłumaczenia zostały zapisane. Możesz teraz wpisać tytuł nowej przetłumaczonej strony, aby dokonać migracji lub dokonać zmian w poniższych jednostkach i zapisać nową wersję.",
diff --git a/MLEB/Translate/i18n/pagetranslation/pms.json b/MLEB/Translate/i18n/pagetranslation/pms.json
index daaa2fd7..7a5772a5 100644
--- a/MLEB/Translate/i18n/pagetranslation/pms.json
+++ b/MLEB/Translate/i18n/pagetranslation/pms.json
@@ -60,8 +60,6 @@
"tpt-unknown-page": "Sto spassi nominal-sì a l'é riservà për tradussion ëd pàgine ëd contnù.\nLa pàgina ch'it preuve a modifiché a smija pa ch'a corisponda a na pàgina marcà për tradussion.",
"tpt-translation-restricted": "La tradussion dë sta pàgina an costa lenga a l'é stàita ampedìa da n'aministrator dle tradussion.\n\nRason: $1",
"tpt-discouraged-language-force": "<strong>Costa pàgina a peul pa esse voltà an $2.</strong>\n\nN'aministrator dle tradussion a l'ha decidù che costa pàgina a peul mach esse voltà an $3.",
- "tpt-discouraged-language": "<strong>La tradussion an $2 a l'é pa na priorità për costa pàgina.</strong>\n\nN'aministrator dle tradussion a l'ha decidù d'adressé jë sfòrs ëd tradussion su $3.",
- "tpt-discouraged-language-reason": "Rason: $1",
"tpt-priority-languages": "N'aministrator ëd tradussion a l'ha ampostà le lenghe prioritarie për sta partìa a $1.",
"tpt-render-summary": "Modifiché për esse com la neuva version dla pàgina sorgiss",
"aggregategroups": "Partìe agregà",
diff --git a/MLEB/Translate/i18n/pagetranslation/pnb.json b/MLEB/Translate/i18n/pagetranslation/pnb.json
index dc1ede45..3dbe57b9 100644
--- a/MLEB/Translate/i18n/pagetranslation/pnb.json
+++ b/MLEB/Translate/i18n/pagetranslation/pnb.json
@@ -1,8 +1,17 @@
{
"@metadata": {
"authors": [
+ "Abbas dhothar",
"Khalid Mahmood"
]
},
- "tpt-languages-nonzero": "$1 ($2% بولی پلٹی گئی)"
+ "tpt-select-prioritylangs-reason": "وجہ:",
+ "tpt-languages-nonzero": "$1 ($2% بولی پلٹی گئی)",
+ "tpt-translation-restricted": "وجہ: $1",
+ "tpt-aggregategroup-edit-description": "تفصیل:",
+ "tpt-aggregategroup-update-cancel": "رد کرو",
+ "pt-movepage-reason": "وجہ:",
+ "pt-deletepage-reason": "وجہ:",
+ "pm-cancel-button-label": "رد کرو",
+ "pp-cancel-button-label": "رد کرو"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/ps.json b/MLEB/Translate/i18n/pagetranslation/ps.json
index ebb165c1..6a27b378 100644
--- a/MLEB/Translate/i18n/pagetranslation/ps.json
+++ b/MLEB/Translate/i18n/pagetranslation/ps.json
@@ -23,7 +23,6 @@
"tpt-languages-legend": "نورې ژبې:",
"tpt-languages-nonzero": "$1 ($2% وژباړل شو)",
"tpt-tab-translate": "ژباړل",
- "tpt-discouraged-language-reason": "سبب: $1",
"aggregategroups": "ډلې غونډول",
"tpt-aggregategroup-add": "ورگډول",
"tpt-aggregategroup-save": "خوندي کول",
diff --git a/MLEB/Translate/i18n/pagetranslation/pt-br.json b/MLEB/Translate/i18n/pagetranslation/pt-br.json
index 36b1b2f3..29388b9e 100644
--- a/MLEB/Translate/i18n/pagetranslation/pt-br.json
+++ b/MLEB/Translate/i18n/pagetranslation/pt-br.json
@@ -4,6 +4,7 @@
"Cainamarques",
"Eduardo Addad de Oliveira",
"Eduardo.mps",
+ "Eduardoaddad",
"Fabsouza1",
"Fasouzafreitas",
"Felipe L. Ewald",
@@ -12,6 +13,7 @@
"Helder.wiki",
"Jhonnatanricardo",
"Luckas",
+ "Pols12",
"Rodrigo codignoli",
"Shirayuki",
555
@@ -20,7 +22,6 @@
"pagetranslation": "Tradução de páginas",
"right-pagetranslation": "Marca versões de páginas para tradução",
"action-pagetranslation": "gerir páginas traduzíveis",
- "tps-edit-sourcepage-title": "Editar uma página traduzível",
"tps-edit-sourcepage-text": "Você está editando uma página de tradução de origem. Verifique se você está familiarizado com a seguinte documentação:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Alterando o texto de origem] \n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Exemplo de marcação a ser usada]",
"tps-edit-sourcepage-ve-warning-title": "Aviso: página não suportada",
"tps-edit-sourcepage-ve-warning-text": "Você está editando uma página traduzível. A edição destes neste editor ainda não é oficialmente suportada. Por favor, use o editor de código-fonte.",
@@ -42,6 +43,7 @@
"tpt-saveok": "A página [[:$1]] foi marcada para tradução com $2 {{PLURAL:$2|unidade|unidades}} de tradução.\nA página já pode ser <span class=\"plainlinks\">[$3 traduzida]</span>.",
"tpt-saveok-first": "Você pode [[Special:PageMigration|importar tradução pré-existente]] para esta página (se houver).",
"tpt-offer-notify": "Você pode <span class=\"plainlinks\">[$1 notificar tradutores]</span> sobre esta página.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Veja a lista de páginas traduzíveis.]]",
"tpt-showpage-intro": "A seguir estão listadas as unidades de tradução novas, existentes e removidas.\nAntes de marcar esta versão para tradução, verifique se as mudanças nas unidades de tradução foram minimizadas, para que seja evitado trabalho desnecessário aos tradutores.",
"tpt-mark-summary": "Marcou esta versão para tradução",
"tpt-mark-nochanges": "Nenhuma alteração para revisar. Marcar esta página para tradução não editará a página nem qualquer unidade de tradução existente.",
@@ -60,12 +62,16 @@
"tpt-outdated-pages": "{{PLURAL:$1|Esta página possui|Essas páginas têm}} mudanças não marcadas para tradução.",
"tpt-tag-discouraged": "desencorajado",
"tpt-tag-oldsyntax": "sintaxe antiga",
+ "tpt-tag-no-transclusion-support": "sem suporte de transclusão",
"tpt-select-prioritylangs": "Códigos de idiomas prioritários, separados por vírgulas:",
"tpt-select-prioritylangs-force": "Impedir traduções para idiomas que não sejam os prioritários",
"tpt-select-prioritylangs-reason": "Motivo:",
"tpt-sections-prioritylangs": "Idiomas prioritários",
"tpt-sections-syntaxversion": "Versão da sintaxe",
+ "tpt-syntaxversion-text": "Esta página atualmente usa uma versão antiga da sintaxe de fonte de página traduzível. A nova versão envolverá as seções não traduzidas com uma etiqueta HTML para indicar o idioma correto do texto. Exemplo: $1. Você pode usar uma nova sintaxe de marcação $2 para evitar qualquer tipo de empacotamento em lugares onde não é apropriado, como ao traduzir o atributo <code>title</code> de um elemento. Não é possível voltar para uma versão de sintaxe antiga.",
"tpt-syntaxversion-label": "Use a versão mais recente da sintaxe para esta página",
+ "tpt-transclusion": "Transclusão de predefinição",
+ "tpt-transclusion-label": "Ativar transclusão com reconhecimento de tradução para esta página",
"tpt-rev-mark": "marcar para traduzir",
"tpt-rev-unmark": "remover das traduções",
"tpt-rev-discourage": "desmarcar de traduzir",
@@ -88,13 +94,12 @@
"tpt-target-page": "Esta página não pode ser atualizada manualmente.\nEsta página é uma tradução da página [[$1]]. Sua tradução pode ser atualizada usando [$2 a ferramenta de tradução].",
"tpt-unknown-page": "Este espaço nominal é reservado para traduções de páginas de conteúdo.\nA página que você está tentando editar não aparenta corresponder a nenhuma página marcada para tradução.",
"tpt-translation-restricted": "Um coordenador de traduções desautorizou que esta página seja traduzida para este idioma.\n\nMotivo: $1",
+ "tpt-translation-restricted-no-reason": "A tradução desta página para este idioma foi impedida por um administrador de tradução.",
"tpt-discouraged-language-force-header": "Est página não pode ser traduzida para $1.",
"tpt-discouraged-language-force-content": "Um administrador de tradução decidiu que esta página só pode ser traduzida para $1.",
"tpt-discouraged-language-header": "Traduzir para $1 não é uma prioridade para esta página.",
"tpt-discouraged-language-content": "Um administrador de tradução decidiu concentrar os esforços de tradução em $1.",
"tpt-discouraged-language-force": "<strong>Esta página não pode ser traduzida para $2.</strong>\n\nUm administrador de traduções decidiu que a página só pode ser traduzida para $3.",
- "tpt-discouraged-language": "<strong>A tradução para $2 não é prioritária para esta página.</strong>\n\nUm administrador de traduções decidiu focar o esforço de tradução em $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "Um coordenador de traduções definiu como idiomas prioritários para este grupo $1.",
"tpt-priority-languages-force": "Um administrador de traduções definiu as línguas prioritárias para este grupo como $1. Não é permitido traduzir para outras línguas.",
"tpt-render-summary": "Atualizando para corresponder à nova versão da página de origem",
@@ -114,7 +119,7 @@
"pt-parse-open": "O elemento &lt;translate> está desequilibrado.\nModelo de tradução: <pre>$1</pre>",
"pt-parse-close": "O elemento &lt;/translate> está desequilibrado.\nModelo de tradução: <pre>$1</pre>",
"pt-parse-nested": "Não são permitidas unidades de tradução &lt;translate> cruzadas.\nTexto do elemento: <pre>$1</pre>",
- "pt-shake-multiple": "Vários marcadores para uma mesma unidade de tradução.\nTexto da unidade de tradução: <pre>$1</pre>",
+ "pt-shake-multiple": "Vários marcadores para uma mesma unidade de tradução.\nCertifique-se de que as unidades de tradução sejam separadas por linhas em branco.\nTexto da unidade de tradução: <pre>$1</pre>",
"pt-shake-position": "Marcadores de unidades de tradução em posição inesperada.\nTexto da unidade de tradução: <pre>$1</pre>",
"pt-shake-empty": "Unidade de tradução vazia para o marcador \"$1\".",
"log-description-pagetranslation": "Registro para operações relacionadas com o sistema de tradução de páginas",
@@ -218,6 +223,7 @@
"tpt-translate-title": "Permitir a tradução do título da página",
"pp-save-summary": "Preparar a página para tradução",
"pagepreparation": "Preparar esta página para tradução",
+ "pagepreparation-summary": "Especifique um título de página para preparar a tradução.",
"pp-pagename-placeholder": "Digite o nome da página",
"pp-prepare-button-label": "Preparar",
"pp-save-button-label": "Publicar",
diff --git a/MLEB/Translate/i18n/pagetranslation/pt.json b/MLEB/Translate/i18n/pagetranslation/pt.json
index 1806583f..c9cc81f6 100644
--- a/MLEB/Translate/i18n/pagetranslation/pt.json
+++ b/MLEB/Translate/i18n/pagetranslation/pt.json
@@ -8,6 +8,7 @@
"Luckas",
"Malafaya",
"Mansil alfalb",
+ "Pols12",
"SandroHc",
"Vitorvicentevalente",
"Vivaelcelta",
@@ -79,8 +80,6 @@
"tpt-discouraged-language-header": "A tradução para $1 não é uma prioridade desta página.",
"tpt-discouraged-language-content": "Um administrador de traduções decidiu concentrar os esforços de tradução em $1.",
"tpt-discouraged-language-force": "<strong>Esta página não pode ser traduzida para $2.</strong>\n\nUm administrador de traduções decidiu que a página só pode ser traduzida para $3.",
- "tpt-discouraged-language": "<strong>A tradução para $2 não é prioritária para esta página.</strong>\n\nUm administrador de traduções decidiu focar o esforço de tradução em $3.",
- "tpt-discouraged-language-reason": "Motivo: $1",
"tpt-priority-languages": "Um administrador de traduções definiu que as línguas prioritárias para este grupo são $1.",
"tpt-priority-languages-force": "Um administrador de traduções definiu as línguas prioritárias para este grupo como $1. Não é permitido traduzir para outras línguas.",
"tpt-render-summary": "A atualizar para corresponder à nova versão da página fonte",
@@ -197,7 +196,7 @@
"pm-pagetitle-placeholder": "Introduza o título da página",
"pm-pagetitle-invalid": "Introduza um título de página válido. Este deverá ter o formato <nome-da-página>/<código-de-língua>.",
"pm-pagetitle-missing": "Introduza o título da página, por favor.",
- "pm-langcode-missing": "O código de língua parece estar em falta no título. Introduza o título da página no formato <nome-da-página>/<código-de-língua>, por favor.",
+ "pm-langcode-missing": "O código de língua parece estar em falta no título. Introduza o título da página no formato <page-name>/<language-code>, por favor.",
"pm-summary-import": "Tradução importada usando a [[Special:PageMigration|migração de página]]",
"pm-on-import-message-text": "As traduções antigas foram importadas. Use as opções acrescentar, trocar e eliminar para ajustar as unidades de tradução e clique o botão \"{{int:pm-savepages-button-label}}\" para gravá-las. Clique o botão \"{{int:pm-cancel-button-label}}\" para cancelar.",
"pm-on-save-message-text": "As unidades de tradução foram gravadas. Agora pode introduzir o título de uma página de tradução nova para migrá-la, ou fazer mudanças às unidades abaixo e gravar uma nova revisão.",
diff --git a/MLEB/Translate/i18n/pagetranslation/qqq.json b/MLEB/Translate/i18n/pagetranslation/qqq.json
index 40d5cc79..b8ea124d 100644
--- a/MLEB/Translate/i18n/pagetranslation/qqq.json
+++ b/MLEB/Translate/i18n/pagetranslation/qqq.json
@@ -8,6 +8,7 @@
"EugeneZelenko",
"Fryed-peach",
"Guycn2",
+ "Kizule",
"Liangent",
"Liuxinyu970226",
"Lloffiwr",
@@ -15,6 +16,7 @@
"Mormegil",
"Nemo bis",
"Nike",
+ "PiefPafPier",
"Pols12",
"Purodha",
"Raymond",
@@ -29,7 +31,6 @@
"pagetranslation": "{{doc-special|PageTranslation}}\n[[Image:Page translation admin view.png|thumb|Admin view of special page PageTranslation]]",
"right-pagetranslation": "{{doc-right|pagetranslation}}",
"action-pagetranslation": "{{doc-action|pagetranslation}}",
- "tps-edit-sourcepage-title": "Caption for the box that appears while editing a source translation page.",
"tps-edit-sourcepage-text": "Help text shown while editing a source translation page. Contains links to various Translate extension documentation page. Appears below {{msg-mw|Tps-edit-sourcepage-title}}.",
"tps-edit-sourcepage-ve-warning-title": "Title for the warning dialog shown when user is editing the sourcepage using Visual Editor 'visual' mode",
"tps-edit-sourcepage-ve-warning-text": "Text shown in the warning dialog when user is editing the sourcepage using Visual Editor 'visual' mode",
@@ -51,6 +52,7 @@
"tpt-saveok": "Followed by {{msg-mw|Tpt-saveok-first}} if the page is being marked for translation for the first time and {{msg-mw|Tpt-offer-notify}} if the user is allowed to notify translators.\n\nParameters:\n* $1 - page title\n* $2 - number of sections, can be used with PLURAL\n* $3 - URL which points to [[Special:Translate]]",
"tpt-saveok-first": "Message displayed on [[Special:PageTranslation]] after marking a page for translation the very first time.\n\nParameters:\n* $1 - a URL to [[Special:PageMigration]]",
"tpt-offer-notify": "Message displayed on [[Special:PageTranslation]] after marking a page for translation when the marking user also has right to notify translators.\n\nParameters:\n* $1 - a URL to [[Special:NotifyTranslators]] with the marked page preselected",
+ "tpt-list-pages-in-translations": "Message displayed on [[Special:PageTranslation]] after marking a page for translation to view the list of translatable pages.",
"tpt-showpage-intro": "See definition on [[mw:Help:Extension:Translate/Glossary]].",
"tpt-mark-summary": "This message is used as an edit summary.",
"tpt-mark-nochanges": "A note in Special:PageTranslation when marking a revision of a page for translation.",
@@ -69,6 +71,7 @@
"tpt-outdated-pages": "[[Image:Page translation admin view.png|thumb|Admin view of special page PageTranslation]]\nPreceded by the section header {{msg-mw|Tpt-outdated-pages-title}}.\n\nFollowed by the ordered list of pages.\n\nParameters:\n* $1 - the number of pages in the following list",
"tpt-tag-discouraged": "Description that can be used as tag for translatable pages that are discouraged from translation.",
"tpt-tag-oldsyntax": "Description that can be used as tag for translatable pages using old syntax version.",
+ "tpt-tag-no-transclusion-support": "Description that can be used as tag for translatable pages that do not support translation aware template transclusion.",
"tpt-select-prioritylangs": "Label for the input box to enter preferred languages",
"tpt-select-prioritylangs-force": "Label for the checkbox to make the translation restriction",
"tpt-select-prioritylangs-reason": "Label for the textbox to enter reason for restriction.\n{{Identical|Reason}}",
@@ -76,6 +79,8 @@
"tpt-sections-syntaxversion": "Section title in [[Special:PageTranslation]].",
"tpt-syntaxversion-text": "Additional explanation",
"tpt-syntaxversion-label": "Label for a checkbox",
+ "tpt-transclusion": "Section title in [[Special:PageTranslation]].",
+ "tpt-transclusion-label": "Label for template transclusion",
"tpt-rev-mark": "Possible page action and link text in [[Special:PageTranslation]]. In parenthesis after page name. [[Image:Page translation admin view.png|thumb|Admin view of special page PageTranslation]]",
"tpt-rev-unmark": "Possible page action and link text in [[Special:PageTranslation]]. In parenthesis after page name. [[Image:Page translation admin view.png|thumb|Admin view of special page PageTranslation]]",
"tpt-rev-discourage": "Possible page action and link text in [[Special:PageTranslation]]. In parenthesis after page name. [[Image:Page translation admin view.png|thumb|Admin view of special page PageTranslation]]",
@@ -98,14 +103,13 @@
"tpt-tab-translate": "Used as label for the tab.\n\nReplaces the edit tab with translation tab for translation pages.\n{{Identical|Translate}}",
"tpt-target-page": "Message displayed when trying to edit a translatable page directly. Parameters:\n* $1 is the translatable page\n* $2 is a link to the translation tool for the translatable page.",
"tpt-unknown-page": "See [[mw:Help:Extension:Translate/Translation example]] for context on page translation feature.",
- "tpt-translation-restricted": "Error message shown to user when translation to a language which is restricted by translation admin.\n\nParameters:\n* $1 - reason",
+ "tpt-translation-restricted": "Error message shown to user when translating to a language which is restricted by translation admin, along with the reason for the restriction.\n\nParameters:\n* $1 - reason\nSee also:\n* {{msg-mw|Tpt-translation-restricted-no-reason}}",
+ "tpt-translation-restricted-no-reason": "Error message shown to user when translating to a language which is restricted by translation admin. Displayed when no reason has been provided by the translation admin.\nSee also:\n* {{msg-mw|Tpt-translation-restricted}}",
"tpt-discouraged-language-force-header": "Header for error shown along with group description if the language is prevented from translation for the selected language.\n\nParameter:\n* $1 - the language to which the user asked to translate the page",
"tpt-discouraged-language-force-content": "Error shown along with group description if the language is prevented from translation for the selected language.\n\nParameters:\n* $1 - comma-separated names of the languages to which translation is encouraged",
"tpt-discouraged-language-header": "Header for warning shown along with group description if the language is discouraged from translation for the selected language.\n\nParameters:\n* $1 the language to which the user asked to translate the page",
"tpt-discouraged-language-content": "Warning shown along with group description if the language is discouraged from translation for the selected language.\n\nParameters:\n* $1 - comma-separated names of the languages to which translation is encouraged",
"tpt-discouraged-language-force": "Error shown along with group description if the language is prevented from translation for the selected language.\n\nParameters:\n* $1 - (Unused) empty string\n* $2 - the language that to which the user asked to translate the page\n* $3 - the names of the translation languages\nSee also:\n* {{msg-mw|Tpt-discouraged-language}}\n\nThis message is used only in the old interface (non-TUX).",
- "tpt-discouraged-language": "Warning shown along with group description if the language is discouraged from translation for the selected language.\n\nParameters:\n* $1 - (Unused) empty string\n* $2 - the language that to which the user asked to translate the page\n* $3 - the name list of the translation languages, separated by \",\"\nSee also:\n* {{msg-mw|Tpt-discouraged-language-force}}\n\nThis message is used only in the old interface (non-TUX).",
- "tpt-discouraged-language-reason": "Parameters:\n* $1 - the reason for the priority language definition. Probably written in the content language.\n\nUsed only if a reason was provided in the following messages:\n* {{msg-mw|Tpt-discouraged-language-force}}\n* {{msg-mw|Tpt-discouraged-language}}\n{{Identical|Reason}}",
"tpt-priority-languages": "Message to be shown before the messagestats table if priority languages are set, but translations to other languages are still allowed. $1 is a comma-separated list of language codes.",
"tpt-priority-languages-force": "Message to be shown before the messagestats table if priority languages are set, and translations to other languages are not allowed. $1 is a comma-separated list of language codes.",
"tpt-render-summary": "Edit summary when FuzzyBot updates translation pages.",
@@ -171,6 +175,7 @@
"pt-movepage-list-translatable-note": "Appears below the section header {{msg-mw|pt-movepage-list-translatable}}",
"pt-movepage-list-other": "Header of a list of additional subpages (other than translation pages) of the translatable page being moved, when the user selected the option to move subpages as well.\n\nSee definition on [[mw:Help:Extension:Translate/Glossary]].\n\nParameters:\n* $1 - number of subpages\n{{Related|Pt-movepage-list}}",
"pt-movepage-list-count": "Used to indicate how many pages will be moved.\n\nParameters:\n* $1 - Total number of pages\n* $2 - Number of subpages\nSee also:\n* {{msg-mw|Pt-deletepage-list-count}}",
+ "pt-movepage-page-count-limit": "Warning shown to the user when they try to move a large number of pages and the operation is not supported by the wiki. \n\nParameters:\n* $1 - Number of pages being moved",
"pt-movepage-list-no-pages": "Message used to indicate that there are no pages under a given section. Appears below {{msg-mw|pt-movepage-list-section}}.",
"pt-movepage-legend": "See definition on [[mw:Help:Extension:Translate/Glossary]].",
"pt-movepage-current": "Label followed by name of a translatable page section (the thing inside <!-- T:[name] --> if you edit the translatable page source.",
@@ -205,7 +210,7 @@
"pt-deletepage-list-count": "Used to indicate how many pages will be deleted.\n\nParameters:\n* $1 - number of pages\n* $2 - Number of subpages\nSee also:\n* {{msg-mw|Pt-movepage-list-count}}",
"pt-deletepage-list-no-pages": "Message used to indicate that there are no pages under a given section. Appears below {{msg-mw|pt-deletepage-list-section}}",
"pt-deletepage-full-logreason": "Used as summary.\n\nSee definition on [[mw:Help:Extension:Translate/Glossary]].\n\nParameters:\n* $1 - translatable-page title\nSee also:\n* {{msg-mw|Pt-deletepage-lang-logreason}}",
- "pt-deletepage-lang-logreason": "Used as summary.\n\nSee definition on [[mw:Help:Extension:Translate/Glossary]].\n\nParameters:\n* $1 - translatable-page title\nSee also:\n* {{msg-mw|Pt-deletepage-full-logreason}}",
+ "pt-deletepage-lang-logreason": "Used as summary.\n\nSee definition on [[mw:Help:Extension:Translate/Glossary]].\n\nParameters:\n* $1 - translation-page title\nSee also:\n* {{msg-mw|Pt-deletepage-full-logreason}}",
"pt-deletepage-started": "Confirmation message after a deletion of a translatable page or a translation page has been started.",
"pt-deletepage-intro": "Help message when deleting a translatable page or a translation page.",
"pagemigration": "{{doc-special|PageMigration}}\nSee the [[mw:Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#migration|page migration help]] for more information.",
@@ -221,7 +226,7 @@
"pm-swap-icon-hover-text": "Hover text for the icon on Special:PageMigration which, when clicked, swaps a unit (text area) with the unit below.",
"pm-delete-icon-hover-text": "Hover text for delete unit icon",
"pm-pagetitle-placeholder": "Placeholder for the page title input field.",
- "pm-pagetitle-invalid": "Error message given when an invalid page title is entered.\n{{doc-important|Do not translate \"<code><page-name>/<language-code></code>\".}}",
+ "pm-pagetitle-invalid": "Error message given when an invalid page title is entered. You should translate format indication; you can localize brackets but you must keep the middle slash <code>/</code>.",
"pm-pagetitle-missing": "Error message given when page title field is blank",
"pm-langcode-missing": "Error message given when the page title field does not contain a language code.\n{{doc-important|Do not translate \"<code><page-name>/<language-code></code>\".}}",
"pm-summary-import": "Edit summary used while creating translation pages which were imported using [[Special:PageMigration]], see [[mw:Help:Extension:Translate/Page_translation_administration#Migrating to page translation]]",
@@ -230,6 +235,7 @@
"tpt-translate-title": "Checkbox on Special:PageTranslation to mark title for translation",
"pp-save-summary": "Edit summary for saving a page prepared for translation by the tool",
"pagepreparation": "{{doc-special|PageMigration}}",
+ "pagepreparation-summary": "Description appearing on top of [[Special:PagePreparation]].",
"pp-pagename-placeholder": "Placeholder for the pagename input field.",
"pp-prepare-button-label": "Used as label for the \"Prepare\" button.\n{{Identical|Prepare}}",
"pp-save-button-label": "Used as label for the \"Save\" button.\n{{Identical|Save}}",
diff --git a/MLEB/Translate/i18n/pagetranslation/ro.json b/MLEB/Translate/i18n/pagetranslation/ro.json
index 1e586f57..062cd229 100644
--- a/MLEB/Translate/i18n/pagetranslation/ro.json
+++ b/MLEB/Translate/i18n/pagetranslation/ro.json
@@ -5,6 +5,7 @@
"Firilacroco",
"KlaudiuMihaila",
"Minisarm",
+ "NGC 54",
"Stelistcristi",
"Strainu"
]
@@ -12,6 +13,7 @@
"pagetranslation": "Traducere pagini",
"right-pagetranslation": "Marchează versiuni ale paginilor pentru a fi traduse",
"action-pagetranslation": "administrați paginile traductibile",
+ "tps-edit-sourcepage-ve-warning-button": "Bine",
"tpt-section": "Unitate de traducere $1",
"tpt-section-new": "Unitate de traducere nouă.\nNume: $1",
"tpt-section-deleted": "Unitate de traducere $1",
@@ -29,12 +31,12 @@
"tpt-offer-notify": "Puteți <span class=\"plainlinks\">[$1 notifica traducătorii]</span> despre această pagină.",
"tpt-mark-summary": "Marcat această versiune pentru traducere",
"tpt-edit-failed": "Pagina nu a putut fi actualizată: $1",
- "tpt-unmarked": "Pagina $1 nu mai este marcată pentru traducere.",
+ "tpt-unmarked": "Pagina [[:$1]] nu mai este marcată pentru traducere.",
"tpt-list-nopages": "Nici o pagină nu este marcată pentru traducere sau gata să fie marcată pentru traducere.",
"tpt-new-pages-title": "Pagini propuse pentru traducere",
"tpt-old-pages-title": "Pagini în curs de traducere",
"tpt-other-pages-title": "Pagini eronate",
- "tpt-old-pages": "Unele versiuni ale {{PLURAL:$1|acestei pagini|acestor pagini}} au fost marcate pentru traducere.",
+ "tpt-old-pages": "Ultima versiune {{PLURAL:$1|a acestei pagini|a acestor pagini}} a fost marcată pentru traducere.",
"tpt-select-prioritylangs": "Listă de coduri de limbă prioritară separate prin virgulă:",
"tpt-select-prioritylangs-reason": "Motiv:",
"tpt-sections-prioritylangs": "Limbi prioritare",
@@ -48,13 +50,12 @@
"tpt-rev-encourage-tooltip": "Restaurează această pagină la traducerea normală.",
"translate-tag-translate-link-desc": "Tradu această pagină",
"translate-tag-markthis": "Marchează această pagină pentru traducere",
- "tpt-translation-intro": "Această pagină reprezintă <span class=\"plainlinks\">[$1 versiunea tradusă]</span> a paginii [[$2]], procesul de traducere fiind completat în proporție de $3%.",
+ "tpt-translation-intro": "Această pagină reprezintă <span class=\"plainlinks\">[$1 versiunea tradusă]</span> a paginii [[$2]], procesul de traducere fiind completat în proporție de $3 %.",
"tpt-translation-intro-fuzzy": "Traducerile învechite sunt marcate în acest fel.",
"tpt-languages-legend": "Alte limbi:",
"tpt-languages-zero": "Începeți traducerea în această limbă",
"tpt-languages-nonzero": "$1 ($2% tradusă)",
"tpt-tab-translate": "Traducere",
- "tpt-discouraged-language-reason": "Motiv: $1",
"tpt-aggregategroup-add": "Adaugă",
"tpt-aggregategroup-save": "Salvează",
"tpt-aggregategroup-add-new": "Adaugă un grup de agregare nou",
@@ -67,7 +68,7 @@
"pt-movepage-list-pages": "Listă de pagini de mutat",
"pt-movepage-list-translation": "{{PLURAL:$1|Pagină|Pagini}} de traducere",
"pt-movepage-list-other": "{{PLURAL:$1|Altă subpagină|Alte subpagini}}",
- "pt-movepage-list-count": "În total, $1 {{PLURAL:$1|pagină|pagini|de pagini}} de redenumit.",
+ "pt-movepage-list-count": "În total, $1 {{PLURAL:$1|pagină|pagini|de pagini}} de mutat și $2 {{PLURAL:$2|subpagină|subpagini|de subpagini}}.",
"pt-movepage-legend": "Mută pagina traductibilă",
"pt-movepage-current": "Nume actual:",
"pt-movepage-new": "Nume nou:",
@@ -89,7 +90,7 @@
"pt-deletepage-list-pages": "Listă de pagini de șters",
"pt-deletepage-list-translation": "Pagini de traducere",
"pt-deletepage-list-other": "Alte subpagini",
- "pt-deletepage-list-count": "În total, $1 {{PLURAL:$1|pagină|pagini|de pagini}} de șters.",
+ "pt-deletepage-list-count": "În total, $1 {{PLURAL:$1|pagină|pagini|de pagini}} de șters și $2 {{PLURAL:$2|subpagină|subpagini|de subpagini}}.",
"pt-deletepage-full-logreason": "Parte a paginii traductibile „$1”.",
"pt-deletepage-lang-logreason": "Parte a paginii de traducere „$1”.",
"tpt-generic-button": "Confirmare"
diff --git a/MLEB/Translate/i18n/pagetranslation/roa-tara.json b/MLEB/Translate/i18n/pagetranslation/roa-tara.json
index 87a0d825..1b1f7472 100644
--- a/MLEB/Translate/i18n/pagetranslation/roa-tara.json
+++ b/MLEB/Translate/i18n/pagetranslation/roa-tara.json
@@ -7,6 +7,7 @@
"pagetranslation": "Pàgene de traduzione",
"right-pagetranslation": "Signe le revisiune de le pàggene pe traduzione",
"action-pagetranslation": "gestisce le pàggene traducibbele",
+ "tps-edit-sourcepage-ve-warning-title": "Attenziò: pàgene non supportate",
"tps-edit-sourcepage-ve-warning-button": "OK",
"tpt-section": "Aunità de traduzione $1",
"tpt-section-new": "Nova unità de traduzione.\nNome: $1",
@@ -42,7 +43,6 @@
"tpt-languages-nonzero": "$1 ($2% tradotte)",
"tpt-tab-translate": "Traduce",
"tpt-discouraged-language-force-header": "Sta pàgene non ge pò essere tradotte jndr'à $1.",
- "tpt-discouraged-language-reason": "Mutive: $1",
"aggregategroups": "Gruppe aggregate",
"tpt-aggregategroup-add": "Aggiunge",
"tpt-aggregategroup-save": "Reggìstre",
diff --git a/MLEB/Translate/i18n/pagetranslation/ru.json b/MLEB/Translate/i18n/pagetranslation/ru.json
index cafc2c26..67657bbc 100644
--- a/MLEB/Translate/i18n/pagetranslation/ru.json
+++ b/MLEB/Translate/i18n/pagetranslation/ru.json
@@ -6,6 +6,7 @@
"DR",
"Eugrus",
"Express2000",
+ "Facenapalm",
"Ferrer",
"G0rn",
"Grigol",
@@ -14,6 +15,7 @@
"Kaganer",
"Kareyac",
"Lockal",
+ "Lopusanski",
"Mailman",
"Movses",
"Okras",
@@ -55,7 +57,7 @@
"tpt-old-pages-title": "Страницы в переводе",
"tpt-other-pages-title": "Повреждённые страницы",
"tpt-new-pages": "{{PLURAL:$1|1=Эта страница содержит|Эти страницы содержат}} текст с тегами перевода, но ни одна из версий {{PLURAL:$1|1=этой страницы|этих страниц}} не отмечена для перевода.",
- "tpt-old-pages": "Некоторые версии {{PLURAL:$1|1=этой страницы|этих страниц}} были отмечены для перевода.",
+ "tpt-old-pages": "Последняя версия {{PLURAL:$1|1=этой страницы|этих страниц}} была отмечена для перевода.",
"tpt-other-pages": "{{PLURAL:$1|1=Старая версия этой страницы отмечена|Старые версии этих страниц отмечены}} для перевода,\nно последняя версия не может быть отмечена для перевода.",
"tpt-select-prioritylangs": "Предпочитаемые языки (коды языков, разделенные запятой):",
"tpt-select-prioritylangs-force": "Предотвратить переводы на другие языки, помимо приоритетных",
@@ -88,8 +90,6 @@
"tpt-discouraged-language-header": "Язык «$1» не включён в список приоритетных для перевода этой страницы.",
"tpt-discouraged-language-content": "Администратор переводов решил сосредоточить усилия по переводу на $1.",
"tpt-discouraged-language-force": "<strong>Эта страница не может быть переведена на $2.</strong>\n\nАдминистратор перевода решил, что эта страница может быть переведена только на $3.",
- "tpt-discouraged-language": "<strong>Перевод на $2 не приоритетен для этой страницы.</strong>\n\nАдминистратор перевода решил сфокусировать усилия по переводу на $3.",
- "tpt-discouraged-language-reason": "Причина: $1",
"tpt-priority-languages": "Администратор перевода установил $1 в качестве приоритетного языка для этой группы.",
"tpt-priority-languages-force": "Администратор переводов установил в качестве приоритетных языков этой группы \"$1\". Перевод на иные языки не разрешён.",
"tpt-render-summary": "Обновление для соответствия новой версии исходной страницы.",
@@ -122,8 +122,8 @@
"logentry-pagetranslation-deletefnok": "$1 {{GENDER:$2|не смог|не смогла}} удалить «$3», относящуюся к доступной для перевода странице «$4»",
"logentry-pagetranslation-deletelok": "$1 {{GENDER:$2|удалил|удалила}} страницу перевода «$3»",
"logentry-pagetranslation-deletelnok": "$1 {{GENDER:$2|не смог|не смогла}} удалить «$3», относящуюся к странице перевода «$4»",
- "logentry-pagetranslation-encourage": "$1 {{GENDER:$2|проверил|проверила}} перевод страницы «$3»",
- "logentry-pagetranslation-discourage": "$1 {{GENDER:$2|снял|сняла}} отметку проверки с перевода страницы «$3»",
+ "logentry-pagetranslation-encourage": "$1 {{GENDER:$2|повысил|повысила}} приоритет перевода страницы «$3»",
+ "logentry-pagetranslation-discourage": "$1 {{GENDER:$2|понизил|понизила}} приоритет перевода страницы «$3»",
"logentry-pagetranslation-prioritylanguages-unset": "$1 {{GENDER:$2|удалил|удалила}} приоритетные языки с доступной для перевода страницы «$3»",
"logentry-pagetranslation-prioritylanguages": "$1 {{GENDER:$2|задал|задала}} для доступной для перевода страницы «$3» следующий список приоритетных языков: $5",
"logentry-pagetranslation-prioritylanguages-force": "$1 {{GENDER:$2|ограничил|ограничила}} для доступной для перевода страницы «$3» список языков: $5",
@@ -206,7 +206,7 @@
"pm-pagetitle-placeholder": "Введите заголовок страницы",
"pm-pagetitle-invalid": "Пожалуйста, введите корректный заголовок страницы. Он должен быть в формате <page-name>/<language-code>.",
"pm-pagetitle-missing": "Пожалуйста, введите заголовок страницы",
- "pm-langcode-missing": "Кажется, в названии отсутствует языковой код. Пожалуйста, введите код языка в формате <название-страницы>/<языковой-код>.",
+ "pm-langcode-missing": "Кажется, в названии отсутствует языковой код. Пожалуйста, введите код языка в формате <page-name>/<language-code>.",
"pm-summary-import": "Импортирован перевод с использованием [[Special:PageMigration|миграции страниц]]",
"pm-on-import-message-text": "Старые переводы импортированы. Чтобы улучшить соответствие элементов перевода, используйте опции по добавлению, замене и удалению фрагментов; затем нажмите кнопку «{{int:pm-savepages-button-label}}», чтобы записать результат. Для отмены нажмите кнопку «{{int:pm-cancel-button-label}}».",
"pm-on-save-message-text": "Элементы перевода сохранены. Теперь можно ввести название новой страницы перевода, чтобы перенести её, или внести изменения в отображаемые ниже элементы и сохранить новую версию.",
@@ -215,9 +215,9 @@
"pagepreparation": "Подготовить страницу к переводу",
"pp-pagename-placeholder": "Введите имя страницы",
"pp-prepare-button-label": "Подготовить",
- "pp-save-button-label": "Сохранить",
+ "pp-save-button-label": "Опубликовать",
"pp-cancel-button-label": "Отмена",
- "pp-save-message": "Страница была сохранена. Вы можете [$1 редактировать] её.",
+ "pp-save-message": "Страница была опубликована. Вы можете [$1 редактировать] её.",
"pp-prepare-message": "Страница была подготовлена для перевода. Различия между версиями смотрите ниже. Нажмите кнопку «{{int:pp-save-button-label}}», если всё нормально!",
"pp-already-prepared-message": "Кажется, эта страница уже была подготовлена для перевода. Нет никаких изменений по сравнению с предыдущей версией.",
"pp-diff-error": "Возникла ошибка во время получения с сервера различия между версиями.",
diff --git a/MLEB/Translate/i18n/pagetranslation/sa.json b/MLEB/Translate/i18n/pagetranslation/sa.json
index b15d3443..83358723 100644
--- a/MLEB/Translate/i18n/pagetranslation/sa.json
+++ b/MLEB/Translate/i18n/pagetranslation/sa.json
@@ -13,7 +13,6 @@
"tpt-languages-legend": "अन्यभाषाः :",
"tpt-languages-nonzero": "$1 ($2% अनुवादः जातः)",
"tpt-tab-translate": "अनूद्यताम्",
- "tpt-discouraged-language-reason": "कारणम् : $1",
"tpt-aggregategroup-add": "योज्यताम्",
"tpt-aggregategroup-save": "रक्ष्यताम्",
"tpt-aggregategroup-new-name": "नाम :",
diff --git a/MLEB/Translate/i18n/pagetranslation/sco.json b/MLEB/Translate/i18n/pagetranslation/sco.json
index 80af027a..faaaec37 100644
--- a/MLEB/Translate/i18n/pagetranslation/sco.json
+++ b/MLEB/Translate/i18n/pagetranslation/sco.json
@@ -60,8 +60,6 @@
"tpt-unknown-page": "This namespace is reserved fer content page owersets.\nThe page that ye'r ettlin tae eedit disna seem tae correspond wi onie page maurkt fer owersetin.",
"tpt-translation-restricted": "Owersetin o this page intil this leid haes been stapt bi aen owerset admeenistrater.\n\nReason: $1",
"tpt-discouraged-language-force": "<strong>This page canna be owerset intil $2.</strong>\n\nAen owerset admeenistrater decided that this page can yinlie be owerset intil $3.",
- "tpt-discouraged-language": "<strong>Owersetin intil $2 isna ae prioritie fer this page.</strong>\n\nAen owerset admeenistrater decided tae focus the owersetin efforts oan $3.",
- "tpt-discouraged-language-reason": "Raison: $1",
"tpt-priority-languages": "Aen owerset admeenistrater haes set the prioritie leids fer this groop til $1.",
"tpt-render-summary": "Updatin tae match new version o soorce page",
"aggregategroups": "Aggregate groops",
diff --git a/MLEB/Translate/i18n/pagetranslation/se.json b/MLEB/Translate/i18n/pagetranslation/se.json
new file mode 100644
index 00000000..ed0ea53d
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/se.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "tpt-languages-legend": "Eará gielat:"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/shi.json b/MLEB/Translate/i18n/pagetranslation/shi.json
index 2cd3a7f4..a2ae79b5 100644
--- a/MLEB/Translate/i18n/pagetranslation/shi.json
+++ b/MLEB/Translate/i18n/pagetranslation/shi.json
@@ -1,8 +1,9 @@
{
"@metadata": {
"authors": [
- "Amara-Amaziɣ"
+ "Amara-Amaziɣ",
+ "Ayour2002"
]
},
- "tpt-languages-nonzero": "$1 ($2% ⴰⴷ ⵉⵜⵜⵢⵓⵙⵓⵖⵍⵏ)"
+ "tpt-languages-nonzero": "$1 ($2% ad ittyusuɣln)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/si.json b/MLEB/Translate/i18n/pagetranslation/si.json
index 487c31d9..76e709ec 100644
--- a/MLEB/Translate/i18n/pagetranslation/si.json
+++ b/MLEB/Translate/i18n/pagetranslation/si.json
@@ -58,7 +58,6 @@
"tpt-languages-legend": "වෙනත් භාෂා:",
"tpt-languages-zero": "මෙම භාෂාව සඳහා පරිවර්තනය අරඹන්න",
"tpt-languages-nonzero": "$1 ($2% පරිවර්තිතයි)",
- "tpt-discouraged-language-reason": "හේතුව: $1",
"tpt-render-summary": "මූලාශ්‍ර පිටුවේ නව අනුවාදය වෙත ගැලපීම සඳහා යාවත්කාලීන කරමින්",
"aggregategroups": "සමස්ත කාණ්ඩයන්",
"tpt-aggregategroup-add": "එක් කරන්න",
diff --git a/MLEB/Translate/i18n/pagetranslation/sl.json b/MLEB/Translate/i18n/pagetranslation/sl.json
index aadbd7c6..c592d9b4 100644
--- a/MLEB/Translate/i18n/pagetranslation/sl.json
+++ b/MLEB/Translate/i18n/pagetranslation/sl.json
@@ -23,15 +23,15 @@
"tpt-action-nofuzzy": "Ne označuj prevodov kot ohlapne",
"tpt-badtitle": "Dano ime strani ($1) ni veljaven naslov",
"tpt-nosuchpage": "Stran $1 ne obstaja",
- "tpt-oldrevision": "$2 ni najnovejša različics strani [[:$1]].\nSamo zadnje različice se lahko označi za prevod.",
- "tpt-notsuitable": "Stran $1 ni primerna za prevod.\nPrepričajte se, da ima oznake <nowiki><translate></nowiki> in veljavno sintakso.",
+ "tpt-oldrevision": "$2 ni zadnja redakcija strani [[:$1]].\nZa prevod se lahko označijo samo zadnje redakcije.",
+ "tpt-notsuitable": "Stran $1 ni primerna za prevod.\nPrepričajte se, da ima značke <nowiki><translate></nowiki> in veljavno sintakso.",
"tpt-saveok": "Stran [[:$1]] je bila označena za prevod z $2 {{PLURAL:$2|prevajalsko enoto|prevajalskima enotama|prevajalskimi enotami}}.\nStran je sedaj mogoče <span class=\"plainlinks\">[$3 prevesti]</span>.",
"tpt-showpage-intro": "Spodaj so navedene nove, obstoječe in izbrisane prevajalne enote.\nPred označitvijo te redakcije za prevajanje preverite, da so spremembe prevajalnih enot čim manjše, saj tako prevajalcem prihranite nepotrebno delo.",
"tpt-mark-summary": "Označil to različico za prevajanje",
"tpt-edit-failed": "Ni mogoče posodobiti strani: $1",
"tpt-duplicate": "Ime prevajalne enote $1 se uporablja več kot enkrat.",
"tpt-unmarked": "Stran [[:$1]] ni več označena za prevajanje.",
- "tpt-list-nopages": "Nobena stran ni označena za prevajanje, niti pripravljena, da se označi za prevajanje.",
+ "tpt-list-nopages": "Nobena stran ni niti označena za prevajanje niti pripravljena za označitev za prevajanje.",
"tpt-new-pages-title": "Strani, predlagane za prevajanje",
"tpt-old-pages-title": "Strani v prevajanju",
"tpt-other-pages-title": "Poškodovane strani",
@@ -54,32 +54,32 @@
"translate-tag-markthis": "Označi to stran za prevajanje",
"translate-tag-markthisagain": "Ta stran ima <span class=\"plainlinks\">[$1 sprememb]</span> odkar je bila nazadnje <span class=\"plainlinks\">[$2 označena za prevajanje]</span>.",
"translate-tag-hasnew": "Stran vsebuje <span class=\"plainlinks\">[$1 spremembe]</span>, ki niso označene za prevajanje.",
- "tpt-translation-intro": "Ta stran je <span class=\"plainlinks\">[$1 prevedena različica]</span> strani [[$2]] in prevod je $3 % dokončan.",
- "tpt-translation-intro-fuzzy": "Zastareli prevodi so označeni tako.",
+ "tpt-translation-intro": "Ta stran je <span class=\"plainlinks\">[$1 prevedena različica]</span> strani [[$2]]. Prevod je $3-% dokončan.",
+ "tpt-translation-intro-fuzzy": "Zastareli prevodi so označeni na tak način.",
"tpt-languages-legend": "Drugi jeziki:",
- "tpt-languages-zero": "Prični s prevajanjem v ta jezik",
+ "tpt-languages-zero": "Začni prevajanje v ta jezik",
"tpt-languages-nonzero": "$1 ($2 % prevedeno)",
"tpt-target-page": "Te strani ni mogoče ročno posodobiti.\nTa stran je prevod strani [[$1]], njen prevod lahko posodobite z uporabo [$2 prevajalskega orodja].",
"tpt-unknown-page": "Ta imenski prostor je pridržan za prevode vsebinskih strani.\nStran, ki jo poskušate urediti, ne ustreza nobeni strani označeni za prevajanje.",
- "tpt-discouraged-language-reason": "Razlog: $1",
"tpt-render-summary": "Posodabljanje za ujemanje nove različice izvorne strani",
"tpt-aggregategroup-add": "Dodaj",
"tpt-aggregategroup-save": "Shrani",
"tpt-aggregategroup-new-name": "Ime:",
- "tpt-aggregategroup-new-description": "Opis (izbirno):",
+ "tpt-aggregategroup-new-description": "Opis (neobvezno):",
"tpt-aggregategroup-invalid-group": "Skupina ne obstaja",
"tpt-aggregategroup-edit-description": "Opis:",
- "pt-parse-open": "Neizenačena etiketa &lt;translate>.\nPrevajalna predloga: <pre>$1</pre>",
- "pt-parse-close": "Neizenačena etiketa &lt;/translate>.\nPrevajalna predloga: <pre>$1</pre>",
- "pt-parse-nested": "Gnezdene prevajalne enote &lt;translate> niso dovoljene.\nBesedilo etikete: <pre>$1</pre>",
- "pt-shake-multiple": "Več označevalcev prevajalnih enot za eno prevajalno enoto.\nBesedilo prevajalne enote: <pre>$1</pre>",
+ "tpt-aggregategroup-update-cancel": "Prekliči",
+ "pt-parse-open": "Neizenačena značka &lt;translate>.\nPrevajalna predloga: <pre>$1</pre>",
+ "pt-parse-close": "Neizenačena značka &lt;/translate>.\nPrevajalna predloga: <pre>$1</pre>",
+ "pt-parse-nested": "Gnezdene prevajalne enote &lt;translate> niso dovoljene.\nBesedilo značke: <pre>$1</pre>",
+ "pt-shake-multiple": "Več označevalcev prevajalnih enot za eno prevajalno enoto.\nPrepričajte se, da so prevajalne enote ločene s praznimi vrsticami.\nBesedilo prevajalne enote: <pre>$1</pre>",
"pt-shake-position": "Označevalci prevajalnih enot na nepričakovanem položaju.\nBesedilo prevajalne enote: <pre>$1</pre>",
"pt-shake-empty": "Prazna prevajalna enota označevalec »$1«.",
"log-description-pagetranslation": "Dnevnik dejanj, ki so povezana s sistemom prevajanja strani",
"log-name-pagetranslation": "Dnevnik prevajanja strani",
"log-action-filter-pagetranslation-move": "Prestavitve strani",
"log-action-filter-pagetranslation-delete": "Izbrisi strani",
- "pt-movepage-title": "Premakni prevedljivo stran $1",
+ "pt-movepage-title": "Prestavi prevedljivo stran $1",
"pt-movepage-blockers": "Prevedljive strani ni mogoče prestaviti na novo ime zaradi {{PLURAL:$1|naslednje napake|naslednjih napak}}:",
"pt-movepage-block-base-exists": "Ciljna prevedljiva stran »[[:$1]]« obstaja.",
"pt-movepage-block-base-invalid": "Ime ciljne prevedljive strani ni veljaven naslov.",
@@ -94,7 +94,7 @@
"pt-movepage-list-section": "{{PLURAL:$1|Stran|Strani}} prevajalnih enot",
"pt-movepage-list-other": "{{PLURAL:$1|Ostala podstran|Ostali podstrani|Ostale podstrani}}",
"pt-movepage-list-count": "Skupno je za prestaviti $1 {{PLURAL:$1|stran|strani}} in $2 {{PLURAL:$2|podstran|podstrani}}.",
- "pt-movepage-legend": "Premakni prevedljivo stran",
+ "pt-movepage-legend": "Prestavi prevedljivo stran",
"pt-movepage-current": "Trenutno ime:",
"pt-movepage-new": "Novo ime:",
"pt-movepage-reason": "Razlog:",
@@ -104,7 +104,7 @@
"pt-movepage-action-other": "Spremeni cilj",
"pt-movepage-intro": "Ta posebna stran omogoča prestavljanje strani, ki so označene za prevajanje.\nDejanje prestavitve ne bo izvedeno takoj, saj bo potrebno prestaviti veliko strani.\nMedtem ko se strani premikajo, ne bo mogoče delovati na straneh v obravnavi.\nNeuspehi bodo zabeleženi v [[Special:Log/pagetranslation|dnevniku strani prevodov]] in jih je potrebno ročno popraviti.",
"pt-movepage-logreason": "Del prevedljive strani »$1«.",
- "pt-movepage-started": "Prosimo, v kratkem preverite [[Special:Log/pagetranslation|dnevnik strani prevodov]] za napake in sporočila o dokončanju.",
+ "pt-movepage-started": "V kratkem preverite [[Special:Log/pagetranslation|dnevnik strani prevodov]] glede napak in sporočil o dokončanju.",
"pt-locked-page": "Stran je zaklenjena, ker se prevedljiva stran trenutno prestavlja.",
"pt-deletepage-lang-title": "Brisanje strani prevoda »$1«",
"pt-deletepage-full-title": "Brisanje prevedljive strani »$1«",
@@ -115,7 +115,7 @@
"pt-deletepage-action-other": "Spremeni cilj",
"pt-deletepage-lang-legend": "Izbriši stran prevoda",
"pt-deletepage-full-legend": "Izbriši prevedljivo stran",
- "pt-deletepage-any-legend": "Izbriši prevedljivo stran ali prevod strani",
+ "pt-deletepage-any-legend": "Izbriši stran za prevod ali prevod strani",
"pt-deletepage-current": "Naslov strani:",
"pt-deletepage-reason": "Razlog:",
"pt-deletepage-subpages": "Izbriši vse podstrani",
@@ -129,10 +129,12 @@
"pt-deletepage-started": "Prosimo, preverite [[Special:Log/pagetranslation|dnevnik prevajanja strani]] za napake in sporočilo o dokončanju.",
"pt-deletepage-intro": "Ta posebna stran vam omogoča izbris celotne prevedljive strani ali individualne strani s prevodom v nekem jeziku.\nDejanje izbrisa ne bo izvedeno takoj, ker je treba izbrisati tudi vse strani, ki so od njih odvisne.\nNeuspehi bodo zabeleženi v [[Special:Log/pagetranslation|dnevniku prevajanja strani]] in jih morate urediti ročno.",
"pagemigration": "Prenos prevedene strani",
+ "pm-cancel-button-label": "Prekliči",
"pm-pagetitle-placeholder": "Vnesite naslov strani",
"pm-pagetitle-missing": "Prosimo, vnesite naslov strani.",
"pp-save-summary": "Stran je pripravljena za prevajanje",
"pagepreparation": "Pripravite stran za prevajanje",
"pp-pagename-placeholder": "Vnesite naslov strani",
+ "pp-cancel-button-label": "Prekliči",
"tpt-unlink-summary": "Stran je bila odstranjena iz prevajanja"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/sli.json b/MLEB/Translate/i18n/pagetranslation/sli.json
new file mode 100644
index 00000000..61d60d87
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/sli.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Äberlausitzer"
+ ]
+ },
+ "tpt-languages-nonzero": "$1 ($2 % iebersetzt)"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/smn.json b/MLEB/Translate/i18n/pagetranslation/smn.json
index 2354ae86..5e14a559 100644
--- a/MLEB/Translate/i18n/pagetranslation/smn.json
+++ b/MLEB/Translate/i18n/pagetranslation/smn.json
@@ -1,8 +1,13 @@
{
"@metadata": {
"authors": [
- "Trondtr"
+ "Trondtr",
+ "Yupik"
]
},
- "tpt-languages-nonzero": "$1 ($2 % jurgâlum)"
+ "tpt-languages-legend": "Eres kielah:",
+ "tpt-languages-nonzero": "$1 ($2 % jurgâlum)",
+ "pt-movepage-subpages": "Sirde puoh vyelisiijđoid",
+ "pt-deletepage-subpages": "Siho puoh vyelisiijđoid",
+ "pt-deletepage-list-other": "Eres vyelisiijđoh"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/sms.json b/MLEB/Translate/i18n/pagetranslation/sms.json
new file mode 100644
index 00000000..2169c0cb
--- /dev/null
+++ b/MLEB/Translate/i18n/pagetranslation/sms.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "tpt-languages-legend": "Jeeʹres ǩiõl:"
+}
diff --git a/MLEB/Translate/i18n/pagetranslation/so.json b/MLEB/Translate/i18n/pagetranslation/so.json
index 12aa2198..2dcd606a 100644
--- a/MLEB/Translate/i18n/pagetranslation/so.json
+++ b/MLEB/Translate/i18n/pagetranslation/so.json
@@ -5,6 +5,5 @@
"Abshirdheere"
]
},
- "tpt-languages-nonzero": "$1 ($2% la turjumay)",
- "tpt-discouraged-language": "<strong>Turjumidda $2 Maaha muhiimadda koowaad ee Boggaan.</strong>\n\nMaamulka waxa uu muhiimad uu siiyey turjumidda $3."
+ "tpt-languages-nonzero": "$1 ($2% la turjumay)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/sq.json b/MLEB/Translate/i18n/pagetranslation/sq.json
index 682fac5f..72d7ea86 100644
--- a/MLEB/Translate/i18n/pagetranslation/sq.json
+++ b/MLEB/Translate/i18n/pagetranslation/sq.json
@@ -2,9 +2,14 @@
"@metadata": {
"authors": [
"Ammartivari",
- "Liridon"
+ "Eraldkerciku",
+ "Liridon",
+ "MuratTheTurkish",
+ "Olsi"
]
},
+ "tpt-languages-legend": "Gjuhë të tjera:",
"tpt-languages-nonzero": "$1 ($2% i përkëthyer)",
+ "pt-shake-multiple": "Shënues të shumëfishtë të njësisë së përkthimit për një njësi përkthimi.\nSigurohuni që njësitë e përkthimit të ndahen me vija të zbrazëta.\nTeksti i njësisë së përkthimit: <pre> $1 </pre>",
"pt-deletepage-reason": "Arsyeja:"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/sr-ec.json b/MLEB/Translate/i18n/pagetranslation/sr-ec.json
index 5cbd3565..a3625e34 100644
--- a/MLEB/Translate/i18n/pagetranslation/sr-ec.json
+++ b/MLEB/Translate/i18n/pagetranslation/sr-ec.json
@@ -3,6 +3,7 @@
"authors": [
"Acamicamacaraca",
"BadDog",
+ "Kizule",
"MarinaSimic",
"Milicevic01",
"Obsuser",
@@ -17,6 +18,7 @@
"pagetranslation": "Превођење странице",
"right-pagetranslation": "означавање верзија страница за превођење",
"action-pagetranslation": "управљате преводивим страницама",
+ "tps-edit-sourcepage-ve-warning-title": "Упозорење: Неподржана страница",
"tps-edit-sourcepage-ve-warning-button": "У реду",
"tpt-section": "Јединица превода $1",
"tpt-section-new": "Нова јединица превода.\nИме: $1",
@@ -32,6 +34,7 @@
"tpt-nosuchpage": "Страница „$1” не постоји",
"tpt-saveok": "Страница [[:$1]] је означена за превођење са $2 {{PLURAL:$2|јединицом превођења|јединице превођења|јединица превођења}}. Страница сада може да буде <span class=\"plainlinks\">[$3 преведена]</span>.",
"tpt-offer-notify": "Можете да <span class=\"plainlinks\">[$1 обавестите преводиоце]</span> о овој страници.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Прикажи списак преводивих страница]]",
"tpt-showpage-intro": "Испод нових, постојеће и избрисане преводилачке јединице су наведене.\nПре него што означите ову верзију за превод, проверите да ли су измене преводилачких јединица сведене на минимум да бисте избегли непотребан рад за преводиоце.",
"tpt-mark-nochanges": "Нема промена за преглед. Означавање ове странице за превођење неће да уреди страницу нити било коју постојећу јединицу превођења.",
"tpt-edit-failed": "Није могуће ажурирати страницу: $1",
@@ -39,12 +42,17 @@
"tpt-new-pages-title": "Странице предложене за превођење",
"tpt-old-pages-title": "Странице за превођење",
"tpt-other-pages-title": "Покварене странице",
+ "tpt-outdated-pages-title": "Странице с изменама на чекању",
"tpt-new-pages": "{{PLURAL:$1|Ова страница садржи|Ове странице садрже}} текст за ознакама за превођење, али нема верзије {{PLURAL:$1|ове странице која је|ове странице које су}} тренутно {{PLURAL:$1|означена|означене}} за превођење.",
- "tpt-old-pages": "{{PLURAL:$1|Нека верзија ове странице је означена|Неке верзије ових страница су означене}} за превођење.",
+ "tpt-old-pages": "Последња верзија {{PLURAL:$1|ове странице је означена|ових страница су означене}} за превођење.",
"tpt-other-pages": "{{PLURAL:$1|Старија верзија ове странице је означена|Старије верзије ових страница су означене}} за превођење, \nали {{PLURAL:$1|најновија верзија|најновије верзије}} не могу да буду означене за превођење.",
+ "tpt-outdated-pages": "{{PLURAL:$1|Ова страница има|Ове странице имају}} измене које нису означене за превођење.",
+ "tpt-tag-discouraged": "непрепоручено",
+ "tpt-tag-oldsyntax": "стара синтакса",
"tpt-select-prioritylangs-force": "Спречи превођење на језике који нису приоритетни",
"tpt-select-prioritylangs-reason": "Разлог:",
"tpt-sections-prioritylangs": "Приоритетни језици",
+ "tpt-sections-syntaxversion": "Верзија синтаксе",
"tpt-rev-mark": "означи за превођење",
"tpt-rev-unmark": "уклони из система превођења",
"tpt-rev-discourage": "непрепоручено",
@@ -55,6 +63,7 @@
"tpt-rev-encourage-tooltip": "Вратите ову страницу за нормално превођење.",
"translate-tag-translate-link-desc": "Преведите ову страницу",
"translate-tag-markthis": "Означи страницу за превођење",
+ "translate-tag-markthisagain": "Ова страница има <span class=\"plainlinks\">[$1 измена]</span> од када је последњи пут <span class=\"plainlinks\">[$2 означена за превођење]</span>.",
"translate-tag-hasnew": "Ова страница садржи <span class=\"plainlinks\">[$1 измене]</span> које нису означене за превођење.",
"tpt-translation-intro": "Ово је <span class=\"plainlinks\">[$1 преведена верзија]</span> странице [[$2]]. Превод је $3% завршен.",
"tpt-translation-intro-fuzzy": "Застарели преводи су означени овако.",
@@ -62,11 +71,10 @@
"tpt-languages-separator": "&#160;•&#32;",
"tpt-languages-zero": "Започните превођење на овом језику",
"tpt-languages-nonzero": "$1 ($2% преведено)",
- "tpt-tab-translate": "Превођење",
+ "tpt-tab-translate": "Преведи",
+ "tpt-discouraged-language-force-header": "Ова страница не може да буде преведена на $1.",
"tpt-discouraged-language-header": "Превођење ове странице на $1 није приоритет.",
"tpt-discouraged-language-force": "<strong>Ова страница се не може превести на $2.</strong>\n\nАдминистратор превођења је одредио да се ова страница може превести само на: $3.",
- "tpt-discouraged-language": "<strong>Превођење ове странице на $2 није приоритет.</strong>\n\nАдминистратор превођења је одредио приоритетне језике и они су: $3.",
- "tpt-discouraged-language-reason": "Разлог: $1",
"aggregategroups": "Збирне групе",
"tpt-aggregategroup-add": "Додај",
"tpt-aggregategroup-save": "Сачувај",
@@ -80,14 +88,14 @@
"tpt-invalid-group": "Неважећа група",
"pt-shake-multiple": "Више маркера јединице превођења за једну јединицу превођења.\nТекст јединице превођења: <pre>$1</pre>",
"pt-shake-position": "Маркери јединице превођења у неочекиваној позицији.\nТекст јединице превода: <pre>$1</pre>",
- "log-description-pagetranslation": "Евиденција радњи везаних за преводилачки систем страница",
+ "log-description-pagetranslation": "Дневник радњи у вези с преводилачким системом страница",
"log-name-pagetranslation": "Дневник превођења страница",
"logentry-pagetranslation-mark": "$1 {{GENDER:$2|означио|означила}} је страницу „$3” за превођење",
"logentry-pagetranslation-unmark": "$1 {{GENDER:$2|уклонио|уклонила}} је страницу „$3” из система превођења",
"logentry-pagetranslation-deletefok": "$1 је {{GENDER:$2|избрисао|избрисала}} преводиву страницу $3",
"logentry-pagetranslation-deletelok": "$1 је {{GENDER:$2|избрисао|избрисала}} преводиву страницу $3",
"logentry-pagetranslation-prioritylanguages": "$1 је {{GENDER:$2|одредио|одредила}} приоритетне језике за преводиву страницу $3: $5",
- "log-action-filter-pagetranslation": "Тип радње:",
+ "log-action-filter-pagetranslation": "Врста радње:",
"log-action-filter-pagetranslation-mark": "Означавање за превођење",
"log-action-filter-pagetranslation-unmark": "Уклањање из система превођења",
"log-action-filter-pagetranslation-move": "Премештања страница",
@@ -120,8 +128,12 @@
"pt-movepage-action-check": "Провери да ли је премештање изводљиво",
"pt-movepage-action-perform": "Изврши премештање",
"pt-movepage-action-other": "Промени циљ",
+ "pt-movepage-logreason": "Део преводиве странице \"$1\"",
"pt-movepage-started": "У међувремену, проверите [[Special:Log/pagetranslation|дневник превођења странице]] да би се пронашле евентуалне грешке и поруке завршетка.",
+ "pt-deletepage-lang-title": "Брисање преводиве странице \"$1\"",
+ "pt-deletepage-full-title": "Брисање преводиве странице \"$1\"",
"pt-deletepage-invalid-title": "Наведена страница није важећа.",
+ "pt-deletepage-invalid-text": "Наведена страница није преводива страница нити страница превода.",
"pt-deletepage-action-check": "Наведи странице за брисање",
"pt-deletepage-action-perform": "Изврши брисање",
"pt-deletepage-action-other": "Промени циљ",
@@ -137,6 +149,8 @@
"pt-deletepage-list-other": "Друге подстранице",
"pt-deletepage-list-count": "Укупно $1 {{PLURAL:$1|страница|странице|страница}} за брисање и $2 {{PLURAL:$2|подстраница|подстранице|подстраница}}.",
"pt-deletepage-list-no-pages": "Није пронађена ниједна страница.",
+ "pt-deletepage-full-logreason": "Део преводиве странице \"$1\"",
+ "pt-deletepage-lang-logreason": "Део странице превода \"$1\"",
"pagemigration": "Миграција странице за превођење",
"pm-import-button-label": "Увези",
"pm-savepages-button-label": "Сачувај",
diff --git a/MLEB/Translate/i18n/pagetranslation/sr-el.json b/MLEB/Translate/i18n/pagetranslation/sr-el.json
index f5da0fb1..77157b02 100644
--- a/MLEB/Translate/i18n/pagetranslation/sr-el.json
+++ b/MLEB/Translate/i18n/pagetranslation/sr-el.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Kizule",
"Michaello",
"Milicevic01",
"Obsuser",
@@ -59,8 +60,6 @@
"tpt-tab-translate": "Prevođenje",
"tpt-discouraged-language-header": "Prevođenje ove stranice na $1 nije prioritet.",
"tpt-discouraged-language-force": "<strong>Ova stranica se ne može prevesti na $2.</strong>\n\nAdministrator prevođenja je odredio da se ova stranica može prevesti samo na: $3.",
- "tpt-discouraged-language": "<strong>Prevođenje ove stranice na $2 nije prioritet.</strong>\n\nAdministrator prevođenja je odredio prioritetne jezike i oni su: $3.",
- "tpt-discouraged-language-reason": "Razlog: $1",
"aggregategroups": "Zbirne grupe",
"tpt-aggregategroup-add": "Dodaj",
"tpt-aggregategroup-save": "Sačuvaj",
diff --git a/MLEB/Translate/i18n/pagetranslation/su.json b/MLEB/Translate/i18n/pagetranslation/su.json
index 288dafc5..0274186a 100644
--- a/MLEB/Translate/i18n/pagetranslation/su.json
+++ b/MLEB/Translate/i18n/pagetranslation/su.json
@@ -12,7 +12,6 @@
"tpt-select-prioritylangs-reason": "Alesan:",
"tpt-languages-nonzero": "$1 ($2% tarjamah)",
"tpt-translation-restricted": "Alesan: $1",
- "tpt-discouraged-language-reason": "Alesan: $1",
"tpt-aggregategroup-update-cancel": "Bolay",
"pt-movepage-current": "Ngaran ayeuna:",
"pt-movepage-new": "Ngaran anyar:",
diff --git a/MLEB/Translate/i18n/pagetranslation/sv.json b/MLEB/Translate/i18n/pagetranslation/sv.json
index 2d3e2c5a..c6b0e2e5 100644
--- a/MLEB/Translate/i18n/pagetranslation/sv.json
+++ b/MLEB/Translate/i18n/pagetranslation/sv.json
@@ -20,8 +20,7 @@
"pagetranslation": "Sidöversättning",
"right-pagetranslation": "Märk versioner av sidor för översättning",
"action-pagetranslation": "hantera översättningsbara sidor",
- "tps-edit-sourcepage-title": "Redigerar en översättbar sida",
- "tps-edit-sourcepage-text": "Du redigerar en källan för en översättningssida. Se till att du är bekant med följande dokumentation: \n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Ändra källtexten]\n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration#Markup_examples Exempel på formatering att använda]",
+ "tps-edit-sourcepage-text": "Du redigerar källan för en översättningssida. Se till att du är bekant med följande dokumentation:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Ändra källtexten]\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Exempel på formatering att använda]",
"tps-edit-sourcepage-ve-warning-title": "Varning: Sidan stöds inte",
"tps-edit-sourcepage-ve-warning-text": "Du redigerar en översättbar sida. Denna redigerare har ännu inget officiellt stöd för att redigera dessa. Använd källtextredigeraren.",
"tps-edit-sourcepage-ve-warning-button": "OK",
@@ -42,6 +41,7 @@
"tpt-saveok": "Sidan [[:$1]] har märkts för översättning med {{PLURAL:$2|en översättningsdel|$2 översättningsdelar}}. Sidan kan nu <span class=\"plainlinks\">[$3 översättas]</span>.",
"tpt-saveok-first": "Du kan [[Special:PageMigration|importera befintlig översättning]] för denna sida (om det finns någon).",
"tpt-offer-notify": "Du kan <span class=\"plainlinks\">[$1 meddela översättare]</span> om den här sidan.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Se listan över översättbara sidor.]]",
"tpt-showpage-intro": "Nedanför finns nya, existerande och raderade översättningsenheter uppradade.\nInnan den här versionen märks för översättning, kontrollera att ändringarna i översättningsenheterna är minimala för att undvika extra arbete för översättarna.",
"tpt-mark-summary": "Den här versionen är märkt för översättning",
"tpt-mark-nochanges": "Inga ändringar att granska. Varken sidan eller befintliga översättningsenheter kommer att redigeras om denna sida märks för översättning.",
@@ -67,13 +67,15 @@
"tpt-sections-syntaxversion": "Syntaxversion",
"tpt-syntaxversion-text": "Denna sida använder för tillfället en gammal version av syntaxen för översättbara sidor. Den nya versionen kommer kapsla in oöversättbara avsnitt med en HTML-tagg för att indikera textens korrekta språk. Exempel: $1. Du kan använda den nya formateringssyntaxen $2 för att förhindra inkapsling där det inte behövs, som när man översätter attributet <code>title</code> för ett element. Det är inte möjligt att gå tillbaka till en gammal syntaxversion.",
"tpt-syntaxversion-label": "Använd senaste syntaxversionen för denna sida",
+ "tpt-transclusion": "Mallinkludering",
+ "tpt-transclusion-label": "Aktivera översättningsmedveten inkludering för denna sida",
"tpt-rev-mark": "markera för översättning",
"tpt-rev-unmark": "ta bort från översättning",
- "tpt-rev-discourage": "förhindra",
+ "tpt-rev-discourage": "avråd",
"tpt-rev-encourage": "återställ",
"tpt-rev-mark-tooltip": "Markera den senaste versionen av denna sida för översättning.",
"tpt-rev-unmark-tooltip": "Ta bort denna sida från översättning.",
- "tpt-rev-discourage-tooltip": "Förhindra vidare översättning på denna sida.",
+ "tpt-rev-discourage-tooltip": "Avråd vidare översättning på denna sida.",
"tpt-rev-encourage-tooltip": "Återställ denna sida till vanlig översättning.",
"translate-tag-translate-link-desc": "Översätt den här sidan",
"translate-tag-markthis": "Märk den här sidan för översättning",
@@ -82,26 +84,26 @@
"tpt-translation-intro": "Det här är en <span class=\"plainlinks\">[$1 översatt version]</span> av sidan [[$2]]. Översättningen är till $3 % färdig och uppdaterad.",
"tpt-translation-intro-fuzzy": "Föråldrade översättningar markeras på det här sättet.",
"tpt-languages-legend": "Andra språk:",
- "tpt-languages-zero": "Starta översättning för detta språk",
+ "tpt-languages-separator": "&#160;•&#32;",
+ "tpt-languages-zero": "Påbörja översättning för detta språk",
"tpt-languages-nonzero": "$1 ($2 % översatt)",
"tpt-tab-translate": "Översätt",
"tpt-target-page": "Den här sidan kan inte uppdateras manuellt. Den här sidan är en översättning av [[$1]] och översättningen kan uppdateras genom att använda [$2 översättningsverktyget].",
- "tpt-unknown-page": "Den här namnrymden är reserverad för översättningar av sidor. Sidan du försöker redigera verkar inte stämma överens med någon sida som är märkt för översättning.",
+ "tpt-unknown-page": "Den här namnrymden är reserverad för översättningar av sidor.\nSidan du försöker redigera verkar inte stämma överens med någon sida som är märkt för översättning.",
"tpt-translation-restricted": "Översättningar av denna sida har förhindrats av en översättningsadministratör.\n\nAnledningar: $1",
+ "tpt-translation-restricted-no-reason": "Översättning av en här sidan till det här språket hindrades av en översättningsadministratör.",
"tpt-discouraged-language-force-header": "Denna sida kan inte översättas till $1.",
"tpt-discouraged-language-force-content": "En översättningsadministratör har beslutat att denna sida enbart kan översättas till $1.",
"tpt-discouraged-language-header": "Översättning till $1 är inte en prioritet för denna sida.",
"tpt-discouraged-language-content": "En översättningsadministratör har beslutat att fokusera översättningsinsatserna till $1.",
"tpt-discouraged-language-force": "<strong>Denna sida kan inte översättas till $2.</strong>\n\nEn översättningsadministratör har beslutat att denna sida endast kan översättas till $3.",
- "tpt-discouraged-language": "<strong>Översättning till $2 är inte en prioritering på denna sida.</strong>\n\nEn översättningsadministratör har beslutat att fokusera översättning på $3.",
- "tpt-discouraged-language-reason": "Anledning: $1",
"tpt-priority-languages": "En översättningsadministratör har ställt in prioritetsspråken för denna grupp till $1.",
"tpt-priority-languages-force": "En översättningsadministratör har ändrat prioritetsspråket för denna grupp till $1. Det är inte tillåtet att översätta till andra språk.",
"tpt-render-summary": "Uppdaterar för att matcha den nya versionen av källpaketet",
"aggregategroups": "Samla grupper",
"tpt-aggregategroup-add": "Lägg till",
"tpt-aggregategroup-save": "Spara",
- "tpt-aggregategroup-add-new": "Lägg till en ny samlad grupp",
+ "tpt-aggregategroup-add-new": "Lägg till en ny samlingsgrupp",
"tpt-aggregategroup-new-name": "Namn:",
"tpt-aggregategroup-new-description": "Beskrivning (valfri):",
"tpt-aggregategroup-remove-confirm": "Är du säker på att du vill radera denna samlingsgrupp?",
@@ -156,7 +158,7 @@
"pt-movepage-list-pages": "Lista över sidor att flytta",
"pt-movepage-list-translation": "Översättnings{{PLURAL:$1|sida|sidor}}",
"pt-movepage-list-section": "Översättningsenhets{{PLURAL:$1|sida|sidor}}",
- "pt-movepage-list-translatable": "{{PLURAL:$1|Undersida|Undersidor}} markerades för översättning",
+ "pt-movepage-list-translatable": "{{PLURAL:$1|Undersida|Undersidor}} markerade för översättning",
"pt-movepage-list-translatable-note": "Dessa sidor måste flyttas separat.",
"pt-movepage-list-other": "{{PLURAL:$1|Annan undersida|Andra undersidor}}",
"pt-movepage-list-count": "Totalt $1 {{PLURAL:$1|sida|sidor}} att flytta och $2 {{PLURAL:$2|undersida|undersidor}}.",
diff --git a/MLEB/Translate/i18n/pagetranslation/sw.json b/MLEB/Translate/i18n/pagetranslation/sw.json
index 429596a9..52a870a0 100644
--- a/MLEB/Translate/i18n/pagetranslation/sw.json
+++ b/MLEB/Translate/i18n/pagetranslation/sw.json
@@ -10,7 +10,6 @@
"tpt-rev-encourage": "rejesha",
"translate-tag-translate-link-desc": "Tafsiri ukurasa huu",
"tpt-languages-legend": "Lugha zingine:",
- "tpt-discouraged-language-reason": "Sababu: $1",
"tpt-aggregategroup-add": "Ongeza",
"tpt-aggregategroup-save": "Hifadhi",
"pt-movepage-list-translatable-note": "Kurasa hizi lazima zihamishwe kila ukurasa kivyake"
diff --git a/MLEB/Translate/i18n/pagetranslation/ta.json b/MLEB/Translate/i18n/pagetranslation/ta.json
index b168aa82..7dec2b0c 100644
--- a/MLEB/Translate/i18n/pagetranslation/ta.json
+++ b/MLEB/Translate/i18n/pagetranslation/ta.json
@@ -44,7 +44,6 @@
"tpt-languages-zero": "இம் மொழியின் சிறிய மொழிபெயர்ப்பு",
"tpt-languages-nonzero": "$1 ($2% மொழிபெயர்க்கப்பட்டது)",
"tpt-translation-restricted": "இப்பக்கத்தை இந்த மொழிக்கு மொழிபெயர்ப்பது மொழிபெயர்ப்பு நிருவாகி ஒருவரால் காக்கப்பட்டுள்ளது.\n\nகாரணம்: $1",
- "tpt-discouraged-language-reason": "காரணம்: $1",
"tpt-aggregategroup-add": "சேர்",
"tpt-aggregategroup-save": "சேமி",
"tpt-aggregategroup-new-name": "பெயர்:",
diff --git a/MLEB/Translate/i18n/pagetranslation/tcy.json b/MLEB/Translate/i18n/pagetranslation/tcy.json
index 6e26978e..1dd4574e 100644
--- a/MLEB/Translate/i18n/pagetranslation/tcy.json
+++ b/MLEB/Translate/i18n/pagetranslation/tcy.json
@@ -22,7 +22,6 @@
"tpt-languages-zero": "ಈ ಬಾಸೆಡ್ ಅನುವಾದ ಸುರು ಮಾನ್ಪಿ",
"tpt-languages-nonzero": "$1($2% ತರ್ಜುಮೆ ಆತ್‌ಂಡ್)",
"tpt-tab-translate": "ಅನುವಾದ ಮಲ್ಪುಲೆ",
- "tpt-discouraged-language-reason": "ಕಾರಣ: $1",
"tpt-aggregategroup-add": "ಸೇರಾಲೆ",
"tpt-aggregategroup-save": "ಒರಿಪಾಲೆ",
"tpt-aggregategroup-new-name": "ಪುದರ್:",
diff --git a/MLEB/Translate/i18n/pagetranslation/ti.json b/MLEB/Translate/i18n/pagetranslation/ti.json
index 60ca78ad..dc405209 100644
--- a/MLEB/Translate/i18n/pagetranslation/ti.json
+++ b/MLEB/Translate/i18n/pagetranslation/ti.json
@@ -4,8 +4,9 @@
"Joanmp17"
]
},
- "translate-tag-translate-link-desc": "እዚ ገጽ ተርጎመ",
- "tpt-tab-translate": "ተርጎመ",
+ "translate-tag-translate-link-desc": "እዚ ገጽ ተርጉም",
+ "tpt-languages-legend": "ካልኦት ቋንቋታት፦",
+ "tpt-tab-translate": "ተርጉም",
"tpt-aggregategroup-add": "ወስኽ",
"tpt-aggregategroup-save": "ኣቐምጥ",
"tpt-aggregategroup-update": "ኣቐምጥ",
diff --git a/MLEB/Translate/i18n/pagetranslation/tk.json b/MLEB/Translate/i18n/pagetranslation/tk.json
index 34727590..27428dbf 100644
--- a/MLEB/Translate/i18n/pagetranslation/tk.json
+++ b/MLEB/Translate/i18n/pagetranslation/tk.json
@@ -4,5 +4,6 @@
"Hanberke"
]
},
- "pagetranslation": "Terjime sahypasy"
+ "pagetranslation": "Terjime sahypasy",
+ "tpt-languages-nonzero": "$1 ($2% terjime edildi)"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/tl.json b/MLEB/Translate/i18n/pagetranslation/tl.json
index 7c462da9..56cc4bcd 100644
--- a/MLEB/Translate/i18n/pagetranslation/tl.json
+++ b/MLEB/Translate/i18n/pagetranslation/tl.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"AnakngAraw",
+ "GinawaSaHapon",
"Jewel457",
"Sky Harbor"
]
@@ -56,13 +57,11 @@
"tpt-languages-legend": "Iba pang mga wika:",
"tpt-languages-separator": "&#160;•&#32;",
"tpt-languages-zero": "Simulan ang pagsasalinwika para sa wikang ito",
- "tpt-languages-nonzero": "$1 ($2% naisalin)",
+ "tpt-languages-nonzero": "$1 ($2% nasalin)",
"tpt-target-page": "Hindi maaaring kinakamay na maisapanahon ang pahinang ito.\nAng pahinang ito ay isang salinwika ng pahinang [[$1]] at maisasapanahon ang salinwika sa pamamagitan ng [$2 kasangkapang pansalinwika].",
"tpt-unknown-page": "Nakalaan ang puwang na pampangalang ito para sa mga salinwika ng pahina ng nilalaman.\nTila hindi tumutugma ang pahinang sinusubukan mong baguhin sa anumang pahinang natatakan para sa pagsasalinwika.",
"tpt-translation-restricted": "Ang pagsasalinwika ng pahinang ito na papunta sa wikang ito ay pinigilan ng isang tagapangasiwa ng salinwika.\n\nDahilan: $1",
"tpt-discouraged-language-force": "<strong>Ang pahinang ito ay hindi maisasalinwika upang maging $2.</strong>\n\nIsang tagapangasiwa ng pagsasalinwika ang nagpasya na ang pahinang ito ay maisasalinwika lamang papunta sa $3.",
- "tpt-discouraged-language": "<strong>Ang pagsasalinwika papunta sa $2 ay hindi isang nararapat na unahin para sa pahinang ito.</strong>\n\nIsang tagapangasiwa ng salinwika ang nagpasyang ituon ang mga pagsisikap ng pagsasalinwika sa $3.",
- "tpt-discouraged-language-reason": "Dahilan: $1",
"tpt-priority-languages": "Isang tagapangasiwa ng salinwika ang nagtakda ng mga wikang nararapat na unahin para sa pangkat na ito upang maging $1.",
"tpt-render-summary": "Isinasapanahon upang tumugma sa bagong bersyon ng pinagmulang pahina",
"aggregategroups": "Mga pangkat na pinagsama-sama",
diff --git a/MLEB/Translate/i18n/pagetranslation/tly.json b/MLEB/Translate/i18n/pagetranslation/tly.json
index d5a6ee5d..86329184 100644
--- a/MLEB/Translate/i18n/pagetranslation/tly.json
+++ b/MLEB/Translate/i18n/pagetranslation/tly.json
@@ -1,9 +1,11 @@
{
"@metadata": {
"authors": [
- "Patriot Kur"
+ "Patriot Kur",
+ "Гусейн"
]
},
+ "tpt-languages-nonzero": "$1 ($2% peqordıniyə bıə)",
"tpt-aggregategroup-edit-description": "Təsvir",
"tpt-aggregategroup-update-cancel": "Ləğv karde",
"pm-cancel-button-label": "Ləğv karde",
diff --git a/MLEB/Translate/i18n/pagetranslation/tr.json b/MLEB/Translate/i18n/pagetranslation/tr.json
index 16707358..1dc53c83 100644
--- a/MLEB/Translate/i18n/pagetranslation/tr.json
+++ b/MLEB/Translate/i18n/pagetranslation/tr.json
@@ -11,8 +11,12 @@
"Mavrikant",
"McAang",
"Meelo",
+ "MuratTheTurkish",
+ "Pols12",
"Rapsar",
+ "SaldırganSincap",
"Sayginer",
+ "Sezgin İbiş",
"Suelnur",
"Vito Genovese",
"Ömer Berkay"
@@ -21,8 +25,7 @@
"pagetranslation": "Çeviri sayfası",
"right-pagetranslation": "Çeviri için sayfaların sürümlerini işaretle",
"action-pagetranslation": "çevrilebilir sayfaları yönet",
- "tps-edit-sourcepage-title": "Çevrilebilir bir sayfayı düzenleniyor",
- "tps-edit-sourcepage-text": "Bir kaynak çeviri sayfasını düzenliyorsunuz. Lütfen aşağıdaki belgelere aşina olduğunuzdan emin olun:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Kaynak metnin değiştirilmesi]\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Kullanılacak biçimlendirme örneği]",
+ "tps-edit-sourcepage-text": "Bir kaynak çeviri sayfasını düzenliyorsunuz. Lütfen aşağıdaki belgelere aşina olduğunuzdan emin olun:\n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration/tr#Changing_the_source_text Kaynak metnin değiştirilmesi]\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration/tr#Markup_examples Kullanılacak biçimlendirme örneği]",
"tps-edit-sourcepage-ve-warning-title": "Uyarı: Desteklemeyen sayfa",
"tps-edit-sourcepage-ve-warning-text": "Çevrilebilir bir sayfayı düzenliyorsunuz. Bunları bu düzenleyicide düzenlemek henüz resmi olarak desteklenmemektedir. Lütfen kaynak düzenleyiciyi kullanın.",
"tps-edit-sourcepage-ve-warning-button": "Tamam",
@@ -39,10 +42,11 @@
"tpt-badtitle": "Verilen sayfa adı ($1) geçerli bir başlık değil",
"tpt-nosuchpage": "$1 sayfası mevcut değil",
"tpt-oldrevision": "$2, [[:$1]] sayfasının en son sürümü değil.\nYalnızca en son sürümler çeviri için işaretlenebilir.",
- "tpt-notsuitable": "$1 sayfası çevrilmeye uygun değil.\n<nowiki><translate></nowiki> etiketine ve geçerli bir sözdizimine sahip olduğundan emin olun.",
+ "tpt-notsuitable": "$1 sayfası çevrilmeye uygun değil.\n&lt;translate> etiketine ve geçerli bir sözdizimine sahip olduğundan emin olun.",
"tpt-saveok": "[[:$1]] sayfası $2 çeviri birimi ile çeviri için işaretlenmiş.\nSayfa artık <span class=\"plainlinks\">[$3 çevrilebilir]</span>.",
"tpt-saveok-first": "Bu sayfa için (varsa) [[Special:PageMigration|önceden var olan çeviriyi içe aktarabilirsiniz]].",
"tpt-offer-notify": "Çevirmenleri bu sayfa hakkında <span class=\"plainlinks\">[$1 bilgilendirebilirsiniz]</span>.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Çevrilebilir sayfa listesine görüntüleyin.]]",
"tpt-showpage-intro": "Aşağıda yeni, mevcut ve silinmiş çeviri birimleri listelenmiştir.\nBu sürümü çeviri için işaretlemeden önce, çevirmenlerin gereksiz çalışmasını önlemek için çeviri birimlerindeki değişikliklerin en aza indirildiğini kontrol edin.",
"tpt-mark-summary": "Bu sürüm çeviri için işaretlendi",
"tpt-mark-nochanges": "İncelenecek değişiklik yok. Çeviri için bu sayfayı işaretlemek sayfayı veya mevcut çeviri birimini düzenlemez.",
@@ -61,6 +65,7 @@
"tpt-outdated-pages": "{{PLURAL:$1|Bu sayfa|Bu sayfalar}} çeviri değişikleri işaretlenmemiş.",
"tpt-tag-discouraged": "vazgeçti",
"tpt-tag-oldsyntax": "eski söz dizimi",
+ "tpt-tag-no-transclusion-support": "yansıtma desteği yok",
"tpt-select-prioritylangs": "Öncelikli dil kodlarının virgülle ayrılmış listesi:",
"tpt-select-prioritylangs-force": "Öncelikli diller dışındaki dillere çevirileri önle",
"tpt-select-prioritylangs-reason": "Sebep:",
@@ -68,6 +73,8 @@
"tpt-sections-syntaxversion": "Söz dizimi sürümü",
"tpt-syntaxversion-text": "Bu sayfa şu anda çevrilebilir sayfa kaynağı sözdiziminin eski bir sürümünü kullanmaktadır. Yeni sürüm, metnin doğru dilini belirtmek için çevrilmemiş bölümleri bir HTML etiketi ile sarar. Örnek: $1. Bir öğenin <code>title</code> özelliğini çevirirken olduğu gibi, uygun olmayan yerlerde her tür kaydırmayı önlemek için yeni bir biçimlendirme sözdizimi $2 kullanabilirsiniz. Eski bir sözdizimi sürümüne geri dönmek mümkün değildir.",
"tpt-syntaxversion-label": "Bu sayfa için en son sözdizimi sürümünü kullanın",
+ "tpt-transclusion": "Şablon yansıtması",
+ "tpt-transclusion-label": "Bu sayfa için çeviriye duyarlı yansıtmayı etkinleştirin",
"tpt-rev-mark": "çeviri için işaretle",
"tpt-rev-unmark": "çeviriden kaldır",
"tpt-rev-discourage": "vazgeç",
@@ -86,16 +93,15 @@
"tpt-languages-zero": "Bu dili için çeviriyi başlatın",
"tpt-languages-nonzero": "$1 (%$2 çevrildi)",
"tpt-tab-translate": "Çevir",
- "tpt-target-page": "Bu sayfa manüel olarak güncellenemez.\nBu sayfa [[$1]] sayfasının bir çevirisidir ve çeviri [$2 çeviri aracı] kullanılarak güncellenebilir.",
+ "tpt-target-page": "Bu sayfa elle güncellenemez.\nBu sayfa [[$1]] sayfasının bir çevirisidir ve çeviri, [$2 çeviri aracı] kullanılarak güncellenebilir.",
"tpt-unknown-page": "Bu ad alanı içerik sayfası çevirileri için ayrılmıştır.\nDüzenlemeye çalıştığınız sayfa, çeviri için işaretlenmiş hiçbir sayfaya karşılık gelmiyor gibi görünüyor.",
"tpt-translation-restricted": "Bu sayfanın bu dile çevirisi çeviri hizmetlisi tarafından engellendi.\n\nSebep: $1",
+ "tpt-translation-restricted-no-reason": "Bu sayfanın bu dile çevrilmesi bir çeviri hizmetli tarafından engellendi.",
"tpt-discouraged-language-force-header": "Bu sayfa $1 ile çevrilemez.",
"tpt-discouraged-language-force-content": "Bir çeviri hizmetlisi bu sayfanın yalnızca $1 ile çevrilebileceğine karar verdi.",
"tpt-discouraged-language-header": "$1 ile çevirmek bu sayfaya bir öncelik değildir.",
"tpt-discouraged-language-content": "Bir çeviri hizmetlisi çeviri çabalarını $1 ile odaklamaya karar verdi.",
"tpt-discouraged-language-force": "<strong>Bu sayfa $2 ile çevrilemez.</strong>\n\nBir çeviri hizmetlisi bu sayfanın yalnızca $3 ile çevrilebileceğine karar verdi.",
- "tpt-discouraged-language": "<strong>$2 ile çevirmek bu sayfa için bir öncelik değil.</strong>\n\nBir çeviri hizmetlisi çeviri çabalarını $3 ile odaklamaya karar verdi.",
- "tpt-discouraged-language-reason": "Sebep: $1",
"tpt-priority-languages": "Bir çeviri hizmetlisi bu grup için öncelik dillerini $1 olarak ayarladı.",
"tpt-priority-languages-force": "Bir çeviri hizmetlisi bu grup için öncelik dillerini $1 olarak ayarladı. Başka dillere tercüme yapılamaz.",
"tpt-render-summary": "Kaynak sayfanın yeni sürümü ile eşleme için güncelleniyor",
@@ -115,7 +121,7 @@
"pt-parse-open": "Dengesiz &lt;translate> etiketi.\nÇeviri şablonu: <pre>$1</pre>",
"pt-parse-close": "Dengesiz &lt;translate> etiketi.\nÇeviri şablonu: <pre>$1</pre>",
"pt-parse-nested": "İç içe &lt;translate> çeviri birimlerine izin verilmez.\nEtiket metni: <pre>$1</pre>",
- "pt-shake-multiple": "Bir çeviri birimi için çoklu çeviri birimi işaretleri.\nÇeviri birimi metni: <pre>$1</pre>",
+ "pt-shake-multiple": "Bir çeviri birimi için çoklu çeviri birimi işaretleri.\nÇeviri birimlerinin boş satırlarla ayrıldığından emin olun.\nÇeviri birimi metni: <pre>$1</pre>",
"pt-shake-position": "Çeviri birimi işaretçileri beklenmedik bir konumda.\nÇeviri birimi metni: <pre>$1</pre>",
"pt-shake-empty": "\"$1\" işareti için boş çeviri birimi.",
"log-description-pagetranslation": "Sayfa çeviri sistemiyle ilgili eylemlerin günlüğü",
@@ -161,6 +167,7 @@
"pt-movepage-list-translatable-note": "Bu sayfalar ayrı olarak taşınmalıdır.",
"pt-movepage-list-other": "Diğer {{PLURAL:$1|alt sayfa|alt sayfalar}}",
"pt-movepage-list-count": "Toplam $1 taşınacak sayfa ve $2 alt sayfa.",
+ "pt-movepage-page-count-limit": "Bu çevrilebilir sayfa $1 fazladan sayfa içerir. Bu kadar çok sayfanın taşınmasının güvenilmez olduğu görüldü. Bunu bir bakım betiği aracılığıyla yapmak için lütfen hizmetli ile iletişime geçin.",
"pt-movepage-list-no-pages": "Sayfa bulunamadı.",
"pt-movepage-legend": "Çevrilebilir sayfayı taşı",
"pt-movepage-current": "Geçerli adı:",
@@ -210,7 +217,7 @@
"pm-swap-icon-hover-text": "Aşağıdaki birim ile değiştir",
"pm-delete-icon-hover-text": "Birimi sil",
"pm-pagetitle-placeholder": "Sayfa başlığı girin",
- "pm-pagetitle-invalid": "Lütfen geçerli bir sayfa başlığı girin. <page-name>/<language-code> biçiminde olmalıdır.",
+ "pm-pagetitle-invalid": "Lütfen geçerli bir sayfa başlığı girin. <sayfa-adı>/<dil-kodu> biçiminde olmalıdır.",
"pm-pagetitle-missing": "Lütfen sayfa adı girin.",
"pm-langcode-missing": "Başlıkta dil kodu eksik görünüyor. Lütfen sayfa başlığını <page-name>/<language-code> biçiminde girin.",
"pm-summary-import": "[[Special:PageMigration|Sayfa taşıma]] kullanarak içe aktarılan çevirisi",
@@ -219,6 +226,7 @@
"tpt-translate-title": "Sayfa başlığının çevirisine izin ver",
"pp-save-summary": "Sayfayı çeviri için hazırladı",
"pagepreparation": "Çeviri için sayfayı hazırlayın",
+ "pagepreparation-summary": "Çeviriye hazırlamak için bir sayfa başlığı belirtin.",
"pp-pagename-placeholder": "Sayfa adı girin",
"pp-prepare-button-label": "Hazırla",
"pp-save-button-label": "Yayımla",
diff --git a/MLEB/Translate/i18n/pagetranslation/tt-cyrl.json b/MLEB/Translate/i18n/pagetranslation/tt-cyrl.json
index d6e65cbd..db8d29c0 100644
--- a/MLEB/Translate/i18n/pagetranslation/tt-cyrl.json
+++ b/MLEB/Translate/i18n/pagetranslation/tt-cyrl.json
@@ -19,7 +19,6 @@
"tpt-languages-legend": "Башка телләр:",
"tpt-languages-nonzero": "$1 ($2% тәрҗемә ителгән)",
"tpt-tab-translate": "Тәрҗемә итү",
- "tpt-discouraged-language-reason": "Сәбәп: $1",
"tpt-aggregategroup-add": "Өстәү",
"tpt-aggregategroup-save": "Саклау",
"tpt-aggregategroup-new-name": "Исем:",
diff --git a/MLEB/Translate/i18n/pagetranslation/ug-arab.json b/MLEB/Translate/i18n/pagetranslation/ug-arab.json
index 1909087e..9bb6a356 100644
--- a/MLEB/Translate/i18n/pagetranslation/ug-arab.json
+++ b/MLEB/Translate/i18n/pagetranslation/ug-arab.json
@@ -30,7 +30,6 @@
"translate-tag-markthis": "تەرجىمە ئۈچۈن بۇ بەتكە بەلگە سال",
"tpt-languages-legend": "باشقا تىل",
"tpt-tab-translate": "تەرجىمە",
- "tpt-discouraged-language-reason": "سەۋەپ: $1",
"tpt-priority-languages": "تەرجىمە باشقۇرغۇچى بۇ گۇرۇپپا ئالدىن تەرجىمە قىلىدىغان تىلنى $1 غا تەڭشىدى.",
"tpt-render-summary": "ئەسلى بەت بىلەن ماسلىشىدىغان يېڭى نەشرىگە يېڭىلاۋاتىدۇ",
"aggregategroups": "توپلانما گۇرۇپپا",
diff --git a/MLEB/Translate/i18n/pagetranslation/uk.json b/MLEB/Translate/i18n/pagetranslation/uk.json
index 540bd2ef..d72d938e 100644
--- a/MLEB/Translate/i18n/pagetranslation/uk.json
+++ b/MLEB/Translate/i18n/pagetranslation/uk.json
@@ -12,6 +12,7 @@
"NickK",
"Olvin",
"Piramidion",
+ "Pols12",
"Prima klasy4na",
"Riwnodennyk",
"Vlad5250",
@@ -22,7 +23,6 @@
"pagetranslation": "Переклад сторінок",
"right-pagetranslation": "Позначення версій сторінок для перекладу",
"action-pagetranslation": "керування сторінками, які можна перекладати",
- "tps-edit-sourcepage-title": "Редагування перекладабельної сторінки",
"tps-edit-sourcepage-text": "Ви редагуєте джерело сторінки перекладу. Будь ласка, переконайтесь, що ви знайомі з документацією:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Редагування вихідного тексту] \n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples Приклади використання розмітки]",
"tps-edit-sourcepage-ve-warning-title": "Попередження: Непідтримувана сторінка",
"tps-edit-sourcepage-ve-warning-text": "Ви редагуєте перекладабельну сторінку. Редагування таких сторінок в цьому редакторі ще не підтримується офіційно. Будь ласка, скористайтесь редактором коду.",
@@ -44,6 +44,7 @@
"tpt-saveok": "Сторінка [[:$1]] була відмічена для перекладу і містить $2 {{PLURAL:$2|блок перекладу|блоки перекладу|блоків перекладу}}.\nТепер сторінку можна <span class=\"plainlinks\">[$3 перекладати]</span>.",
"tpt-saveok-first": "Ви можете [[Special:PageMigration|імпортувати існуючий переклад]] цієї сторінки (якщо є).",
"tpt-offer-notify": "Ви можете <span class=\"plainlinks\">[$1 повідомити перекладачів]</span> про цю сторінку.",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|Переглянути список перекладних сторінок.]]",
"tpt-showpage-intro": "Нижче наведені нові, існуючі та видалені блоки перекладу.\nПеред тим, які відмітити цю версію для перекладу, переконайтесь, що зміни в блоках перекладу будуть мінімальними, щоб уникнути необов'язкової роботи для перекладачів.",
"tpt-mark-summary": "Позначено цю версію для перекладу",
"tpt-mark-nochanges": "Немає змін для перегляду. Позначення цієї сторінки на переклад не змінить ні сторінку, ні жоден блок перекладу.",
@@ -91,13 +92,12 @@
"tpt-target-page": "Ця сторінка не може бути оновлена вручну.\nЦе – переклад сторінки [[$1]] і його можна оновити за допомогою [$2 засобу перекладу].",
"tpt-unknown-page": "Цей простір назв зарезервовано для перекладів текстів сторінок.\nСторінка, яку Ви намагаєтесь редагувати, скоріше за все, не відповідає жодній сторінці, відміченій для перекладу.",
"tpt-translation-restricted": "Адміністратор перекладу заборонив переклад цієї сторінки такою мовою.\n\nПричина: $1",
+ "tpt-translation-restricted-no-reason": "Переклад цієї сторінки на цю мову було заборонено адміністратором перекладу.",
"tpt-discouraged-language-force-header": "Ця сторінка не може бути перекладена на $1.",
"tpt-discouraged-language-force-content": "Адміністратор перекладів вирішив, що ця сторінка може бути перекладена лише на $1.",
"tpt-discouraged-language-header": "Переклад на $1 не є пріоритетним для цієї сторінки.",
"tpt-discouraged-language-content": "Адміністратор перекладів вирішив зосередити зусилля з перекладу на $1.",
"tpt-discouraged-language-force": "<strong>Ця сторінка не може бути перекладена мовою $2.</strong>\n\nАдміністратор перекладу вирішив, що ця сторінка може бути перекладена лише такими мовами: $3",
- "tpt-discouraged-language": "<strong>Переклад мовою $2 не є пріоритетним для цієї сторінки.</strong>\n\nАдміністратор вирішив зосередити зусилля на перекладі такими мовами: $3.",
- "tpt-discouraged-language-reason": "Причина:$1",
"tpt-priority-languages": "Адміністратор перекладу визначив для цієї групи пріоритетні мови $1.",
"tpt-priority-languages-force": "Адміністратор перекладу встановив $1 як пріоритетні мови для цієї групи. Переклад іншими мовами не дозволений.",
"tpt-render-summary": "Оновлення для відповідності новій версії вихідної сторінки",
@@ -117,7 +117,7 @@
"pt-parse-open": "Незбалансований тег &lt;translate>.\nШаблон перекладу: <pre>$1</pre>",
"pt-parse-close": "Незбалансований тег &lt;/translate>.\nШаблон перекладу: <pre>$1</pre>",
"pt-parse-nested": "Вкладати один блок перекладу &lt;translate> до іншого не допускається.\nТекст тегу: <pre>$1</pre>",
- "pt-shake-multiple": "Декілька маркерів блоку перекладу для одного блоку.\nТекст блоку перекладу: <pre>$1</pre>",
+ "pt-shake-multiple": "Декілька маркерів блоку перекладу для одного блоку.\nПереконайтеся, що блоки перекладу розділені порожніми рядками.\nТекст блоку перекладу: <pre>$1</pre>",
"pt-shake-position": "Маркери блоку перекладу в неочікуваному місці.\nТекст блоку: <pre>$1</pre>",
"pt-shake-empty": "Порожній блок перекладу під маркером \"$1\".",
"log-description-pagetranslation": "Журнал для дій, пов'язаних з системою перекладу сторінок.",
@@ -214,7 +214,7 @@
"pm-pagetitle-placeholder": "Введіть назву сторінки",
"pm-pagetitle-invalid": "Будь ласка, введіть правильну назву сторінки. Вона має бути в форматі <назва-сторінки>/<код-мови>.",
"pm-pagetitle-missing": "Будь ласка, введіть назву сторінки.",
- "pm-langcode-missing": "Схоже, що код мови відсутній у назві. Будь ласка, введіть назву сторінки у форматі <назва-сторінки>/<код-мови>.",
+ "pm-langcode-missing": "Схоже, що код мови відсутній у назві. Будь ласка, введіть назву сторінки у форматі <page-name>/<language-code>.",
"pm-summary-import": "Імпортований переклад за допомогою [[Special:PageMigration|міграції сторінок]]",
"pm-on-import-message-text": "Було імпортовано старі переклади. Використайте опції додавання, зміни та вилучення блоків перекладу та натисніть на кнопку «{{int:pm-savepages-button-label}}» для їх збереження. Натисніть на кнопку «{{int:pm-cancel-button-label}}» для скасування.",
"pm-on-save-message-text": "Блоки перекладу було збережено. Тепер Ви можете ввести назву нової сторінки перекладу для її міграції, або зробити зміни до блоків нижче й зберегти нове редагування.",
diff --git a/MLEB/Translate/i18n/pagetranslation/ur.json b/MLEB/Translate/i18n/pagetranslation/ur.json
index 0e3beeff..b9ca9246 100644
--- a/MLEB/Translate/i18n/pagetranslation/ur.json
+++ b/MLEB/Translate/i18n/pagetranslation/ur.json
@@ -37,7 +37,6 @@
"tpt-languages-zero": "اس زبان کے لئے ترجمہ شروع",
"tpt-languages-nonzero": "$1 ($2% ترجمہ ہوا)",
"tpt-tab-translate": "ترجمہ کریں",
- "tpt-discouraged-language-reason": "وجہ: $1",
"tpt-aggregategroup-add": "شامل کریں",
"tpt-aggregategroup-save": "محفوظ کریں",
"tpt-aggregategroup-add-new": "ایک نیا میرا گروپ شامل کریں",
diff --git a/MLEB/Translate/i18n/pagetranslation/vi.json b/MLEB/Translate/i18n/pagetranslation/vi.json
index 07950fd5..386a745b 100644
--- a/MLEB/Translate/i18n/pagetranslation/vi.json
+++ b/MLEB/Translate/i18n/pagetranslation/vi.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Minh Nguyen",
+ "Pols12",
"Trần Nguyễn Minh Huy",
"Vinhtantran"
]
@@ -68,8 +69,6 @@
"tpt-discouraged-language-header": "Việc biên dịch ra $1 không phải là một ưu tiên cho trang này.",
"tpt-discouraged-language-content": "Một người quản lý biên dịch đã quyết định chú trọng vào việc biên dịch ra $1.",
"tpt-discouraged-language-force": "<strong>Không thể biên dịch trang này ra $2.</strong>\n\nMột người quản lý biên dịch chỉ cho phép dịch trang ra $3.",
- "tpt-discouraged-language": "<strong>Việc biên dịch ra $2 không phải là một ưu tiên cho trang này.</strong>\n\nMột người quản lý biên dịch đã quyết định chú trọng vào việc biên dịch ra $3.",
- "tpt-discouraged-language-reason": "Lý do: $1",
"tpt-priority-languages": "Một người quản lý biên dịch đã đặt các ngôn ngữ quan trọng của nhóm này là $1.",
"tpt-render-summary": "Cập nhật đến phiên bản mới của trang nguồn",
"aggregategroups": "Nhóm tập hợp",
@@ -181,7 +180,7 @@
"pm-pagetitle-placeholder": "Nhập tên trang",
"pm-pagetitle-invalid": "Xin vui lòng nhập một tên trang hợp lệ. Nên sử dụng định dạng <tên-trang>/<mã-ngôn-ngữ>.",
"pm-pagetitle-missing": "Vui lòng nhập tên trang.",
- "pm-langcode-missing": "Hình như tên trang thiếu mã ngôn ngữ. Xin vui lòng nhập tên trang ở dạng <tên-trang>/<mã-ngôn-ngữ>.",
+ "pm-langcode-missing": "Hình như tên trang thiếu mã ngôn ngữ. Xin vui lòng nhập tên trang ở dạng <page-name>/<language-code>.",
"pm-summary-import": "Đã nhập bản dịch bằng cách [[Special:PageMigration|chuyển trang]]",
"pm-on-import-message-text": "Các bản dịch cũ đã được nhập. Sử dụng các nút thêm, đổi, và xóa để chỉnh sửa các đơn vị biên dịch và bấm nút “{{int:pm-savepages-button-label}}” để lưu chúng. Bấm nút “{{int:pm-cancel-button-label}}” để vứt bỏ.",
"pm-on-save-message-text": "Các đơn vị biên dịch đã được lưu. Bạn có thể điền tên của một trang dịch được để chuyển đổi nó hoặc thay đổi các đơn vị bên dưới và lưu phiên bản mới.",
diff --git a/MLEB/Translate/i18n/pagetranslation/yi.json b/MLEB/Translate/i18n/pagetranslation/yi.json
index a0abb362..49b68635 100644
--- a/MLEB/Translate/i18n/pagetranslation/yi.json
+++ b/MLEB/Translate/i18n/pagetranslation/yi.json
@@ -59,7 +59,6 @@
"tpt-discouraged-language-force-header": "מען קען נישט איבערזעצן דעם בלאט אויף $1.",
"tpt-discouraged-language-force-content": "אן איבערזעצונג־אדמיניסטראטאר האט באשלאסן אז דער בלעט קען מען איבערזעצן נאר אויף $1.",
"tpt-discouraged-language-header": "איבערזעצן אויף $1 איז נישט קיין פריאריטעט פאר דעם בלאט.",
- "tpt-discouraged-language-reason": "אורזאך: $1",
"tpt-aggregategroup-add": "צולייגן",
"tpt-aggregategroup-save": "אויפֿהיטן",
"tpt-aggregategroup-new-name": "נאָמען:",
@@ -125,7 +124,7 @@
"pm-page-does-not-exist": "$1 עקזיסטירט נישט",
"pm-old-translations-missing": "$1 אנטהאלט נישט קיין אלטע איבערזעצונגען",
"pm-delete-icon-hover-text": "אויסמעקן איינס",
- "pm-langcode-missing": "װײזט אױס אַז דער שפראַכקאד פֿעלט אין קעפל. ביטע איינגעבן בלאַטקעפל אין פֿארמאַט <בלאַטנאָמען>/<שפראַכקאד>.",
+ "pm-langcode-missing": "װײזט אױס אַז דער שפראַכקאד פֿעלט אין קעפל. ביטע איינגעבן בלאַטקעפל אין פֿארמאַט <page-name>/<language-code>.",
"pagepreparation": "צוגרייטן בלאט פאר איבערזעצונג",
"pp-pagename-placeholder": "אײַנגעבן בלאטנאמען",
"pp-prepare-button-label": "צוגרייטן",
diff --git a/MLEB/Translate/i18n/pagetranslation/zgh.json b/MLEB/Translate/i18n/pagetranslation/zgh.json
index 9403534a..e55de378 100644
--- a/MLEB/Translate/i18n/pagetranslation/zgh.json
+++ b/MLEB/Translate/i18n/pagetranslation/zgh.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
- "Amara-Amaziɣ"
+ "Amara-Amaziɣ",
+ "Hakim1bal"
]
},
- "tpt-languages-nonzero": "$1 ($2% ⵉⵜⵜⵓⵙⵓⵖⵍⵏ)"
+ "tpt-languages-nonzero": "$1 ($2% ⵉⵜⵜⵓⵙⵓⵖⵍⵏ)",
+ "tpt-aggregategroup-add": "ⵔⵏⵓ"
}
diff --git a/MLEB/Translate/i18n/pagetranslation/zh-hans.json b/MLEB/Translate/i18n/pagetranslation/zh-hans.json
index 2e0731a0..98990b24 100644
--- a/MLEB/Translate/i18n/pagetranslation/zh-hans.json
+++ b/MLEB/Translate/i18n/pagetranslation/zh-hans.json
@@ -5,7 +5,9 @@
"Anakmalaysia",
"Chenxiaoqino",
"Dimension",
+ "Func",
"Gzdavidwong",
+ "Hmgrmb",
"Hudafu",
"Hydra",
"Hzy980512",
@@ -16,6 +18,7 @@
"Mys 721tx",
"NigelSoft",
"PhiLiP",
+ "Pseudo Classes",
"Shirayuki",
"Shuiwater",
"Slboat",
@@ -35,7 +38,6 @@
"pagetranslation": "页面翻译",
"right-pagetranslation": "标记翻译的页面版本",
"action-pagetranslation": "管理可翻译页面",
- "tps-edit-sourcepage-title": "编辑一个可译的页面。",
"tps-edit-sourcepage-text": "你正在编辑一个源翻译页。请您确保对下面的文档非常熟悉:\n*\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text Changing the source text] \n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples 标记使用示例]",
"tps-edit-sourcepage-ve-warning-title": "警告:不支持的页面",
"tps-edit-sourcepage-ve-warning-text": "你正在编辑一个可译的界面。用这个编辑器编译这些还没有得到官方的支持。请用源编辑器编辑。",
@@ -73,6 +75,7 @@
"tpt-other-pages": "{{PLURAL:$1|此|这些}}页面的旧版本被标记翻译,但最新版本不能标记翻译。",
"tpt-tag-discouraged": "不建议",
"tpt-tag-oldsyntax": "旧的语法",
+ "tpt-tag-no-transclusion-support": "没有支持嵌入",
"tpt-select-prioritylangs": "优先语言代码的逗号分隔型列表",
"tpt-select-prioritylangs-force": "不允许向优先语言以外的语言的翻译",
"tpt-select-prioritylangs-reason": "原因:",
@@ -91,21 +94,19 @@
"translate-tag-markthisagain": "此页面自从最近被<span class=\"plainlinks\">[$2 标记翻译]</span>以来已有<span class=\"plainlinks\">[$1 更改]</span>。",
"translate-tag-hasnew": "此页面有未被标记进行翻译的<span class=\"plainlinks\">[$1 更改]</span>。",
"tpt-translation-intro": "本页是页面[[$2]]的<span class=\"plainlinks\">[$1 翻译版本]</span>,翻译工作已完成$3%。",
- "tpt-translation-intro-fuzzy": "已过时的翻译就会像这样标记。",
+ "tpt-translation-intro-fuzzy": "过时的翻译将会这样标记。",
"tpt-languages-legend": "其他语言:",
"tpt-languages-zero": "开始这种语言的翻译",
"tpt-languages-nonzero": "$1($2%已翻译)",
"tpt-tab-translate": "翻译",
"tpt-target-page": "本页面无法手动更新。本页面是[[$1]]页面的翻译版,可以使用[$2 翻译工具]来更新该翻译。",
- "tpt-unknown-page": "此名字空间是保留给内容页面翻译。您尝试编辑的页面似乎没有对应任何被标记进行翻译的页面。",
+ "tpt-unknown-page": "此名字空间为内容页面翻译保留。\n您尝试编辑的页面似乎没有对应任何被标记进行翻译的页面。",
"tpt-translation-restricted": "此页面到这种语言的翻译,已被翻译管理员禁止。\n\n原因:$1",
"tpt-discouraged-language-force-header": "此页面不能翻译成$1。",
"tpt-discouraged-language-force-content": "翻译管理员决定此页面只能翻译成$1。",
"tpt-discouraged-language-header": "此页面不应优先翻译成$1。",
- "tpt-discouraged-language-content": "翻译管理员决定将竭力翻译成$1。",
+ "tpt-discouraged-language-content": "一位翻译管理员决定将翻译工作的重点放在$1。",
"tpt-discouraged-language-force": "<strong>此页面不能翻译到$2。</strong>\n\n一名翻译管理员已决定,此页面仅可以翻译为$3。",
- "tpt-discouraged-language": "<strong>翻译此页面为$2并非首要任务。</strong>\n\n一名翻译管理员已在$3决定翻译工作的重点。",
- "tpt-discouraged-language-reason": "原因:$1",
"tpt-priority-languages": "翻译管理员已将该组需优先翻译的语言设为$1。",
"tpt-render-summary": "更新以匹配源页面内容的新版本",
"aggregategroups": "聚合组",
@@ -124,13 +125,13 @@
"pt-parse-open": "&lt;translate>标签不平衡。\n翻译模板:<pre>$1</pre>",
"pt-parse-close": "&lt;/translate>标签不平衡。\n翻译模板:<pre>$1</pre>",
"pt-parse-nested": "不允许嵌套&lt;translate>翻译单元。\n标签文本:<pre>$1</pre>",
- "pt-shake-multiple": "单一翻译单元含多个翻译单元标记。翻译单元文本:<pre>$1</pre>",
+ "pt-shake-multiple": "单一翻译单元含多个翻译单元标记。\n确保翻译单元由空白行分隔。\n翻译单元文本:<pre>$1</pre>",
"pt-shake-position": "翻译单元标记在意外位置。翻译单元文本:<pre>$1</pre>",
"pt-shake-empty": "为“$1”的翻译单位标记是空的。",
"log-description-pagetranslation": "页面翻译系统的对应活动日志",
"log-name-pagetranslation": "页面翻译日志",
"logentry-pagetranslation-mark": "$1将$3{{GENDER:$2|标记为}}需要翻译",
- "logentry-pagetranslation-unmark": "$1将$3从翻译中{{GENDER:$2|除去}}",
+ "logentry-pagetranslation-unmark": "$1将$3从翻译系统中{{GENDER:$2|移除}}",
"logentry-pagetranslation-moveok": "$1{{GENDER:$2|完成了}}翻译页面$3到$4的重命名",
"logentry-pagetranslation-movenok": "$1在移动页面$3到$4时{{GENDER:$2|遇到了}}一个问题",
"logentry-pagetranslation-deletefok": "$1{{GENDER:$2|完成了}}翻译页面$3的删除",
@@ -140,7 +141,7 @@
"logentry-pagetranslation-encourage": "$1{{GENDER:$2|支持}}$3的翻译",
"logentry-pagetranslation-discourage": "$1{{GENDER:$2|不支持}}$3的翻译",
"logentry-pagetranslation-prioritylanguages-unset": "$1已从翻译的页面$3的优先语言中被{{GENDER:$2|移除}}",
- "logentry-pagetranslation-prioritylanguages": "$1{{GENDER:$2|设置}}了此翻译页面的优先语言从$3到$5",
+ "logentry-pagetranslation-prioritylanguages": "$1将可翻译页面$3的优先语言{{GENDER:$2|设置}}为$5",
"logentry-pagetranslation-prioritylanguages-force": "$1认为$3到$5对此翻译页面的贡献{{GENDER:$2|很有限}}",
"logentry-pagetranslation-associate": "$1{{GENDER:$2|添加}}了翻译页面$3至信息组$4",
"logentry-pagetranslation-dissociate": "$1已在信息组$4的翻译页面$3中{{GENDER:$2|移除}}",
@@ -166,8 +167,8 @@
"pt-movepage-list-pages": "需移动页面的列表",
"pt-movepage-list-translation": "翻译{{PLURAL:$1|页面|页面}}",
"pt-movepage-list-section": "翻译单元{{PLURAL:$1|页面}}",
- "pt-movepage-list-other": "其他子{{PLURAL:$1|页面}}",
- "pt-movepage-list-count": "共移动$1个页面。",
+ "pt-movepage-list-other": "其他{{PLURAL:$1|子页面}}",
+ "pt-movepage-list-count": "共移动$1个{{PLURAL:$1|页面}}和$2个{{PLURAL:$2|子页面}}。",
"pt-movepage-legend": "移动可翻译页面",
"pt-movepage-current": "当前名称:",
"pt-movepage-new": "新名称:",
@@ -197,7 +198,7 @@
"pt-deletepage-list-translation": "翻译页面",
"pt-deletepage-list-section": "翻译单元页面",
"pt-deletepage-list-other": "其他子页面",
- "pt-deletepage-list-count": "共删除$1个页面。",
+ "pt-deletepage-list-count": "共删除$1个{{PLURAL:$1|页面}}及$2个{{PLURAL:$2|子页面}}。",
"pt-deletepage-full-logreason": "可翻译页面“$1”的一部分",
"pt-deletepage-lang-logreason": "翻译页面“$1”的一部分",
"pt-deletepage-started": "请检查[[Special:Log/pagetranslation|页面翻译日志]]内的错误和完成消息。",
diff --git a/MLEB/Translate/i18n/pagetranslation/zh-hant.json b/MLEB/Translate/i18n/pagetranslation/zh-hant.json
index 3367fe93..09eba1bd 100644
--- a/MLEB/Translate/i18n/pagetranslation/zh-hant.json
+++ b/MLEB/Translate/i18n/pagetranslation/zh-hant.json
@@ -11,6 +11,7 @@
"Liangent",
"Liuxinyu970226",
"Mark85296341",
+ "Pseudo Classes",
"Shirayuki",
"Simon Shek",
"TianyinLee",
@@ -24,8 +25,7 @@
"pagetranslation": "頁面翻譯",
"right-pagetranslation": "標記需要翻譯的頁面版本",
"action-pagetranslation": "管理可翻譯頁面",
- "tps-edit-sourcepage-title": "編輯可翻譯的頁面",
- "tps-edit-sourcepage-text": "您正在編輯來源翻譯頁面。請確認您有孰悉以下文件內容:\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Changing_the_source_text 更改來源文字] \n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration#Markup_examples 使用嵌入的範例]",
+ "tps-edit-sourcepage-text": "您正在編輯來源翻譯頁面。請確認您有孰悉以下文件內容:\n\n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration/zh#%E6%9B%B4%E6%94%B9%E6%BA%90%E6%96%87%E6%9C%AC 更改來源文字] \n* [https://www.mediawiki.org/wiki/Help:Extension:Translate/Page_translation_administration/zh#%E5%B5%8C%E5%85%A5%E9%83%A8%E5%88%86%E7%A4%BA%E4%BE%8B 使用嵌入的範例]",
"tps-edit-sourcepage-ve-warning-title": "警告:不支援的頁面",
"tps-edit-sourcepage-ve-warning-text": "您正在編輯可翻譯的頁面,目前尚不支援在此編輯器裡編輯這些內容。請使用原始碼編輯器。",
"tps-edit-sourcepage-ve-warning-button": "確定",
@@ -46,6 +46,7 @@
"tpt-saveok": "頁面 [[:$1]] 已被標記需要翻譯,包含 $2 個翻譯單元。\n現在已可 <span class=\"plainlinks\">[$3 翻譯]</span> 頁面。",
"tpt-saveok-first": "您可以替此頁面[[Special:PageMigration|匯入先前存在的翻譯]](如果有的話)。",
"tpt-offer-notify": "您可以 <span class=\"plainlinks\">[$1 通知翻譯人員]</span> 翻譯此頁。",
+ "tpt-list-pages-in-translations": "[[Special:PageTranslation|檢視可翻譯頁面清單。]]",
"tpt-showpage-intro": "下列為新的,已存在與已刪除的翻譯單元。\n在將此版本標記為需要翻譯之前,請先檢查翻譯單元已最小化,避免翻譯人員不必要的作業。",
"tpt-mark-summary": "已標記此版本用來翻譯",
"tpt-mark-nochanges": "沒有變更需要審查。標記此頁面需要翻譯不會編輯頁面,也沒有任何現有的翻譯單元。",
@@ -64,6 +65,7 @@
"tpt-outdated-pages": "{{PLURAL:$1|此頁面|這些頁面}}有未被標記為需要翻譯的更改",
"tpt-tag-discouraged": "不建議",
"tpt-tag-oldsyntax": "舊語法",
+ "tpt-tag-no-transclusion-support": "不支援內嵌",
"tpt-select-prioritylangs": "優先語言代碼 (以逗號分隔):",
"tpt-select-prioritylangs-force": "防止翻譯成優先語言以外的語言",
"tpt-select-prioritylangs-reason": "原因:",
@@ -71,6 +73,7 @@
"tpt-sections-syntaxversion": "語法版本",
"tpt-syntaxversion-text": "此頁面目前使用可翻譯頁面來源語法的舊版本。新版本會包住帶有 HTML 標籤的未翻譯段落,來指示出文字上的正確語言。例如:$1。您可以使用新標記語法$2來防止在不恰當地方做出這樣的動作,例如像是在翻譯帶有 <code>title</code> 屬性的元素。但請留意這樣做會無法返回到舊語法版本。",
"tpt-syntaxversion-label": "使用此頁面的最新語法版本",
+ "tpt-transclusion": "模板內嵌",
"tpt-rev-mark": "標記需要翻譯",
"tpt-rev-unmark": "從翻譯中刪除",
"tpt-rev-discourage": "不建議",
@@ -83,22 +86,21 @@
"translate-tag-markthis": "標記此頁面需要翻譯",
"translate-tag-markthisagain": "此頁面在 <span class=\"plainlinks\">[$2 標記需要翻譯]</span> 之後,已有 <span class=\"plainlinks\">[$1 變更]</span>。",
"translate-tag-hasnew": "此頁面包含未被標記用來翻譯的<span class=\"plainlinks\">[$1 變更]</span>。",
- "tpt-translation-intro": "此頁面為頁面 [[$2]] <span class=\"plainlinks\">[$1 翻譯後的版本]</span> 且翻譯完成進度為 $3%。",
- "tpt-translation-intro-fuzzy": "已過時的翻譯標記為這樣。",
+ "tpt-translation-intro": "此頁面為頁面[[$2]]的<span class=\"plainlinks\">[$1 翻譯版本]</span>,翻譯完成進度為$3%。",
+ "tpt-translation-intro-fuzzy": "過時的翻譯將會這樣標記。",
"tpt-languages-legend": "其他語言:",
"tpt-languages-zero": "開始翻譯此語言",
"tpt-languages-nonzero": "$1($2%已翻譯)",
"tpt-tab-translate": "翻譯",
"tpt-target-page": "此頁面無法手動更新。此頁面是頁面[[$1]]的翻譯版本,翻譯可使用[$2 翻譯工具]更新。",
"tpt-unknown-page": "此命名空間是保留給內容頁面翻譯使用。\n您嘗試編輯的頁面似乎不對應被標記需要翻譯的頁面。",
- "tpt-translation-restricted": "翻譯此頁面為此語言已被翻譯管理員禁止。\n\n原因:$1",
+ "tpt-translation-restricted": "將這個頁面翻譯成此語言已被翻譯管理員禁止。\n\n原因:$1",
+ "tpt-translation-restricted-no-reason": "將這個頁面翻譯成此語言已被翻譯管理員禁止。",
"tpt-discouraged-language-force-header": "此頁面無法翻譯為 $1。",
"tpt-discouraged-language-force-content": "翻譯管理員決定只將此頁面翻譯為 $1。",
"tpt-discouraged-language-header": "翻譯為 $1 並非此頁面優先的工作。",
"tpt-discouraged-language-content": "翻譯管理員決定全力將此頁面翻譯為 $1。",
"tpt-discouraged-language-force": "<strong>此頁面不能翻譯為 $2。</strong>\n\n翻譯管理員決定只將此頁面翻譯為 $3。",
- "tpt-discouraged-language": "<strong>翻譯為 $2 不是此頁面的優先工作。</strong>\n\n翻譯管理員決定全力將此頁面翻譯為 $3。",
- "tpt-discouraged-language-reason": "原因:$1",
"tpt-priority-languages": "翻譯管理員已將此群組的優先語言設為 $1。",
"tpt-priority-languages-force": "翻譯管理員已設定此群組的屬性語言成$1,不允許翻譯成其它語言。",
"tpt-render-summary": "正在更新來源頁面以與新版本相符",
@@ -118,7 +120,7 @@
"pt-parse-open": "&lt;translate> 標籤不對稱。\n翻譯模板:<pre>$1</pre>",
"pt-parse-close": "&lt;/translate> 標籤不對稱。\n翻譯模板:<pre>$1</pre>",
"pt-parse-nested": "不允許巢狀 &lt;translate> 翻譯單元。\n標籤內容:<pre>$1</pre>",
- "pt-shake-multiple": "一個翻譯單元中含多個翻譯單元標記。\n翻譯單元內容:<pre>$1</pre>",
+ "pt-shake-multiple": "一個翻譯單元中含多個翻譯單元標記。\n請確保翻譯單元是由空白行分隔。\n翻譯單元內容:<pre>$1</pre>",
"pt-shake-position": "翻譯單元標記在預期之外的位置。\n翻譯單元內容:<pre>$1</pre>",
"pt-shake-empty": "空的翻譯單元標記 \"$1\"。",
"log-description-pagetranslation": "頁面翻譯系統相關的操作日誌",
diff --git a/MLEB/Translate/i18n/sandbox/ce.json b/MLEB/Translate/i18n/sandbox/ce.json
index cbce1e27..9e85afcd 100644
--- a/MLEB/Translate/i18n/sandbox/ce.json
+++ b/MLEB/Translate/i18n/sandbox/ce.json
@@ -37,5 +37,5 @@
"log-description-translatorsandbox": "Гочдаран ловзаран майдан чохь декъашхоша бина хийцамаш",
"logentry-translatorsandbox-promoted": "$1 {{GENDER:$2|вина|йина}}$3 {{GENDER:$4|гочдархо}}.",
"logentry-translatorsandbox-rejected": "гочдархо статусан дехар $3 $1 {{GENDER:$2|юхадаьккхина}}.",
- "logentry-newusers-tsbpromoted": "Декъашхочун $3 дӀаяздар {{GENDER:$2|кхоьллина}} ловзаран майдан чура дӀаяздарх"
+ "logentry-newusers-tsbpromoted": "Декъашхочун $3 агӀо {{GENDER:$2|кхоьллина}} ловзаран майдан чура дӀаяздарх"
}
diff --git a/MLEB/Translate/i18n/sandbox/de.json b/MLEB/Translate/i18n/sandbox/de.json
index 0448a22e..08315adc 100644
--- a/MLEB/Translate/i18n/sandbox/de.json
+++ b/MLEB/Translate/i18n/sandbox/de.json
@@ -4,7 +4,8 @@
"J. 'mach' wust",
"Kghbln",
"Metalhead64",
- "Rillke"
+ "Rillke",
+ "Umherirrender"
]
},
"managetranslatorsandbox": "Übersetzer-Spielwiese konfigurieren",
@@ -21,7 +22,7 @@
"tsb-email-rejected-body": "Hallo $1,\n\nvielen Dank für deinen Antrag auf Beförderung {{GENDER:$1|zum Übersetzer|zur Übersetzerin}} auf {{SITENAME}}. Ich bedauere, dich informieren zu müssen, dass ich deinen Antrag abgelehnt habe, da die Qualität deiner Übersetzungen nicht den Anforderungen entspricht.\n\nFalls du denkst, dass dein Antrag durch einen Fehler abgelehnt wurde, versuche, deinen Übersetzerantrag auf {{SITENAME}} erneut einzureichen. Du kannst dich hier registrieren:\n$2\n\n$3,\n{{GENDER:$3|Mitarbeiter|Mitarbeiterin}} von {{SITENAME}}",
"tsb-request-count": "{{PLURAL:$1|Eine Anfrage|$1 Anfragen}}",
"tsb-all-languages-button-label": "Alle Sprachen",
- "tsb-search-requests": "Anfragen durchsuchen",
+ "tsb-search-requests": "Offene Anfragen durchsuchen",
"tsb-accept-button-label": "Akzeptieren",
"tsb-reject-button-label": "Ablehnen",
"tsb-selected-count": "{{PLURAL:$1|Ein|$1}} Benutzer ausgewählt",
diff --git a/MLEB/Translate/i18n/sandbox/diq.json b/MLEB/Translate/i18n/sandbox/diq.json
index 7875878e..462832dd 100644
--- a/MLEB/Translate/i18n/sandbox/diq.json
+++ b/MLEB/Translate/i18n/sandbox/diq.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "1917 Ekim Devrimi",
"Dılmıc",
"Gambollar",
"Gırd",
@@ -11,7 +12,7 @@
},
"tsb-request-count": "$1 {{PLURAL:$1|waştış|waştışi}}",
"tsb-all-languages-button-label": "Zıwani pêro",
- "tsb-search-requests": "Telebê cıgeyrayışi",
+ "tsb-search-requests": "Telebê cıgeyrayışê pawıteyan",
"tsb-accept-button-label": "Qebul ke",
"tsb-reject-button-label": "Red ke",
"tsb-selected-count": "{{PLURAL:$1|$1 kerber weçineya|$1 karberi weçineyay}}",
@@ -23,5 +24,5 @@
"translationstash": "Xeyr amey",
"translate-translationstash-skip-button-label": "Yewbina bıcerrebne",
"tsb-limit-reached-title": "Çarnayışê to rê teşekur kenime",
- "log-name-translatorsandbox": "Qumdora açarnayışi"
+ "log-name-translatorsandbox": "Roceka tadayışê qumdori"
}
diff --git a/MLEB/Translate/i18n/sandbox/fi.json b/MLEB/Translate/i18n/sandbox/fi.json
index 43e8fc4c..03569f03 100644
--- a/MLEB/Translate/i18n/sandbox/fi.json
+++ b/MLEB/Translate/i18n/sandbox/fi.json
@@ -22,7 +22,7 @@
"tsb-email-rejected-body": "Hei {{GENDER:$1|$1}},\n\nKiitos hakemuksestasi kääntäjänä {{GRAMMAR:inessive|{{SITENAME}}}}. Pahoittelen ilmoittaakseni sinulle että olen hylännyt hakemuksesi, koska käännöstesi laatu ei täyttänyt vaatimuksia.\n\nJos luulet, että hakemuksesi hylättiin vahingossa, yritä hakea uudelleen kääntäjäksi {{GRAMMAR:inessive|{{SITENAME}}}}. Voit rekisteröityä täällä: \n$2\n\n{{GENDER:$3|$3}},\n{{GRAMMAR:genitive|{{SITENAME}}}} henkilökunta",
"tsb-request-count": "$1 {{PLURAL:$1|hakemus|hakemusta}}",
"tsb-all-languages-button-label": "Kaikki kielet",
- "tsb-search-requests": "Hae hakemuksista",
+ "tsb-search-requests": "Hae odottavia pyyntöjä",
"tsb-accept-button-label": "Hyväksy",
"tsb-reject-button-label": "Hylkää",
"tsb-selected-count": "{{PLURAL:$1|$1 käyttäjä|$1 käyttäjää}} valittu",
diff --git a/MLEB/Translate/i18n/sandbox/fy.json b/MLEB/Translate/i18n/sandbox/fy.json
index 5a8dc8d1..5512369b 100644
--- a/MLEB/Translate/i18n/sandbox/fy.json
+++ b/MLEB/Translate/i18n/sandbox/fy.json
@@ -6,7 +6,49 @@
"Robin0van0der0vliet"
]
},
+ "managetranslatorsandbox": "Oersetterssânbak beheare",
+ "tsb-filter-pending": "Net-ôfdiene oanfragen",
+ "tsb-reminder-title-generic": "Meitsje jo yntroduksje dien en wurd oersetter",
+ "tsb-reminder-content-generic": "Goeie $1,\n\nTankjewol foar jo ynskriuwing by {{GRAMMAR:lidw|{{SITENAME}}}}.\n\nAt jo jo testoersettings dienmeitsje, sille de behearders jo sa gau mooglik dêrnei folsleine oersettagong jaan.\n\nKom del en meitsje hjir noch in pear oersettings:\n$2\n\n$3,\nStêf {{SITENAME}}",
+ "tsb-reminder-sending": "Werinnering ferstjoeren ...",
+ "tsb-reminder-sent": "{{PLURAL:$1|$1 werinnering ferstjoerd. Tiid: $2.|$1 werinnerings ferstjoerd. Tiid fan 'e lêste: $2.}}",
+ "tsb-reminder-sent-new": "Werinnering ferstjoerd",
+ "tsb-reminder-failed": "Werinnering ferstjoeren mislearre",
+ "tsb-email-promoted-subject": "Jo binne no oersetter by {{GRAMMAR:lidw|{{SITENAME}}}}",
+ "tsb-email-promoted-body": "Goeie {{GENDER:$1|$1}},\n\nLokwinske! Ik haw de testoersettings dy't jo by {{GRAMMAR:lidw|{{SITENAME}}}} makke hawwe neisjoen, en haw jo de folsleine oersettersrjochten jûn.\n\nKom nei {{GRAMMAR:lidw|{{SITENAME}}}} en gean fierder mei oersetten, no of hokker dei dan ek:\n$2\n\nWolkom, en tankjewol foar jo bydragen!\n\n{{GENDER:$3|$3}},\nStêf {{SITENAME}}",
+ "tsb-email-rejected-subject": "Jo oanmelding om oersetter te wurden by {{GRAMMAR:lidw|{{SITENAME}}}} is ôfwiisd",
+ "tsb-email-rejected-body": "Goeie {{GENDER:$1|$1}},\n\nTankjewol foar it oanmelden as oersetter by {{GRAMMAR:lidw|{{SITENAME}}}}. Spitigernôch moat ik jo meidiele dat ik jo oanmelding ôfwiisd haw, omreden dat de kwaliteit fan jo oersettings net oan 'e easken foldocht.\n\nAt jo tinke dat jo oanmelding by fersin ôfwiisd is, besykje dan nochris en meld jo oan as oersetter. Jo kinne hjir ynskriuwe:\n$2\n\n{{GENDER:$3|$3}},\nStêf {{SITENAME}}",
+ "tsb-request-count": "$1 {{PLURAL:$1|oanfraach|oanfragen}}",
+ "tsb-all-languages-button-label": "Alle talen",
+ "tsb-search-requests": "Net-ôfdiene oanfragen trochsykje",
+ "tsb-accept-button-label": "Goedkarre",
+ "tsb-reject-button-label": "Ofwize",
+ "tsb-selected-count": "{{PLURAL:$1|$1 meidogger selektearre|$1 meidoggers selektearre}}",
+ "tsb-older-requests": "$1 âldere {{PLURAL:$1|oanfraach|oanfragen}}",
+ "tsb-accept-all-button-label": "Alles goedkarre",
+ "tsb-reject-all-button-label": "Alles ôfwize",
+ "tsb-user-posted-a-comment": "Gjin oersetter",
+ "tsb-reminder-link-text": "Werinnering e-maile",
+ "tsb-didnt-make-any-translations": "Dizze meidogger hat gjin oersettings makke.",
+ "tsb-translations-source": "Grûntekst",
+ "tsb-translations-user": "Oersettings fan 'e {{GENDER:$1|meidogger}}",
+ "tsb-translations-current": "Besteande oersettings",
+ "tsb-delete-userpage-summary": "Meidoggerside fan in sânbakmeidogger wiske",
+ "tsb-reject-confirmation": "{{PLURAL:$1|Meidogger|Meidoggers}} ôfwiisd",
+ "tsb-accept-confirmation": "{{PLURAL:$1|Meidogger|Meidoggers}} goedkard",
"translationstash": "Wolkom",
+ "translate-translationstash-welcome": "Wolkom, $1. Jo binne in nije {{GENDER:$1|oersetter|oersetster}}",
+ "translate-translationstash-welcome-note": "Meitsje jo it oersetark eigen. Set in stikmannich berjochten oer, en krij de folsleine oersettersrjochten foar jo favorite projekten.",
+ "translate-translationstash-initialtranslation": "Jo earste oersetting",
+ "translate-translationstash-translations": "$1 {{PLURAL:$1|oersetting|oersettings}} makke",
+ "translate-translationstash-skip-button-label": "Oarenien besykje",
+ "tsb-limit-reached-title": "Tankjewol foar jo oersettings",
+ "tsb-limit-reached-body": "Jo hawwe de oersetbeheining foar nije oersetters berikt.\nUs tiim sil it sa gau mooglik neisjen en jo akkount opwurdearje.\nDan kinne jo oersette sûnder beheinings.",
+ "tsb-no-requests-from-new-users": "Gjin oanfragen fan nije meidoggers",
"tsb-create-user-page": "Ienfâldige meidoggerside oanmakke",
- "log-name-translatorsandbox": "Oersetsânbakloch"
+ "log-name-translatorsandbox": "Oersetsânbakloch",
+ "log-description-translatorsandbox": "In loch fan hannelings oangeande meidoggers yn 'e oersetsânbak",
+ "logentry-translatorsandbox-promoted": "$1 hat $3 ta {{GENDER:$4|oersetter}} {{GENDER:$2|promovearre}}",
+ "logentry-translatorsandbox-rejected": "$1 hat de oanfraach fan \"$3\" om oersetter te wurden {{GENDER:$2|ôfwiisd}}",
+ "logentry-newusers-tsbpromoted": "It meidochakkount $3 is by promoasje út 'e sânbak {{GENDER:$2|oanmakke}}"
}
diff --git a/MLEB/Translate/i18n/sandbox/he.json b/MLEB/Translate/i18n/sandbox/he.json
index 40141bfc..d4b72838 100644
--- a/MLEB/Translate/i18n/sandbox/he.json
+++ b/MLEB/Translate/i18n/sandbox/he.json
@@ -18,7 +18,7 @@
"tsb-email-rejected-body": "שלום $1,\n\nתודה על בקשתך להיות {{GENDER:$1|מתרגם|מתרגמת}} באתר {{SITENAME}}. אני {{GENDER:$3|מצטער|מצטערת}} להודיע לך שדחיתי את בקשתך משום שהאיכות של התרגומים שלך לא עמדה בדרישות.\n\nאם נראה לך שהבקשה נדחתה בטעות, {{GENDER:$1|נסה|נסי}} להירשם שוב בתור {{GENDER:$1|מתרגם|מתרגמת}} באתר {{SITENAME}} בכתובת הבאה:\n$2\n\n$3\nסגל {{SITENAME}}",
"tsb-request-count": "{{PLURAL:$1|בקשה אחת|$1 בקשות}}",
"tsb-all-languages-button-label": "כל השפות",
- "tsb-search-requests": "חיפוש בקשות",
+ "tsb-search-requests": "חיפוש בקשות ממתינות",
"tsb-accept-button-label": "לקבל",
"tsb-reject-button-label": "לדחות",
"tsb-selected-count": "{{PLURAL:$1|נבחר משתמש אחד|נבחרו $1 משתמשים}}",
diff --git a/MLEB/Translate/i18n/sandbox/hu.json b/MLEB/Translate/i18n/sandbox/hu.json
index 7a247e43..3d0aedb7 100644
--- a/MLEB/Translate/i18n/sandbox/hu.json
+++ b/MLEB/Translate/i18n/sandbox/hu.json
@@ -15,7 +15,7 @@
"tsb-email-rejected-subject": "A fordítói jelentkezésedet a(z) {{SITENAME}} wikin elutasították",
"tsb-request-count": "$1 kérés",
"tsb-all-languages-button-label": "Minden nyelv",
- "tsb-search-requests": "Keresés a kérések között",
+ "tsb-search-requests": "Keresés a függőben lévő kérések között",
"tsb-accept-button-label": "Elfogadás",
"tsb-reject-button-label": "Elutasítás",
"tsb-selected-count": "$1 felhasználó kiválasztva",
diff --git a/MLEB/Translate/i18n/sandbox/hy.json b/MLEB/Translate/i18n/sandbox/hy.json
new file mode 100644
index 00000000..5ede46a9
--- /dev/null
+++ b/MLEB/Translate/i18n/sandbox/hy.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kareyac"
+ ]
+ },
+ "tsb-all-languages-button-label": "Բոլոր լեզուները"
+}
diff --git a/MLEB/Translate/i18n/sandbox/hyw.json b/MLEB/Translate/i18n/sandbox/hyw.json
new file mode 100644
index 00000000..1f5dcdc3
--- /dev/null
+++ b/MLEB/Translate/i18n/sandbox/hyw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kareyac"
+ ]
+ },
+ "translationstash": "Բարի Եկաք"
+}
diff --git a/MLEB/Translate/i18n/sandbox/id.json b/MLEB/Translate/i18n/sandbox/id.json
new file mode 100644
index 00000000..aed3c9a0
--- /dev/null
+++ b/MLEB/Translate/i18n/sandbox/id.json
@@ -0,0 +1,52 @@
+{
+ "@metadata": {
+ "authors": [
+ "Daud I.F. Argana"
+ ]
+ },
+ "managetranslatorsandbox": "Kelola kotak pasir penerjemah",
+ "tsb-filter-pending": "Permohonan tertunda",
+ "tsb-reminder-title-generic": "Lengkapi perkenalan Anda untuk menjadi seorang penerjemah",
+ "tsb-reminder-content-generic": "Hai $1,\n\nTerima kasih telah mendaftar dengan {{SITENAME}}.\n\nJika Anda melengkapi tes penerjemahan ini, pengurus akan memberikan Anda akses terjemahan penuh.\n\nSilahkan datang dan buat lebih banyak terjemahan di sini:\n$2\n\n$3,\nStaf {{SITENAME}}",
+ "tsb-reminder-sending": "Sedang mengirim pengingat...",
+ "tsb-reminder-sent": "{{PLURAL:$1|Telah mengirim $1 pengingat. Waktu: $2.|Telah mengirim $1 pengingat. Waktu pengiriman terakhir: $2.}}",
+ "tsb-reminder-sent-new": "Pengingat telah dikirim",
+ "tsb-reminder-failed": "Pengingat gagal dikirim",
+ "tsb-email-promoted-subject": "Anda sekarang adalah seorang penerjemah di {{SITENAME}}",
+ "tsb-email-promoted-body": "Hai {{GENDER:$1|$1}},\n\nSelamat! Saya telah memeriksa tes terjemahan yang telah Anda lakukan di {{SITENAME}}, dan oleh sebab itu memberikan Anda hak penerjemah penuh.\n\nDatanglah ke {{SITENAME}} untuk terus menerjemahkan sekarang, dan setiap hari:\n$2\n\nSelamat datang dan terima kasih atas kontribusi anda!\n\n{{GENDER:$3|$3}},\nStaf {{SITENAME}}",
+ "tsb-email-rejected-subject": "Permohonan anda untuk menjadi penerjemah di {{SITENAME}} ditolak",
+ "tsb-email-rejected-body": "Hai {{GENDER:$1|$1}},\n\nTerima kasih karena memohon untuk menjadi penerjemah di {{SITENAME}}. Saya dengan sedih memberitahukan Anda bahwa saya telah menolak permohonan Anda karena mutu penerjemahan Anda tidak memenuhi syarat.\n\nJika Anda berpendapat bahwa penolakan permohonan Anda adalah kesalahan, silakan mencoba untuk memohon kembali sebagai penerjemah di {{SITENAME}}. Anda bisa mendaftar di sini:\n$2\n\n{{GENDER:$3|$3}},\nStaf {{SITENAME}}",
+ "tsb-request-count": "$1 {{PLURAL:$1|permohonan|permohonan}}",
+ "tsb-all-languages-button-label": "Semua bahasa",
+ "tsb-search-requests": "Cari permohonan tertunda",
+ "tsb-accept-button-label": "Terima",
+ "tsb-reject-button-label": "Tolak",
+ "tsb-selected-count": "{{PLURAL:$1|$1 pengguna dipilih|$1 pengguna dipilih}}",
+ "tsb-older-requests": "$1 {{PLURAL:$1|permohonan|permohonan}} yang lebih lama",
+ "tsb-accept-all-button-label": "Terima semua",
+ "tsb-reject-all-button-label": "Tolak semua",
+ "tsb-user-posted-a-comment": "Bukan penerjemah",
+ "tsb-reminder-link-text": "Kirim surel pengingat",
+ "tsb-didnt-make-any-translations": "Pengguna ini tidak membuat terjemahan apapun.",
+ "tsb-translations-source": "Sumber",
+ "tsb-translations-user": "Terjemahan {{GENDER:$1|pengguna}}",
+ "tsb-translations-current": "Terjemahan yang ada",
+ "tsb-delete-userpage-summary": "Menghapus halaman pengguna dari seorang pengguna kotak pasir",
+ "tsb-reject-confirmation": "{{PLURAL:$1|Pengguna|Pengguna}} ditolak",
+ "tsb-accept-confirmation": "{{PLURAL:$1|Pengguna|Pengguna}} diterima",
+ "translationstash": "Selamat datang",
+ "translate-translationstash-welcome": "Selamat datang, {{GENDER:$1|$1}}. Anda adalah seorang peneerjemah baru",
+ "translate-translationstash-welcome-note": "Biasakan diri dengan peralatan penerjemahan. Terjemahkan beberapa pesan dan dapatkan hak penerjemahan penuh untuk berpartisipasi di proyek-proyek favorit anda.",
+ "translate-translationstash-initialtranslation": "Terjemahan awal Anda",
+ "translate-translationstash-translations": "$1 menyelesaikan {{PLURAL:$1|terjemahan|terjemahan}}",
+ "translate-translationstash-skip-button-label": "Coba yang lainnya",
+ "tsb-limit-reached-title": "Terima kasih atas terjemahan Anda",
+ "tsb-limit-reached-body": "Anda telah mencapai batas penerjemahan untuk penerjemah baru.\nTim kami akan memeriksa dan memperbarui akun Anda segera.\nLalu Anda akan bisa menerjemahkan tanpa batas.",
+ "tsb-no-requests-from-new-users": "Tidak ada permohonan dari pengguna baru",
+ "tsb-create-user-page": "Membuat halaman pengguna dasar",
+ "log-name-translatorsandbox": "Catatan kotak pasir terjemahan",
+ "log-description-translatorsandbox": "Catatan tindakan kepada pengguna kotak pasir terjemahan",
+ "logentry-translatorsandbox-promoted": "$1 {{GENDER:$2|mengangkat}} $3 menjadi {{GENDER:$4|penerjemah}}",
+ "logentry-translatorsandbox-rejected": "$1 {{GENDER:$2|menolak}} permohonan dari \"$3\" untuk menjadi seorang penerjemah",
+ "logentry-newusers-tsbpromoted": "Akun pengguna $3 {{GENDER:$2|dibuat}} melalui promosi dari kotak pasir"
+}
diff --git a/MLEB/Translate/i18n/sandbox/kab.json b/MLEB/Translate/i18n/sandbox/kab.json
index cdf40346..71fed2e4 100644
--- a/MLEB/Translate/i18n/sandbox/kab.json
+++ b/MLEB/Translate/i18n/sandbox/kab.json
@@ -1,28 +1,29 @@
{
"@metadata": {
"authors": [
- "Belkacem77"
+ "Belkacem77",
+ "Bilalbill"
]
},
- "tsb-all-languages-button-label": "Akk tutlayin",
- "tsb-accept-all-button-label": "Qbel meṛṛa",
- "tsb-reject-all-button-label": "Agwi meṛṛa",
- "tsb-user-posted-a-comment": "Mačči d amsuqel",
+ "tsb-all-languages-button-label": "Tutlayin yakk",
+ "tsb-accept-all-button-label": "Ddeg yakk",
+ "tsb-reject-all-button-label": "Agwi yakk",
+ "tsb-user-posted-a-comment": "Mačči d amsuɣel",
"tsb-reminder-link-text": "Azen imayl n usmekti",
- "tsb-didnt-make-any-translations": "Aseqdac-agi ur isuqel ara yakan.",
+ "tsb-didnt-make-any-translations": "Aseqdac-agi ur yettwasuɣel ara yakan.",
"tsb-translations-source": "Aɣbalu",
"tsb-translations-user": "Tisiqilin n{{GENDER:$1|useqdac|tseqdact}}",
"tsb-translations-current": "Tisuqilin yellan",
"tsb-reject-confirmation": "{{PLURAL:$1|n usqdac yettwagwin|n iseqdacen yettwagwin}}",
- "tsb-accept-confirmation": "{{PLURAL:$1|n useqdac yettwaqeblen|n iseqdacen yettwaqeblen}}",
- "translationstash": "Anṣuf",
- "translate-translationstash-welcome": "Anṣuf {{GENDER:$1|$1}}, aqla-k d amsuqel amaynut",
- "translate-translationstash-initialtranslation": "Tasuqilt-ik tamezwarut",
- "translate-translationstash-translations": "Tfukeḍ $1 {{PLURAL:$1|n tsuqilt|n tsuqilin}}.",
- "translate-translationstash-skip-button-label": "Ɛreḍ tayeḍ",
+ "tsb-accept-confirmation": "{{PLURAL:$1|n useqdac yettwaddgen|n iseqdacen yettwaqeblen}}",
+ "translationstash": "Ansuf",
+ "translate-translationstash-welcome": "Ansuf {{GENDER:$1|$1}}, aqla-k d amsuɣel amaynut",
+ "translate-translationstash-initialtranslation": "Tasuɣlt-ik tamezwarut",
+ "translate-translationstash-translations": "Tfukkeḍ $1 {{PLURAL:$1|n tsuqilt|n tsuqilin}}.",
+ "translate-translationstash-skip-button-label": "Arem tayeḍ",
"tsb-limit-reached-title": "Tanemmirt ɣef tsuqilin-ik",
"tsb-no-requests-from-new-users": "Ulac tuttriwin n iseqdacen imaynuten",
"tsb-create-user-page": "Rnu asebter aseqdac azadur",
"logentry-translatorsandbox-promoted": "$1 {{GENDER:$2|yessuli}} $3 ar {{GENDER:$4|umsuqel|tamsuqelt}}.",
- "logentry-translatorsandbox-rejected": "$1 {{GENDER:$2|yugwi|tugwi}} asuter n $3 akken ad yuɣal d amsuqel"
+ "logentry-translatorsandbox-rejected": "$1 {{GENDER:$2|yugwi|tugwi}} asuter n $3 akken ad yuɣal d amsuɣel"
}
diff --git a/MLEB/Translate/i18n/sandbox/ku-latn.json b/MLEB/Translate/i18n/sandbox/ku-latn.json
index 9d9a05b8..fa656804 100644
--- a/MLEB/Translate/i18n/sandbox/ku-latn.json
+++ b/MLEB/Translate/i18n/sandbox/ku-latn.json
@@ -6,7 +6,7 @@
]
},
"tsb-all-languages-button-label": "Hemû ziman",
- "tsb-search-requests": "Lê daxwaziyan bigere",
+ "tsb-search-requests": "Li daxwaziyên li bendê bigere",
"tsb-accept-button-label": "Bipejirîne",
"tsb-translations-source": "Çavkanî"
}
diff --git a/MLEB/Translate/i18n/sandbox/pnb.json b/MLEB/Translate/i18n/sandbox/pnb.json
new file mode 100644
index 00000000..6f845db1
--- /dev/null
+++ b/MLEB/Translate/i18n/sandbox/pnb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "tsb-all-languages-button-label": "ساریاں بولیاں"
+}
diff --git a/MLEB/Translate/i18n/sandbox/pt-br.json b/MLEB/Translate/i18n/sandbox/pt-br.json
index 0a7b20dc..b98dceb3 100644
--- a/MLEB/Translate/i18n/sandbox/pt-br.json
+++ b/MLEB/Translate/i18n/sandbox/pt-br.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Fabsouza1",
"Felipe L. Ewald"
]
diff --git a/MLEB/Translate/i18n/sandbox/ro.json b/MLEB/Translate/i18n/sandbox/ro.json
index faecf9ee..d4adfe2f 100644
--- a/MLEB/Translate/i18n/sandbox/ro.json
+++ b/MLEB/Translate/i18n/sandbox/ro.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Minisarm",
+ "NGC 54",
"Strainu"
]
},
@@ -9,7 +10,7 @@
"tsb-filter-pending": "Cereri în așteptare",
"tsb-reminder-title-generic": "Finalizați-vă propria prezentare pentru a deveni un traducător",
"tsb-all-languages-button-label": "Toate limbile",
- "tsb-search-requests": "Căutare cereri",
+ "tsb-search-requests": "Căutare cereri în așteptare",
"tsb-accept-button-label": "Acceptă",
"tsb-reject-button-label": "Respinge",
"tsb-selected-count": "{{PLURAL:$1|$1 utilizator selectat|$1 utilizatori selectați|$1 de utilizatori selectați}}",
@@ -21,10 +22,11 @@
"tsb-translations-user": "Traducerile {{GENDER:$1|utilizatorului|utilizatoarei}}",
"tsb-translations-current": "Traduceri existente",
"translationstash": "Bun venit",
- "translate-translationstash-welcome": "Bune venit {{GENDER:$1|$1}}, sunteți un nou traducător",
+ "translate-translationstash-welcome": "Bun venit, {{GENDER:$1|$1}}, sunteți {{GENDER:$1|un nou traducător|o nouă traducătoare|un nou traducător}}",
"translate-translationstash-initialtranslation": "Traducerea dumnevoastră inițială",
"translate-translationstash-translations": "$1 {{PLURAL:$1|traducere finalizată|traduceri finalizate|de traduceri finalizate}}",
"translate-translationstash-skip-button-label": "Încercați o alta",
"tsb-limit-reached-title": "Mulțumim pentru traduceri",
- "tsb-no-requests-from-new-users": "Nicio cerere din partea utilizatorilor noi"
+ "tsb-no-requests-from-new-users": "Nicio cerere din partea utilizatorilor noi",
+ "log-name-translatorsandbox": "Jurnal traduceri cutie cu nisip"
}
diff --git a/MLEB/Translate/i18n/sandbox/sr-ec.json b/MLEB/Translate/i18n/sandbox/sr-ec.json
index 9bb467cf..45339904 100644
--- a/MLEB/Translate/i18n/sandbox/sr-ec.json
+++ b/MLEB/Translate/i18n/sandbox/sr-ec.json
@@ -2,16 +2,24 @@
"@metadata": {
"authors": [
"BadDog",
+ "Kizule",
"Milicevic01",
"Obsuser"
]
},
+ "managetranslatorsandbox": "Управљај песком преводиоца",
+ "tsb-filter-pending": "Захтеви на чекању",
+ "tsb-reminder-title-generic": "Довршите ваше представљање како би сте постали преводилац",
+ "tsb-reminder-sending": "Слање обавештења...",
"tsb-all-languages-button-label": "Сви језици",
"tsb-accept-button-label": "Прихвати",
"tsb-reject-button-label": "Одбиј",
"tsb-accept-all-button-label": "Прихвати све",
"tsb-reject-all-button-label": "Одбији све",
"tsb-translations-source": "Извор",
+ "translationstash": "Добро дошли!",
+ "translate-translationstash-welcome": "{{GENDER:$1|Добродошао $1|Добродошла $1}}, Ви сте нови преводилац",
+ "translate-translationstash-initialtranslation": "Ваш почетни превод",
"tsb-create-user-page": "Направљена основна корисничка страница",
"log-name-translatorsandbox": "Дневник превода у песку",
"logentry-translatorsandbox-promoted": "$1 је {{GENDER:$2|унапредио|унапредила}} $3 у {{GENDER:$4|преводиоца}}",
diff --git a/MLEB/Translate/i18n/sandbox/sv.json b/MLEB/Translate/i18n/sandbox/sv.json
index 4244d468..2c424b4a 100644
--- a/MLEB/Translate/i18n/sandbox/sv.json
+++ b/MLEB/Translate/i18n/sandbox/sv.json
@@ -4,6 +4,7 @@
"JohanahoJ",
"Jopparn",
"Lokal Profil",
+ "Sabelöga",
"WikiPhoenix"
]
},
@@ -21,7 +22,7 @@
"tsb-email-rejected-body": "Hej {{GENDER:$1|$1}},\n\nTack för att du ansöker om att bli översättare på {{SITENAME}}. Jag måste tyvärr meddela att jag har avslagit din ansökan, eftersom kvaliteten på dina översättningar inte uppfyllde kraven.\n\nOm du tror att din ansökan avslogs av misstag, var god försök att ansöka igen som en översättare på {{SITENAME}}. Du kan registrera dig här:\n$2\n\n{{GENDER:$3|$3}},\n{{SITENAME}} personal",
"tsb-request-count": "{{PLURAL:$1|En begäran|$1 begäran}}",
"tsb-all-languages-button-label": "Alla språk",
- "tsb-search-requests": "Sökbegäran",
+ "tsb-search-requests": "Sök bland väntande förfrågningar",
"tsb-accept-button-label": "Acceptera",
"tsb-reject-button-label": "Acceptera inte",
"tsb-selected-count": "{{PLURAL:$1|En användare vald|$1 användare valda}}",
diff --git a/MLEB/Translate/i18n/sandbox/th.json b/MLEB/Translate/i18n/sandbox/th.json
new file mode 100644
index 00000000..3c8322f6
--- /dev/null
+++ b/MLEB/Translate/i18n/sandbox/th.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aefgh39622"
+ ]
+ },
+ "tsb-all-languages-button-label": "ทุกภาษา",
+ "tsb-accept-button-label": "ยอมรับ",
+ "tsb-reject-button-label": "ปฏิเสธ",
+ "tsb-accept-all-button-label": "ยอมรับทั้งหมด",
+ "tsb-reject-all-button-label": "ปฏิเสธทั้งหมด",
+ "tsb-user-posted-a-comment": "ไม่ใช่ผู้แปล",
+ "tsb-translations-source": "ต้นฉบับ",
+ "tsb-translations-current": "การแปลที่มีอยู่",
+ "translationstash": "ยินดีต้อนรับ",
+ "translate-translationstash-welcome": "ยินดีต้อนรับ {{GENDER:$1|$1}} คุณเป็นผู้แปลใหม่",
+ "translate-translationstash-skip-button-label": "ลองอันอื่น",
+ "tsb-limit-reached-title": "ขอบคุณที่ร่วมแปล"
+}
diff --git a/MLEB/Translate/i18n/search/az.json b/MLEB/Translate/i18n/search/az.json
index 4e07de78..ec7f870f 100644
--- a/MLEB/Translate/i18n/search/az.json
+++ b/MLEB/Translate/i18n/search/az.json
@@ -1,7 +1,8 @@
{
"@metadata": {
"authors": [
- "Khan27"
+ "Khan27",
+ "Şeyx Şamil"
]
},
"searchtranslations": "Tərcümələri axtar",
@@ -12,5 +13,10 @@
"tux-sst-facet-language": "Dillər",
"tux-sst-facet-group": "Mesaj qrupları",
"tux-sst-nosolr-title": "Axtarış mümkün deyil",
- "tux-sst-nosolr-body": "Bu viki üçün tərcümə axtarış sistemi yoxdur."
+ "tux-sst-nosolr-body": "Bu viki üçün tərcümə axtarış sistemi yoxdur.",
+ "tux-sst-default": "Tərcümələr",
+ "tux-sst-translated": "$1 dilindən tərcümələr",
+ "tux-sst-untranslated": "$1 dilindən tərcümə yoxdur",
+ "tux-sst-ellipsis-untranslated": "Tərcümə yoxdur",
+ "tux-sst-ellipsis-outdated": "Köhnəlmiş tərcümələr"
}
diff --git a/MLEB/Translate/i18n/search/fy.json b/MLEB/Translate/i18n/search/fy.json
index d5423094..ea832823 100644
--- a/MLEB/Translate/i18n/search/fy.json
+++ b/MLEB/Translate/i18n/search/fy.json
@@ -1,11 +1,34 @@
{
"@metadata": {
"authors": [
+ "PiefPafPier",
"Robin van der Vliet",
"Robin0van0der0vliet"
]
},
+ "searchtranslations": "Oersettings sykje",
"tux-sst-edit": "Oersetting bewurkje",
+ "tux-sst-view-foreign": "Op $1 besjen",
"tux-sst-search": "Sykje",
- "tux-sst-facet-language": "Talen"
+ "tux-sst-search-ph": "Oersettings trochsykje",
+ "tux-sst-count": "{{PLURAL:$1|Ien treffer|$1 treffers}} fûn",
+ "tux-sst-facet-language": "Talen",
+ "tux-sst-facet-group": "Berjochtegroepen",
+ "tux-sst-nosolr-title": "Sykjen net beskikber",
+ "tux-sst-nosolr-body": "Dizze wiki hat gjin sykfunksje foar oersettings.",
+ "tux-sst-solr-offline-title": "Sykjen net beskikber",
+ "tux-sst-solr-offline-body": "De sykfunksje is tydlik net beskikber.",
+ "tux-sst-next": "Fierder ›",
+ "tux-sst-prev": "‹ Werom",
+ "tux-sst-default": "Oersettings",
+ "tux-sst-translated": "Oersettings fan $1",
+ "tux-sst-untranslated": "Gjin oersetting fan $1",
+ "tux-sst-outdated": "Ferâldere oersettings fan $1",
+ "tux-sst-ellipsis-untranslated": "Gjin oersetting",
+ "tux-sst-ellipsis-outdated": "Ferâldere oersettings",
+ "tux-sst-link-all-match": "Alle sykwurden fereaskje.",
+ "tux-sst-match-message": "Oersettings werjûn oerienkommend mei hokker sykwurd dan ek. $1",
+ "tux-sst-case-sensitive": "Haadlettergefoelich",
+ "tux-sst-error-offset": "Mear syktreffers kinne net werjûn wurde. Graach jo sykopdracht beheine.",
+ "tux-sst-error-language": "Dizze taal kin net brûkt wurde mei dit type fan sykopdracht."
}
diff --git a/MLEB/Translate/i18n/search/id.json b/MLEB/Translate/i18n/search/id.json
new file mode 100644
index 00000000..dee98747
--- /dev/null
+++ b/MLEB/Translate/i18n/search/id.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "Daud I.F. Argana"
+ ]
+ },
+ "searchtranslations": "Cari terjemahan",
+ "tux-sst-edit": "Sunting terjemahan",
+ "tux-sst-view-foreign": "Lihat di $1",
+ "tux-sst-search": "Cari",
+ "tux-sst-search-ph": "Cari terjemahan",
+ "tux-sst-count": "{{PLURAL:$1|Satu hasil ditemukan|$1 hasil ditemukan}}",
+ "tux-sst-facet-language": "Bahasa",
+ "tux-sst-facet-group": "Kelompok pesan",
+ "tux-sst-nosolr-title": "Tidak bisa mencari",
+ "tux-sst-nosolr-body": "Wiki ini tidak memiliki layanan pencarian terjemahan.",
+ "tux-sst-solr-offline-title": "Tidak bisa mencari",
+ "tux-sst-solr-offline-body": "Layanan pencarian sedang tidak tersedia untuk sementara.",
+ "tux-sst-next": "Selanjutnya ›",
+ "tux-sst-prev": "‹ Sebelumnya",
+ "tux-sst-default": "Terjemahan",
+ "tux-sst-translated": "Terjemahan dari $1",
+ "tux-sst-untranslated": "Tidak ada terjemahan dari $1",
+ "tux-sst-outdated": "Terjemahan usang dari $1",
+ "tux-sst-ellipsis-untranslated": "Tidak ada terjemahan",
+ "tux-sst-ellipsis-outdated": "Terjemahan usang",
+ "tux-sst-link-all-match": "Haruskan semua kata pencarian.",
+ "tux-sst-match-message": "Tampilkan terjemahan yang cocok dengan kata-kata pencarian manapun. $1",
+ "tux-sst-case-sensitive": "Peka kapital",
+ "tux-sst-error-offset": "Tidak ada lagi hasil pencarian yang dapat ditampilkan. Tolong sempitkan pencarian Anda.",
+ "tux-sst-error-language": "Bahasa ini tidak bisa digunakan dengan jenis pencarian ini."
+}
diff --git a/MLEB/Translate/i18n/search/io.json b/MLEB/Translate/i18n/search/io.json
index 22841314..7b5936a8 100644
--- a/MLEB/Translate/i18n/search/io.json
+++ b/MLEB/Translate/i18n/search/io.json
@@ -5,9 +5,16 @@
]
},
"searchtranslations": "Serchar tradukuri",
+ "tux-sst-edit": "Modifikar tradukuro",
"tux-sst-search": "Serchez",
"tux-sst-search-ph": "Serchar tradukuri",
+ "tux-sst-count": "{{PLURAL:$1|1 rezulto|$1 rezulti}} trovesis",
"tux-sst-facet-language": "Lingui",
"tux-sst-facet-group": "Grupo di mesaji",
+ "tux-sst-default": "Tradukuri",
+ "tux-sst-translated": "Tradukuri de $1",
+ "tux-sst-untranslated": "Nula tradukuro de(l) $1",
+ "tux-sst-ellipsis-untranslated": "Nula tradukuro",
+ "tux-sst-match-message": "Hike montresas tradukuri qui koincidas kun irga vorto ek la serchita. $1",
"tux-sst-case-sensitive": "''Case sensitive''"
}
diff --git a/MLEB/Translate/i18n/search/ksh.json b/MLEB/Translate/i18n/search/ksh.json
index fd26b838..6e2ec8ae 100644
--- a/MLEB/Translate/i18n/search/ksh.json
+++ b/MLEB/Translate/i18n/search/ksh.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "DannyS712",
"Purodha"
]
},
@@ -19,9 +20,9 @@
"tux-sst-next": "De Nähkße ›",
"tux-sst-prev": "‹ De Förrėje",
"tux-sst-default": "Övversäzonge",
- "tux-sst-translated": "Översäzonge us em $1 ",
- "tux-sst-untranslated": "Kein Översäzonge us em $1 ",
- "tux-sst-outdated": "Övverhollte Översäzonge us em $1 ",
+ "tux-sst-translated": "Översäzonge us em $1",
+ "tux-sst-untranslated": "Kein Översäzonge us em $1",
+ "tux-sst-outdated": "Övverhollte Översäzonge us em $1",
"tux-sst-ellipsis-untranslated": "Kein Övversäzong",
"tux-sst-ellipsis-outdated": "Övverhollte Översäzonge",
"tux-sst-link-all-match": "Donn noh all dä Wööter soöhke.",
diff --git a/MLEB/Translate/i18n/search/pnb.json b/MLEB/Translate/i18n/search/pnb.json
new file mode 100644
index 00000000..ab56ff46
--- /dev/null
+++ b/MLEB/Translate/i18n/search/pnb.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "tux-sst-facet-language": "بولیاں",
+ "tux-sst-default": "ترجمے"
+}
diff --git a/MLEB/Translate/i18n/search/pt-br.json b/MLEB/Translate/i18n/search/pt-br.json
index 70a2661c..66a4fb8a 100644
--- a/MLEB/Translate/i18n/search/pt-br.json
+++ b/MLEB/Translate/i18n/search/pt-br.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Felipe L. Ewald",
"Luckas",
"TheEduGobi"
diff --git a/MLEB/Translate/i18n/search/sl.json b/MLEB/Translate/i18n/search/sl.json
index cc37e744..391400c1 100644
--- a/MLEB/Translate/i18n/search/sl.json
+++ b/MLEB/Translate/i18n/search/sl.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Eleassar",
"Janezdrilc"
]
},
@@ -9,7 +10,7 @@
"tux-sst-view-foreign": "Ogled na: $1",
"tux-sst-search": "Išči",
"tux-sst-search-ph": "Išči prevode",
- "tux-sst-count": "{{PLURAL:$1|En najden zadetek|$1 najdena zadetka|$1 najdeni zadetki|$1 najdenih zadetkov}}",
+ "tux-sst-count": "{{PLURAL:$1|En najdeni zadetek|$1 najdena zadetka|$1 najdeni zadetki|$1 najdenih zadetkov}}",
"tux-sst-facet-language": "Jeziki",
"tux-sst-facet-group": "Skupine sporočil",
"tux-sst-nosolr-title": "Iskanje ni na voljo",
@@ -26,5 +27,5 @@
"tux-sst-ellipsis-outdated": "Zastareli prevodi",
"tux-sst-link-all-match": "Zahteva vse besede iskanja.",
"tux-sst-match-message": "Prikazuje prevode, ki se ujemajo s katerokoli od vpisanih besed. $1",
- "tux-sst-case-sensitive": "Razlikuj velike in male črke"
+ "tux-sst-case-sensitive": "Razlikuj med velikimi in malimi črkami"
}
diff --git a/MLEB/Translate/i18n/search/sv.json b/MLEB/Translate/i18n/search/sv.json
index 707ab205..e1705486 100644
--- a/MLEB/Translate/i18n/search/sv.json
+++ b/MLEB/Translate/i18n/search/sv.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Jopparn",
+ "Sabelöga",
"WikiPhoenix"
]
},
@@ -28,5 +29,6 @@
"tux-sst-link-all-match": "Kräv alla sökord.",
"tux-sst-match-message": "Visar översättningar som överensstämmer något sökord. $1",
"tux-sst-case-sensitive": "Skiftlägeskänsligt",
+ "tux-sst-error-offset": "Kan inte visa fler resultat. Begränsa din sökning.",
"tux-sst-error-language": "Detta språk kan inte användas med denna sökningstyp."
}
diff --git a/MLEB/Translate/i18n/search/th.json b/MLEB/Translate/i18n/search/th.json
index d87f878d..747a079c 100644
--- a/MLEB/Translate/i18n/search/th.json
+++ b/MLEB/Translate/i18n/search/th.json
@@ -1,8 +1,26 @@
{
"@metadata": {
"authors": [
+ "Aefgh39622",
"Octahedron80"
]
},
- "tux-sst-count": "ค้นพบ $1 {{PLURAL:$1|ผลลัพธ์|ผลลัพธ์}}"
+ "searchtranslations": "ค้นหาการแปล",
+ "tux-sst-edit": "แก้ไขการแปล",
+ "tux-sst-view-foreign": "ดูที่ $1",
+ "tux-sst-search": "ค้นหา",
+ "tux-sst-search-ph": "ค้นหาการแปล",
+ "tux-sst-count": "ค้นพบ $1 {{PLURAL:$1|ผลลัพธ์|ผลลัพธ์}}",
+ "tux-sst-facet-language": "ภาษา",
+ "tux-sst-facet-group": "กลุ่มข้อความ",
+ "tux-sst-nosolr-title": "การค้นหาไม่สามารถใช้ได้",
+ "tux-sst-nosolr-body": "วิกินี้ไม่มีบริการค้นหาการแปล",
+ "tux-sst-solr-offline-title": "การค้นหาไม่สามารถใช้ได้",
+ "tux-sst-solr-offline-body": "บริการค้นหาไม่สามารถใช้ได้ชั่วคราว",
+ "tux-sst-next": "ถัดไป ›",
+ "tux-sst-prev": "‹ ก่อนหน้า",
+ "tux-sst-default": "การแปล",
+ "tux-sst-translated": "การแปลจาก $1",
+ "tux-sst-untranslated": "ไม่มีการแปลจาก $1",
+ "tux-sst-ellipsis-untranslated": "ไม่มีการแปล"
}
diff --git a/MLEB/Translate/i18n/search/ti.json b/MLEB/Translate/i18n/search/ti.json
index ef63ab6a..48f09ee7 100644
--- a/MLEB/Translate/i18n/search/ti.json
+++ b/MLEB/Translate/i18n/search/ti.json
@@ -5,13 +5,13 @@
]
},
"searchtranslations": "ትርጉማት ምድላይ",
- "tux-sst-edit": "ትርጉም ኣተዓራረየ",
- "tux-sst-view-foreign": "ብ$1 ርኣይ",
+ "tux-sst-edit": "ትርጉም ኣመዓራርይ",
+ "tux-sst-view-foreign": "ኣብ $1 ርኣይ",
"tux-sst-search": "ምድላይ",
"tux-sst-search-ph": "ትርጉማት ምድላይ",
- "tux-sst-count": "{{PLURAL:$1|ሓደ ውጽኢት ተረኸቡ|$1 ውጺኢታት ተረኸቡን}}",
+ "tux-sst-count": "{{PLURAL:$1|ሓደ ውጽኢት ዝተረኸበ|$1 ውጺኢታት ዝተረኸቡ}}",
"tux-sst-facet-language": "ቋንቋታት",
- "tux-sst-facet-group": "መልእክትታት ጉጅለታት",
+ "tux-sst-facet-group": "ጉጅለታት መልእኽትታት",
"tux-sst-nosolr-title": "ምድላይ ዘይርከብ",
"tux-sst-solr-offline-title": "ምድላይ ዘይርከብ",
"tux-sst-next": "ዝቕጽል ›",
diff --git a/MLEB/Translate/i18n/search/yue.json b/MLEB/Translate/i18n/search/yue.json
new file mode 100644
index 00000000..d5ee15dc
--- /dev/null
+++ b/MLEB/Translate/i18n/search/yue.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Moon0319"
+ ]
+ },
+ "tux-sst-ellipsis-outdated": "過咗時嘅翻譯"
+}
diff --git a/MLEB/Translate/i18n/search/zgh.json b/MLEB/Translate/i18n/search/zgh.json
new file mode 100644
index 00000000..3322dfce
--- /dev/null
+++ b/MLEB/Translate/i18n/search/zgh.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hakim1bal"
+ ]
+ },
+ "searchtranslations": "ⵔⵣⵓ ⵜⵉⵙⵓⵖⴰⵍ",
+ "tux-sst-edit": "ⵙⵏⴼⵍ ⵜⴰⵙⵓⵖⵍⵜ",
+ "tux-sst-view-foreign": "ⵙⴽⵏ ⴳ $1",
+ "tux-sst-search": "ⵔⵣⵓ",
+ "tux-sst-search-ph": "ⵔⵣⵓ ⵜⵉⵙⵓⵖⴰⵍ",
+ "tux-sst-facet-language": "ⵜⵓⵜⵍⴰⵢⵉⵏ",
+ "tux-sst-next": "ⵖⵔ ⵣⴷⴰⵜ",
+ "tux-sst-prev": "ⵖⵔ ⴷⴼⴼⵉⵔ",
+ "tux-sst-default": "ⵜⵉⵙⵓⵖⴰⵍ",
+ "tux-sst-translated": "ⵜⵉⵙⵓⵖⴰⵍ ⵙⴳ $1",
+ "tux-sst-untranslated": "ⵡⴰⵍⵓ ⵜⵉⵙⵓⵖⴰⵍ ⵙⴳ $1",
+ "tux-sst-ellipsis-untranslated": "ⵡⴰⵍⵓ ⵜⵉⵙⵓⵖⴰⵍ"
+}
diff --git a/MLEB/Translate/insertables/CombinedInsertablesSuggester.php b/MLEB/Translate/insertables/CombinedInsertablesSuggester.php
deleted file mode 100644
index 5f3c468a..00000000
--- a/MLEB/Translate/insertables/CombinedInsertablesSuggester.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * A class to combine multiple insertables suggesters.
- */
-class CombinedInsertablesSuggester implements InsertablesSuggester {
-
- /**
- * @var InsertablesSuggester[]
- */
- protected $suggesters = [];
-
- /**
- * @param InsertablesSuggester[] $suggesters Array of InsertablesSuggester objects to combine.
- */
- public function __construct( $suggesters = [] ) {
- $this->suggesters = $suggesters;
- }
-
- public function getInsertables( $text ) {
- $insertables = [];
- foreach ( $this->suggesters as $suggester ) {
- $new = $suggester->getInsertables( $text );
- $insertables = array_merge( $insertables, $new );
- }
-
- return array_unique( $insertables, SORT_REGULAR );
- }
-}
diff --git a/MLEB/Translate/insertables/InsertablesSuggester.php b/MLEB/Translate/insertables/InsertablesSuggester.php
deleted file mode 100644
index 8210ff7a..00000000
--- a/MLEB/Translate/insertables/InsertablesSuggester.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-/**
- * Interface for InsertablesSuggesters.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
-
-/**
- * Insertable is a string that usually does not need translation and is
- * difficult to type manually.
- * @since 2013.09
- */
-interface InsertablesSuggester {
- /**
- * Returns the insertables in the message text.
- * @param string $text
- * @return array
- */
- public function getInsertables( $text );
-}
diff --git a/MLEB/Translate/messagegroups/AggregateMessageGroup.php b/MLEB/Translate/messagegroups/AggregateMessageGroup.php
index 52666b89..17d83a33 100644
--- a/MLEB/Translate/messagegroups/AggregateMessageGroup.php
+++ b/MLEB/Translate/messagegroups/AggregateMessageGroup.php
@@ -14,14 +14,10 @@
* @ingroup MessageGroup
*/
class AggregateMessageGroup extends MessageGroupBase {
- /**
- * @var MessageGroup[]
- */
+ /** @var MessageGroup[] */
private $groups;
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function exists() {
// Group exists if there are any subgroups.
$exists = (bool)$this->conf['GROUPS'];
@@ -29,15 +25,11 @@ class AggregateMessageGroup extends MessageGroupBase {
return $exists;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function load( $code ) {
$messages = [];
- /**
- * @var $group MessageGroup
- */
+ /** @var $group MessageGroup */
foreach ( $this->getGroups() as $group ) {
$messages += $group->load( $code );
}
@@ -45,9 +37,7 @@ class AggregateMessageGroup extends MessageGroupBase {
return $messages;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getMangler() {
if ( $this->mangler === null ) {
$this->mangler = new StringMatcher();
@@ -116,9 +106,7 @@ class AggregateMessageGroup extends MessageGroupBase {
return $messages;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function initCollection( $code ) {
$messages = $this->loadMessagesFromCache( $this->getGroups() );
$namespace = $this->getNamespace();
@@ -130,9 +118,7 @@ class AggregateMessageGroup extends MessageGroupBase {
return $collection;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getMessage( $key, $code ) {
/* Just hand over the message content retrieval to the primary message
* group directly. This used to iterate over the subgroups looking for
@@ -160,9 +146,7 @@ class AggregateMessageGroup extends MessageGroupBase {
}
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getTags( $type = null ) {
$tags = [];
@@ -173,9 +157,7 @@ class AggregateMessageGroup extends MessageGroupBase {
return $tags;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getKeys() {
$keys = [];
foreach ( $this->getGroups() as $group ) {
diff --git a/MLEB/Translate/messagegroups/FileBasedMessageGroup.php b/MLEB/Translate/messagegroups/FileBasedMessageGroup.php
index 08b2f055..c348df4c 100644
--- a/MLEB/Translate/messagegroups/FileBasedMessageGroup.php
+++ b/MLEB/Translate/messagegroups/FileBasedMessageGroup.php
@@ -209,9 +209,7 @@ class FileBasedMessageGroup extends MessageGroupBase implements MetaYamlSchemaEx
return $schema;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getKeys() {
$cache = $this->getMessageGroupCache( $this->getSourceLanguage() );
if ( !$cache->exists() ) {
@@ -221,9 +219,7 @@ class FileBasedMessageGroup extends MessageGroupBase implements MetaYamlSchemaEx
}
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function initCollection( $code ) {
$namespace = $this->getNamespace();
$messages = [];
@@ -245,9 +241,7 @@ class FileBasedMessageGroup extends MessageGroupBase implements MetaYamlSchemaEx
return $collection;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getMessage( $key, $code ) {
$cache = $this->getMessageGroupCache( $code );
if ( $cache->exists() ) {
diff --git a/MLEB/Translate/messagegroups/MessageGroup.php b/MLEB/Translate/messagegroups/MessageGroup.php
index 9c7c898c..2786c11d 100644
--- a/MLEB/Translate/messagegroups/MessageGroup.php
+++ b/MLEB/Translate/messagegroups/MessageGroup.php
@@ -9,6 +9,8 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
+
/**
* Interface for message groups.
*
@@ -89,7 +91,7 @@ interface MessageGroup {
/**
* Returns a message validator object or null.
- * @return MessageValidator|null
+ * @return ValidationRunner|null
*/
public function getValidator();
@@ -161,8 +163,8 @@ interface MessageGroup {
public function getMessageGroupStates();
/**
- * Get all the translatable languages for a group, considering the whitelisting
- * and blacklisting.
+ * Get all the translatable languages for a group, considering the inclusion
+ * and exclusion list.
* @return array|null The language codes as array keys.
*/
public function getTranslatableLanguages();
@@ -174,4 +176,11 @@ interface MessageGroup {
* @return array
*/
public function getTranslationAids();
+
+ /**
+ * Gets support URL defined for the group if any
+ *
+ * @return array|null
+ */
+ public function getSupportConfig(): ?array;
}
diff --git a/MLEB/Translate/messagegroups/MessageGroupBase.php b/MLEB/Translate/messagegroups/MessageGroupBase.php
index c067e692..dfd62502 100644
--- a/MLEB/Translate/messagegroups/MessageGroupBase.php
+++ b/MLEB/Translate/messagegroups/MessageGroupBase.php
@@ -8,6 +8,9 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\CombinedInsertablesSuggester;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertableFactory;
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
use MediaWiki\MediaWikiServices;
/**
@@ -22,10 +25,7 @@ use MediaWiki\MediaWikiServices;
abstract class MessageGroupBase implements MessageGroup {
protected $conf;
protected $namespace;
-
- /**
- * @var StringMatcher
- */
+ /** @var StringMatcher */
protected $mangler;
protected function __construct() {
@@ -115,10 +115,19 @@ abstract class MessageGroupBase implements MessageGroup {
return null;
}
- $msgValidator = new MessageValidator( $this->getId() );
+ $msgValidator = new ValidationRunner( $this->getId() );
foreach ( $validatorConfigs as $config ) {
- $msgValidator->addValidator( $config );
+ try {
+ $msgValidator->addValidator( $config );
+ } catch ( Exception $e ) {
+ $id = $this->getId();
+ throw new InvalidArgumentException(
+ "Unable to construct validator for message group $id: " . $e->getMessage(),
+ 0,
+ $e
+ );
+ }
}
return $msgValidator;
@@ -138,9 +147,7 @@ abstract class MessageGroupBase implements MessageGroup {
throw new MWException( "Mangler class $class does not exist." );
}
- /**
- * @todo Branch handling, merge with upper branch keys
- */
+ /** @todo Branch handling, merge with upper branch keys */
$this->mangler = new $class();
$this->mangler->setConf( $this->conf['MANGLER'] );
}
@@ -154,35 +161,28 @@ abstract class MessageGroupBase implements MessageGroup {
* @return CombinedInsertablesSuggester
*/
public function getInsertablesSuggester() {
- $allClasses = [];
-
- $class = $this->getFromConf( 'INSERTABLES', 'class' );
- if ( $class !== null ) {
- $allClasses[] = $class;
- }
-
- $classes = $this->getFromConf( 'INSERTABLES', 'classes' );
- if ( $classes !== null ) {
- $allClasses = array_merge( $allClasses, $classes );
- }
-
- $allClasses = array_unique( $allClasses, SORT_REGULAR );
-
$suggesters = [];
+ $insertableConf = $this->getFromConf( 'INSERTABLES' ) ?? [];
- foreach ( $allClasses as $class ) {
- if ( !class_exists( $class ) ) {
- throw new InvalidArgumentException( "InsertablesSuggester class $class does not exist." );
+ foreach ( $insertableConf as $config ) {
+ if ( !isset( $config['class'] ) ) {
+ throw new InvalidArgumentException(
+ 'Insertable configuration for group: ' . $this->getId() .
+ ' does not provide a class.'
+ );
}
- $suggesters[] = new $class();
- }
+ if ( !is_string( $config['class'] ) ) {
+ throw new InvalidArgumentException(
+ 'Expected Insertable class to be string, got: ' . gettype( $config['class'] ) .
+ ' for group: ' . $this->getId()
+ );
+ }
- if ( $suggesters === [] ) {
- $suggesters = $this->getArrayInsertables();
+ $suggesters[] = InsertableFactory::make( $config['class'], $config['params'] ?? [] );
}
- // get validators marked as insertable
+ // Get validators marked as insertable
$messageValidator = $this->getValidator();
if ( $messageValidator ) {
$suggesters = array_merge( $suggesters, $messageValidator->getInsertableValidators() );
@@ -191,9 +191,7 @@ abstract class MessageGroupBase implements MessageGroup {
return new CombinedInsertablesSuggester( $suggesters );
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getKeys() {
return array_keys( $this->getDefinitions() );
}
@@ -237,7 +235,7 @@ abstract class MessageGroupBase implements MessageGroup {
* Use mangler to find messages that match.
*/
foreach ( $messageKeys as $key ) {
- if ( $mangler->match( $key ) ) {
+ if ( $mangler->matches( $key ) ) {
$matches[] = $key;
}
}
@@ -290,9 +288,7 @@ abstract class MessageGroupBase implements MessageGroup {
return $code === $this->getSourceLanguage();
}
- /**
- * @deprecated Use getMessageGroupStates
- */
+ /** @deprecated Use getMessageGroupStates */
public function getWorkflowConfiguration() {
global $wgTranslateWorkflowStates;
if ( !$wgTranslateWorkflowStates ) {
@@ -318,11 +314,7 @@ abstract class MessageGroupBase implements MessageGroup {
return new MessageGroupStates( $conf );
}
- /**
- * Get all the translatable languages for a group, considering the whitelisting
- * and blacklisting.
- * @return array|null The language codes as array keys.
- */
+ /** @inheritDoc */
public function getTranslatableLanguages() {
global $wgTranslateBlacklist;
@@ -336,39 +328,39 @@ abstract class MessageGroupBase implements MessageGroup {
$lists = $groupConfiguration['LANGUAGES'];
if ( isset( $lists['blacklist'] ) ) {
- $blacklist = $lists['blacklist'];
- if ( $blacklist === '*' ) {
- // All languages blacklisted
+ $exclusionList = $lists['blacklist'];
+ if ( $exclusionList === '*' ) {
+ // All excluded languages
$codes = [];
- } elseif ( is_array( $blacklist ) ) {
- foreach ( $blacklist as $code ) {
+ } elseif ( is_array( $exclusionList ) ) {
+ foreach ( $exclusionList as $code ) {
unset( $codes[$code] );
}
}
} else {
- // Treat lack of explicit blacklist the same as blacklisting everything. This way,
- // when one defines only whitelist, it means that only those languages are allowed.
+ // Treat lack of explicit exclusion list the same as excluding everything. This way,
+ // when one defines only inclusions, it means that only those languages are allowed.
$codes = [];
}
// DWIM with $wgTranslateBlacklist, e.g. languages in that list should not unexpectedly
- // be enabled when a whitelist is used to whitelist any language.
+ // be enabled when an inclusion list is used to include any language.
$checks = [ $this->getId(), strtok( $this->getId(), '-' ), '*' ];
foreach ( $checks as $check ) {
if ( isset( $wgTranslateBlacklist[ $check ] ) ) {
- foreach ( array_keys( $wgTranslateBlacklist[ $check ] ) as $blacklistedCode ) {
- unset( $codes[ $blacklistedCode ] );
+ foreach ( array_keys( $wgTranslateBlacklist[ $check ] ) as $excludedCode ) {
+ unset( $codes[ $excludedCode ] );
}
}
}
if ( isset( $lists['whitelist'] ) ) {
- $whitelist = $lists['whitelist'];
- if ( $whitelist === '*' ) {
- // All languages whitelisted (except $wgTranslateBlacklist)
+ $inclusionList = $lists['whitelist'];
+ if ( $inclusionList === '*' ) {
+ // All languages included (except $wgTranslateBlacklist)
return null;
- } elseif ( is_array( $whitelist ) ) {
- foreach ( $whitelist as $code ) {
+ } elseif ( is_array( $inclusionList ) ) {
+ foreach ( $inclusionList as $code ) {
$codes[$code] = true;
}
}
@@ -387,29 +379,7 @@ abstract class MessageGroupBase implements MessageGroup {
return TranslationAid::getTypes();
}
- /**
- * Fetches insertables that have been added in the array configuration format.
- * TODO: MessageValidator - Move this code to getInsertablesSuggester once all
- * insertables in group config file have been migrated to the array structure.
- * @return array
- */
- private function getArrayInsertables() {
- $suggesters = [];
- $insertableConf = $this->getFromConf( 'INSERTABLES' );
-
- if ( $insertableConf === null ) {
- return $suggesters;
- }
-
- foreach ( $insertableConf as $config ) {
- if ( !isset( $config['class'] ) ) {
- throw new InvalidArgumentException( "Insertable configuration does not provide a class." );
- }
-
- $class = $config['class'];
- $suggesters[] = new $class( $config['params'] ?? [] );
- }
-
- return $suggesters;
+ public function getSupportConfig(): ?array {
+ return $this->getFromConf( 'BASIC', 'support' );
}
}
diff --git a/MLEB/Translate/messagegroups/MessageGroupOld.php b/MLEB/Translate/messagegroups/MessageGroupOld.php
index 0eec3d0a..f34d2594 100644
--- a/MLEB/Translate/messagegroups/MessageGroupOld.php
+++ b/MLEB/Translate/messagegroups/MessageGroupOld.php
@@ -31,9 +31,7 @@ abstract class MessageGroupOld implements MessageGroup {
return $this->label;
}
- /**
- * @param string $value
- */
+ /** @param string $value */
public function setLabel( $value ) {
$this->label = $value;
}
@@ -43,16 +41,12 @@ abstract class MessageGroupOld implements MessageGroup {
*/
protected $id = 'none';
- /**
- * @return string
- */
+ /** @return string */
public function getId() {
return $this->id;
}
- /**
- * @param string $value
- */
+ /** @param string $value */
public function setId( $value ) {
$this->id = $value;
}
@@ -81,46 +75,7 @@ abstract class MessageGroupOld implements MessageGroup {
}
/**
- * List of messages that are hidden by default, but can still be translated if
- * needed.
- */
- protected $optional = [];
-
- /**
- * @return array
- */
- public function getOptional() {
- return $this->optional;
- }
-
- /**
- * @param array $value
- */
- public function setOptional( $value ) {
- $this->optional = $value;
- }
-
- /**
- * List of messages that are always hidden and cannot be translated.
- */
- protected $ignored = [];
-
- /**
- * @return array
- */
- public function getIgnored() {
- return $this->ignored;
- }
-
- /**
- * @param array $value
- */
- public function setIgnored( $value ) {
- $this->ignored = $value;
- }
-
- /**
- * Holds descripton of this group. Description is a wiki text snippet that
+ * Holds description of this group. Description is a wiki text snippet that
* gives information about this group to translators.
*/
protected $description = null;
@@ -161,9 +116,7 @@ abstract class MessageGroupOld implements MessageGroup {
*/
protected $mangler = null;
- /**
- * @return StringMatcher
- */
+ /** @return StringMatcher */
public function getMangler() {
if ( !isset( $this->mangler ) ) {
$this->mangler = new StringMatcher();
@@ -206,9 +159,7 @@ abstract class MessageGroupOld implements MessageGroup {
return $this->meta ? [] : $this->getDefinitions();
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getKeys() {
return array_keys( $this->getDefinitions() );
}
@@ -219,7 +170,7 @@ abstract class MessageGroupOld implements MessageGroup {
*
* @param string $key Message key
* @param string $code Language code
- * @return Mixed List of stored translation or \null.
+ * @return mixed List of stored translation or \null.
*/
public function getMessage( $key, $code ) {
if ( !isset( $this->messages[$code] ) ) {
@@ -320,16 +271,7 @@ abstract class MessageGroupOld implements MessageGroup {
}
public function getTags( $type = null ) {
- $tags = [
- 'optional' => $this->optional,
- 'ignored' => $this->ignored,
- ];
-
- if ( !$type ) {
- return $tags;
- }
-
- return $tags[$type] ?? [];
+ return [];
}
/**
@@ -355,9 +297,7 @@ abstract class MessageGroupOld implements MessageGroup {
return null;
}
- /**
- * @deprecated Use getMessageGroupStates
- */
+ /** @deprecated Use getMessageGroupStates */
public function getWorkflowConfiguration() {
global $wgTranslateWorkflowStates;
if ( !$wgTranslateWorkflowStates ) {
@@ -383,11 +323,7 @@ abstract class MessageGroupOld implements MessageGroup {
return new MessageGroupStates( $conf );
}
- /**
- * Get all the translatable languages for a group, considering the whitelisting
- * and blacklisting.
- * @return array|null The language codes as array keys.
- */
+ /** @inheritDoc */
public function getTranslatableLanguages() {
return null;
}
@@ -411,4 +347,8 @@ abstract class MessageGroupOld implements MessageGroup {
public function getTranslationAids() {
return TranslationAid::getTypes();
}
+
+ public function getSupportConfig(): ?array {
+ return null;
+ }
}
diff --git a/MLEB/Translate/messagegroups/RecentAdditionsMessageGroup.php b/MLEB/Translate/messagegroups/RecentAdditionsMessageGroup.php
index 688d75a0..70baedbd 100644
--- a/MLEB/Translate/messagegroups/RecentAdditionsMessageGroup.php
+++ b/MLEB/Translate/messagegroups/RecentAdditionsMessageGroup.php
@@ -8,15 +8,13 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
/**
* @since 2012-11-01
* @ingroup MessageGroup
*/
class RecentAdditionsMessageGroup extends RecentMessageGroup {
- protected $groupInfoCache = [];
-
public function getId() {
return '!additions';
}
@@ -43,15 +41,9 @@ class RecentAdditionsMessageGroup extends RecentMessageGroup {
'rc_namespace' => $wgTranslateMessageNamespaces,
'rc_type != ' . RC_LOG,
'rc_id > ' . $this->getRCCutoff(),
+ 'rc_actor' => FuzzyBot::getUser()->getActorId()
];
- if ( class_exists( ActorMigration::class ) ) {
- $conds[] = ActorMigration::newMigration()
- ->getWhere( $db, 'rc_user', FuzzyBot::getUser() )['conds'];
- } else {
- $conds['rc_user'] = FuzzyBot::getUser()->getId();
- }
-
return $conds;
}
diff --git a/MLEB/Translate/messagegroups/RecentMessageGroup.php b/MLEB/Translate/messagegroups/RecentMessageGroup.php
index 7a19c088..426d546b 100644
--- a/MLEB/Translate/messagegroups/RecentMessageGroup.php
+++ b/MLEB/Translate/messagegroups/RecentMessageGroup.php
@@ -19,7 +19,6 @@ class RecentMessageGroup extends WikiMessageGroup {
* @see MessageCollection::getPages()
*/
protected $namespace = false;
-
protected $language;
/**
@@ -93,14 +92,9 @@ class RecentMessageGroup extends WikiMessageGroup {
$db = wfGetDB( DB_REPLICA );
- if ( is_callable( [ RecentChange::class, 'getQueryInfo' ] ) ) {
- $rcQuery = RecentChange::getQueryInfo();
- $tables = $rcQuery['tables'];
- $joins = $rcQuery['joins'];
- } else {
- $tables = 'recentchanges';
- $joins = [];
- }
+ $rcQuery = RecentChange::getQueryInfo();
+ $tables = $rcQuery['tables'];
+ $joins = $rcQuery['joins'];
$fields = [ 'rc_namespace', 'rc_title' ];
$conds = $this->getQueryConditions();
diff --git a/MLEB/Translate/messagegroups/SandboxMessageGroup.php b/MLEB/Translate/messagegroups/SandboxMessageGroup.php
index 8866d38b..df33e67b 100644
--- a/MLEB/Translate/messagegroups/SandboxMessageGroup.php
+++ b/MLEB/Translate/messagegroups/SandboxMessageGroup.php
@@ -7,6 +7,8 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashStorage;
+
/**
* @since 2013.06
* @ingroup MessageGroup
@@ -17,7 +19,6 @@ class SandboxMessageGroup extends WikiMessageGroup {
* @see MessageCollection::getPages()
*/
protected $namespace = false;
-
protected $language;
/**
@@ -86,7 +87,7 @@ class SandboxMessageGroup extends WikiMessageGroup {
$messagesToProvide = $wgTranslateSandboxLimit * 2;
foreach ( $list as $index => &$translation ) {
- list( $ns, $page ) = explode( ':', $index, 2 );
+ [ $ns, $page ] = explode( ':', $index, 2 );
$title = Title::makeTitle( $ns, "$page/{$this->language}" );
$handle = new MessageHandle( $title );
diff --git a/MLEB/Translate/messagegroups/WikiMessageGroup.php b/MLEB/Translate/messagegroups/WikiMessageGroup.php
index 4e90db00..ea97a7ed 100644
--- a/MLEB/Translate/messagegroups/WikiMessageGroup.php
+++ b/MLEB/Translate/messagegroups/WikiMessageGroup.php
@@ -22,8 +22,6 @@ class WikiMessageGroup extends MessageGroupOld {
protected $source;
/**
- * Constructor.
- *
* @param string $id Unique id for this group.
* @param string $source Mediawiki message that contains list of message keys.
*/
diff --git a/MLEB/Translate/messagegroups/WikiPageMessageGroup.php b/MLEB/Translate/messagegroups/WikiPageMessageGroup.php
index 747ab104..e894fbb6 100644
--- a/MLEB/Translate/messagegroups/WikiPageMessageGroup.php
+++ b/MLEB/Translate/messagegroups/WikiPageMessageGroup.php
@@ -8,6 +8,9 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageInsertablesSuggester;
+use MediaWiki\Extension\Translate\PageTranslation\TranslationUnit;
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\SlotRecord;
@@ -16,14 +19,9 @@ use MediaWiki\Revision\SlotRecord;
* @ingroup PageTranslation MessageGroup
*/
class WikiPageMessageGroup extends MessageGroupOld implements IDBAccessObject {
- /**
- * @var Title|string
- */
+ /** @var Title|string */
protected $title;
-
- /**
- * @var int
- */
+ /** @var int */
protected $namespace = NS_TRANSLATIONS;
/**
@@ -39,9 +37,7 @@ class WikiPageMessageGroup extends MessageGroupOld implements IDBAccessObject {
return $this->getTitle()->getPageLanguage()->getCode();
}
- /**
- * @return Title
- */
+ /** @return Title */
public function getTitle() {
if ( is_string( $this->title ) ) {
$this->title = Title::newFromText( $this->title );
@@ -56,9 +52,7 @@ class WikiPageMessageGroup extends MessageGroupOld implements IDBAccessObject {
*/
protected $definitions;
- /**
- * @return string[]
- */
+ /** @return string[] */
public function getDefinitions() {
if ( is_array( $this->definitions ) ) {
return $this->definitions;
@@ -81,7 +75,7 @@ class WikiPageMessageGroup extends MessageGroupOld implements IDBAccessObject {
$defs = [];
foreach ( $res as $r ) {
- $section = new TPSection();
+ $section = new TranslationUnit();
$section->text = $r->trs_text;
$defs[$r->trs_key] = $section->getTextWithVariables();
}
@@ -171,11 +165,9 @@ class WikiPageMessageGroup extends MessageGroupOld implements IDBAccessObject {
return ContentHandler::getContentText( $rev->getContent( SlotRecord::MAIN ) );
}
- /**
- * @return MessageValidator
- */
+ /** @return ValidationRunner */
public function getValidator() {
- $validator = new MessageValidator( $this->getId() );
+ $validator = new ValidationRunner( $this->getId() );
$validator->setValidators( [
[ 'id' => 'MediaWikiPlural' ],
[ 'id' => 'BraceBalance' ]
diff --git a/MLEB/Translate/messagegroups/WorkflowStatesMessageGroup.php b/MLEB/Translate/messagegroups/WorkflowStatesMessageGroup.php
index f3b40460..cffdf62c 100644
--- a/MLEB/Translate/messagegroups/WorkflowStatesMessageGroup.php
+++ b/MLEB/Translate/messagegroups/WorkflowStatesMessageGroup.php
@@ -9,11 +9,9 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
-/**
- * @ingroup MessageGroup
- */
+/** @ingroup MessageGroup */
class WorkflowStatesMessageGroup extends WikiMessageGroup {
// id and source are not needed
public function __construct() {
@@ -41,9 +39,7 @@ class WorkflowStatesMessageGroup extends WikiMessageGroup {
$groups = MessageGroups::getAllGroups();
$keys = [];
- /**
- * @var $g MessageGroup
- */
+ /** @var $g MessageGroup */
foreach ( $groups as $g ) {
$states = $g->getMessageGroupStates()->getStates();
foreach ( array_keys( $states ) as $state ) {
diff --git a/MLEB/Translate/messagegroups/loaders/AggregateMessageGroupLoader.php b/MLEB/Translate/messagegroups/loaders/AggregateMessageGroupLoader.php
index 54fed244..226ed7d1 100644
--- a/MLEB/Translate/messagegroups/loaders/AggregateMessageGroupLoader.php
+++ b/MLEB/Translate/messagegroups/loaders/AggregateMessageGroupLoader.php
@@ -19,18 +19,12 @@ class AggregateMessageGroupLoader extends MessageGroupLoader
implements CachedMessageGroupLoader {
private const CACHE_KEY = 'aggregate';
- private const CACHE_VERSION = 1;
+ private const CACHE_VERSION = 2;
- /**
- * @var MessageGroupWANCache
- */
+ /** @var MessageGroupWANCache */
protected $cache;
-
- /**
- * @var IDatabase
- */
+ /** @var IDatabase */
protected $db;
-
/**
* List of groups
* @var array|null
diff --git a/MLEB/Translate/messagegroups/loaders/FileBasedMessageGroupLoader.php b/MLEB/Translate/messagegroups/loaders/FileBasedMessageGroupLoader.php
index 2134d47c..4225dd67 100644
--- a/MLEB/Translate/messagegroups/loaders/FileBasedMessageGroupLoader.php
+++ b/MLEB/Translate/messagegroups/loaders/FileBasedMessageGroupLoader.php
@@ -18,17 +18,14 @@ class FileBasedMessageGroupLoader extends MessageGroupLoader
implements CachedMessageGroupLoader {
private const CACHE_KEY = 'filebased';
- private const CACHE_VERSION = 1;
+ private const CACHE_VERSION = 2;
/**
* List of groups
* @var array|null
*/
protected $groups;
-
- /**
- * @var MessageGroupWANCache
- */
+ /** @var MessageGroupWANCache */
protected $cache;
public function __construct( MessageGroupWANCache $cache ) {
diff --git a/MLEB/Translate/messagegroups/loaders/TranslatablePageMessageGroupStore.php b/MLEB/Translate/messagegroups/loaders/TranslatablePageMessageGroupStore.php
index 287d9d80..7117a22e 100644
--- a/MLEB/Translate/messagegroups/loaders/TranslatablePageMessageGroupStore.php
+++ b/MLEB/Translate/messagegroups/loaders/TranslatablePageMessageGroupStore.php
@@ -19,18 +19,12 @@ class TranslatablePageMessageGroupStore extends MessageGroupLoader
{
private const CACHE_KEY = 'wikipage';
- private const CACHE_VERSION = 1;
+ private const CACHE_VERSION = 2;
- /**
- * @var Wikimedia\Rdbms\IDatabase
- */
+ /** @var Wikimedia\Rdbms\IDatabase */
protected $db;
-
- /**
- * @var MessageGroupWANCache
- */
+ /** @var MessageGroupWANCache */
protected $cache;
-
/**
* List of groups
* @var array|null
@@ -154,7 +148,7 @@ class TranslatablePageMessageGroupStore extends MessageGroupLoader
$tables = [ 'page', 'revtag' ];
$vars = [ 'page_id', 'page_namespace', 'page_title' ];
$conds = [ 'page_id=rt_page', 'rt_type' => RevTag::getType( 'tp:mark' ) ];
- $options = [ 'GROUP BY' => 'rt_page' ];
+ $options = [ 'GROUP BY' => 'rt_page,page_id,page_namespace,page_title' ];
$res = $this->db->select( $tables, $vars, $conds, __METHOD__, $options );
foreach ( $res as $r ) {
diff --git a/MLEB/Translate/package-lock.json b/MLEB/Translate/package-lock.json
index 6bd678fa..217f17b1 100644
--- a/MLEB/Translate/package-lock.json
+++ b/MLEB/Translate/package-lock.json
@@ -12,45 +12,45 @@
}
},
"@babel/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
- "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helpers": "^7.9.0",
- "@babel/parser": "^7.9.0",
- "@babel/template": "^7.8.6",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.7.tgz",
+ "integrity": "sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.7",
+ "@babel/types": "^7.12.7",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
"json5": "^2.1.2",
- "lodash": "^4.17.13",
+ "lodash": "^4.17.19",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -58,125 +58,125 @@
}
},
"@babel/generator": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
- "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
"dev": true,
"requires": {
- "@babel/types": "^7.9.5",
+ "@babel/types": "^7.12.5",
"jsesc": "^2.5.1",
- "lodash": "^4.17.13",
"source-map": "^0.5.0"
}
},
"@babel/helper-function-name": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
- "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.9.5"
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.10.4"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
- "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.9.0",
- "lodash": "^4.17.13"
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz",
+ "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.7"
}
},
"@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.12.1"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "@babel/types": "^7.11.0"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
- "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
"dev": true
},
"@babel/helpers": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
- "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
"dev": true,
"requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0"
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
}
},
"@babel/highlight": {
@@ -191,47 +191,38 @@
}
},
"@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==",
"dev": true
},
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
"@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -239,38 +230,38 @@
}
},
"@babel/traverse": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
- "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.7.tgz",
+ "integrity": "sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.5",
- "@babel/helper-function-name": "^7.9.5",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.5",
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.13"
+ "lodash": "^4.17.19"
},
"dependencies": {
"@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.8.3"
+ "@babel/highlight": "^7.10.4"
}
},
"@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
@@ -278,16 +269,80 @@
}
},
"@babel/types": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
- "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.9.5",
- "lodash": "^4.17.13",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
+ "@eslint/eslintrc": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
+ "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+ "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.4",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
+ "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ }
+ }
+ },
"@nodelib/fs.scandir": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
@@ -315,22 +370,22 @@
}
},
"@stylelint/postcss-css-in-js": {
- "version": "0.37.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz",
- "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==",
+ "version": "0.37.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+ "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
"dev": true,
"requires": {
"@babel/core": ">=7.9.0"
}
},
"@stylelint/postcss-markdown": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
- "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
"dev": true,
"requires": {
- "remark": "^12.0.0",
- "unist-util-find-all-after": "^3.0.1"
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
}
},
"@types/color-name": {
@@ -339,10 +394,25 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
"@types/minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
"dev": true
},
"@types/normalize-package-data": {
@@ -363,6 +433,16 @@
"integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
"dev": true
},
+ "JSONStream": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz",
+ "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": ">=2.2.7 <3"
+ }
+ },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -441,6 +521,12 @@
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
+ "array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true
+ },
"array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
@@ -496,18 +582,18 @@
"dev": true
},
"autoprefixer": {
- "version": "9.7.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz",
- "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==",
+ "version": "9.8.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+ "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
"dev": true,
"requires": {
- "browserslist": "^4.11.1",
- "caniuse-lite": "^1.0.30001039",
- "chalk": "^2.4.2",
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "colorette": "^1.2.1",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
- "postcss": "^7.0.27",
- "postcss-value-parser": "^4.0.3"
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
}
},
"bail": {
@@ -597,15 +683,16 @@
}
},
"browserslist": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
- "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
+ "version": "4.14.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz",
+ "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001043",
- "electron-to-chromium": "^1.3.413",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
+ "caniuse-lite": "^1.0.30001157",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.591",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.66"
}
},
"cache-base": {
@@ -631,16 +718,27 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
- "caniuse-lite": {
- "version": "1.0.30001045",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001045.tgz",
- "integrity": "sha512-Y8o2Iz1KPcD6FjySbk1sPpvJqchgxk/iow0DABpGyzA1UeQAuxh63Xh0Enj5/BrsYbXtCN32JmR4ZxQTCQ6E6A==",
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001159",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz",
+ "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==",
"dev": true
},
"chalk": {
@@ -660,12 +758,6 @@
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -701,6 +793,17 @@
}
}
},
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"clone-regexp": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
@@ -710,12 +813,6 @@
"is-regexp": "^2.0.0"
}
},
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -741,6 +838,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -748,9 +851,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz",
+ "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==",
"dev": true
},
"component-emitter": {
@@ -780,37 +883,23 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
"cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
+ "import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "dependencies": {
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
+ "yaml": "^1.10.0"
}
},
"cross-spawn": {
@@ -835,6 +924,90 @@
}
}
},
+ "css-rule-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
+ "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=",
+ "dev": true,
+ "requires": {
+ "css-tokenize": "^1.0.1",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "css-tokenize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
+ "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^1.0.33"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -870,6 +1043,14 @@
"requires": {
"decamelize": "^1.1.0",
"map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
}
},
"decode-uri-component": {
@@ -938,14 +1119,6 @@
"dev": true,
"requires": {
"path-type": "^4.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
}
},
"doctrine": {
@@ -957,6 +1130,53 @@
"esutils": "^2.0.2"
}
},
+ "doiuse": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.0.tgz",
+ "integrity": "sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.14.7",
+ "caniuse-lite": "^1.0.30001157",
+ "css-rule-stream": "^1.1.0",
+ "duplexer2": "0.0.2",
+ "jsonfilter": "^1.1.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.1.6",
+ "source-map": "^0.7.3",
+ "through2": "^4.0.2",
+ "yargs": "^16.1.0"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
@@ -968,15 +1188,15 @@
},
"dependencies": {
"domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+ "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==",
"dev": true
},
"entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
"dev": true
}
}
@@ -1006,10 +1226,51 @@
"domelementtype": "1"
}
},
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
"electron-to-chromium": {
- "version": "1.3.414",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz",
- "integrity": "sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ==",
+ "version": "1.3.603",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz",
+ "integrity": "sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ==",
"dev": true
},
"emoji-regex": {
@@ -1042,6 +1303,12 @@
"is-arrayish": "^0.2.1"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1049,12 +1316,13 @@
"dev": true
},
"eslint": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.1.tgz",
- "integrity": "sha512-cQC/xj9bhWUcyi/RuMbRtC3I0eW8MH0jhRELSvpKYkWep3C6YZ2OkvcvJVUeO6gcunABmzptbXBuDoXsjHmfTA==",
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.1.tgz",
+ "integrity": "sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.1.3",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
@@ -1062,9 +1330,9 @@
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
"eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^1.3.0",
+ "espree": "^7.3.0",
"esquery": "^1.2.0",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
@@ -1078,7 +1346,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.14",
+ "lodash": "^4.17.19",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -1149,9 +1417,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -1160,22 +1428,151 @@
}
},
"eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.17.0.tgz",
+ "integrity": "sha512-zxTlSJkNvKNfWRBGxXoFbI4jCKFMDLdclPQZyvlCC4z35xPh81SuhIW1CfYoTmL4DvJEj+2X7wVXlHs5E/WaxQ==",
"dev": true,
"requires": {
- "eslint": "^7.2.0",
+ "eslint": "^7.6.0",
"eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
+ "eslint-plugin-jsdoc": "^30.2.1",
+ "eslint-plugin-json": "^2.1.2",
"eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
+ "eslint-plugin-mocha": "^8.0.0",
+ "eslint-plugin-no-jquery": "^2.5.0",
"eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
+ "eslint-plugin-qunit": "^4.3.0",
"eslint-plugin-vue": "^6.2.2",
"eslint-plugin-wdio": "^6.0.12"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+ "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.1.tgz",
+ "integrity": "sha512-/2rX2pfhyUG0y+A123d0ccXtMm7DV7sH1m3lk9nk2DZ2LReq39FXHueR9xZwshE5MdfSf0xunSaMWRqyIA6M1w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.1.3",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.0",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^1.3.0",
+ "espree": "^7.3.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"eslint-plugin-es": {
@@ -1189,30 +1586,30 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
+ "version": "30.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.3.1.tgz",
+ "integrity": "sha512-185ARou6Wj/68DP0g9kLLBnvmVwgg6/E/7Z8Z7Dz7Z63WgvRNaSvOLQiXkzIOEwstQfwI9PCuFPh4qBJov907A==",
"dev": true,
"requires": {
- "comment-parser": "^0.7.5",
+ "comment-parser": "^0.7.6",
"debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
"regextras": "^0.7.1",
- "semver": "^6.3.0",
+ "semver": "^7.3.2",
"spdx-expression-parse": "^3.0.1"
},
"dependencies": {
"lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
"dev": true
},
"spdx-expression-parse": {
@@ -1228,21 +1625,13 @@
}
},
"eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.2.tgz",
+ "integrity": "sha512-isM/fsUxS4wN1+nLsWoV5T4gLgBQnsql3nMTr8u+cEls1bL8rRQO5CP5GtxJxaOfbcKqnz401styw+H/P+e78Q==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- }
+ "lodash": "^4.17.19",
+ "vscode-json-languageservice": "^3.7.0"
}
},
"eslint-plugin-mediawiki": {
@@ -1256,13 +1645,13 @@
}
},
"eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.0.0.tgz",
+ "integrity": "sha512-n67etbWDz6NQM+HnTwZHyBwz/bLlYPOxUbw7bPuCyFujv7ZpaT/Vn6KTAbT02gf7nRljtYIjWcTxK/n8a57rQQ==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
}
},
"eslint-plugin-no-jquery": {
@@ -1300,9 +1689,9 @@
}
},
"eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.3.0.tgz",
+ "integrity": "sha512-xyQtwoDHWDuIqH5cp8SV0N++gFGwxfMKwRyumsBnJ3INM6Mz/qWUhrCTastOvvAc98aoieu2X5Ht4LgaZ3a75Q==",
"dev": true
},
"eslint-plugin-vue": {
@@ -1348,14 +1737,22 @@
"dev": true
},
"espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
"dev": true,
"requires": {
- "acorn": "^7.2.0",
+ "acorn": "^7.4.0",
"acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
+ "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -1581,9 +1978,9 @@
"dev": true
},
"fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@@ -1606,10 +2003,16 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz",
+ "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@@ -1633,6 +2036,16 @@
"to-regex-range": "^5.0.1"
}
},
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -1723,6 +2136,12 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
@@ -1730,9 +2149,21 @@
"dev": true
},
"gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true
},
"get-value": {
@@ -1797,9 +2228,9 @@
"dev": true
},
"globby": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
- "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
@@ -1811,9 +2242,9 @@
},
"dependencies": {
"ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
}
}
@@ -1834,9 +2265,9 @@
}
},
"grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1846,8 +2277,8 @@
"glob": "~7.1.6",
"grunt-cli": "~1.3.2",
"grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
"iconv-lite": "~0.4.13",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
@@ -1997,65 +2428,124 @@
"dev": true
},
"grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
"dev": true,
"requires": {
"colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
+ "grunt-legacy-log-utils": "~2.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.5"
+ "lodash": "~4.17.19"
}
},
"grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
"dev": true,
"requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
"dev": true,
"requires": {
"async": "~1.5.2",
"exit": "~0.1.1",
"getobject": "~0.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
"which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
}
},
"grunt-stylelint": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.15.0.tgz",
- "integrity": "sha512-1G5kbT3Y6OtAqgIv/XErtI6ai1t1UdtQWXxUV5Gd900PQoEzu/WrBYhGNAXdb/9nAsNWNjFHQjtdXQtZcDmobA==",
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.16.0.tgz",
+ "integrity": "sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==",
"dev": true,
"requires": {
- "chalk": "^3.0.0"
+ "chalk": "^4.1.0"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -2084,9 +2574,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -2100,6 +2590,15 @@
"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true
},
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -2180,10 +2679,13 @@
"dev": true
},
"hosted-git-info": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
- "dev": true
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+ "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"html-tags": {
"version": "3.1.0",
@@ -2242,6 +2744,12 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
"indexes-of": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
@@ -2265,9 +2773,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
+ "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
"dev": true
},
"interpret": {
@@ -2318,12 +2826,6 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -2341,11 +2843,20 @@
"dev": true
},
"is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
},
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -2481,24 +2992,12 @@
"unc-path-regex": "^0.1.2"
}
},
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -2534,9 +3033,9 @@
}
},
"jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true
},
"jsesc": {
@@ -2545,10 +3044,10 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"dev": true
},
"json-schema-traverse": {
@@ -2573,9 +3072,63 @@
}
},
"jsonc-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
- "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+ "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+ "dev": true
+ },
+ "jsonfilter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz",
+ "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^0.8.4",
+ "minimist": "^1.1.0",
+ "stream-combiner": "^0.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "jsonparse": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
+ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
"dev": true
},
"kind-of": {
@@ -2585,16 +3138,56 @@
"dev": true
},
"known-css-properties": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz",
- "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==",
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
+ "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
"dev": true
},
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
+ "ldjson-stream": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
+ "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=",
+ "dev": true,
+ "requires": {
+ "split2": "^0.2.1",
+ "through2": "^0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
},
"levn": {
"version": "0.4.1",
@@ -2761,21 +3354,12 @@
"dev": true
},
"locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "dependencies": {
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
+ "p-locate": "^4.1.0"
}
},
"lodash": {
@@ -2785,12 +3369,63 @@
"dev": true
},
"log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
"dev": true,
"requires": {
- "chalk": "^2.4.2"
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"longest-streak": {
@@ -2799,6 +3434,15 @@
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -2815,9 +3459,9 @@
"dev": true
},
"map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
"dev": true
},
"map-visit": {
@@ -2829,42 +3473,87 @@
"object-visit": "^1.0.0"
}
},
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
"mathml-tag-names": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
"integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
"dev": true
},
- "mdast-util-compact": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
- "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz",
+ "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==",
"dev": true,
"requires": {
- "unist-util-visit": "^2.0.0"
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "micromark": "~2.10.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz",
+ "integrity": "sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true
+ },
+ "meow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
+ "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ }
}
},
"merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
+ "micromark": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz",
+ "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
@@ -2876,9 +3565,9 @@
}
},
"min-indent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
- "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true
},
"minimatch": {
@@ -2897,13 +3586,14 @@
"dev": true
},
"minimist-options": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
- "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
"dev": true,
"requires": {
"arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
},
"dependencies": {
"is-plain-obj": {
@@ -2950,6 +3640,33 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.18.tgz",
+ "integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
+ "dev": true
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -2976,9 +3693,9 @@
"dev": true
},
"node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
+ "version": "1.1.67",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
+ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
"nopt": {
@@ -2991,15 +3708,33 @@
}
},
"normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+ "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
"dev": true,
"requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
+ "hosted-git-info": "^3.0.6",
+ "resolve": "^1.17.0",
+ "semver": "^7.3.2",
"validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.1.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
}
},
"normalize-range": {
@@ -3143,27 +3878,27 @@
}
},
"p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "^2.2.0"
}
},
"p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"parent-module": {
@@ -3200,6 +3935,18 @@
"path-root": "^0.1.1"
}
},
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
@@ -3212,6 +3959,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -3245,32 +3998,18 @@
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
"dev": true
},
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
"picomatch": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- }
- }
- },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -3278,9 +4017,9 @@
"dev": true
},
"postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
@@ -3329,29 +4068,6 @@
"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
"dev": true
},
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- },
- "dependencies": {
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- }
- }
- },
"postcss-resolve-nested-selector": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -3378,23 +4094,24 @@
}
},
"postcss-scss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
- "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
"dev": true,
"requires": {
- "postcss": "^7.0.0"
+ "postcss": "^7.0.6"
}
},
"postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
}
},
"postcss-syntax": {
@@ -3404,9 +4121,9 @@
"dev": true
},
"postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
"prelude-ls": {
@@ -3434,11 +4151,60 @@
"dev": true
},
"ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
"dev": true
},
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -3459,11 +4225,15 @@
"resolve": "^1.1.6"
}
},
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
- "dev": true
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
},
"regex-not": {
"version": "1.0.2",
@@ -3488,60 +4258,32 @@
"dev": true
},
"remark": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.0.tgz",
- "integrity": "sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^8.0.0",
- "remark-stringify": "^8.0.0",
- "unified": "^9.0.0"
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
}
},
"remark-parse": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.1.tgz",
- "integrity": "sha512-Ye/5W57tdQZWsfkuVyRq9SUWRgECHnDsMuyUMzdSKpTbNPkZeGtoYfsrkeSi4+Xyl0mhcPPddHITXPcCPHrl3w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^2.0.0",
- "vfile-location": "^3.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-from-markdown": "^0.8.0"
}
},
"remark-stringify": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.0.0.tgz",
- "integrity": "sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz",
+ "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^2.0.0",
- "mdast-util-compact": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^3.0.0",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "mdast-util-to-markdown": "^0.5.0"
}
},
"repeat-element": {
@@ -3562,6 +4304,12 @@
"integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
"dev": true
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
"resolve": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
@@ -3641,9 +4389,9 @@
}
},
"run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
},
"safe-buffer": {
@@ -3712,9 +4460,9 @@
"dev": true
},
"signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
"slash": {
@@ -3888,9 +4636,9 @@
"dev": true
},
"spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
@@ -3904,9 +4652,9 @@
"dev": true
},
"spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
@@ -3934,18 +4682,57 @@
"extend-shallow": "^3.0.0"
}
},
+ "split2": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
+ "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=",
+ "dev": true,
+ "requires": {
+ "through2": "~0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -3967,6 +4754,16 @@
}
}
},
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
"string-width": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -3989,15 +4786,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
}
}
},
@@ -4011,26 +4799,13 @@
},
"dependencies": {
"safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
}
}
},
- "stringify-entities": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.0.tgz",
- "integrity": "sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw==",
- "dev": true,
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.2",
- "is-hexadecimal": "^1.0.0"
- }
- },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -4040,6 +4815,15 @@
"ansi-regex": "^5.0.0"
}
},
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "requires": {
+ "min-indent": "^1.0.0"
+ }
+ },
"strip-json-comments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
@@ -4053,48 +4837,48 @@
"dev": true
},
"stylelint": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.3.2.tgz",
- "integrity": "sha512-kpO3/Gz2ZY40EWUwFYYkgpzhf8ZDUyKpcui5+pS0XKJBj/EMYmZpOJoL8IFAz2yApYeg91NVy5yAjE39hDzWvQ==",
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
+ "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
"dev": true,
"requires": {
- "@stylelint/postcss-css-in-js": "^0.37.1",
- "@stylelint/postcss-markdown": "^0.36.1",
- "autoprefixer": "^9.7.6",
+ "@stylelint/postcss-css-in-js": "^0.37.2",
+ "@stylelint/postcss-markdown": "^0.36.2",
+ "autoprefixer": "^9.8.6",
"balanced-match": "^1.0.0",
- "chalk": "^4.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
+ "chalk": "^4.1.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.2.0",
"execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
+ "fast-glob": "^3.2.4",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.0",
+ "get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
- "globby": "^11.0.0",
+ "globby": "^11.0.1",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
- "ignore": "^5.1.4",
+ "ignore": "^5.1.8",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.18.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
+ "known-css-properties": "^0.20.0",
+ "lodash": "^4.17.20",
+ "log-symbols": "^4.0.0",
"mathml-tag-names": "^2.1.3",
- "meow": "^6.1.0",
+ "meow": "^8.0.0",
"micromatch": "^4.0.2",
"normalize-selector": "^0.2.0",
- "postcss": "^7.0.27",
+ "postcss": "^7.0.35",
"postcss-html": "^0.36.0",
"postcss-less": "^3.1.4",
"postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^4.0.2",
"postcss-sass": "^0.4.4",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^6.0.2",
+ "postcss-scss": "^2.1.1",
+ "postcss-selector-parser": "^6.0.4",
"postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.3",
+ "postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
"slash": "^3.0.0",
"specificity": "^0.4.1",
@@ -4103,15 +4887,15 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
+ "table": "^6.0.3",
+ "v8-compile-cache": "^2.2.0",
"write-file-atomic": "^3.0.3"
},
"dependencies": {
"ajv": {
- "version": "6.12.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
- "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -4121,36 +4905,24 @@
}
},
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
"chalk": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
- "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -4172,26 +4944,38 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
- "dev": true
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
},
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"dev": true,
"requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "flat-cache": "^3.0.4"
}
},
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
"dev": true
},
"has-flag": {
@@ -4201,228 +4985,117 @@
"dev": true
},
"ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
"lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
- "map-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
- "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
- "dev": true
- },
- "meow": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
- "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.1.1",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.0.0",
- "minimist-options": "^4.0.1",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.0",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.8.1",
- "yargs-parser": "^18.1.1"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- }
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
"resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "glob": "^7.1.3"
}
},
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "min-indent": "^1.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
}
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
}
},
- "trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+ "v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"dev": true
}
}
},
"stylelint-config-wikimedia": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.1.tgz",
- "integrity": "sha512-R/E7xVKwDyneKmVwkNi+TqJlXZjnL5IH+bQPmfHrgwwyAekNx5GdYZ+tVjx7VBXdv/pjOr0HevVpXSQe86ZfVQ==",
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.3.tgz",
+ "integrity": "sha512-+n082jsEfX4v+ra5F6RfsEnjG6VymnHc613yJeyQAJtigL/+B5XDduVmtXk5vPZ01s0eXTOzVuK0aJ98ofmkoA==",
"dev": true,
"requires": {
- "stylelint": "13.3.2"
+ "stylelint": "13.8.0",
+ "stylelint-no-unsupported-browser-features": "4.1.4"
+ }
+ },
+ "stylelint-no-unsupported-browser-features": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz",
+ "integrity": "sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA==",
+ "dev": true,
+ "requires": {
+ "doiuse": "^4.3.1",
+ "lodash": "^4.17.15",
+ "postcss": "^8.1.4"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
"sugarss": {
@@ -4495,6 +5168,21 @@
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -4548,16 +5236,10 @@
"is-number": "^7.0.0"
}
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
+ "trim-newlines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+ "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
"dev": true
},
"trough": {
@@ -4606,20 +5288,10 @@
"util-deprecate": "^1.0.2"
}
},
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
"unified": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz",
- "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
"dev": true,
"requires": {
"bail": "^1.0.0",
@@ -4649,29 +5321,20 @@
"dev": true
},
"unist-util-find-all-after": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
- "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+ "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
"dev": true,
"requires": {
"unist-util-is": "^4.0.0"
}
},
"unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz",
+ "integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
- "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
"unist-util-stringify-position": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -4681,27 +5344,6 @@
"@types/unist": "^2.0.2"
}
},
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- },
"unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -4801,9 +5443,9 @@
}
},
"vfile": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz",
- "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
+ "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
"dev": true,
"requires": {
"@types/unist": "^2.0.0",
@@ -4814,9 +5456,9 @@
}
},
"vfile-location": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
- "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
"dev": true
},
"vfile-message": {
@@ -4830,9 +5472,9 @@
}
},
"vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.8.3.tgz",
+ "integrity": "sha512-8yPag/NQHCuTthahyaTtzK0DHT0FKM/xBU0mFBQ8nMo8C1i2P+FCyIVqICoNoHkRI2BTGlXKomPUpsqjSz0TnQ==",
"dev": true,
"requires": {
"jsonc-parser": "^2.2.1",
@@ -4890,12 +5532,6 @@
"acorn-jsx": "^5.2.0",
"eslint-visitor-keys": "^1.1.0"
}
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
}
}
},
@@ -4914,6 +5550,43 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -4947,32 +5620,50 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true
},
+ "y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"yaml": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz",
- "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz",
+ "integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==",
"dev": true,
"requires": {
- "@babel/runtime": "^7.9.2"
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- }
- }
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/MLEB/Translate/package.json b/MLEB/Translate/package.json
index 75b51d24..3e0ad4ac 100644
--- a/MLEB/Translate/package.json
+++ b/MLEB/Translate/package.json
@@ -4,11 +4,11 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.17.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
"grunt-eslint": "23.0.0",
- "grunt-stylelint": "0.15.0",
- "stylelint-config-wikimedia": "0.10.1"
+ "grunt-stylelint": "0.16.0",
+ "stylelint-config-wikimedia": "0.10.3"
}
}
diff --git a/MLEB/Translate/resources/css/ext.translate.groupselector.less b/MLEB/Translate/resources/css/ext.translate.groupselector.less
index 025dfa85..dbce8d3d 100644
--- a/MLEB/Translate/resources/css/ext.translate.groupselector.less
+++ b/MLEB/Translate/resources/css/ext.translate.groupselector.less
@@ -7,8 +7,7 @@
position: absolute;
top: 14px;
right: 0;
- z-index: 1000;
- display: none;
+ z-index: 900;
margin-top: 13px;
width: 600px;
padding: 0;
@@ -16,6 +15,10 @@
background-color: #f0f0f0;
border-radius: 5px;
box-shadow: 0 5px 10px rgba( 0, 0, 0, 0.2 );
+
+ &.hide {
+ display: none;
+ }
}
/* The triangle shaped callout */
@@ -61,7 +64,7 @@
}
.tux-groupselector__filter__search__icon {
- .background-image( '../images/search.svg' );
+ background-image: url( ../images/search.svg );
background-repeat: no-repeat;
background-position: right center;
background-size: 25px;
diff --git a/MLEB/Translate/resources/css/ext.translate.quickedit.css b/MLEB/Translate/resources/css/ext.translate.quickedit.css
index 3cd2825d..ee9ad228 100644
--- a/MLEB/Translate/resources/css/ext.translate.quickedit.css
+++ b/MLEB/Translate/resources/css/ext.translate.quickedit.css
@@ -2,35 +2,16 @@
color: #00f;
}
-.mw-translate-tmsug {
- margin-bottom: 0.2em;
-}
-
.mw-sp-translate-edit-fields fieldset {
line-height: normal;
margin: 0;
border: 1px solid #dbdbdb;
- /* Browsers suck
- max-height: 250px; */
- overflow: auto;
}
.mw-sp-translate-edit-fields legend {
background-color: transparent;
}
-.mw-translate-edit-extra {
- border-bottom: 1px solid #000;
-}
-
-.mw-translate-legend {
- border-left: 1px solid #000;
- float: right;
- margin-left: 1em;
- padding-left: 5pt;
- font-weight: bold;
-}
-
/* Align the adder according to the target language */
/* @noflip */
.mw-translate-adder-ltr {
@@ -44,11 +25,6 @@
padding-left: 1px;
}
-.mw-translate-sep {
- margin-bottom: 1ex;
- margin-top: 0.5ex;
-}
-
.mw-translate-edit-deftext {
/*
* Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
@@ -59,37 +35,7 @@
font-family: monospace, monospace;
}
-.mw-translate-edit-area {
- padding: 0;
- width: 100%;
-}
-
-/* Buttons */
-.mw-translate-save {
- font-weight: bold;
-}
-
-.mw-translate-history {
- float: right;
-}
-
-.mw-ajax-dialog #summary {
- width: 5em;
-}
-
/* Blue tints for translate fieldsets */
-.mw-sp-translate-edit-inother {
- background-color: #f8f8ff;
-}
-
-.mw-sp-translate-in-other-small {
- background-color: #f0f8ff;
-}
-
-.mw-sp-translate-in-other-big {
- background-color: #f0f8ff;
-}
-
.mw-sp-translate-message-documentation {
background-color: #ebebeb;
}
@@ -97,13 +43,3 @@
.mw-sp-translate-edit-definition {
background-color: #eaf3fc;
}
-
-.mw-translate-inputs {
- overflow: auto; /* Fix "100%" width after floats issue */
- padding: 2px; /* Avoid random scrollbars (browsers suck) */
-}
-
-.mw-translate-bottom {
- clear: both;
- margin-top: -3px; /* Reduce excess whitespace */
-}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.managegroups.css b/MLEB/Translate/resources/css/ext.translate.special.managegroups.css
index 53d4c0cf..53f9b5a0 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.managegroups.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.managegroups.css
@@ -38,6 +38,11 @@
right: 0;
}
+/** Added to override hover style added by Timeless */
+.mw-translate-smg-change .smg-rename-actions:hover {
+ background-color: transparent;
+}
+
.mw-translate-smg-change .smg-rename-actions.loading {
background: transparent url( ../images/loading.gif ) center center no-repeat;
background-size: 90%;
@@ -47,14 +52,20 @@
padding: 0.75em 0.5em 0 0.5em;
}
-.mw-translate-smg-submit {
- font-size: 5em;
+.oo-ui-buttonElement.mw-translate-smg-submit {
+ display: block;
+}
+
+.oo-ui-buttonElement.mw-translate-smg-submit button {
+ font-size: 3em;
margin: auto;
width: 80%;
display: block;
+ word-wrap: break-word;
+ white-space: pre-wrap;
}
-.diff-lineno {
+.mw-translate-smg-change .diff-lineno {
display: none;
}
@@ -63,10 +74,19 @@
font-weight: bold;
}
+.mw-translate-hide {
+ display: none;
+}
+
.warningbox.mw-translate-smg-submitted {
margin-top: 2.5em;
}
+.mw-translate-smg-change .mw-translate-smg-notice-important {
+ background: #fbb;
+ border: 1px solid #f58d8d;
+}
+
/**************************
* Rename dropdown styles
**************************/
@@ -85,7 +105,8 @@
display: block;
}
-.smg-rename-dropdown-menu button {
+/* Additional class to override CSS from skins */
+.smg-rename-dropdown-menu.smg-rename-dropdown-menu button {
display: block;
background: none;
border: 0;
@@ -95,10 +116,48 @@
white-space: nowrap;
color: #222;
font-size: 14px;
+ font-weight: normal;
}
-.smg-rename-dropdown-menu button:hover {
+.smg-rename-dropdown-menu.smg-rename-dropdown-menu button:hover {
cursor: pointer;
background-color: #f0f0f0;
color: #222;
}
+
+.smg-group-sync-cache-info {
+ padding: 0.5em 1em;
+ background: #f0f0f0;
+ border-radius: 3px;
+ margin-bottom: 1em;
+}
+
+.smg-group-sync-cache-info__help {
+ position: absolute;
+ right: 1em;
+}
+
+.smg-group-sync-cache-info__group-errors {
+ margin-bottom: 0.5em;
+ background-color: #e0e0e0;
+ padding: 0.5em 1em;
+ border-radius: 3px;
+}
+
+.smg-group-sync-cache-info__message-error dt {
+ float: left;
+ text-align: right;
+ margin-right: 5px;
+}
+
+.client-nojs .smg-group-sync-cache-info__resolve-action {
+ pointer-events: none;
+ text-decoration: line-through;
+ color: inherit;
+}
+
+.smg-group-sync-cache-info__sync-actions .loading {
+ pointer-events: none;
+ color: inherit;
+ text-decoration: none;
+}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.pagemigration.css b/MLEB/Translate/resources/css/ext.translate.special.pagemigration.css
index 06c061cf..ced60095 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.pagemigration.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.pagemigration.css
@@ -5,14 +5,10 @@
border: 2px solid #808080;
}
-#title {
+.mw-tpm-sp-form #title {
width: 35%;
}
-.hide {
- display: none;
-}
-
.mw-tpm-sp-unit:last-child .mw-tpm-sp-action--swap,
.mw-tpm-sp-unit:last-child .mw-tpm-sp-action--add {
display: none;
@@ -22,7 +18,7 @@
padding-bottom: 10px;
}
-.grid .mw-tpm-sp-unit textarea {
+.mw-tpm-sp-container .mw-tpm-sp-unit textarea {
padding: 10px;
}
@@ -67,7 +63,7 @@
margin: 0.7em 0;
}
-.client-nojs .grid {
+.client-nojs .mw-tpm-sp-container {
display: none;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.pagepreparation.css b/MLEB/Translate/resources/css/ext.translate.special.pagepreparation.css
index d68d6072..35de8fd5 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.pagepreparation.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.pagepreparation.css
@@ -1,8 +1,8 @@
-#page {
+.mw-tpp-sp-form #page {
width: 35%;
}
-.client-nojs .grid {
+.client-nojs .mw-tpp-sp-container {
display: none;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.pagetranslation.css b/MLEB/Translate/resources/css/ext.translate.special.pagetranslation.css
index c6afa183..910f6533 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.pagetranslation.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.pagetranslation.css
@@ -21,11 +21,6 @@
padding-right: 2em;
}
-.ui-autocomplete {
- max-height: 100px;
- overflow-y: auto;
- /* prevent horizontal scrollbar */
- overflow-x: hidden;
- /* add padding to account for vertical scrollbar */
- padding-right: 20px;
+.client-nojs .mw-tpt-sp-markform .mw-widgets-pendingTextInputWidget {
+ display: none;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.searchtranslations.css b/MLEB/Translate/resources/css/ext.translate.special.searchtranslations.css
index c866a818..9f5752ad 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.searchtranslations.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.searchtranslations.css
@@ -116,7 +116,7 @@
margin: 5px 0;
}
-h1.firstHeading {
+.mw-special-SearchTranslations h1.firstHeading {
display: none;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.supportedlanguages.css b/MLEB/Translate/resources/css/ext.translate.special.supportedlanguages.css
index 0bab7abe..d0553411 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.supportedlanguages.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.supportedlanguages.css
@@ -8,13 +8,13 @@
margin-top: 2em;
}
-.tagcloud {
+.mw-special-SupportedLanguages .tagcloud {
line-height: 200%;
margin: 5em;
text-align: center;
}
-.tagcloud .tag {
+.mw-special-SupportedLanguages .tagcloud .tag {
white-space: nowrap;
margin: 0.5ex;
color: #000;
diff --git a/MLEB/Translate/resources/css/ext.translate.special.translate.css b/MLEB/Translate/resources/css/ext.translate.special.translate.css
index 5c1e0731..73766c02 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.translate.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.translate.css
@@ -191,19 +191,17 @@
}
}
-.tux-message-filter-wrapper {
- background: no-repeat scroll left center transparent;
- background-image: /* @embed */ linear-gradient( transparent, transparent ), url( ../images/search.svg );
- background-size: 25px;
- padding-left: 30px;
-}
-
.tux-message-filter-box {
+ background: no-repeat url( ../images/search.svg ) 8px center;
+ background-size: 18px;
font-size: 14px;
+ /* FIXME: `box-sizing` lives here due to a shortcoming in Timeless, isn't needed in other skins
+ As soon as https://phabricator.wikimedia.org/T276896 is resolved, next line should be removed */
+ box-sizing: border-box !important;
height: 28px;
border: 1px solid #c9c9c9;
width: 100%;
- padding: 0 5px;
+ padding: 0 5px 0 34px;
margin: 0;
}
@@ -214,3 +212,7 @@
.client-js .tux-nojs {
display: none;
}
+
+.mw-special-Translate #firstHeading {
+ display: none;
+}
diff --git a/MLEB/Translate/resources/css/ext.translate.special.translations.css b/MLEB/Translate/resources/css/ext.translate.special.translations.css
index 030369e1..aa177067 100644
--- a/MLEB/Translate/resources/css/ext.translate.special.translations.css
+++ b/MLEB/Translate/resources/css/ext.translate.special.translations.css
@@ -1,39 +1,7 @@
-.mw-sp-translate-table {
- width: 100%;
- border-width: 1px;
- border-collapse: collapse;
-}
-
-.mw-sp-translate-table th {
- background-color: #b2b2ff;
- border: 1px solid;
-}
-
-.mw-sp-translate-table tr.orig {
+.mw-sp-translate-table .mw-sp-translate-fuzzy {
background-color: #ffe2e2;
}
-.mw-sp-translate-table tr.new {
- background-color: #e2ffe2;
-}
-
-.mw-sp-translate-table tr.def {
- background-color: #f0f0ff;
-}
-
-.mw-sp-translate-table tr.ign {
- background-color: #202020;
-}
-
-.mw-sp-translate-table tr.opt {
- background-color: #f2f200;
-}
-
-.mw-sp-translate-table .untranslated {
- background-color: #a2f290;
-}
-
-.mw-sp-translate-table > tbody > tr > * {
+.mw-sp-translate-table td {
vertical-align: top;
- border: 1px solid #909090;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.statstable.less b/MLEB/Translate/resources/css/ext.translate.statstable.less
index a33400f1..ee70f44d 100644
--- a/MLEB/Translate/resources/css/ext.translate.statstable.less
+++ b/MLEB/Translate/resources/css/ext.translate.statstable.less
@@ -21,6 +21,10 @@
cursor: s-resize;
}
+ .statstable-hide {
+ display: none;
+ }
+
/* Small zebra rows effect */
> * > tr {
&.tux-statstable-even > td {
@@ -40,6 +44,9 @@
padding: 0.5em;
font-weight: normal;
letter-spacing: 1px;
+ position: sticky;
+ top: 0;
+ z-index: 1;
}
> td {
diff --git a/MLEB/Translate/resources/css/ext.translate.tabgroup.css b/MLEB/Translate/resources/css/ext.translate.tabgroup.css
index 9943d134..fa8f48ff 100644
--- a/MLEB/Translate/resources/css/ext.translate.tabgroup.css
+++ b/MLEB/Translate/resources/css/ext.translate.tabgroup.css
@@ -1,8 +1,3 @@
-/* Heading not needed for special pages in tab group */
-#firstHeading {
- display: none;
-}
-
#left-navigation .selected {
font-weight: bold;
}
diff --git a/MLEB/Translate/resources/css/ext.translate.translationstats.graphbuilder.less b/MLEB/Translate/resources/css/ext.translate.translationstats.graphbuilder.less
new file mode 100644
index 00000000..55a663c6
--- /dev/null
+++ b/MLEB/Translate/resources/css/ext.translate.translationstats.graphbuilder.less
@@ -0,0 +1,91 @@
+/**
+ * Contains CSS for the error messages and loaders displayed.
+ * when loading the translation stats graph.
+ * @license GPL-2.0-or-later
+ */
+.mw-translate-translationstats-container {
+ @keyframes mw-translate-loading-spinner {
+ from {
+ transform: rotate( 0deg );
+ }
+
+ to {
+ transform: rotate( 360deg );
+ }
+ }
+ position: relative;
+ display: inline-block;
+ margin-right: 40px;
+ margin-top: 1em;
+ vertical-align: top;
+
+ .mw-translationstats-graph-container {
+ margin: auto;
+ }
+
+ .mw-translate-loading-spinner {
+ /* @embed */
+ background-image: url( ../images/loading.svg );
+ background-size: 100%;
+ animation-name: mw-translate-loading-spinner;
+ animation-duration: 1.5s;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+ height: 34px;
+ width: 34px;
+ backface-visibility: hidden;
+ position: absolute;
+ left: 48%;
+ top: 15%;
+ display: none;
+ }
+
+ .mw-translate-error-container {
+ width: 100%;
+ top: 1em;
+ position: absolute;
+ background-color: #fee7e6;
+ color: #b32424;
+ padding: 0.6em 1em;
+ text-align: center;
+ display: none;
+ }
+
+ &.mw-translate-loading .mw-translate-loading-spinner {
+ display: block;
+ }
+
+ &.mw-translate-has-error .mw-translate-error-container {
+ display: block;
+ }
+}
+
+.mw-translate-translationstats-table {
+ border: 0;
+ clip: rect( 1px, 1px, 1px, 1px );
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+
+ tbody td:not( :first-child ) {
+ text-align: right;
+ }
+
+ &:focus,
+ &:active {
+ clip: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ position: static;
+ width: auto;
+ }
+}
+
+// Used on Special:TranslationStats
+.mw-translate-translationstats-hide {
+ display: none;
+}
diff --git a/MLEB/Translate/resources/images/search.svg b/MLEB/Translate/resources/images/search.svg
index e9d42573..f9b81b15 100644
--- a/MLEB/Translate/resources/images/search.svg
+++ b/MLEB/Translate/resources/images/search.svg
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
- <path fill="#54595d" d="M3.377 3.377c4.503-4.503 11.806-4.503 16.31 0 4.07 4.072 4.415 10.425 1.122 14.936L32 29.503 29.504 32l-11.19-11.19C13.8 24.102 7.448 23.757 3.376 19.684c-4.503-4.502-4.503-11.805 0-16.308zM5.5 5.5c-3.344 3.34-3.385 8.763-.043 12.105 3.343 3.343 8.806 3.343 12.148 0 3.343-3.342 3.3-8.764-.04-12.106-3.344-3.343-8.724-3.343-12.066 0z"/>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <title>
+ search
+ </title>
+ <path fill="#54595d" fill-rule="evenodd" d="M12.2 13.6a7 7 0 111.4-1.4l5.4 5.4-1.4 1.4-5.4-5.4zM13 8A5 5 0 113 8a5 5 0 0110 0z"/>
</svg>
diff --git a/MLEB/Translate/resources/js/LanguagesMultiselectWidget.js b/MLEB/Translate/resources/js/LanguagesMultiselectWidget.js
new file mode 100644
index 00000000..2ec3b0e7
--- /dev/null
+++ b/MLEB/Translate/resources/js/LanguagesMultiselectWidget.js
@@ -0,0 +1,123 @@
+'use strict';
+/* eslint-disable no-implicit-globals */
+
+/**
+ * @class
+ * @extends OO.ui.MenuTagMultiselectWidget
+ * @mixins OO.ui.mixin.RequestManager
+ * @mixins OO.ui.mixin.PendingElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.07
+ */
+var LanguagesMultiselectWidget = function ( config ) {
+ this.api = config.api;
+ this.allowedValues = Object.keys( config.languages );
+ this.languages = config.languages;
+
+ LanguagesMultiselectWidget.parent.call( this, $.extend( true,
+ {
+ allowEditTags: false,
+ allowArbitary: false,
+ menu: {
+ filterFromInput: false
+ }
+ },
+ config
+ ) );
+
+ OO.ui.mixin.RequestManager.call( this, config );
+ OO.ui.mixin.PendingElement.call( this, $.extend( true, {}, config, {
+ $pending: this.$handle
+ } ) );
+
+ // No need for default values for the menu
+ this.menu.clearItems();
+};
+
+/* Setup */
+
+OO.inheritClass( LanguagesMultiselectWidget, OO.ui.MenuTagMultiselectWidget );
+OO.mixinClass( LanguagesMultiselectWidget, OO.ui.mixin.RequestManager );
+OO.mixinClass( LanguagesMultiselectWidget, OO.ui.mixin.PendingElement );
+
+/* Methods */
+
+/** @inheritdoc OO.ui.MenuTagMultiselectWidget */
+LanguagesMultiselectWidget.prototype.onInputChange = function () {
+ var widget = this;
+
+ this.getRequestData()
+ .then( function ( data ) {
+ // Reset
+ widget.menu.clearItems();
+ widget.menu.addItems( widget.getOptionsFromData( data ) );
+ } ).always( function () {
+ // Parent method
+ LanguagesMultiselectWidget.parent.prototype.onInputChange.call( widget );
+ } );
+};
+
+/**
+ * Get option widgets from the server response
+ *
+ * @param {Object} data Query result
+ * @return {OO.ui.MenuOptionWidget[]} Menu items
+ */
+LanguagesMultiselectWidget.prototype.getOptionsFromData = function ( data ) {
+ var languageCode, options = [];
+
+ for ( languageCode in data ) {
+ if ( this.languages[ languageCode ] !== undefined ) {
+ options.push( new OO.ui.MenuOptionWidget( {
+ data: languageCode,
+ label: this.languages[ languageCode ]
+ } ) );
+ }
+ }
+
+ return options;
+};
+
+/** @inheritdoc OO.ui.MenuTagMultiselectWidget */
+LanguagesMultiselectWidget.prototype.setValue = function ( valueObject ) {
+ valueObject = Array.isArray( valueObject ) ? valueObject : [ valueObject ];
+
+ this.clearItems();
+ valueObject.forEach( function ( obj ) {
+ var data;
+
+ if ( typeof obj === 'string' ) {
+ data = obj;
+ } else {
+ data = obj.data;
+ }
+
+ this.addTag( data, this.languages[ data ] );
+ }.bind( this ) );
+};
+
+/** @inheritdoc OO.ui.mixin.RequestManager */
+LanguagesMultiselectWidget.prototype.getRequestQuery = function () {
+ return this.input.getValue();
+};
+
+/** @inheritdoc OO.ui.mixin.RequestManager */
+LanguagesMultiselectWidget.prototype.getRequest = function () {
+ return this.api.get( {
+ action: 'languagesearch',
+ formatversion: '2',
+ search: this.getRequestQuery()
+ } );
+};
+
+/** @inheritdoc OO.ui.mixin.RequestManager */
+LanguagesMultiselectWidget.prototype.getRequestCacheDataFromResponse = function ( response ) {
+ return response.languagesearch || {};
+};
+
+module.exports = LanguagesMultiselectWidget;
diff --git a/MLEB/Translate/resources/js/ext.translate.base.js b/MLEB/Translate/resources/js/ext.translate.base.js
index e9930834..cb0e13a5 100644
--- a/MLEB/Translate/resources/js/ext.translate.base.js
+++ b/MLEB/Translate/resources/js/ext.translate.base.js
@@ -171,10 +171,9 @@
},
isDirty: function () {
- return $( '.mw-ajax-dialog:visible' ).length || // For old Translate
- // For new Translate, something being typed in the current editor.
- mw.translate.dirty ||
- // For new translate, previous editors has some unsaved edits
+ // Something being typed in the current editor.
+ return mw.translate.dirty ||
+ // Previous editors has some unsaved edits
$( '.tux-status-unsaved' ).length;
}
} );
diff --git a/MLEB/Translate/resources/js/ext.translate.editor.helpers.js b/MLEB/Translate/resources/js/ext.translate.editor.helpers.js
index 7a1729aa..f728381e 100644
--- a/MLEB/Translate/resources/js/ext.translate.editor.helpers.js
+++ b/MLEB/Translate/resources/js/ext.translate.editor.helpers.js
@@ -68,8 +68,10 @@
).done( function ( parsedDocumentation ) {
$messageDesc.html( parsedDocumentation );
} ).fail( function ( errorCode, results ) {
+ // Note: It is possible for results to be undefined.
+ var errorInfo = results && results.error ? results.error.info : 'No information';
$messageDesc.html( newDocumentation );
- mw.log( 'Error parsing documentation ' + errorCode + ' ' + results.error.info );
+ mw.log( 'Error parsing documentation ' + errorCode + ' ' + errorInfo );
} ).always( function () {
// A collapsible element etc. may have been added
mw.hook( 'wikipage.content' ).fire( $messageDesc );
@@ -359,7 +361,7 @@
e.stopPropagation();
if ( suggestion.$sourcesElement ) {
- suggestion.$sourcesElement.toggle();
+ suggestion.$sourcesElement.toggleClass( 'hide' );
return;
}
@@ -568,10 +570,12 @@
);
}.bind( this ) ).fail( function ( errorCode, results ) {
+ // results.error may be undefined
+ var errorInfo = results && results.error && results.error.info || 'Unknown error';
this.$editor.find( '.infocolumn .loading' ).remove();
this.$editor.find( '.infocolumn' ).append(
$( '<div>' )
- .text( mw.msg( 'tux-editor-loading-failed', results.error.info ) )
+ .text( mw.msg( 'tux-editor-loading-failed', errorInfo ) )
.addClass( 'warningbox tux-translation-aid-error' )
);
mw.log.error( 'Error loading translation aids:', errorCode, results );
diff --git a/MLEB/Translate/resources/js/ext.translate.editor.js b/MLEB/Translate/resources/js/ext.translate.editor.js
index 0074418c..e4e227c1 100644
--- a/MLEB/Translate/resources/js/ext.translate.editor.js
+++ b/MLEB/Translate/resources/js/ext.translate.editor.js
@@ -244,16 +244,6 @@
if ( editResp.result === 'Success' ) {
translateEditor.message.translation = translation;
translateEditor.onSaveSuccess();
- // Handle errors
- // BC MW < 1.34
- } else if ( editResp.spamblacklist ) {
- translateEditor.onSaveFail( mw.msg( 'spamprotectiontext' ) );
- // BC MW < 1.34
- } else if ( editResp.info &&
- editResp.info.indexOf( 'Hit AbuseFilter:' ) === 0 &&
- editResp.warning
- ) {
- translateEditor.onSaveFail( editResp.warning );
} else {
translateEditor.onSaveFail( mw.msg( 'tux-save-unknown-error' ) );
mw.log( response, xhr );
@@ -505,7 +495,7 @@
$editSummary,
$editSummaryBlock,
$discardChangesButton = $( [] ),
- $saveButton,
+ $saveButton = $( [] ),
$requestRight,
$skipButton,
$cancelButton,
@@ -689,9 +679,7 @@
} );
$textarea.on( 'textchange', function () {
- var $textarea = $( this ),
- $saveButton = translateEditor.$editor.find( '.tux-editor-save-button' ),
- $pasteSourceButton = translateEditor.$editor.find( '.tux-editor-paste-original-button' ),
+ var $pasteSourceButton = translateEditor.$editor.find( '.tux-editor-paste-original-button' ),
original = translateEditor.message.translation || '',
current = $textarea.val() || '';
@@ -1391,7 +1379,7 @@
},
/**
- * Makes the textare large enough for insertables and positions the insertables.
+ * Makes the textarea large enough for insertables and positions the insertables.
*
* @param {jQuery} $textarea Text area.
*/
diff --git a/MLEB/Translate/resources/js/ext.translate.groupselector.js b/MLEB/Translate/resources/js/ext.translate.groupselector.js
index 624da2a2..c87f4acf 100644
--- a/MLEB/Translate/resources/js/ext.translate.groupselector.js
+++ b/MLEB/Translate/resources/js/ext.translate.groupselector.js
@@ -64,7 +64,7 @@
this.$menu = $( '<div>' )
.addClass( 'tux-groupselector' )
- .addClass( 'grid' );
+ .addClass( 'grid hide' );
$searchIcon = $( '<div>' )
.addClass( 'two columns tux-groupselector__filter__search__icon' );
@@ -124,7 +124,7 @@
* Show the selector
*/
show: function () {
- this.$menu.addClass( 'open' ).show();
+ this.$menu.addClass( 'open' ).removeClass( 'hide' );
this.position();
// Place the focus in the message group search box.
this.$search.trigger( 'focus' );
@@ -147,7 +147,7 @@
return;
}
- this.$menu.hide().removeClass( 'open' );
+ this.$menu.addClass( 'hide' ).removeClass( 'open' );
},
/**
@@ -301,7 +301,7 @@
showDefaultGroups: function () {
var groupSelector = this;
- this.$loader.show();
+ this.$loader.removeClass( 'hide' );
this.loadGroups().done( function ( groups ) {
var groupsToShow = mw.translate.findGroup( groupSelector.parentGroupId, groups );
@@ -311,7 +311,7 @@
groupsToShow = groupsToShow.groups;
}
- groupSelector.$loader.hide();
+ groupSelector.$loader.addClass( 'hide' );
groupSelector.$list.empty();
groupSelector.addGroupRows( groupsToShow );
} );
@@ -333,11 +333,11 @@
*/
showSelectedGroups: function ( groups ) {
var groupSelector = this;
- this.$loader.show();
+ this.$loader.removeClass( 'hide' );
this.loadGroups()
.then( function ( allGroups ) {
var rows = [];
- $.each( groups, function ( index, id ) {
+ groups.forEach( function ( id ) {
var group = mw.translate.findGroup( id, allGroups );
if ( group ) {
rows.push( groupSelector.prepareMessageGroupRow( group ) );
@@ -346,7 +346,7 @@
return rows;
} )
.always( function () {
- groupSelector.$loader.hide();
+ groupSelector.$loader.addClass( 'hide' );
groupSelector.$list.empty();
} )
.done( function ( rows ) {
@@ -415,7 +415,7 @@
}
}
- self.$loader.hide();
+ self.$loader.addClass( 'hide' );
self.$list.empty();
self.addGroupRows( foundGroups );
} );
@@ -466,7 +466,7 @@
return;
}
- $.each( groups, function ( index, group ) {
+ groups.forEach( function ( group ) {
/* Hide from the selector:
* - discouraged groups (the only priority value currently supported).
* - groups that are recommended for other languages.
diff --git a/MLEB/Translate/resources/js/ext.translate.messagetable.js b/MLEB/Translate/resources/js/ext.translate.messagetable.js
index ba139bed..9bea2c33 100644
--- a/MLEB/Translate/resources/js/ext.translate.messagetable.js
+++ b/MLEB/Translate/resources/js/ext.translate.messagetable.js
@@ -285,17 +285,17 @@
} );
setTimeout( function () {
- var offset, $icon = $( '.autotooltip:visible' );
- if ( !$icon.length ) {
+ var offset, $visibleIcon = $( '.autotooltip:visible' );
+ if ( !$visibleIcon.length ) {
return;
}
- offset = $icon.offset();
+ offset = $visibleIcon.offset();
tooltip.$element.appendTo( document.body );
tooltip.toggle( true ).toggleClipping( false ).togglePositioning( false );
tooltip.$element.css( {
- top: offset.top + $icon.outerHeight() + 5,
- left: offset.left + $icon.outerWidth() - tooltip.$element.width() / 2 - 15
+ top: offset.top + $visibleIcon.outerHeight() + 5,
+ left: offset.left + $visibleIcon.outerWidth() - tooltip.$element.width() / 2 - 15
} );
setTimeout( function () {
@@ -509,7 +509,7 @@
}
}
- $.each( messages, function ( index, message ) {
+ messages.forEach( function ( message, index ) {
message.group = self.settings.group;
self.add( message );
self.messages.push( message );
@@ -779,7 +779,7 @@
}
if ( messageTable.messages.length ) {
- $.each( messageTable.messages, function ( index, message ) {
+ messageTable.messages.forEach( function ( message ) {
messageTable.add( message );
} );
} else if ( messageTable.initialized && !messageTable.loading ) {
@@ -855,7 +855,7 @@
var $warningContainer = $( '.tux-editor-header .group-warning' );
if ( errors ) {
- $.map( errors, function ( error ) {
+ errors.forEach( function ( error ) {
$warningContainer.append( error.html );
} );
} else {
diff --git a/MLEB/Translate/resources/js/ext.translate.multiselectautocomplete.js b/MLEB/Translate/resources/js/ext.translate.multiselectautocomplete.js
deleted file mode 100644
index e8c88897..00000000
--- a/MLEB/Translate/resources/js/ext.translate.multiselectautocomplete.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*!
- * @author Santhosh Thottingal
- * jQuery autocomplete based multiple selector for input box.
- * Autocompleted values will be available in input filed as comma separated values.
- * The values for autocompletion is from the language selector in this case.
- * The input field is created in PHP code.
- * Credits: https://jqueryui.com/autocomplete/#multiple
- */
-$( function () {
- 'use strict';
-
- /* eslint-disable no-underscore-dangle */
-
- $.widget( 'ui.multiselectautocomplete', {
- options: {
- inputbox: null // a jQuery selector for the input box where selections are written.
- // TODO can have more options.
- },
- _create: function () {
- var self, select, options, input;
-
- self = this;
- select = this.element.hide();
- options = this.options;
-
- function split( val ) {
- return val.split( /,\s*/ );
- }
-
- input = this.input = $( options.inputbox ).autocomplete( {
- delay: 0,
- minLength: 0,
- source: function ( request, response ) {
- var term, matcher;
-
- term = split( request.term ).pop();
- matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), 'i' );
-
- response( select.children( 'option' ).map( function () {
- var text = $( this ).html(),
- value = $( this ).val(),
- term = split( request.term ).pop();
-
- if ( this.value && ( !request.term || matcher.test( text ) ) ) {
- if ( term.trim() !== '' ) {
- text = text.replace(
- new RegExp(
- '(?![^&;]+;)(?!<[^<>]*)(' +
- $.ui.autocomplete.escapeRegex( term ) +
- ')(?![^<>]*>)(?![^&;]+;)', 'gi'
- ), '<strong>$1</strong>' );
- }
-
- return {
- label: text,
- value: value,
- option: this
- };
- }
- return undefined;
- } ) );
- },
- select: function ( event, ui ) {
- var terms;
-
- ui.item.option.selected = true;
- self._trigger( 'selected', event, {
- item: ui.item.option
- } );
- terms = split( $( this ).val() );
- // remove the current input
- terms.pop();
- // add the selected item
- terms.push( ui.item.value );
- // add placeholder to get the comma-and-space at the end
- terms.push( '' );
- $( this ).val( terms.join( ', ' ) );
- return false;
- }
- } );
-
- input.data( 'autocomplete' )._renderItem = function ( ul, item ) {
- return $( '<li>' )
- .data( 'item.autocomplete', item )
- .append( '<a>' + item.label + '</a>' )
- .appendTo( ul );
- };
- }, // End of _create
-
- destroy: function () {
- this.input.remove();
- this.element.show();
- $.Widget.prototype.destroy.call( this );
- }
- } );
-} );
diff --git a/MLEB/Translate/resources/js/ext.translate.pagetranslation.uls.js b/MLEB/Translate/resources/js/ext.translate.pagetranslation.uls.js
index 00c67e9e..a0bfc2d4 100644
--- a/MLEB/Translate/resources/js/ext.translate.pagetranslation.uls.js
+++ b/MLEB/Translate/resources/js/ext.translate.pagetranslation.uls.js
@@ -10,6 +10,13 @@
page = page.replace( /\/[^/]+$/, '' );
}
- location.href = mw.util.getUrl( page, { setlang: language } );
+ if ( mw.uls.setLanguage ) {
+ mw.uls.setLanguage( language ).then( function () {
+ location.href = mw.util.getUrl( page );
+ } );
+ } else {
+ // Fallback if ULS is older than Translate (2021.03)
+ location.href = mw.util.getUrl( page, { setlang: language } );
+ }
};
}() );
diff --git a/MLEB/Translate/resources/js/ext.translate.parsers.js b/MLEB/Translate/resources/js/ext.translate.parsers.js
index 4f38df41..393a76bb 100644
--- a/MLEB/Translate/resources/js/ext.translate.parsers.js
+++ b/MLEB/Translate/resources/js/ext.translate.parsers.js
@@ -36,14 +36,14 @@
} );
text = text.replace( /(^\*.*(\n|$))+/gm, function ( match ) {
- match = match.replace( /^\*(.*)/gm, function ( match, p1 ) {
+ match = match.replace( /^\*(.*)/gm, function ( fullMatch, p1 ) {
return $( '<div>' ).append( $( '<li>' ).html( p1 ) ).html();
} );
return $( '<div>' ).append( $( '<ul>' ).html( match ) ).html();
} );
text = text.replace( /(^#.*(\n|$))+/gm, function ( match ) {
- match = match.replace( /^#(.*)/gm, function ( match, p1 ) {
+ match = match.replace( /^#(.*)/gm, function ( fullMatch, p1 ) {
return $( '<div>' ).append( $( '<li>' ).html( p1 ) ).html();
} );
return $( '<div>' ).append( $( '<ol>' ).html( match ) ).html();
diff --git a/MLEB/Translate/resources/js/ext.translate.proofread.js b/MLEB/Translate/resources/js/ext.translate.proofread.js
index 22179f6a..ad3791af 100644
--- a/MLEB/Translate/resources/js/ext.translate.proofread.js
+++ b/MLEB/Translate/resources/js/ext.translate.proofread.js
@@ -268,9 +268,7 @@
data = $this.data( 'proofread' );
if ( !data ) {
- $this.data( 'proofread',
- ( data = new Proofread( this, options ) )
- );
+ $this.data( 'proofread', new Proofread( this, options ) );
}
} );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.aggregategroups.js b/MLEB/Translate/resources/js/ext.translate.special.aggregategroups.js
index 24b2079d..41d4ac0a 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.aggregategroups.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.aggregategroups.js
@@ -31,7 +31,7 @@
}
function associate( event, resp ) {
- var successFunction, params, subgroupId,
+ var successFunction, params, subgroupId, i,
$target = $( event.target ),
$parent = $target.parents( '.mw-tpa-group' ),
parentId = $parent.data( 'id' ),
@@ -63,11 +63,12 @@
// Get the label for the value and make API request if valid
subgroupId = '';
- $.each( resp, function ( key, value ) {
- if ( subgroupName === value.label ) {
- subgroupId = value.id;
+ for ( i = 0; i < resp.length; ++i ) {
+ if ( subgroupName === resp[ i ].label ) {
+ subgroupId = resp[ i ].id;
+ break;
}
- } );
+ }
if ( subgroupId ) {
params = $.extend( getApiParams( $target ), {
@@ -201,11 +202,15 @@
resp = [];
- $.each( groups, function ( key, value ) {
- if ( value.label.match( inp ) && exclude.indexOf( value.label ) === -1 ) {
- resp.push( value );
+ Object.keys( groups ).forEach( function ( key ) {
+ if (
+ groups[ key ].label.match( inp ) &&
+ exclude.indexOf( groups[ key ].label ) === -1
+ ) {
+ resp.push( groups[ key ] );
}
} );
+
response( resp );
};
diff --git a/MLEB/Translate/resources/js/ext.translate.special.languagestats.js b/MLEB/Translate/resources/js/ext.translate.special.languagestats.js
index 8f65646e..00daca44 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.languagestats.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.languagestats.js
@@ -8,19 +8,20 @@
( function () {
'use strict';
+ var $columns;
+
/**
* Add css class to every other visible row.
* It's not possible to do zebra colors with CSS only if there are hidden rows.
*/
- function doZebra() {
- $( '.statstable tr:visible:odd' ).toggleClass( 'tux-statstable-even', false );
- $( '.statstable tr:visible:even' ).toggleClass( 'tux-statstable-even', true );
+ function doZebra( $table ) {
+ $table.find( 'tr:visible:odd' ).toggleClass( 'tux-statstable-even', false );
+ $table.find( 'tr:visible:even' ).toggleClass( 'tux-statstable-even', true );
}
- $( function () {
+ function addExpanders( $table ) {
var $allChildRows, $allTogglesCache, $toggleAllButton,
- $translateTable = $( '.statstable' ),
- $metaRows = $( 'tr.AggregateMessageGroup', $translateTable );
+ $metaRows = $( 'tr.AggregateMessageGroup', $table );
// Quick return
if ( !$metaRows.length ) {
@@ -31,7 +32,7 @@
var $toggler,
$parent = $( this ),
thisGroupId = $parent.attr( 'data-groupid' ),
- $children = $( 'tr[data-parentgroup="' + thisGroupId + '"]', $translateTable );
+ $children = $( 'tr[data-parentgroup="' + thisGroupId + '"]', $table );
// Only do the collapse stuff if this Meta-group actually has children on this page
if ( !$children.length ) {
@@ -51,11 +52,13 @@
var $el = $( this );
// Switch the state and toggle the rows
if ( $el.hasClass( 'collapsed' ) ) {
- $children.fadeIn( { start: doZebra } ).trigger( 'show' );
+ $children.removeClass( 'statstable-hide' ).trigger( 'show' );
+ doZebra( $table );
$el.removeClass( 'collapsed' ).addClass( 'expanded' );
$el.find( '> a' ).text( mw.msg( 'translate-langstats-collapse' ) );
} else {
- $children.fadeOut( { done: doZebra } ).trigger( 'hide' );
+ $children.addClass( 'statstable-hide' ).trigger( 'hide' );
+ doZebra( $table );
$el.addClass( 'collapsed' ).removeClass( 'expanded' );
$el.find( '> a' ).text( mw.msg( 'translate-langstats-expand' ) );
}
@@ -77,7 +80,7 @@
} );
// Create, bind and append the toggle-all button
- $allChildRows = $( 'tr[data-parentgroup]', $translateTable );
+ $allChildRows = $( 'tr[data-parentgroup]', $table );
$allTogglesCache = null;
$toggleAllButton = $( '<span>' ).addClass( 'collapsed' )
.append(
@@ -89,56 +92,162 @@
)
.on( 'click', function ( e ) {
var $el = $( this ),
- $allToggles = $allTogglesCache || $( '.groupexpander', $translateTable );
+ $allToggles = $allTogglesCache || $( '.groupexpander', $table );
// Switch the state and toggle the rows
// and update the local toggles too
if ( $el.hasClass( 'collapsed' ) ) {
- $allChildRows.show();
+ $allChildRows.removeClass( 'statstable-hide' );
$el.add( $allToggles ).removeClass( 'collapsed' ).addClass( 'expanded' );
$el.find( '> a' ).text( mw.msg( 'translate-langstats-collapseall' ) );
$allToggles.find( '> a' ).text( mw.msg( 'translate-langstats-collapse' ) );
} else {
- $allChildRows.hide();
+ $allChildRows.addClass( 'statstable-hide' );
$el.add( $allToggles ).addClass( 'collapsed' ).removeClass( 'expanded' );
$el.find( '> a' ).text( mw.msg( 'translate-langstats-expandall' ) );
$allToggles.find( '> a' ).text( mw.msg( 'translate-langstats-expand' ) );
}
- doZebra();
+ doZebra( $table );
e.preventDefault();
} );
// Initially hide them
- $allChildRows.hide();
- doZebra();
+ $allChildRows.addClass( 'statstable-hide' );
+ doZebra( $table );
// Add the toggle-all button above the table
- $( '<p>' ).addClass( 'groupexpander-all' ).append( $toggleAllButton ).insertBefore( $translateTable );
- } );
+ $( '<p>' ).addClass( 'groupexpander-all' ).append( $toggleAllButton ).insertBefore( $table );
+ }
- $( function () {
+ function applySorting( $table ) {
var index,
sort = {},
re = /#sortable:(\d+)=(asc|desc)/,
- match = re.exec( window.location.hash ),
- $tables = $( '.statstable' );
+ match = re.exec( location.hash );
if ( match ) {
index = parseInt( match[ 1 ], 10 );
sort[ index ] = match[ 2 ];
}
- $tables.tablesorter( { sortList: [ sort ] } );
+ $table.tablesorter( { sortList: [ sort ] } );
- $tables.on( 'sortEnd.tablesorter', function () {
- var $table = $( this );
+ $table.on( 'sortEnd.tablesorter', function () {
$table.find( '.headerSortDown, .headerSortUp' ).each( function () {
- var index = $table.find( 'th' ).index( $( this ) ),
+ var headerIndex = $table.find( 'th' ).index( $( this ) ),
dir = $( this ).hasClass( 'headerSortUp' ) ? 'asc' : 'desc';
- window.location.hash = 'sortable:' + index + '=' + dir;
+ location.hash = 'sortable:' + headerIndex + '=' + dir;
+
+ doZebra( $table );
+ } );
+ } );
+ }
- doZebra();
+ function narrowTable( $table, enable ) {
+ var $select,
+ labelColumnCount = 1,
+ // 0-indexed
+ defaultValueColumn = 2;
+
+ if ( $columns === undefined ) {
+ $columns = $table.find( 'thead > tr > th ' ).map( function ( index, value ) {
+ return value.textContent;
} );
+ }
+
+ $select = makeValueColumnSelector( $columns, labelColumnCount, defaultValueColumn );
+ // Prevent table sorter from making the select inaccessible
+ $select.on( 'mousedown click', function ( e ) {
+ e.stopPropagation();
+ } ).on( 'change', function () {
+ showValueColumn( $table, $select, labelColumnCount );
+ } );
+
+ if ( enable ) {
+ showValueColumn( $table, $select, labelColumnCount );
+ } else {
+ // Restore original headings
+ $table.find( 'thead > tr > th' ).map( function ( index ) {
+ return $( this ).text( $columns[ index ] );
+ } );
+ $table.find( 'tr > *' ).removeClass( 'statstable-hide' );
+ }
+
+ }
+
+ function makeValueColumnSelector( headings, skip, def ) {
+ var i, $select = $( '<select>' );
+
+ for ( i = skip; i < headings.length; i++ ) {
+ $( '<option>' )
+ .text( headings[ i ] )
+ .val( i )
+ .prop( 'selected', i === def )
+ .appendTo( $select );
+ }
+
+ return $select;
+ }
+
+ function showValueColumn( $table, $select, skip ) {
+ var i, index, cssQuery;
+
+ index = parseInt( $select.val(), 10 );
+ cssQuery = 'th:nth-child(_)'.replace( '_', index + 1 );
+ $table.find( cssQuery ).html( $select );
+
+ for ( i = 0; i < $select.children().length; i++ ) {
+ cssQuery = 'tr > *:nth-child(_)'.replace( '_', i + skip + 1 );
+ $table.find( cssQuery ).toggleClass( 'statstable-hide', i + skip !== index );
+ }
+ }
+
+ $( function () {
+ var isNarrowMode, minimumTableWidth,
+ $table = $( '.statstable' );
+
+ // Sometimes the table is not present on the page
+ if ( !$table.length ) {
+ return;
+ }
+
+ // Calculate absolute minimum table width
+ if ( window.ResizeObserver ) {
+ $table.css( 'max-width', '1px' );
+ }
+
+ applySorting( $table );
+ addExpanders( $table );
+
+ if ( !window.ResizeObserver ) {
+ return;
+ }
+
+ // Hopefully previous stuff have time to render by now to have accurate picture of the width
+ ( window.requestAnimationFrame || setTimeout )( function () {
+ minimumTableWidth = $table.outerWidth();
+ $table.css( 'max-width', '' );
} );
+
+ new ResizeObserver( function ( entries ) {
+ var newMode, shouldCollapse, shouldExpand;
+
+ shouldCollapse = entries[ 0 ].contentRect.width < minimumTableWidth;
+ // Some fudge to avoid flapping
+ shouldExpand = entries[ 0 ].contentRect.width - 20 > minimumTableWidth;
+
+ if ( isNarrowMode && shouldExpand ) {
+ newMode = false;
+ } else if ( !isNarrowMode && shouldCollapse ) {
+ newMode = true;
+ } else {
+ newMode = isNarrowMode;
+ }
+
+ if ( newMode !== isNarrowMode ) {
+ isNarrowMode = newMode;
+ narrowTable( $table, isNarrowMode );
+ }
+ } ).observe( $table.parent().get( 0 ) );
} );
}() );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.managegroups.js b/MLEB/Translate/resources/js/ext.translate.special.managegroups.js
index 9d727adf..9337ed5f 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.managegroups.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.managegroups.js
@@ -1,10 +1,13 @@
( function () {
- var RenameDropdown;
+ var RenameDropdown,
+ GroupSynchronization;
$( function () {
var windowManager, renameDialog;
RenameDropdown.init();
+ GroupSynchronization.init();
+
// Create and append a window manager.
windowManager = new OO.ui.WindowManager();
windowManager.$element.appendTo( document.body );
@@ -45,6 +48,7 @@
} ).show();
if ( $parentContainer.hasClass( 'smg-change-addition' ) ) {
+ // For a new message, the "add as new" option is hidden.
RenameDropdown.hideOption( '.smg-rename-new-action' );
}
event.preventDefault();
@@ -121,10 +125,11 @@
function toggleLoading( $element, isLoading ) {
if ( isLoading ) {
- $( '.smg-rename-actions' ).hide();
- $element.show().addClass( 'loading' );
+ // hide all the rename buttons, but show the current one with loading animation
+ $( '.smg-rename-actions' ).addClass( 'mw-translate-hide' );
+ $element.removeClass( 'mw-translate-hide' ).addClass( 'loading' );
} else {
- $( '.smg-rename-actions' ).show();
+ $( '.smg-rename-actions' ).removeClass( 'mw-translate-hide' );
$element.removeClass( 'loading' );
}
}
@@ -264,13 +269,13 @@
var $addAsRename = $( '<li>' ).append(
$( '<button>' )
.attr( 'type', 'button' )
- .addClass( 'smg-rename-new-action' )
+ .addClass( 'smg-rename-new-action mw-translate-hide' )
.text( mw.msg( 'translate-smg-rename-new' ) )
),
$addAsNew = $( '<li>' ).append(
$( '<button>' )
.attr( 'type', 'button' )
- .addClass( 'smg-rename-rename-action' )
+ .addClass( 'smg-rename-rename-action mw-translate-hide' )
.text( mw.msg( 'translate-smg-rename-rename' ) )
);
@@ -316,8 +321,9 @@
left: $currentTarget.position().left - $renameMenu.width() + $currentTarget.width()
} ).data( 'custom-data', customData );
- // show all the li's
- $renameMenu.find( 'li' ).show();
+ // When appending, show all the li's by default since based on the
+ // message type (RENAME / NEW) some li's may be hidden previously
+ $renameMenu.find( 'li' ).removeClass( 'mw-translate-hide' );
return this;
}
@@ -337,7 +343,7 @@
* @chainable
*/
function hideOption( optSelector ) {
- $renameMenu.find( optSelector ).parent().hide();
+ $renameMenu.find( optSelector ).parent().addClass( 'mw-translate-hide' );
return this;
}
@@ -350,4 +356,119 @@
hideOption: hideOption
};
}() );
+
+ GroupSynchronization = ( function () {
+ function init() {
+ $( '.js-group-sync-message-resolve' ).on( 'click', markMessageAsResolved );
+ $( '.js-group-sync-group-resolve' ).on( 'click', markGroupAsResolved );
+ }
+
+ function markMessageAsResolved() {
+ var $target = $( this ),
+ groupId = $target.data( 'groupId' ),
+ messageTitle = $target.data( 'msgTitle' );
+
+ showLoading( $target );
+
+ markAsResolved( 'resolveMessage', groupId, messageTitle ).done( function ( response ) {
+ var responseData = response.managegroupsynchronizationcache || null;
+ if ( responseData && responseData.success ) {
+ if ( responseData.data.groupRemainingMessageCount === 0 ) {
+ removeParentGroupBlock( $target );
+ } else {
+ // Remove the message from the DOM
+ $target.parents( '.js-group-sync-message-error' ).remove();
+ }
+ }
+ } ).fail( function ( code, result ) {
+ handleResolutionFailure( code, result, groupId, messageTitle );
+ } ).always( function () {
+ hideLoading( $target );
+ } );
+ }
+
+ function markGroupAsResolved() {
+ var $target = $( this ),
+ groupId = $target.data( 'groupId' );
+
+ showLoading( $target );
+
+ markAsResolved( 'resolveGroup', groupId ).done( function ( response ) {
+ var responseData = response.managegroupsynchronizationcache || null;
+ if ( responseData && responseData.success ) {
+ removeParentGroupBlock( $target );
+ }
+ } ).fail( function ( code, result ) {
+ handleResolutionFailure( code, result, groupId );
+ } ).always( function () {
+ hideLoading( $target );
+ } );
+ }
+
+ function markAsResolved( operation, groupId, messageTitle ) {
+ var params, api = new mw.Api();
+
+ params = {
+ action: 'managegroupsynchronizationcache',
+ group: groupId,
+ operation: operation,
+ assert: 'user',
+ formatversion: 2
+ };
+
+ if ( messageTitle ) {
+ params.title = messageTitle;
+ }
+
+ return api.postWithToken( 'csrf', params );
+ }
+
+ function removeParentGroupBlock( $child ) {
+ // Remove the entire group block from DOM
+ $child.parents( '.js-group-sync-group-errors' ).remove();
+ // If all groups are resolved, remove the group sync error block
+ if ( !$( '.js-group-sync-group-errors' ).length ) {
+ $( '.js-group-sync-groups-with-error' ).remove();
+ }
+ }
+
+ function handleResolutionFailure( code, result, groupId, messageTitle ) {
+ var errorInfo = result && result.error ? result.error.info : null;
+ if ( errorInfo ) {
+ mw.notify( result.error.info, {
+ type: 'error',
+ tag: 'new-error'
+ } );
+ } else {
+ // Unknown error
+ mw.notify( mw.msg( 'translate-smg-unknown-error' ), {
+ type: 'error',
+ tag: 'new-error'
+ } );
+ }
+
+ mw.log.error( 'Error while resolving group or message. Param: ' + JSON.stringify( {
+ groupId: groupId,
+ messageTitle: messageTitle,
+ errorCode: code,
+ errorInfo: errorInfo
+ } ) );
+ }
+
+ function showLoading( $target ) {
+ $target.addClass( 'loading' )
+ .text( mw.msg( 'translate-smg-loading' ) )
+ .removeAttr( 'href' );
+ }
+
+ function hideLoading( $target ) {
+ $target.removeClass( 'loading' )
+ .text( mw.msg( 'translate-smg-group-action-resolve' ) )
+ .prop( 'href', '#' );
+ }
+
+ return {
+ init: init
+ };
+ }() );
}() );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.managetranslatorsandbox.js b/MLEB/Translate/resources/js/ext.translate.special.managetranslatorsandbox.js
index bb451592..e5986e1a 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.managetranslatorsandbox.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.managetranslatorsandbox.js
@@ -86,7 +86,9 @@
$( '<div>' )
.addClass( 'reminder-email row' )
.append(
- $( '<span>' ).text( request.email ),
+ $( '<span>' )
+ .attr( { dir: 'ltr' } )
+ .text( request.email ),
$( '<a>' )
.prop( 'href', '#' )
.addClass( 'send-reminder link' )
@@ -156,7 +158,7 @@
if ( request.languagepreferences ) {
if ( request.languagepreferences.languages ) {
- $.each( request.languagepreferences.languages, function ( index, language ) {
+ request.languagepreferences.languages.forEach( function ( language ) {
$detailsPane.find( '.languages' ).append(
$( '<span>' )
.prop( {
@@ -220,7 +222,7 @@
);
translations.translationstash.translations.sort( sortTranslationsByLanguage );
- $.each( translations.translationstash.translations, function ( index, translation ) {
+ translations.translationstash.translations.forEach( function ( translation ) {
showTranslation( translation );
} );
}
diff --git a/MLEB/Translate/resources/js/ext.translate.special.pagemigration.js b/MLEB/Translate/resources/js/ext.translate.special.pagemigration.js
index 19b5651d..06578db1 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.pagemigration.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.pagemigration.js
@@ -60,12 +60,12 @@
}
if ( obj === undefined ) {
// obj was not initialized
- $errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).removeClass( 'hide' );
return $.Deferred().reject();
}
if ( obj.revisions === undefined ) {
// the case of /en subpage where first edit is by FuzzyBot
- $errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).removeClass( 'hide' );
return $.Deferred().reject();
}
pageContent = obj.revisions[ 0 ][ '*' ];
@@ -102,12 +102,12 @@
}
// Page does not exist if missing field is present
if ( obj === undefined || obj.missing === '' ) {
- $errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-page-does-not-exist', pageTitle ) ).removeClass( 'hide' );
return $.Deferred().reject();
}
// Page exists, but no edit by FuzzyBot
if ( obj.revisions === undefined ) {
- $errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-old-translations-missing', pageTitle ) ).removeClass( 'hide' );
return $.Deferred().reject();
} else {
// FB over here refers to FuzzyBot
@@ -342,14 +342,14 @@
function saveHandler() {
var i, content, list = [];
- $( '.mw-tpm-sp-error__message' ).hide( 'fast' );
+ $( '.mw-tpm-sp-error__message' ).addClass( 'hide' );
if ( noOfSourceUnits < noOfTranslationUnits ) {
$( '.mw-tpm-sp-error__message' ).text( mw.msg( 'pm-extra-units-warning' ) )
- .show( 'fast' );
+ .removeClass( 'hide' );
return;
} else {
$( 'input' ).prop( 'disabled', true );
- $( '.mw-tpm-sp-instructions' ).hide( 'fast' );
+ $( '.mw-tpm-sp-instructions' ).addClass( 'hide' );
for ( i = 0; i < noOfSourceUnits; i++ ) {
content = $( '.mw-tpm-sp-unit__target' ).eq( i ).val();
content = content.trim();
@@ -361,11 +361,13 @@
$.ajaxDispatcher( list, 1 ).done( function () {
$( '#action-import' ).removeClass( 'hide' );
$( 'input' ).prop( 'disabled', false );
- $( '.mw-tpm-sp-instructions' ).text( mw.msg( 'pm-on-save-message-text' ) ).show( 'fast' );
+ $( '.mw-tpm-sp-instructions' )
+ .text( mw.msg( 'pm-on-save-message-text' ) )
+ .removeClass( 'hide' );
} ).fail( function ( errmsg ) {
$( 'input' ).prop( 'disabled', false );
// eslint-disable-next-line mediawiki/msg-doc
- $( '.mw-tpm-sp-error__message' ).text( mw.msg( errmsg ) ).show( 'fast' );
+ $( '.mw-tpm-sp-error__message' ).text( mw.msg( errmsg ) ).removeClass( 'hide' );
} );
}
}
@@ -374,8 +376,8 @@
* Handler for 'Cancel' button click event.
*/
function cancelHandler() {
- $( '.mw-tpm-sp-error__message' ).hide( 'fast' );
- $( '.mw-tpm-sp-instructions' ).hide( 'fast' );
+ $( '.mw-tpm-sp-error__message' ).addClass( 'hide' );
+ $( '.mw-tpm-sp-instructions' ).addClass( 'hide' );
$( '#action-save, #action-cancel' ).addClass( 'hide' );
$( '#action-import' ).removeClass( 'hide' );
$( '.mw-tpm-sp-unit-listing' ).html( '' );
@@ -452,14 +454,14 @@
pageTitle = $( '#title' ).val().trim();
if ( pageTitle === '' ) {
- $errorBox.text( mw.msg( 'pm-pagetitle-missing' ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-pagetitle-missing' ) ).removeClass( 'hide' );
return;
}
titleObj = mw.Title.newFromText( pageTitle );
- $messageBox.hide( 'fast' );
+ $messageBox.addClass( 'hide' );
if ( titleObj === null ) {
- $errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).removeClass( 'hide' );
return;
}
@@ -467,7 +469,7 @@
slashPos = pageTitle.lastIndexOf( '/' );
if ( slashPos === -1 ) {
- $errorBox.text( mw.msg( 'pm-langcode-missing' ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-langcode-missing' ) ).removeClass( 'hide' );
return;
}
@@ -475,11 +477,11 @@
langCode = pageTitle.substring( slashPos + 1 );
if ( pageName === '' ) {
- $errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).show( 'fast' );
+ $errorBox.text( mw.msg( 'pm-pagetitle-invalid' ) ).removeClass( 'hide' );
return;
}
- $errorBox.hide( 'fast' );
+ $errorBox.addClass( 'hide' );
$.when( getSourceUnits( pageName ), getFuzzyTimestamp( pageTitle ) )
.then( function ( sourceUnits, fuzzyTimestamp ) {
@@ -491,7 +493,7 @@
displayUnits( sourceUnits, translationUnits );
$( '#action-save, #action-cancel' ).removeClass( 'hide' );
$( '#action-import' ).addClass( 'hide' );
- $messageBox.text( mw.msg( 'pm-on-import-message-text' ) ).show( 'fast' );
+ $messageBox.text( mw.msg( 'pm-on-import-message-text' ) ).removeClass( 'hide' );
} );
} );
}
diff --git a/MLEB/Translate/resources/js/ext.translate.special.pagepreparation.js b/MLEB/Translate/resources/js/ext.translate.special.pagepreparation.js
index b32008fe..cdf1aa52 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.pagepreparation.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.pagepreparation.js
@@ -73,7 +73,7 @@
* @return {string}
*/
function addLanguageBar( pageContent ) {
- if ( !pageContent.match( /<languages\/>/gi ) ) {
+ if ( !/<languages\/>/gi.test( pageContent ) ) {
pageContent = '<languages/>\n' + pageContent;
}
pageContent = pageContent.replace( /\{\{languages.*?\}\}/gi, '' );
@@ -376,12 +376,12 @@
$( '.messageDiv' )
.empty()
.append( mw.message( 'pp-save-message', pageUrl ).parseDom() )
- .show();
- $( '.divDiff' ).hide( 'fast' );
- $( '#action-prepare' ).show();
+ .removeClass( 'hide' );
+ $( '.divDiff' ).addClass( 'hide' );
+ $( '#action-prepare' ).removeClass( 'hide' );
$input.val( '' );
- $( '#action-save' ).hide();
- $( '#action-cancel' ).hide();
+ $( '#action-save' ).addClass( 'hide' );
+ $( '#action-cancel' ).addClass( 'hide' );
} );
} );
@@ -389,7 +389,7 @@
var pageName, $messageDiv = $( '.messageDiv' );
pageName = $input.val().trim();
- $messageDiv.hide();
+ $messageDiv.addClass( 'hide' );
if ( pageName === '' ) {
// eslint-disable-next-line no-alert
alert( mw.msg( 'pp-pagename-missing' ) );
@@ -405,24 +405,24 @@
pageContent = addNewLines( pageContent );
pageContent = fixInternalLinks( pageContent );
pageContent = doTemplates( pageContent );
- doFiles( pageContent ).then( doCategories ).done( function ( pageContent ) {
- pageContent = postPreparationCleanup( pageContent );
- pageContent = pageContent.trim();
- getDiff( pageName, pageContent ).done( function ( diff ) {
+ doFiles( pageContent ).then( doCategories ).done( function ( preppedContent ) {
+ preppedContent = postPreparationCleanup( preppedContent );
+ preppedContent = preppedContent.trim();
+ getDiff( pageName, preppedContent ).done( function ( diff ) {
if ( diff === undefined ) {
- $messageDiv.text( mw.msg( 'pp-diff-error' ) ).show();
+ $messageDiv.text( mw.msg( 'pp-diff-error' ) ).removeClass( 'hide' );
return;
}
$( '.diff tbody' ).append( diff );
- $( '.divDiff' ).show( 'fast' );
+ $( '.divDiff' ).removeClass( 'hide' );
if ( diff !== '' ) {
- $messageDiv.text( mw.msg( 'pp-prepare-message' ) ).show();
- $( '#action-prepare' ).hide();
- $( '#action-save' ).show();
- $( '#action-cancel' ).show();
+ $messageDiv.text( mw.msg( 'pp-prepare-message' ) ).removeClass( 'hide' );
+ $( '#action-prepare' ).addClass( 'hide' );
+ $( '#action-save' ).removeClass( 'hide' );
+ $( '#action-cancel' ).removeClass( 'hide' );
} else {
- $messageDiv.text( mw.msg( 'pp-already-prepared-message' ) ).show();
+ $messageDiv.text( mw.msg( 'pp-already-prepared-message' ) ).removeClass( 'hide' );
}
} );
} );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.pagetranslation.js b/MLEB/Translate/resources/js/ext.translate.special.pagetranslation.js
index 67610f52..fc27242a 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.pagetranslation.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.pagetranslation.js
@@ -1,26 +1,67 @@
+'use strict';
+/* eslint-disable no-implicit-globals */
+
/*!
* @author Santhosh Thottingal
* @author Niklas Laxström
* @license GPL-2.0-or-later
*/
-( function () {
- 'use strict';
+var LanguagesMultiselectWidget = require( './LanguagesMultiselectWidget.js' );
+
+// Needed for OOUI :(
+window.LanguagesMultiselectWidget = LanguagesMultiselectWidget;
+
+function configureLanguageInput( $form, $widget ) {
+ var widget, $input;
- $( function () {
- $( '#wpUserLanguage' ).multiselectautocomplete( { inputbox: '#tpt-prioritylangs' } );
+ /** @type {LanguagesMultiselectWidget} */
+ widget = OO.ui.infuse( $widget, { api: new mw.Api() } );
- $( '#mw-content-text' ).on( 'click', '.mw-translate-jspost', function ( e ) {
- var params,
- uri = new mw.Uri( e.target.href );
+ $input = $( '<input>' ).prop( {
+ type: 'hidden',
+ name: 'prioritylangs',
+ value: widget.getValue()
+ } );
+
+ $form.prepend( $input );
+ widget.on( 'change', function () {
+ $input.val( widget.getValue() );
+ } );
+}
- params = uri.query;
- params.token = mw.user.tokens.get( 'csrfToken' );
- $.post( uri.path, params ).done( function () {
- location.reload();
- } );
+function configurePostLinks( $container ) {
+ $container.on( 'click', '.mw-translate-jspost', function ( e ) {
+ var params,
+ uri = new mw.Uri( e.target.href );
- e.preventDefault();
+ params = uri.query;
+ params.token = mw.user.tokens.get( 'csrfToken' );
+ $.post( uri.path, params ).done( function () {
+ location.reload();
} );
+
+ e.preventDefault();
} );
-}() );
+}
+
+// Init
+$( function () {
+ var mediaWikiVersion = mw.config.get( 'wgVersion' ),
+ $widgets = $( '#mw-translate-SpecialPageTranslation-prioritylangs' );
+
+ configurePostLinks( $( '#mw-content-text' ) );
+
+ if ( $widgets.length ) {
+ // On MW 1.34, pre-selected priority languages are not being displayed when using
+ // LanguagesMultiselectWidget, which in turn uses MenuTagMultiselectWidget.
+ // This could be due to an older version of OOUI.
+ // Use a normal textarea and remove the loading input.
+ if ( ( /^1\.34\./ ).test( mediaWikiVersion ) ) {
+ $widgets.find( '.oo-ui-textInputWidget' ).last().remove();
+ return;
+ }
+
+ configureLanguageInput( $( '.mw-tpt-sp-markform' ), $widgets );
+ }
+} );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.searchtranslations.js b/MLEB/Translate/resources/js/ext.translate.special.searchtranslations.js
index 546e2612..e3f5ecb8 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.searchtranslations.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.searchtranslations.js
@@ -6,21 +6,21 @@
$( function () {
resultGroups = $( '.facet.groups' ).data( 'facets' );
- $( '.tux-searchpage .button' ).on( 'click', function () {
+ $( '.tux-searchpage .mw-ui-button' ).on( 'click', function () {
var query = $( '.tux-searchpage .searchinputbox' ).val(),
result = lexOperators( query ),
$form = $( '.tux-searchpage form[name=searchform]' );
- $.each( result, function ( index, value ) {
+ Object.keys( result ).forEach( function ( index ) {
var $input = $( '<input>' ).prop( 'type', 'hidden' ),
$elem = $form.find( 'input[name=' + index + ']' );
if ( $elem.length ) {
- $elem.val( value );
+ $elem.val( result[ index ] );
} else {
$form.append( $input
.prop( {
- value: value,
+ value: result[ index ],
name: index
} )
);
@@ -135,7 +135,7 @@
);
}
- $.each( Object.keys( languages ), function ( index, languageCode ) {
+ Object.keys( languages ).forEach( function ( languageCode ) {
ulslanguages[ languageCode ] = mw.config.get( 'wgTranslateLanguages' )[ languageCode ];
} );
@@ -191,7 +191,6 @@
currentGroup = $( '.facet.groups' ).data( 'group' ),
resultCount = groupList.length,
position,
- groups,
options,
grouppath;
@@ -282,32 +281,30 @@
options = {
language: mw.config.get( 'wgUserLanguage' ),
position: position,
- onSelect: function ( group ) {
- var uri = new mw.Uri( location.href );
- uri.extend( { group: group.id, grouppath: group.id } );
- location.href = uri.toString();
+ onSelect: function ( selectedGroup ) {
+ var currentUri = new mw.Uri( location.href );
+ currentUri.extend( { group: selectedGroup.id, grouppath: selectedGroup.id } );
+ location.href = currentUri.toString();
},
preventSelector: true
};
- groups = $.map( resultGroups, function ( value, index ) {
- return index;
- } );
+
$grouSelectorTrigger.msggroupselector(
options,
- groups
+ Object.keys( resultGroups )
);
}
}
function lexOperators( str ) {
- var string = str.split( ' ' ),
+ var splitValues = str.split( ' ' ),
result = {},
query = '';
- $.each( string, function ( index, value ) {
- matchOperators( value, function ( obj ) {
+ splitValues.forEach( function ( string ) {
+ matchOperators( string, function ( obj ) {
if ( obj === false ) {
- query = query + ' ' + value;
+ query = query + ' ' + string;
} else {
result[ obj.operator ] = obj.value;
}
@@ -324,7 +321,7 @@
// Add operators for different filters
operatorRegex = [ 'language', 'group', 'filter' ];
- $.each( operatorRegex, function ( index, value ) {
+ operatorRegex.forEach( function ( value ) {
var regex = new RegExp( value + ':(\\S+)', 'i' );
if ( ( matches = regex.exec( str ) ) !== null ) {
counter = true;
@@ -354,6 +351,7 @@
/**
* Finds a specific group from a groups object containing nested groups.
+ *
* @param {string} targetGroupId
* @param {Object} groups
* @return {Object} Message group object, or null if group is not found
diff --git a/MLEB/Translate/resources/js/ext.translate.special.translate.js b/MLEB/Translate/resources/js/ext.translate.special.translate.js
index 63cac603..1b80061a 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.translate.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.translate.js
@@ -70,8 +70,8 @@
uri.extend( params );
// Support removing keys from the query
- $.each( params, function ( key, val ) {
- if ( val === null ) {
+ Object.keys( params ).forEach( function ( key ) {
+ if ( params[ key ] === null ) {
delete uri.query[ key ];
}
} );
@@ -143,18 +143,18 @@
/**
* Updates all group specific stuff on the page.
*
- * @param {Object} state Information about current group and language.
- * @param {string} state.group Message group id.
- * @param {string} state.language Language.
+ * @param {Object} stateInfo Information about current group and language.
+ * @param {string} stateInfo.group Message group id.
+ * @param {string} stateInfo.language Language.
*/
- function updateGroupInformation( state ) {
+ function updateGroupInformation( stateInfo ) {
var props = 'id|priority|prioritylangs|priorityforce|description';
- mw.translate.recentGroups.append( state.group );
+ mw.translate.recentGroups.append( stateInfo.group );
- mw.translate.getMessageGroup( state.group, props ).done( function ( group ) {
+ mw.translate.getMessageGroup( stateInfo.group, props ).done( function ( group ) {
updateDescription( group );
- updateGroupWarning( group, state.language );
+ updateGroupWarning( group, stateInfo.language );
} );
}
@@ -179,37 +179,50 @@
}
function updateGroupWarning( group, language ) {
- var preferredLanguages, headerMessage, languagesMessage,
+ var $preferredLanguages, headerMessage, languagesMessage,
$groupWarning = $( '.tux-editor-header .group-warning' );
- if ( isPriorityLanguage( language, group.prioritylangs ) ) {
+ if ( !group.prioritylangs || isPriorityLanguage( language, group.prioritylangs ) ) {
return;
}
// Make a comma-separated list of preferred languages
- preferredLanguages = $.map( group.prioritylangs, function ( lang ) {
+ $preferredLanguages = $( '<span>' );
+ group.prioritylangs.forEach( function ( languageCode, index ) {
// bidi isolation for language names
- return '<bdi>' + $.uls.data.getAutonym( lang ) + '</bdi>';
- } ).join( ', ' );
+ $preferredLanguages.append(
+ $( '<bdi>' ).text( $.uls.data.getAutonym( languageCode ) )
+ );
- headerMessage = mw.message(
- group.priorityforce ?
- 'tpt-discouraged-language-force-header' :
- 'tpt-discouraged-language-header',
- $.uls.data.getAutonym( language )
- ).parse();
+ // Add comma between languages
+ if ( index + 1 !== group.prioritylangs.length ) {
+ $preferredLanguages.append( ', ' );
+ }
+ } );
- languagesMessage = mw.message(
- group.priorityforce ?
- 'tpt-discouraged-language-force-content' :
+ if ( group.priorityforce ) {
+ headerMessage = mw.message(
+ 'tpt-discouraged-language-force-header',
+ $.uls.data.getAutonym( language )
+ );
+ languagesMessage = mw.message(
+ 'tpt-discouraged-language-force-content',
+ $preferredLanguages
+ );
+ } else {
+ headerMessage = mw.message(
+ 'tpt-discouraged-language-header',
+ $.uls.data.getAutonym( language )
+ );
+ languagesMessage = mw.message(
'tpt-discouraged-language-content',
- preferredLanguages
- ).parse();
+ $preferredLanguages
+ );
+ }
$groupWarning.append(
- $( '<p>' ).append( $( '<strong>' ).text( headerMessage ) ),
- // html because of the <bdi> and because it's parsed
- $( '<p>' ).html( languagesMessage )
+ $( '<p>' ).append( $( '<strong>' ).text( headerMessage.text() ) ),
+ $( '<p>' ).append( languagesMessage.parseDom() )
);
}
@@ -388,11 +401,11 @@
} );
$( '#tux-option-optional' ).on( 'change', function () {
- var uri = new mw.Uri( window.location.href ),
+ var currentUri = new mw.Uri( window.location.href ),
checked = $( this ).prop( 'checked' );
mw.translate.changeUrl( { optional: checked ? 1 : 0 } );
- mw.translate.changeFilter( uri.query.filter );
+ mw.translate.changeFilter( currentUri.query.filter );
} );
} );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.translationstash.js b/MLEB/Translate/resources/js/ext.translate.special.translationstash.js
index 6a9b8587..d4356923 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.translationstash.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.translationstash.js
@@ -177,7 +177,7 @@
var $untranslated, messages = result.query.messagecollection;
$messageTable.empty();
- $.each( messages, function ( index, message ) {
+ messages.forEach( function ( message ) {
message.properties = {};
message.properties.status = 'untranslated';
@@ -246,10 +246,9 @@
translationStashStorage.getUserTranslations()
.done( function ( translations ) {
if ( translations.translationstash.translations ) {
- $.each( translations.translationstash.translations,
- function ( index, translation ) {
- userTranslations[ translation.title ] = translation;
- } );
+ translations.translationstash.translations.forEach( function ( translation ) {
+ userTranslations[ translation.title ] = translation;
+ } );
}
loadMessages();
} );
diff --git a/MLEB/Translate/resources/js/ext.translate.special.translationstats.js b/MLEB/Translate/resources/js/ext.translate.special.translationstats.js
index bf6408a5..093be515 100644
--- a/MLEB/Translate/resources/js/ext.translate.special.translationstats.js
+++ b/MLEB/Translate/resources/js/ext.translate.special.translationstats.js
@@ -1,41 +1,128 @@
+'use strict';
+/* eslint-disable no-implicit-globals */
+
/*!
- * JavaScript functions for embedding jQuery controls
- * into translation notification form.
- *
+ * Display translation stats via a form.
* @author Amir E. Aharoni
* @author Siebrand Mazeland
* @author Niklas Laxström
* @copyright Copyright © 2012-2013 Amir E. Aharoni, Siebrand Mazeland
* @license GPL-2.0-or-later
*/
+var FormHandler = function () {
+ var $form = $( '#translationStatsConfig' ),
+ onFilter = null;
-( function () {
- 'use strict';
+ function getHeight() {
+ return parseInt( $form.find( 'input[name="height"]' ).val(), 10 );
+ }
- $( function () {
- var widget, defaultValue, defaultDate,
- $input = $( '#start' );
+ function getWidth() {
+ return parseInt( $form.find( 'input[name="width"]' ).val(), 10 );
+ }
- defaultDate = new Date();
- defaultDate.setDate( 1 );
+ function getLanguages() {
+ var languages = $form.find( 'input[name="language"]' ).val().trim();
- if ( $input.val() ) {
- defaultValue = new Date( $input.val() );
+ if ( languages.length > 0 ) {
+ return getSplitValues( languages );
}
- widget = new mw.widgets.datetime.DateTimeInputWidget( {
- formatter: {
- format: '${year|0}-${month|0}-${day|0}',
- defaultDate: defaultDate
- },
- type: 'date',
- value: defaultValue,
- max: new Date()
- } );
+ return [];
+ }
+
+ function getGroups() {
+ var groups = $form.find( 'input[name="group"]' ).val().trim();
+
+ if ( groups.length > 0 ) {
+ return getSplitValues( groups );
+ }
+
+ return [];
+ }
+
+ function getGranularity() {
+ return $form.find( 'input[name="scale"]:checked' ).val().trim();
+ }
+
+ function getMeasure() {
+ return $form.find( 'input[name="count"]:checked' ).val().trim();
+ }
+
+ function getDays() {
+ return parseInt( $form.find( 'input[name="days"]' ).val(), 10 );
+ }
+
+ function getStart() {
+ return $form.find( '#start' ).val();
+ }
+
+ function getAllOptions() {
+ return {
+ measure: getMeasure(),
+ days: getDays(),
+ start: getStart(),
+ granularity: getGranularity(),
+ group: getGroups(),
+ language: getLanguages(),
+ height: getHeight(),
+ width: getWidth()
+ };
+ }
- $input.after( widget.$element ).hide();
- widget.on( 'change', function ( data ) {
- $input.val( data + 'T00:00:00' );
+ function getSplitValues( values ) {
+ return values.split( ',' ).map( function ( value ) {
+ return value.trim();
} );
+ }
+
+ function filter() {
+ if ( !this.onFilter ) {
+ return;
+ }
+
+ this.onFilter( this.getAllOptions() );
+ }
+
+ return {
+ onFilter: onFilter,
+ filter: filter,
+ getAllOptions: getAllOptions
+ };
+};
+
+$( function () {
+ var widget, defaultValue, defaultDate,
+ $input = $( '#start' ),
+ formHandler = new FormHandler(),
+ $graphContainer = $( '#translationStatsGraphContainer' ),
+ graphBuilder;
+
+ defaultDate = new Date();
+ defaultDate.setDate( 1 );
+
+ if ( $input.val() ) {
+ defaultValue = new Date( $input.val() );
+ }
+
+ widget = new mw.widgets.datetime.DateTimeInputWidget( {
+ formatter: {
+ format: '${year|0}-${month|0}-${day|0}',
+ defaultDate: defaultDate
+ },
+ type: 'date',
+ value: defaultValue,
+ max: new Date()
} );
-}() );
+
+ $input.after( widget.$element ).addClass( 'mw-translate-translationstats-hide' );
+ widget.on( 'change', function ( data ) {
+ $input.val( data + 'T00:00:00' );
+ } );
+
+ // Check if the graph container has been loaded
+ if ( $graphContainer.length !== 0 ) {
+ graphBuilder = new mw.translate.TranslationStatsGraphBuilder( $graphContainer );
+ graphBuilder.display( formHandler.getAllOptions() );
+ }
+} );
diff --git a/MLEB/Translate/resources/js/ext.translate.statsbar.js b/MLEB/Translate/resources/js/ext.translate.statsbar.js
index aeec9314..43ba29da 100644
--- a/MLEB/Translate/resources/js/ext.translate.statsbar.js
+++ b/MLEB/Translate/resources/js/ext.translate.statsbar.js
@@ -175,7 +175,7 @@
data = $this.data( 'languagestatsbar' );
if ( !data ) {
- $this.data( 'languagestatsbar', ( data = new LanguageStatsBar( this, options ) ) );
+ $this.data( 'languagestatsbar', new LanguageStatsBar( this, options ) );
}
} );
};
diff --git a/MLEB/Translate/resources/js/ext.translate.translationstats.embedded.js b/MLEB/Translate/resources/js/ext.translate.translationstats.embedded.js
new file mode 100644
index 00000000..b0ec95fd
--- /dev/null
+++ b/MLEB/Translate/resources/js/ext.translate.translationstats.embedded.js
@@ -0,0 +1,86 @@
+'use strict';
+/* eslint-disable no-implicit-globals */
+
+/*!
+ * Used to embed translation stats graph on other pages.
+ * @license GPL-2.0-or-later
+ */
+var EmbeddedHandler = function ( $graphContainer ) {
+ var graphOptions = JSON.parse(
+ $graphContainer.find( '[name="translationStatsGraphOptions"]' ).val()
+ );
+
+ function getHeight() {
+ return parseInt( graphOptions.height, 10 );
+ }
+
+ function getWidth() {
+ return parseInt( graphOptions.width, 10 );
+ }
+
+ function getAllOptions() {
+ return {
+ measure: graphOptions.count,
+ days: graphOptions.days,
+ start: graphOptions.start,
+ granularity: graphOptions.scale,
+ group: graphOptions.group,
+ language: graphOptions.language,
+ height: getHeight(),
+ width: getWidth()
+ };
+ }
+
+ return {
+ getAllOptions: getAllOptions
+ };
+};
+
+$( function () {
+ var $graphContainers = $( '.mw-translate-translationstats-container' ),
+ currentGraph = 0,
+ graphInstances = [];
+
+ function loadGraph() {
+ var currentGraphBuilder = graphInstances[ currentGraph ].graphBuilder,
+ currentOptions = graphInstances[ currentGraph ].options.getAllOptions();
+
+ currentGraphBuilder
+ .display( currentOptions )
+ .always( function () {
+ ++currentGraph;
+ if ( currentGraph < graphInstances.length ) {
+ loadGraph();
+ }
+ } );
+ }
+
+ // Create graph and options instances, then display loader
+ function initGraph( $graphContainer ) {
+ var graphBuilder,
+ graphOptions;
+
+ graphOptions = new EmbeddedHandler( $graphContainer );
+ graphBuilder = new mw.translate.TranslationStatsGraphBuilder(
+ $graphContainer, graphOptions.getAllOptions()
+ );
+ graphBuilder.showLoading();
+
+ return {
+ graphBuilder: graphBuilder,
+ options: graphOptions
+ };
+ }
+
+ for ( ;currentGraph < $graphContainers.length; ++currentGraph ) {
+ graphInstances.push(
+ initGraph( $graphContainers.eq( currentGraph ) )
+ );
+ }
+
+ currentGraph = 0;
+ setTimeout( function () {
+ // Give time to display the loaders.
+ loadGraph();
+ } );
+} );
diff --git a/MLEB/Translate/resources/js/ext.translate.translationstats.graphbuilder.js b/MLEB/Translate/resources/js/ext.translate.translationstats.graphbuilder.js
new file mode 100644
index 00000000..f5280041
--- /dev/null
+++ b/MLEB/Translate/resources/js/ext.translate.translationstats.graphbuilder.js
@@ -0,0 +1,346 @@
+/*!
+ * Graph component to display translation stats using ChartJS
+ * @license GPL-2.0-or-later
+ */
+
+( function () {
+ 'use strict';
+ var graphInfo = {
+ edits: mw.msg( 'translate-statsf-count-edits' ),
+ users: mw.msg( 'translate-statsf-count-users' ),
+ registrations: mw.msg( 'translate-statsf-count-registrations' ),
+ reviews: mw.msg( 'translate-statsf-count-reviews' ),
+ reviewers: mw.msg( 'translate-statsf-count-reviewers' )
+ }, granularityInfo = {
+ months: mw.msg( 'translate-statsf-scale-months' ),
+ weeks: mw.msg( 'translate-statsf-scale-weeks' ),
+ days: mw.msg( 'translate-statsf-scale-days' ),
+ hours: mw.msg( 'translate-statsf-scale-hours' )
+ }, graphColors = [
+ 'skyblue', 'green', 'orange', 'blue', 'red', 'darkgreen', 'purple', 'peru',
+ 'cyan', 'salmon', 'slateblue', 'yellowgreen', 'magenta', 'aquamarine', 'gold', 'violet'
+ ],
+ GraphBuilder;
+
+ /**
+ * Used to display translation stats graph. Each instance of this class manages one
+ * instance of the graph.
+ *
+ * @param {Object} $graphContainer The title of the page including language code
+ * to store the translation.
+ * @param {Object} graphOptions Graph options, current only processes the width and height.
+ * @return {Object} Instance of the graph builder
+ */
+ GraphBuilder = function ( $graphContainer, graphOptions ) {
+ var $graphElement = $( '<canvas>' )
+ .attr( 'class', 'mw-translate-translationstats-graph' )
+ .attr( 'role', 'img' )
+ .attr( 'tabindex', 0 )
+ .text( mw.msg( 'translate-statsf-graph-alt-text-info' ) ),
+ $graphWrapper = $( '<div>' )
+ .attr( 'class', 'mw-translationstats-graph-container' ),
+ $loadingElement = $( '<div>' )
+ .attr( 'class', 'mw-translate-loading-spinner' ),
+ $errorElement = $( '<div>' )
+ .attr( 'class', 'mw-translate-error-container' ),
+ $tableElement = $( '<table>' )
+ .addClass( 'wikitable mw-translate-translationstats-table' )
+ .attr( 'tabindex', 0 )
+ .attr(
+ 'summary', mw.msg( 'translate-statsf-alt-text' )
+ ),
+ lineChart;
+
+ $graphWrapper
+ .width( graphOptions && graphOptions.width )
+ .height( graphOptions && graphOptions.height );
+
+ // Set the container height and width if passed.
+ $graphContainer.append( [
+ $graphWrapper,
+ $loadingElement,
+ $errorElement
+ ] );
+
+ $graphWrapper.append( $graphElement );
+
+ function display( options ) {
+ if ( lineChart ) {
+ cleanup();
+ }
+
+ // Set the appropriate height and width and display the loader.
+ $graphWrapper
+ .width( options.width )
+ .height( options.height );
+
+ showLoading();
+
+ return getData( options ).then( function ( graphData ) {
+ // Hide the loader before displaying the data.
+ showData( graphData, options );
+ } ).fail( function ( errorCode, results ) {
+ var errorInfo = results && results.error ? results.error.info :
+ mw.msg( 'translate-statsf-unknown-error' );
+ displayError( mw.msg( 'translate-statsf-error-message', errorInfo ) );
+ } ).always( function () {
+ hideLoading();
+ } );
+ }
+
+ function showData( apiResponse, options ) {
+ var graphData = getAxesLabelsAndData( apiResponse.data ),
+ graphDatasets = [],
+ datasetLabels = apiResponse.labels;
+
+ if ( graphData.data.length ) {
+ graphData.data.forEach( function ( dataset, datasetIndex ) {
+ var graphDataset = {
+ data: dataset,
+ fill: false,
+ borderColor: getLineColor( datasetIndex )
+ };
+
+ if ( datasetLabels[ datasetIndex ] ) {
+ graphDataset.label = datasetLabels[ datasetIndex ];
+ }
+
+ graphDatasets.push( graphDataset );
+ } );
+ }
+
+ lineChart = new Chart( $graphElement, {
+ type: 'line',
+ data: {
+ labels: graphData.axesLabels,
+ datasets: graphDatasets
+ },
+ options: {
+ maintainAspectRatio: false,
+ legend: {
+ display: datasetLabels.length !== 0
+ },
+ scales: {
+ yAxes: [ {
+ scaleLabel: {
+ display: true,
+ labelString: getXAxesLabel( options.measure )
+ },
+ ticks: {
+ beginAtZero: true,
+ precision: 0,
+ callback: function ( value ) {
+ return mw.language.convertNumber( Number( value ) );
+ }
+ }
+ } ],
+ xAxes: [ {
+ scaleLabel: {
+ display: true,
+ labelString: getYAxesLabel( options.granularity )
+ },
+ ticks: {
+ maxTicksLimit: 15
+ },
+ gridLines: {
+ display: false
+ }
+ } ]
+ },
+ tooltips: {
+ callbacks: {
+ label: function ( tooltipItem, data ) {
+ var convertedValue = mw.language.convertNumber( Number( tooltipItem.yLabel ) ),
+ label = data.datasets[ tooltipItem.datasetIndex ].label;
+
+ if ( label ) {
+ return label + ': ' + convertedValue;
+ }
+
+ return convertedValue;
+ }
+ }
+ }
+ }
+ } );
+
+ // Generate table inside the canvas element to improve accessibility.
+ showTable( graphData, datasetLabels, options );
+ }
+
+ function getAxesLabelsAndData( jsonGraphData ) {
+ var labelProp, labels = [], graphData = [],
+ labelData, i, labelIndex = 0,
+ currentValue, maxValue = 0, minValue = 0;
+
+ for ( labelProp in jsonGraphData ) {
+ if ( labels.indexOf( labelProp ) === -1 ) {
+ labels.push( labelProp );
+ }
+
+ labelData = jsonGraphData[ labelProp ];
+
+ for ( i = 0; i < labelData.length; ++i ) {
+ if ( !graphData[ i ] ) {
+ graphData[ i ] = [];
+ }
+
+ currentValue = labelData[ i ];
+ graphData[ i ][ labelIndex ] = currentValue;
+ if ( currentValue < minValue ) {
+ minValue = currentValue;
+ }
+
+ if ( currentValue > maxValue ) {
+ maxValue = currentValue;
+ }
+ }
+
+ ++labelIndex;
+ }
+
+ return {
+ axesLabels: labels,
+ data: graphData,
+ max: maxValue,
+ min: minValue
+ };
+ }
+
+ function getXAxesLabel( measure ) {
+ return graphInfo[ measure ];
+ }
+
+ function getYAxesLabel( granularity ) {
+ return granularityInfo[ granularity ];
+ }
+
+ function getData( filterOptions ) {
+ var api = new mw.Api(),
+ apiParams = {
+ action: 'translationstats',
+ count: filterOptions.measure,
+ days: filterOptions.days,
+ start: filterOptions.start || null,
+ scale: filterOptions.granularity,
+ group: filterOptions.group,
+ language: filterOptions.language,
+ formatversion: 2
+ };
+
+ // Remove null or empty array from request object
+ Object.keys( apiParams ).forEach( function ( apiParamKey ) {
+ var apiParamValue = apiParams[ apiParamKey ];
+ if (
+ apiParamValue === null ||
+ ( Array.isArray( apiParamValue ) && apiParamValue.length === 0 )
+ ) {
+ delete apiParams[ apiParamKey ];
+ }
+ } );
+
+ return api.get( apiParams ).then( function ( result ) {
+ return result.translationstats;
+ } );
+ }
+
+ function getLineColor( index ) {
+ var colorIndex = index % graphColors.length,
+ colorName = graphColors[ colorIndex ];
+ return colorName;
+ }
+
+ function displayError( errorMessage ) {
+ $errorElement.text( errorMessage );
+ $graphContainer.addClass( 'mw-translate-has-error' )
+ .height( 'auto' );
+ }
+
+ function showLoading() {
+ // show loading, and hide error messages.
+ $graphContainer.addClass( 'mw-translate-loading' )
+ .removeClass( 'mw-translate-has-error' );
+ }
+
+ function hideLoading() {
+ $graphContainer.removeClass( 'mw-translate-loading' );
+ }
+
+ function showTable( graphData, datasetLabels, options ) {
+ $tableElement
+ .append(
+ $( '<caption>' ).text( getGraphSummary( options ) )
+ )
+ .append( getTableHead( datasetLabels, options ) )
+ .append( getTableBody( graphData ) );
+
+ $graphContainer.append( $tableElement );
+ }
+
+ function getTableHead( datasetLabels, options ) {
+ var $tableHead = $( '<thead>' ),
+ $tableHeadRow = $( '<tr>' ),
+ i = 0;
+
+ $tableHeadRow.append( $( '<th>' ).text( getYAxesLabel( options.granularity ) ) );
+
+ if ( datasetLabels && datasetLabels.length ) {
+ for ( ; i < datasetLabels.length; ++i ) {
+ $tableHeadRow.append( $( '<th>' ).text( datasetLabels[ i ] ) );
+ }
+ } else {
+ $tableHeadRow.append( $( '<th>' ).text( getXAxesLabel( options.measure ) ) );
+ }
+
+ return $tableHead.append( $tableHeadRow );
+ }
+
+ function getTableBody( graphData ) {
+ var $tbody = $( '<tbody>' ),
+ scaleIndex, datasetIndex, $tBodyRow,
+ columnValue;
+
+ for ( scaleIndex = 0; scaleIndex < graphData.axesLabels.length; scaleIndex++ ) {
+ $tBodyRow = $( '<tr>' )
+ .append( $( '<td>' ).text( graphData.axesLabels[ scaleIndex ] ) );
+
+ for ( datasetIndex = 0; datasetIndex < graphData.data.length; datasetIndex++ ) {
+ columnValue = '';
+ if (
+ graphData.data[ datasetIndex ] &&
+ graphData.data[ datasetIndex ][ scaleIndex ] !== undefined
+ ) {
+ columnValue =
+ mw.language.convertNumber(
+ Number( graphData.data[ datasetIndex ][ scaleIndex ] )
+ );
+ }
+ $tBodyRow.append( $( '<td>' ).text( columnValue ) );
+ }
+
+ $tbody.append( $tBodyRow );
+ }
+
+ return $tbody;
+ }
+
+ function cleanup() {
+ lineChart.destroy();
+ $tableElement.remove();
+ }
+
+ function getGraphSummary( options ) {
+ return getXAxesLabel( options.measure ) + ' / ' +
+ getYAxesLabel( options.granularity );
+ }
+
+ return {
+ display: display,
+ showLoading: showLoading,
+ hideLoading: hideLoading
+ };
+ };
+
+ mw.translate = mw.translate || {};
+ mw.translate.TranslationStatsGraphBuilder = mw.translate.TranslationStatsGraphBuilder || GraphBuilder;
+}() );
diff --git a/MLEB/Translate/resources/js/ext.translate.workflowselector.js b/MLEB/Translate/resources/js/ext.translate.workflowselector.js
index d5e64766..b9d86f67 100644
--- a/MLEB/Translate/resources/js/ext.translate.workflowselector.js
+++ b/MLEB/Translate/resources/js/ext.translate.workflowselector.js
@@ -104,23 +104,23 @@
e.stopPropagation();
} );
- $.each( this.states, function ( id, data ) {
- var $state;
+ Object.keys( instance.states ).forEach( function ( key ) {
+ var data = instance.states[ key ], $state;
// Store the id also
- data.id = id;
+ data.id = key;
$state = $( '<li>' )
.data( 'state', data )
.text( data.name );
- if ( data.canchange && id !== instance.currentState ) {
+ if ( data.canchange && data.id !== instance.currentState ) {
$state.addClass( 'changeable' );
} else {
$state.addClass( 'unchangeable' );
}
- if ( id === instance.currentState ) {
+ if ( data.id === instance.currentState ) {
$display.text( instance.getStateDisplay( data.name ) );
$display.append( $( '<span>' ).addClass( 'tux-workflow-status-triangle' ) );
$state.addClass( 'selected' );
@@ -157,7 +157,7 @@
data = $this.data( 'workflowselector' );
if ( !data ) {
- $this.data( 'workflowselector', ( data = new WorkflowSelector( this ) ) );
+ $this.data( 'workflowselector', new WorkflowSelector( this ) );
}
$this.data( 'workflowselector' ).receiveState( groupId, language, state );
} );
diff --git a/MLEB/Translate/resources/lib/Chart.js/Chart.css b/MLEB/Translate/resources/lib/Chart.js/Chart.css
new file mode 100644
index 00000000..5e749593
--- /dev/null
+++ b/MLEB/Translate/resources/lib/Chart.js/Chart.css
@@ -0,0 +1,47 @@
+/*
+ * DOM element rendering detection
+ * https://davidwalsh.name/detect-node-insertion
+ */
+@keyframes chartjs-render-animation {
+ from { opacity: 0.99; }
+ to { opacity: 1; }
+}
+
+.chartjs-render-monitor {
+ animation: chartjs-render-animation 0.001s;
+}
+
+/*
+ * DOM element resizing detection
+ * https://github.com/marcj/css-element-queries
+ */
+.chartjs-size-monitor,
+.chartjs-size-monitor-expand,
+.chartjs-size-monitor-shrink {
+ position: absolute;
+ direction: ltr;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ overflow: hidden;
+ pointer-events: none;
+ visibility: hidden;
+ z-index: -1;
+}
+
+.chartjs-size-monitor-expand > div {
+ position: absolute;
+ width: 1000000px;
+ height: 1000000px;
+ left: 0;
+ top: 0;
+}
+
+.chartjs-size-monitor-shrink > div {
+ position: absolute;
+ width: 200%;
+ height: 200%;
+ left: 0;
+ top: 0;
+}
diff --git a/MLEB/Translate/resources/lib/Chart.js/Chart.js b/MLEB/Translate/resources/lib/Chart.js/Chart.js
new file mode 100644
index 00000000..e8d937cf
--- /dev/null
+++ b/MLEB/Translate/resources/lib/Chart.js/Chart.js
@@ -0,0 +1,16151 @@
+/*!
+ * Chart.js v2.9.3
+ * https://www.chartjs.org
+ * (c) 2019 Chart.js Contributors
+ * Released under the MIT License
+ */
+(function (global, factory) {
+typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) :
+typeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) :
+(global = global || self, global.Chart = factory(global.moment));
+}(this, (function (moment) { 'use strict';
+
+moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;
+
+function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+}
+
+function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+}
+
+var colorName = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+};
+
+var conversions = createCommonjsModule(function (module) {
+/* MIT license */
+
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+// values that give correct `typeof` results).
+// do not use box values types (i.e. Number(), String(), etc.)
+
+var reverseKeywords = {};
+for (var key in colorName) {
+ if (colorName.hasOwnProperty(key)) {
+ reverseKeywords[colorName[key]] = key;
+ }
+}
+
+var convert = module.exports = {
+ rgb: {channels: 3, labels: 'rgb'},
+ hsl: {channels: 3, labels: 'hsl'},
+ hsv: {channels: 3, labels: 'hsv'},
+ hwb: {channels: 3, labels: 'hwb'},
+ cmyk: {channels: 4, labels: 'cmyk'},
+ xyz: {channels: 3, labels: 'xyz'},
+ lab: {channels: 3, labels: 'lab'},
+ lch: {channels: 3, labels: 'lch'},
+ hex: {channels: 1, labels: ['hex']},
+ keyword: {channels: 1, labels: ['keyword']},
+ ansi16: {channels: 1, labels: ['ansi16']},
+ ansi256: {channels: 1, labels: ['ansi256']},
+ hcg: {channels: 3, labels: ['h', 'c', 'g']},
+ apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+ gray: {channels: 1, labels: ['gray']}
+};
+
+// hide .channels and .labels properties
+for (var model in convert) {
+ if (convert.hasOwnProperty(model)) {
+ if (!('channels' in convert[model])) {
+ throw new Error('missing channels property: ' + model);
+ }
+
+ if (!('labels' in convert[model])) {
+ throw new Error('missing channel labels property: ' + model);
+ }
+
+ if (convert[model].labels.length !== convert[model].channels) {
+ throw new Error('channel and label counts mismatch: ' + model);
+ }
+
+ var channels = convert[model].channels;
+ var labels = convert[model].labels;
+ delete convert[model].channels;
+ delete convert[model].labels;
+ Object.defineProperty(convert[model], 'channels', {value: channels});
+ Object.defineProperty(convert[model], 'labels', {value: labels});
+ }
+}
+
+convert.rgb.hsl = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var min = Math.min(r, g, b);
+ var max = Math.max(r, g, b);
+ var delta = max - min;
+ var h;
+ var s;
+ var l;
+
+ if (max === min) {
+ h = 0;
+ } else if (r === max) {
+ h = (g - b) / delta;
+ } else if (g === max) {
+ h = 2 + (b - r) / delta;
+ } else if (b === max) {
+ h = 4 + (r - g) / delta;
+ }
+
+ h = Math.min(h * 60, 360);
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ l = (min + max) / 2;
+
+ if (max === min) {
+ s = 0;
+ } else if (l <= 0.5) {
+ s = delta / (max + min);
+ } else {
+ s = delta / (2 - max - min);
+ }
+
+ return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+ var rdif;
+ var gdif;
+ var bdif;
+ var h;
+ var s;
+
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var v = Math.max(r, g, b);
+ var diff = v - Math.min(r, g, b);
+ var diffc = function (c) {
+ return (v - c) / 6 / diff + 1 / 2;
+ };
+
+ if (diff === 0) {
+ h = s = 0;
+ } else {
+ s = diff / v;
+ rdif = diffc(r);
+ gdif = diffc(g);
+ bdif = diffc(b);
+
+ if (r === v) {
+ h = bdif - gdif;
+ } else if (g === v) {
+ h = (1 / 3) + rdif - bdif;
+ } else if (b === v) {
+ h = (2 / 3) + gdif - rdif;
+ }
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ }
+
+ return [
+ h * 360,
+ s * 100,
+ v * 100
+ ];
+};
+
+convert.rgb.hwb = function (rgb) {
+ var r = rgb[0];
+ var g = rgb[1];
+ var b = rgb[2];
+ var h = convert.rgb.hsl(rgb)[0];
+ var w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+ b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+ return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var c;
+ var m;
+ var y;
+ var k;
+
+ k = Math.min(1 - r, 1 - g, 1 - b);
+ c = (1 - r - k) / (1 - k) || 0;
+ m = (1 - g - k) / (1 - k) || 0;
+ y = (1 - b - k) / (1 - k) || 0;
+
+ return [c * 100, m * 100, y * 100, k * 100];
+};
+
+/**
+ * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ * */
+function comparativeDistance(x, y) {
+ return (
+ Math.pow(x[0] - y[0], 2) +
+ Math.pow(x[1] - y[1], 2) +
+ Math.pow(x[2] - y[2], 2)
+ );
+}
+
+convert.rgb.keyword = function (rgb) {
+ var reversed = reverseKeywords[rgb];
+ if (reversed) {
+ return reversed;
+ }
+
+ var currentClosestDistance = Infinity;
+ var currentClosestKeyword;
+
+ for (var keyword in colorName) {
+ if (colorName.hasOwnProperty(keyword)) {
+ var value = colorName[keyword];
+
+ // Compute comparative distance
+ var distance = comparativeDistance(rgb, value);
+
+ // Check if its less, if so set as closest
+ if (distance < currentClosestDistance) {
+ currentClosestDistance = distance;
+ currentClosestKeyword = keyword;
+ }
+ }
+ }
+
+ return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+ return colorName[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+
+ // assume sRGB
+ r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+ g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+ b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
+
+ var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+ var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+ var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+ return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+ var xyz = convert.rgb.xyz(rgb);
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+ var h = hsl[0] / 360;
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var t1;
+ var t2;
+ var t3;
+ var rgb;
+ var val;
+
+ if (s === 0) {
+ val = l * 255;
+ return [val, val, val];
+ }
+
+ if (l < 0.5) {
+ t2 = l * (1 + s);
+ } else {
+ t2 = l + s - l * s;
+ }
+
+ t1 = 2 * l - t2;
+
+ rgb = [0, 0, 0];
+ for (var i = 0; i < 3; i++) {
+ t3 = h + 1 / 3 * -(i - 1);
+ if (t3 < 0) {
+ t3++;
+ }
+ if (t3 > 1) {
+ t3--;
+ }
+
+ if (6 * t3 < 1) {
+ val = t1 + (t2 - t1) * 6 * t3;
+ } else if (2 * t3 < 1) {
+ val = t2;
+ } else if (3 * t3 < 2) {
+ val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+ } else {
+ val = t1;
+ }
+
+ rgb[i] = val * 255;
+ }
+
+ return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+ var h = hsl[0];
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var smin = s;
+ var lmin = Math.max(l, 0.01);
+ var sv;
+ var v;
+
+ l *= 2;
+ s *= (l <= 1) ? l : 2 - l;
+ smin *= lmin <= 1 ? lmin : 2 - lmin;
+ v = (l + s) / 2;
+ sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+ return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+ var h = hsv[0] / 60;
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var hi = Math.floor(h) % 6;
+
+ var f = h - Math.floor(h);
+ var p = 255 * v * (1 - s);
+ var q = 255 * v * (1 - (s * f));
+ var t = 255 * v * (1 - (s * (1 - f)));
+ v *= 255;
+
+ switch (hi) {
+ case 0:
+ return [v, t, p];
+ case 1:
+ return [q, v, p];
+ case 2:
+ return [p, v, t];
+ case 3:
+ return [p, q, v];
+ case 4:
+ return [t, p, v];
+ case 5:
+ return [v, p, q];
+ }
+};
+
+convert.hsv.hsl = function (hsv) {
+ var h = hsv[0];
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+ var vmin = Math.max(v, 0.01);
+ var lmin;
+ var sl;
+ var l;
+
+ l = (2 - s) * v;
+ lmin = (2 - s) * vmin;
+ sl = s * vmin;
+ sl /= (lmin <= 1) ? lmin : 2 - lmin;
+ sl = sl || 0;
+ l /= 2;
+
+ return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+ var h = hwb[0] / 360;
+ var wh = hwb[1] / 100;
+ var bl = hwb[2] / 100;
+ var ratio = wh + bl;
+ var i;
+ var v;
+ var f;
+ var n;
+
+ // wh + bl cant be > 1
+ if (ratio > 1) {
+ wh /= ratio;
+ bl /= ratio;
+ }
+
+ i = Math.floor(6 * h);
+ v = 1 - bl;
+ f = 6 * h - i;
+
+ if ((i & 0x01) !== 0) {
+ f = 1 - f;
+ }
+
+ n = wh + f * (v - wh); // linear interpolation
+
+ var r;
+ var g;
+ var b;
+ switch (i) {
+ default:
+ case 6:
+ case 0: r = v; g = n; b = wh; break;
+ case 1: r = n; g = v; b = wh; break;
+ case 2: r = wh; g = v; b = n; break;
+ case 3: r = wh; g = n; b = v; break;
+ case 4: r = n; g = wh; b = v; break;
+ case 5: r = v; g = wh; b = n; break;
+ }
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+ var c = cmyk[0] / 100;
+ var m = cmyk[1] / 100;
+ var y = cmyk[2] / 100;
+ var k = cmyk[3] / 100;
+ var r;
+ var g;
+ var b;
+
+ r = 1 - Math.min(1, c * (1 - k) + k);
+ g = 1 - Math.min(1, m * (1 - k) + k);
+ b = 1 - Math.min(1, y * (1 - k) + k);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+ var x = xyz[0] / 100;
+ var y = xyz[1] / 100;
+ var z = xyz[2] / 100;
+ var r;
+ var g;
+ var b;
+
+ r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+ g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+ b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+ // assume sRGB
+ r = r > 0.0031308
+ ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+ : r * 12.92;
+
+ g = g > 0.0031308
+ ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+ : g * 12.92;
+
+ b = b > 0.0031308
+ ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+ : b * 12.92;
+
+ r = Math.min(Math.max(0, r), 1);
+ g = Math.min(Math.max(0, g), 1);
+ b = Math.min(Math.max(0, b), 1);
+
+ return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+ var x = xyz[0];
+ var y = xyz[1];
+ var z = xyz[2];
+ var l;
+ var a;
+ var b;
+
+ x /= 95.047;
+ y /= 100;
+ z /= 108.883;
+
+ x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+ y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+ z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+ l = (116 * y) - 16;
+ a = 500 * (x - y);
+ b = 200 * (y - z);
+
+ return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var x;
+ var y;
+ var z;
+
+ y = (l + 16) / 116;
+ x = a / 500 + y;
+ z = y - b / 200;
+
+ var y2 = Math.pow(y, 3);
+ var x2 = Math.pow(x, 3);
+ var z2 = Math.pow(z, 3);
+ y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+ x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+ z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+ x *= 95.047;
+ y *= 100;
+ z *= 108.883;
+
+ return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+ var l = lab[0];
+ var a = lab[1];
+ var b = lab[2];
+ var hr;
+ var h;
+ var c;
+
+ hr = Math.atan2(b, a);
+ h = hr * 360 / 2 / Math.PI;
+
+ if (h < 0) {
+ h += 360;
+ }
+
+ c = Math.sqrt(a * a + b * b);
+
+ return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+ var l = lch[0];
+ var c = lch[1];
+ var h = lch[2];
+ var a;
+ var b;
+ var hr;
+
+ hr = h / 360 * 2 * Math.PI;
+ a = c * Math.cos(hr);
+ b = c * Math.sin(hr);
+
+ return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+ var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
+
+ value = Math.round(value / 50);
+
+ if (value === 0) {
+ return 30;
+ }
+
+ var ansi = 30
+ + ((Math.round(b / 255) << 2)
+ | (Math.round(g / 255) << 1)
+ | Math.round(r / 255));
+
+ if (value === 2) {
+ ansi += 60;
+ }
+
+ return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+ // optimization here; we already know the value and don't need to get
+ // it converted for us.
+ return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+ var r = args[0];
+ var g = args[1];
+ var b = args[2];
+
+ // we use the extended greyscale palette here, with the exception of
+ // black and white. normal palette only has 4 greyscale shades.
+ if (r === g && g === b) {
+ if (r < 8) {
+ return 16;
+ }
+
+ if (r > 248) {
+ return 231;
+ }
+
+ return Math.round(((r - 8) / 247) * 24) + 232;
+ }
+
+ var ansi = 16
+ + (36 * Math.round(r / 255 * 5))
+ + (6 * Math.round(g / 255 * 5))
+ + Math.round(b / 255 * 5);
+
+ return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+ var color = args % 10;
+
+ // handle greyscale
+ if (color === 0 || color === 7) {
+ if (args > 50) {
+ color += 3.5;
+ }
+
+ color = color / 10.5 * 255;
+
+ return [color, color, color];
+ }
+
+ var mult = (~~(args > 50) + 1) * 0.5;
+ var r = ((color & 1) * mult) * 255;
+ var g = (((color >> 1) & 1) * mult) * 255;
+ var b = (((color >> 2) & 1) * mult) * 255;
+
+ return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+ // handle greyscale
+ if (args >= 232) {
+ var c = (args - 232) * 10 + 8;
+ return [c, c, c];
+ }
+
+ args -= 16;
+
+ var rem;
+ var r = Math.floor(args / 36) / 5 * 255;
+ var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+ var b = (rem % 6) / 5 * 255;
+
+ return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+ var integer = ((Math.round(args[0]) & 0xFF) << 16)
+ + ((Math.round(args[1]) & 0xFF) << 8)
+ + (Math.round(args[2]) & 0xFF);
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+ var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+ if (!match) {
+ return [0, 0, 0];
+ }
+
+ var colorString = match[0];
+
+ if (match[0].length === 3) {
+ colorString = colorString.split('').map(function (char) {
+ return char + char;
+ }).join('');
+ }
+
+ var integer = parseInt(colorString, 16);
+ var r = (integer >> 16) & 0xFF;
+ var g = (integer >> 8) & 0xFF;
+ var b = integer & 0xFF;
+
+ return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+ var r = rgb[0] / 255;
+ var g = rgb[1] / 255;
+ var b = rgb[2] / 255;
+ var max = Math.max(Math.max(r, g), b);
+ var min = Math.min(Math.min(r, g), b);
+ var chroma = (max - min);
+ var grayscale;
+ var hue;
+
+ if (chroma < 1) {
+ grayscale = min / (1 - chroma);
+ } else {
+ grayscale = 0;
+ }
+
+ if (chroma <= 0) {
+ hue = 0;
+ } else
+ if (max === r) {
+ hue = ((g - b) / chroma) % 6;
+ } else
+ if (max === g) {
+ hue = 2 + (b - r) / chroma;
+ } else {
+ hue = 4 + (r - g) / chroma + 4;
+ }
+
+ hue /= 6;
+ hue %= 1;
+
+ return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+ var s = hsl[1] / 100;
+ var l = hsl[2] / 100;
+ var c = 1;
+ var f = 0;
+
+ if (l < 0.5) {
+ c = 2.0 * s * l;
+ } else {
+ c = 2.0 * s * (1.0 - l);
+ }
+
+ if (c < 1.0) {
+ f = (l - 0.5 * c) / (1.0 - c);
+ }
+
+ return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+ var s = hsv[1] / 100;
+ var v = hsv[2] / 100;
+
+ var c = s * v;
+ var f = 0;
+
+ if (c < 1.0) {
+ f = (v - c) / (1 - c);
+ }
+
+ return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+ var h = hcg[0] / 360;
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ if (c === 0.0) {
+ return [g * 255, g * 255, g * 255];
+ }
+
+ var pure = [0, 0, 0];
+ var hi = (h % 1) * 6;
+ var v = hi % 1;
+ var w = 1 - v;
+ var mg = 0;
+
+ switch (Math.floor(hi)) {
+ case 0:
+ pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+ case 1:
+ pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+ case 2:
+ pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+ case 3:
+ pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+ case 4:
+ pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+ default:
+ pure[0] = 1; pure[1] = 0; pure[2] = w;
+ }
+
+ mg = (1.0 - c) * g;
+
+ return [
+ (c * pure[0] + mg) * 255,
+ (c * pure[1] + mg) * 255,
+ (c * pure[2] + mg) * 255
+ ];
+};
+
+convert.hcg.hsv = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var v = c + g * (1.0 - c);
+ var f = 0;
+
+ if (v > 0.0) {
+ f = c / v;
+ }
+
+ return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+
+ var l = g * (1.0 - c) + 0.5 * c;
+ var s = 0;
+
+ if (l > 0.0 && l < 0.5) {
+ s = c / (2 * l);
+ } else
+ if (l >= 0.5 && l < 1.0) {
+ s = c / (2 * (1 - l));
+ }
+
+ return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+ var c = hcg[1] / 100;
+ var g = hcg[2] / 100;
+ var v = c + g * (1.0 - c);
+ return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+ var w = hwb[1] / 100;
+ var b = hwb[2] / 100;
+ var v = 1 - b;
+ var c = v - w;
+ var g = 0;
+
+ if (c < 1) {
+ g = (v - c) / (1 - c);
+ }
+
+ return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+ return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+ return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+ return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = convert.gray.hsv = function (args) {
+ return [0, 0, args[0]];
+};
+
+convert.gray.hwb = function (gray) {
+ return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+ return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+ return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+ var val = Math.round(gray[0] / 100 * 255) & 0xFF;
+ var integer = (val << 16) + (val << 8) + val;
+
+ var string = integer.toString(16).toUpperCase();
+ return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+ var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+ return [val / 255 * 100];
+};
+});
+var conversions_1 = conversions.rgb;
+var conversions_2 = conversions.hsl;
+var conversions_3 = conversions.hsv;
+var conversions_4 = conversions.hwb;
+var conversions_5 = conversions.cmyk;
+var conversions_6 = conversions.xyz;
+var conversions_7 = conversions.lab;
+var conversions_8 = conversions.lch;
+var conversions_9 = conversions.hex;
+var conversions_10 = conversions.keyword;
+var conversions_11 = conversions.ansi16;
+var conversions_12 = conversions.ansi256;
+var conversions_13 = conversions.hcg;
+var conversions_14 = conversions.apple;
+var conversions_15 = conversions.gray;
+
+/*
+ this function routes a model to all other models.
+
+ all functions that are routed have a property `.conversion` attached
+ to the returned synthetic function. This property is an array
+ of strings, each with the steps in between the 'from' and 'to'
+ color models (inclusive).
+
+ conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+ var graph = {};
+ // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+ var models = Object.keys(conversions);
+
+ for (var len = models.length, i = 0; i < len; i++) {
+ graph[models[i]] = {
+ // http://jsperf.com/1-vs-infinity
+ // micro-opt, but this is simple.
+ distance: -1,
+ parent: null
+ };
+ }
+
+ return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+ var graph = buildGraph();
+ var queue = [fromModel]; // unshift -> queue -> pop
+
+ graph[fromModel].distance = 0;
+
+ while (queue.length) {
+ var current = queue.pop();
+ var adjacents = Object.keys(conversions[current]);
+
+ for (var len = adjacents.length, i = 0; i < len; i++) {
+ var adjacent = adjacents[i];
+ var node = graph[adjacent];
+
+ if (node.distance === -1) {
+ node.distance = graph[current].distance + 1;
+ node.parent = current;
+ queue.unshift(adjacent);
+ }
+ }
+ }
+
+ return graph;
+}
+
+function link(from, to) {
+ return function (args) {
+ return to(from(args));
+ };
+}
+
+function wrapConversion(toModel, graph) {
+ var path = [graph[toModel].parent, toModel];
+ var fn = conversions[graph[toModel].parent][toModel];
+
+ var cur = graph[toModel].parent;
+ while (graph[cur].parent) {
+ path.unshift(graph[cur].parent);
+ fn = link(conversions[graph[cur].parent][cur], fn);
+ cur = graph[cur].parent;
+ }
+
+ fn.conversion = path;
+ return fn;
+}
+
+var route = function (fromModel) {
+ var graph = deriveBFS(fromModel);
+ var conversion = {};
+
+ var models = Object.keys(graph);
+ for (var len = models.length, i = 0; i < len; i++) {
+ var toModel = models[i];
+ var node = graph[toModel];
+
+ if (node.parent === null) {
+ // no possible conversion, or this node is the source model.
+ continue;
+ }
+
+ conversion[toModel] = wrapConversion(toModel, graph);
+ }
+
+ return conversion;
+};
+
+var convert = {};
+
+var models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
+
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
+
+ return fn(args);
+ };
+
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+function wrapRounded(fn) {
+ var wrappedFn = function (args) {
+ if (args === undefined || args === null) {
+ return args;
+ }
+
+ if (arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);
+ }
+
+ var result = fn(args);
+
+ // we're assuming the result is an array here.
+ // see notice in conversions.js; don't use box types
+ // in conversion functions.
+ if (typeof result === 'object') {
+ for (var len = result.length, i = 0; i < len; i++) {
+ result[i] = Math.round(result[i]);
+ }
+ }
+
+ return result;
+ };
+
+ // preserve .conversion property if there is one
+ if ('conversion' in fn) {
+ wrappedFn.conversion = fn.conversion;
+ }
+
+ return wrappedFn;
+}
+
+models.forEach(function (fromModel) {
+ convert[fromModel] = {};
+
+ Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+ Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+ var routes = route(fromModel);
+ var routeModels = Object.keys(routes);
+
+ routeModels.forEach(function (toModel) {
+ var fn = routes[toModel];
+
+ convert[fromModel][toModel] = wrapRounded(fn);
+ convert[fromModel][toModel].raw = wrapRaw(fn);
+ });
+});
+
+var colorConvert = convert;
+
+var colorName$1 = {
+ "aliceblue": [240, 248, 255],
+ "antiquewhite": [250, 235, 215],
+ "aqua": [0, 255, 255],
+ "aquamarine": [127, 255, 212],
+ "azure": [240, 255, 255],
+ "beige": [245, 245, 220],
+ "bisque": [255, 228, 196],
+ "black": [0, 0, 0],
+ "blanchedalmond": [255, 235, 205],
+ "blue": [0, 0, 255],
+ "blueviolet": [138, 43, 226],
+ "brown": [165, 42, 42],
+ "burlywood": [222, 184, 135],
+ "cadetblue": [95, 158, 160],
+ "chartreuse": [127, 255, 0],
+ "chocolate": [210, 105, 30],
+ "coral": [255, 127, 80],
+ "cornflowerblue": [100, 149, 237],
+ "cornsilk": [255, 248, 220],
+ "crimson": [220, 20, 60],
+ "cyan": [0, 255, 255],
+ "darkblue": [0, 0, 139],
+ "darkcyan": [0, 139, 139],
+ "darkgoldenrod": [184, 134, 11],
+ "darkgray": [169, 169, 169],
+ "darkgreen": [0, 100, 0],
+ "darkgrey": [169, 169, 169],
+ "darkkhaki": [189, 183, 107],
+ "darkmagenta": [139, 0, 139],
+ "darkolivegreen": [85, 107, 47],
+ "darkorange": [255, 140, 0],
+ "darkorchid": [153, 50, 204],
+ "darkred": [139, 0, 0],
+ "darksalmon": [233, 150, 122],
+ "darkseagreen": [143, 188, 143],
+ "darkslateblue": [72, 61, 139],
+ "darkslategray": [47, 79, 79],
+ "darkslategrey": [47, 79, 79],
+ "darkturquoise": [0, 206, 209],
+ "darkviolet": [148, 0, 211],
+ "deeppink": [255, 20, 147],
+ "deepskyblue": [0, 191, 255],
+ "dimgray": [105, 105, 105],
+ "dimgrey": [105, 105, 105],
+ "dodgerblue": [30, 144, 255],
+ "firebrick": [178, 34, 34],
+ "floralwhite": [255, 250, 240],
+ "forestgreen": [34, 139, 34],
+ "fuchsia": [255, 0, 255],
+ "gainsboro": [220, 220, 220],
+ "ghostwhite": [248, 248, 255],
+ "gold": [255, 215, 0],
+ "goldenrod": [218, 165, 32],
+ "gray": [128, 128, 128],
+ "green": [0, 128, 0],
+ "greenyellow": [173, 255, 47],
+ "grey": [128, 128, 128],
+ "honeydew": [240, 255, 240],
+ "hotpink": [255, 105, 180],
+ "indianred": [205, 92, 92],
+ "indigo": [75, 0, 130],
+ "ivory": [255, 255, 240],
+ "khaki": [240, 230, 140],
+ "lavender": [230, 230, 250],
+ "lavenderblush": [255, 240, 245],
+ "lawngreen": [124, 252, 0],
+ "lemonchiffon": [255, 250, 205],
+ "lightblue": [173, 216, 230],
+ "lightcoral": [240, 128, 128],
+ "lightcyan": [224, 255, 255],
+ "lightgoldenrodyellow": [250, 250, 210],
+ "lightgray": [211, 211, 211],
+ "lightgreen": [144, 238, 144],
+ "lightgrey": [211, 211, 211],
+ "lightpink": [255, 182, 193],
+ "lightsalmon": [255, 160, 122],
+ "lightseagreen": [32, 178, 170],
+ "lightskyblue": [135, 206, 250],
+ "lightslategray": [119, 136, 153],
+ "lightslategrey": [119, 136, 153],
+ "lightsteelblue": [176, 196, 222],
+ "lightyellow": [255, 255, 224],
+ "lime": [0, 255, 0],
+ "limegreen": [50, 205, 50],
+ "linen": [250, 240, 230],
+ "magenta": [255, 0, 255],
+ "maroon": [128, 0, 0],
+ "mediumaquamarine": [102, 205, 170],
+ "mediumblue": [0, 0, 205],
+ "mediumorchid": [186, 85, 211],
+ "mediumpurple": [147, 112, 219],
+ "mediumseagreen": [60, 179, 113],
+ "mediumslateblue": [123, 104, 238],
+ "mediumspringgreen": [0, 250, 154],
+ "mediumturquoise": [72, 209, 204],
+ "mediumvioletred": [199, 21, 133],
+ "midnightblue": [25, 25, 112],
+ "mintcream": [245, 255, 250],
+ "mistyrose": [255, 228, 225],
+ "moccasin": [255, 228, 181],
+ "navajowhite": [255, 222, 173],
+ "navy": [0, 0, 128],
+ "oldlace": [253, 245, 230],
+ "olive": [128, 128, 0],
+ "olivedrab": [107, 142, 35],
+ "orange": [255, 165, 0],
+ "orangered": [255, 69, 0],
+ "orchid": [218, 112, 214],
+ "palegoldenrod": [238, 232, 170],
+ "palegreen": [152, 251, 152],
+ "paleturquoise": [175, 238, 238],
+ "palevioletred": [219, 112, 147],
+ "papayawhip": [255, 239, 213],
+ "peachpuff": [255, 218, 185],
+ "peru": [205, 133, 63],
+ "pink": [255, 192, 203],
+ "plum": [221, 160, 221],
+ "powderblue": [176, 224, 230],
+ "purple": [128, 0, 128],
+ "rebeccapurple": [102, 51, 153],
+ "red": [255, 0, 0],
+ "rosybrown": [188, 143, 143],
+ "royalblue": [65, 105, 225],
+ "saddlebrown": [139, 69, 19],
+ "salmon": [250, 128, 114],
+ "sandybrown": [244, 164, 96],
+ "seagreen": [46, 139, 87],
+ "seashell": [255, 245, 238],
+ "sienna": [160, 82, 45],
+ "silver": [192, 192, 192],
+ "skyblue": [135, 206, 235],
+ "slateblue": [106, 90, 205],
+ "slategray": [112, 128, 144],
+ "slategrey": [112, 128, 144],
+ "snow": [255, 250, 250],
+ "springgreen": [0, 255, 127],
+ "steelblue": [70, 130, 180],
+ "tan": [210, 180, 140],
+ "teal": [0, 128, 128],
+ "thistle": [216, 191, 216],
+ "tomato": [255, 99, 71],
+ "turquoise": [64, 224, 208],
+ "violet": [238, 130, 238],
+ "wheat": [245, 222, 179],
+ "white": [255, 255, 255],
+ "whitesmoke": [245, 245, 245],
+ "yellow": [255, 255, 0],
+ "yellowgreen": [154, 205, 50]
+};
+
+/* MIT license */
+
+
+var colorString = {
+ getRgba: getRgba,
+ getHsla: getHsla,
+ getRgb: getRgb,
+ getHsl: getHsl,
+ getHwb: getHwb,
+ getAlpha: getAlpha,
+
+ hexString: hexString,
+ rgbString: rgbString,
+ rgbaString: rgbaString,
+ percentString: percentString,
+ percentaString: percentaString,
+ hslString: hslString,
+ hslaString: hslaString,
+ hwbString: hwbString,
+ keyword: keyword
+};
+
+function getRgba(string) {
+ if (!string) {
+ return;
+ }
+ var abbr = /^#([a-fA-F0-9]{3,4})$/i,
+ hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,
+ rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,
+ keyword = /(\w+)/;
+
+ var rgb = [0, 0, 0],
+ a = 1,
+ match = string.match(abbr),
+ hexAlpha = "";
+ if (match) {
+ match = match[1];
+ hexAlpha = match[3];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i] + match[i], 16);
+ }
+ if (hexAlpha) {
+ a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;
+ }
+ }
+ else if (match = string.match(hex)) {
+ hexAlpha = match[2];
+ match = match[1];
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
+ }
+ if (hexAlpha) {
+ a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;
+ }
+ }
+ else if (match = string.match(rgba)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = parseInt(match[i + 1]);
+ }
+ a = parseFloat(match[4]);
+ }
+ else if (match = string.match(per)) {
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
+ }
+ a = parseFloat(match[4]);
+ }
+ else if (match = string.match(keyword)) {
+ if (match[1] == "transparent") {
+ return [0, 0, 0, 0];
+ }
+ rgb = colorName$1[match[1]];
+ if (!rgb) {
+ return;
+ }
+ }
+
+ for (var i = 0; i < rgb.length; i++) {
+ rgb[i] = scale(rgb[i], 0, 255);
+ }
+ if (!a && a != 0) {
+ a = 1;
+ }
+ else {
+ a = scale(a, 0, 1);
+ }
+ rgb[3] = a;
+ return rgb;
+}
+
+function getHsla(string) {
+ if (!string) {
+ return;
+ }
+ var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hsl);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ s = scale(parseFloat(match[2]), 0, 100),
+ l = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, s, l, a];
+ }
+}
+
+function getHwb(string) {
+ if (!string) {
+ return;
+ }
+ var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
+ var match = string.match(hwb);
+ if (match) {
+ var alpha = parseFloat(match[4]);
+ var h = scale(parseInt(match[1]), 0, 360),
+ w = scale(parseFloat(match[2]), 0, 100),
+ b = scale(parseFloat(match[3]), 0, 100),
+ a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
+ return [h, w, b, a];
+ }
+}
+
+function getRgb(string) {
+ var rgba = getRgba(string);
+ return rgba && rgba.slice(0, 3);
+}
+
+function getHsl(string) {
+ var hsla = getHsla(string);
+ return hsla && hsla.slice(0, 3);
+}
+
+function getAlpha(string) {
+ var vals = getRgba(string);
+ if (vals) {
+ return vals[3];
+ }
+ else if (vals = getHsla(string)) {
+ return vals[3];
+ }
+ else if (vals = getHwb(string)) {
+ return vals[3];
+ }
+}
+
+// generators
+function hexString(rgba, a) {
+ var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];
+ return "#" + hexDouble(rgba[0])
+ + hexDouble(rgba[1])
+ + hexDouble(rgba[2])
+ + (
+ (a >= 0 && a < 1)
+ ? hexDouble(Math.round(a * 255))
+ : ""
+ );
+}
+
+function rgbString(rgba, alpha) {
+ if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
+ return rgbaString(rgba, alpha);
+ }
+ return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
+}
+
+function rgbaString(rgba, alpha) {
+ if (alpha === undefined) {
+ alpha = (rgba[3] !== undefined ? rgba[3] : 1);
+ }
+ return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
+ + ", " + alpha + ")";
+}
+
+function percentString(rgba, alpha) {
+ if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
+ return percentaString(rgba, alpha);
+ }
+ var r = Math.round(rgba[0]/255 * 100),
+ g = Math.round(rgba[1]/255 * 100),
+ b = Math.round(rgba[2]/255 * 100);
+
+ return "rgb(" + r + "%, " + g + "%, " + b + "%)";
+}
+
+function percentaString(rgba, alpha) {
+ var r = Math.round(rgba[0]/255 * 100),
+ g = Math.round(rgba[1]/255 * 100),
+ b = Math.round(rgba[2]/255 * 100);
+ return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
+}
+
+function hslString(hsla, alpha) {
+ if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
+ return hslaString(hsla, alpha);
+ }
+ return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
+}
+
+function hslaString(hsla, alpha) {
+ if (alpha === undefined) {
+ alpha = (hsla[3] !== undefined ? hsla[3] : 1);
+ }
+ return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
+ + alpha + ")";
+}
+
+// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
+// (hwb have alpha optional & 1 is default value)
+function hwbString(hwb, alpha) {
+ if (alpha === undefined) {
+ alpha = (hwb[3] !== undefined ? hwb[3] : 1);
+ }
+ return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
+ + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
+}
+
+function keyword(rgb) {
+ return reverseNames[rgb.slice(0, 3)];
+}
+
+// helpers
+function scale(num, min, max) {
+ return Math.min(Math.max(min, num), max);
+}
+
+function hexDouble(num) {
+ var str = num.toString(16).toUpperCase();
+ return (str.length < 2) ? "0" + str : str;
+}
+
+
+//create a list of reverse color names
+var reverseNames = {};
+for (var name in colorName$1) {
+ reverseNames[colorName$1[name]] = name;
+}
+
+/* MIT license */
+
+
+
+var Color = function (obj) {
+ if (obj instanceof Color) {
+ return obj;
+ }
+ if (!(this instanceof Color)) {
+ return new Color(obj);
+ }
+
+ this.valid = false;
+ this.values = {
+ rgb: [0, 0, 0],
+ hsl: [0, 0, 0],
+ hsv: [0, 0, 0],
+ hwb: [0, 0, 0],
+ cmyk: [0, 0, 0, 0],
+ alpha: 1
+ };
+
+ // parse Color() argument
+ var vals;
+ if (typeof obj === 'string') {
+ vals = colorString.getRgba(obj);
+ if (vals) {
+ this.setValues('rgb', vals);
+ } else if (vals = colorString.getHsla(obj)) {
+ this.setValues('hsl', vals);
+ } else if (vals = colorString.getHwb(obj)) {
+ this.setValues('hwb', vals);
+ }
+ } else if (typeof obj === 'object') {
+ vals = obj;
+ if (vals.r !== undefined || vals.red !== undefined) {
+ this.setValues('rgb', vals);
+ } else if (vals.l !== undefined || vals.lightness !== undefined) {
+ this.setValues('hsl', vals);
+ } else if (vals.v !== undefined || vals.value !== undefined) {
+ this.setValues('hsv', vals);
+ } else if (vals.w !== undefined || vals.whiteness !== undefined) {
+ this.setValues('hwb', vals);
+ } else if (vals.c !== undefined || vals.cyan !== undefined) {
+ this.setValues('cmyk', vals);
+ }
+ }
+};
+
+Color.prototype = {
+ isValid: function () {
+ return this.valid;
+ },
+ rgb: function () {
+ return this.setSpace('rgb', arguments);
+ },
+ hsl: function () {
+ return this.setSpace('hsl', arguments);
+ },
+ hsv: function () {
+ return this.setSpace('hsv', arguments);
+ },
+ hwb: function () {
+ return this.setSpace('hwb', arguments);
+ },
+ cmyk: function () {
+ return this.setSpace('cmyk', arguments);
+ },
+
+ rgbArray: function () {
+ return this.values.rgb;
+ },
+ hslArray: function () {
+ return this.values.hsl;
+ },
+ hsvArray: function () {
+ return this.values.hsv;
+ },
+ hwbArray: function () {
+ var values = this.values;
+ if (values.alpha !== 1) {
+ return values.hwb.concat([values.alpha]);
+ }
+ return values.hwb;
+ },
+ cmykArray: function () {
+ return this.values.cmyk;
+ },
+ rgbaArray: function () {
+ var values = this.values;
+ return values.rgb.concat([values.alpha]);
+ },
+ hslaArray: function () {
+ var values = this.values;
+ return values.hsl.concat([values.alpha]);
+ },
+ alpha: function (val) {
+ if (val === undefined) {
+ return this.values.alpha;
+ }
+ this.setValues('alpha', val);
+ return this;
+ },
+
+ red: function (val) {
+ return this.setChannel('rgb', 0, val);
+ },
+ green: function (val) {
+ return this.setChannel('rgb', 1, val);
+ },
+ blue: function (val) {
+ return this.setChannel('rgb', 2, val);
+ },
+ hue: function (val) {
+ if (val) {
+ val %= 360;
+ val = val < 0 ? 360 + val : val;
+ }
+ return this.setChannel('hsl', 0, val);
+ },
+ saturation: function (val) {
+ return this.setChannel('hsl', 1, val);
+ },
+ lightness: function (val) {
+ return this.setChannel('hsl', 2, val);
+ },
+ saturationv: function (val) {
+ return this.setChannel('hsv', 1, val);
+ },
+ whiteness: function (val) {
+ return this.setChannel('hwb', 1, val);
+ },
+ blackness: function (val) {
+ return this.setChannel('hwb', 2, val);
+ },
+ value: function (val) {
+ return this.setChannel('hsv', 2, val);
+ },
+ cyan: function (val) {
+ return this.setChannel('cmyk', 0, val);
+ },
+ magenta: function (val) {
+ return this.setChannel('cmyk', 1, val);
+ },
+ yellow: function (val) {
+ return this.setChannel('cmyk', 2, val);
+ },
+ black: function (val) {
+ return this.setChannel('cmyk', 3, val);
+ },
+
+ hexString: function () {
+ return colorString.hexString(this.values.rgb);
+ },
+ rgbString: function () {
+ return colorString.rgbString(this.values.rgb, this.values.alpha);
+ },
+ rgbaString: function () {
+ return colorString.rgbaString(this.values.rgb, this.values.alpha);
+ },
+ percentString: function () {
+ return colorString.percentString(this.values.rgb, this.values.alpha);
+ },
+ hslString: function () {
+ return colorString.hslString(this.values.hsl, this.values.alpha);
+ },
+ hslaString: function () {
+ return colorString.hslaString(this.values.hsl, this.values.alpha);
+ },
+ hwbString: function () {
+ return colorString.hwbString(this.values.hwb, this.values.alpha);
+ },
+ keyword: function () {
+ return colorString.keyword(this.values.rgb, this.values.alpha);
+ },
+
+ rgbNumber: function () {
+ var rgb = this.values.rgb;
+ return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];
+ },
+
+ luminosity: function () {
+ // http://www.w3.org/TR/WCAG20/#relativeluminancedef
+ var rgb = this.values.rgb;
+ var lum = [];
+ for (var i = 0; i < rgb.length; i++) {
+ var chan = rgb[i] / 255;
+ lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);
+ }
+ return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
+ },
+
+ contrast: function (color2) {
+ // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
+ var lum1 = this.luminosity();
+ var lum2 = color2.luminosity();
+ if (lum1 > lum2) {
+ return (lum1 + 0.05) / (lum2 + 0.05);
+ }
+ return (lum2 + 0.05) / (lum1 + 0.05);
+ },
+
+ level: function (color2) {
+ var contrastRatio = this.contrast(color2);
+ if (contrastRatio >= 7.1) {
+ return 'AAA';
+ }
+
+ return (contrastRatio >= 4.5) ? 'AA' : '';
+ },
+
+ dark: function () {
+ // YIQ equation from http://24ways.org/2010/calculating-color-contrast
+ var rgb = this.values.rgb;
+ var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
+ return yiq < 128;
+ },
+
+ light: function () {
+ return !this.dark();
+ },
+
+ negate: function () {
+ var rgb = [];
+ for (var i = 0; i < 3; i++) {
+ rgb[i] = 255 - this.values.rgb[i];
+ }
+ this.setValues('rgb', rgb);
+ return this;
+ },
+
+ lighten: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] += hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ darken: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[2] -= hsl[2] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ saturate: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] += hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ desaturate: function (ratio) {
+ var hsl = this.values.hsl;
+ hsl[1] -= hsl[1] * ratio;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ whiten: function (ratio) {
+ var hwb = this.values.hwb;
+ hwb[1] += hwb[1] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+
+ blacken: function (ratio) {
+ var hwb = this.values.hwb;
+ hwb[2] += hwb[2] * ratio;
+ this.setValues('hwb', hwb);
+ return this;
+ },
+
+ greyscale: function () {
+ var rgb = this.values.rgb;
+ // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
+ var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
+ this.setValues('rgb', [val, val, val]);
+ return this;
+ },
+
+ clearer: function (ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha - (alpha * ratio));
+ return this;
+ },
+
+ opaquer: function (ratio) {
+ var alpha = this.values.alpha;
+ this.setValues('alpha', alpha + (alpha * ratio));
+ return this;
+ },
+
+ rotate: function (degrees) {
+ var hsl = this.values.hsl;
+ var hue = (hsl[0] + degrees) % 360;
+ hsl[0] = hue < 0 ? 360 + hue : hue;
+ this.setValues('hsl', hsl);
+ return this;
+ },
+
+ /**
+ * Ported from sass implementation in C
+ * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
+ */
+ mix: function (mixinColor, weight) {
+ var color1 = this;
+ var color2 = mixinColor;
+ var p = weight === undefined ? 0.5 : weight;
+
+ var w = 2 * p - 1;
+ var a = color1.alpha() - color2.alpha();
+
+ var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;
+ var w2 = 1 - w1;
+
+ return this
+ .rgb(
+ w1 * color1.red() + w2 * color2.red(),
+ w1 * color1.green() + w2 * color2.green(),
+ w1 * color1.blue() + w2 * color2.blue()
+ )
+ .alpha(color1.alpha() * p + color2.alpha() * (1 - p));
+ },
+
+ toJSON: function () {
+ return this.rgb();
+ },
+
+ clone: function () {
+ // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,
+ // making the final build way to big to embed in Chart.js. So let's do it manually,
+ // assuming that values to clone are 1 dimension arrays containing only numbers,
+ // except 'alpha' which is a number.
+ var result = new Color();
+ var source = this.values;
+ var target = result.values;
+ var value, type;
+
+ for (var prop in source) {
+ if (source.hasOwnProperty(prop)) {
+ value = source[prop];
+ type = ({}).toString.call(value);
+ if (type === '[object Array]') {
+ target[prop] = value.slice(0);
+ } else if (type === '[object Number]') {
+ target[prop] = value;
+ } else {
+ console.error('unexpected color value:', value);
+ }
+ }
+ }
+
+ return result;
+ }
+};
+
+Color.prototype.spaces = {
+ rgb: ['red', 'green', 'blue'],
+ hsl: ['hue', 'saturation', 'lightness'],
+ hsv: ['hue', 'saturation', 'value'],
+ hwb: ['hue', 'whiteness', 'blackness'],
+ cmyk: ['cyan', 'magenta', 'yellow', 'black']
+};
+
+Color.prototype.maxes = {
+ rgb: [255, 255, 255],
+ hsl: [360, 100, 100],
+ hsv: [360, 100, 100],
+ hwb: [360, 100, 100],
+ cmyk: [100, 100, 100, 100]
+};
+
+Color.prototype.getValues = function (space) {
+ var values = this.values;
+ var vals = {};
+
+ for (var i = 0; i < space.length; i++) {
+ vals[space.charAt(i)] = values[space][i];
+ }
+
+ if (values.alpha !== 1) {
+ vals.a = values.alpha;
+ }
+
+ // {r: 255, g: 255, b: 255, a: 0.4}
+ return vals;
+};
+
+Color.prototype.setValues = function (space, vals) {
+ var values = this.values;
+ var spaces = this.spaces;
+ var maxes = this.maxes;
+ var alpha = 1;
+ var i;
+
+ this.valid = true;
+
+ if (space === 'alpha') {
+ alpha = vals;
+ } else if (vals.length) {
+ // [10, 10, 10]
+ values[space] = vals.slice(0, space.length);
+ alpha = vals[space.length];
+ } else if (vals[space.charAt(0)] !== undefined) {
+ // {r: 10, g: 10, b: 10}
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[space.charAt(i)];
+ }
+
+ alpha = vals.a;
+ } else if (vals[spaces[space][0]] !== undefined) {
+ // {red: 10, green: 10, blue: 10}
+ var chans = spaces[space];
+
+ for (i = 0; i < space.length; i++) {
+ values[space][i] = vals[chans[i]];
+ }
+
+ alpha = vals.alpha;
+ }
+
+ values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));
+
+ if (space === 'alpha') {
+ return false;
+ }
+
+ var capped;
+
+ // cap values of the space prior converting all values
+ for (i = 0; i < space.length; i++) {
+ capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));
+ values[space][i] = Math.round(capped);
+ }
+
+ // convert to all the other color spaces
+ for (var sname in spaces) {
+ if (sname !== space) {
+ values[sname] = colorConvert[space][sname](values[space]);
+ }
+ }
+
+ return true;
+};
+
+Color.prototype.setSpace = function (space, args) {
+ var vals = args[0];
+
+ if (vals === undefined) {
+ // color.rgb()
+ return this.getValues(space);
+ }
+
+ // color.rgb(10, 10, 10)
+ if (typeof vals === 'number') {
+ vals = Array.prototype.slice.call(args);
+ }
+
+ this.setValues(space, vals);
+ return this;
+};
+
+Color.prototype.setChannel = function (space, index, val) {
+ var svalues = this.values[space];
+ if (val === undefined) {
+ // color.red()
+ return svalues[index];
+ } else if (val === svalues[index]) {
+ // color.red(color.red())
+ return this;
+ }
+
+ // color.red(100)
+ svalues[index] = val;
+ this.setValues(space, svalues);
+
+ return this;
+};
+
+if (typeof window !== 'undefined') {
+ window.Color = Color;
+}
+
+var chartjsColor = Color;
+
+/**
+ * @namespace Chart.helpers
+ */
+var helpers = {
+ /**
+ * An empty function that can be used, for example, for optional callback.
+ */
+ noop: function() {},
+
+ /**
+ * Returns a unique id, sequentially generated from a global variable.
+ * @returns {number}
+ * @function
+ */
+ uid: (function() {
+ var id = 0;
+ return function() {
+ return id++;
+ };
+ }()),
+
+ /**
+ * Returns true if `value` is neither null nor undefined, else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isNullOrUndef: function(value) {
+ return value === null || typeof value === 'undefined';
+ },
+
+ /**
+ * Returns true if `value` is an array (including typed arrays), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @function
+ */
+ isArray: function(value) {
+ if (Array.isArray && Array.isArray(value)) {
+ return true;
+ }
+ var type = Object.prototype.toString.call(value);
+ if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Returns true if `value` is an object (excluding null), else returns false.
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ * @since 2.7.0
+ */
+ isObject: function(value) {
+ return value !== null && Object.prototype.toString.call(value) === '[object Object]';
+ },
+
+ /**
+ * Returns true if `value` is a finite number, else returns false
+ * @param {*} value - The value to test.
+ * @returns {boolean}
+ */
+ isFinite: function(value) {
+ return (typeof value === 'number' || value instanceof Number) && isFinite(value);
+ },
+
+ /**
+ * Returns `value` if defined, else returns `defaultValue`.
+ * @param {*} value - The value to return if defined.
+ * @param {*} defaultValue - The value to return if `value` is undefined.
+ * @returns {*}
+ */
+ valueOrDefault: function(value, defaultValue) {
+ return typeof value === 'undefined' ? defaultValue : value;
+ },
+
+ /**
+ * Returns value at the given `index` in array if defined, else returns `defaultValue`.
+ * @param {Array} value - The array to lookup for value at `index`.
+ * @param {number} index - The index in `value` to lookup for value.
+ * @param {*} defaultValue - The value to return if `value[index]` is undefined.
+ * @returns {*}
+ */
+ valueAtIndexOrDefault: function(value, index, defaultValue) {
+ return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);
+ },
+
+ /**
+ * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the
+ * value returned by `fn`. If `fn` is not a function, this method returns undefined.
+ * @param {function} fn - The function to call.
+ * @param {Array|undefined|null} args - The arguments with which `fn` should be called.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @returns {*}
+ */
+ callback: function(fn, args, thisArg) {
+ if (fn && typeof fn.call === 'function') {
+ return fn.apply(thisArg, args);
+ }
+ },
+
+ /**
+ * Note(SB) for performance sake, this method should only be used when loopable type
+ * is unknown or in none intensive code (not called often and small loopable). Else
+ * it's preferable to use a regular for() loop and save extra function calls.
+ * @param {object|Array} loopable - The object or array to be iterated.
+ * @param {function} fn - The function to call for each item.
+ * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.
+ * @param {boolean} [reverse] - If true, iterates backward on the loopable.
+ */
+ each: function(loopable, fn, thisArg, reverse) {
+ var i, len, keys;
+ if (helpers.isArray(loopable)) {
+ len = loopable.length;
+ if (reverse) {
+ for (i = len - 1; i >= 0; i--) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ } else {
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[i], i);
+ }
+ }
+ } else if (helpers.isObject(loopable)) {
+ keys = Object.keys(loopable);
+ len = keys.length;
+ for (i = 0; i < len; i++) {
+ fn.call(thisArg, loopable[keys[i]], keys[i]);
+ }
+ }
+ },
+
+ /**
+ * Returns true if the `a0` and `a1` arrays have the same content, else returns false.
+ * @see https://stackoverflow.com/a/14853974
+ * @param {Array} a0 - The array to compare
+ * @param {Array} a1 - The array to compare
+ * @returns {boolean}
+ */
+ arrayEquals: function(a0, a1) {
+ var i, ilen, v0, v1;
+
+ if (!a0 || !a1 || a0.length !== a1.length) {
+ return false;
+ }
+
+ for (i = 0, ilen = a0.length; i < ilen; ++i) {
+ v0 = a0[i];
+ v1 = a1[i];
+
+ if (v0 instanceof Array && v1 instanceof Array) {
+ if (!helpers.arrayEquals(v0, v1)) {
+ return false;
+ }
+ } else if (v0 !== v1) {
+ // NOTE: two different object instances will never be equal: {x:20} != {x:20}
+ return false;
+ }
+ }
+
+ return true;
+ },
+
+ /**
+ * Returns a deep copy of `source` without keeping references on objects and arrays.
+ * @param {*} source - The value to clone.
+ * @returns {*}
+ */
+ clone: function(source) {
+ if (helpers.isArray(source)) {
+ return source.map(helpers.clone);
+ }
+
+ if (helpers.isObject(source)) {
+ var target = {};
+ var keys = Object.keys(source);
+ var klen = keys.length;
+ var k = 0;
+
+ for (; k < klen; ++k) {
+ target[keys[k]] = helpers.clone(source[keys[k]]);
+ }
+
+ return target;
+ }
+
+ return source;
+ },
+
+ /**
+ * The default merger when Chart.helpers.merge is called without merger option.
+ * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.
+ * @private
+ */
+ _merger: function(key, target, source, options) {
+ var tval = target[key];
+ var sval = source[key];
+
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.merge(tval, sval, options);
+ } else {
+ target[key] = helpers.clone(sval);
+ }
+ },
+
+ /**
+ * Merges source[key] in target[key] only if target[key] is undefined.
+ * @private
+ */
+ _mergerIf: function(key, target, source) {
+ var tval = target[key];
+ var sval = source[key];
+
+ if (helpers.isObject(tval) && helpers.isObject(sval)) {
+ helpers.mergeIf(tval, sval);
+ } else if (!target.hasOwnProperty(key)) {
+ target[key] = helpers.clone(sval);
+ }
+ },
+
+ /**
+ * Recursively deep copies `source` properties into `target` with the given `options`.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @param {object} [options] - Merging options:
+ * @param {function} [options.merger] - The merge method (key, target, source, options)
+ * @returns {object} The `target` object.
+ */
+ merge: function(target, source, options) {
+ var sources = helpers.isArray(source) ? source : [source];
+ var ilen = sources.length;
+ var merge, i, keys, klen, k;
+
+ if (!helpers.isObject(target)) {
+ return target;
+ }
+
+ options = options || {};
+ merge = options.merger || helpers._merger;
+
+ for (i = 0; i < ilen; ++i) {
+ source = sources[i];
+ if (!helpers.isObject(source)) {
+ continue;
+ }
+
+ keys = Object.keys(source);
+ for (k = 0, klen = keys.length; k < klen; ++k) {
+ merge(keys[k], target, source, options);
+ }
+ }
+
+ return target;
+ },
+
+ /**
+ * Recursively deep copies `source` properties into `target` *only* if not defined in target.
+ * IMPORTANT: `target` is not cloned and will be updated with `source` properties.
+ * @param {object} target - The target object in which all sources are merged into.
+ * @param {object|object[]} source - Object(s) to merge into `target`.
+ * @returns {object} The `target` object.
+ */
+ mergeIf: function(target, source) {
+ return helpers.merge(target, source, {merger: helpers._mergerIf});
+ },
+
+ /**
+ * Applies the contents of two or more objects together into the first object.
+ * @param {object} target - The target object in which all objects are merged into.
+ * @param {object} arg1 - Object containing additional properties to merge in target.
+ * @param {object} argN - Additional objects containing properties to merge in target.
+ * @returns {object} The `target` object.
+ */
+ extend: Object.assign || function(target) {
+ return helpers.merge(target, [].slice.call(arguments, 1), {
+ merger: function(key, dst, src) {
+ dst[key] = src[key];
+ }
+ });
+ },
+
+ /**
+ * Basic javascript inheritance based on the model created in Backbone.js
+ */
+ inherits: function(extensions) {
+ var me = this;
+ var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {
+ return me.apply(this, arguments);
+ };
+
+ var Surrogate = function() {
+ this.constructor = ChartElement;
+ };
+
+ Surrogate.prototype = me.prototype;
+ ChartElement.prototype = new Surrogate();
+ ChartElement.extend = helpers.inherits;
+
+ if (extensions) {
+ helpers.extend(ChartElement.prototype, extensions);
+ }
+
+ ChartElement.__super__ = me.prototype;
+ return ChartElement;
+ },
+
+ _deprecated: function(scope, value, previous, current) {
+ if (value !== undefined) {
+ console.warn(scope + ': "' + previous +
+ '" is deprecated. Please use "' + current + '" instead');
+ }
+ }
+};
+
+var helpers_core = helpers;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.callback instead.
+ * @function Chart.helpers.callCallback
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers.callCallback = helpers.callback;
+
+/**
+ * Provided for backward compatibility, use Array.prototype.indexOf instead.
+ * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+
+ * @function Chart.helpers.indexOf
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers.indexOf = function(array, item, fromIndex) {
+ return Array.prototype.indexOf.call(array, item, fromIndex);
+};
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.
+ * @function Chart.helpers.getValueOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers.getValueOrDefault = helpers.valueOrDefault;
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.
+ * @function Chart.helpers.getValueAtIndexOrDefault
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
+
+/**
+ * Easing functions adapted from Robert Penner's easing equations.
+ * @namespace Chart.helpers.easingEffects
+ * @see http://www.robertpenner.com/easing/
+ */
+var effects = {
+ linear: function(t) {
+ return t;
+ },
+
+ easeInQuad: function(t) {
+ return t * t;
+ },
+
+ easeOutQuad: function(t) {
+ return -t * (t - 2);
+ },
+
+ easeInOutQuad: function(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t;
+ }
+ return -0.5 * ((--t) * (t - 2) - 1);
+ },
+
+ easeInCubic: function(t) {
+ return t * t * t;
+ },
+
+ easeOutCubic: function(t) {
+ return (t = t - 1) * t * t + 1;
+ },
+
+ easeInOutCubic: function(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t + 2);
+ },
+
+ easeInQuart: function(t) {
+ return t * t * t * t;
+ },
+
+ easeOutQuart: function(t) {
+ return -((t = t - 1) * t * t * t - 1);
+ },
+
+ easeInOutQuart: function(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t;
+ }
+ return -0.5 * ((t -= 2) * t * t * t - 2);
+ },
+
+ easeInQuint: function(t) {
+ return t * t * t * t * t;
+ },
+
+ easeOutQuint: function(t) {
+ return (t = t - 1) * t * t * t * t + 1;
+ },
+
+ easeInOutQuint: function(t) {
+ if ((t /= 0.5) < 1) {
+ return 0.5 * t * t * t * t * t;
+ }
+ return 0.5 * ((t -= 2) * t * t * t * t + 2);
+ },
+
+ easeInSine: function(t) {
+ return -Math.cos(t * (Math.PI / 2)) + 1;
+ },
+
+ easeOutSine: function(t) {
+ return Math.sin(t * (Math.PI / 2));
+ },
+
+ easeInOutSine: function(t) {
+ return -0.5 * (Math.cos(Math.PI * t) - 1);
+ },
+
+ easeInExpo: function(t) {
+ return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));
+ },
+
+ easeOutExpo: function(t) {
+ return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;
+ },
+
+ easeInOutExpo: function(t) {
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if ((t /= 0.5) < 1) {
+ return 0.5 * Math.pow(2, 10 * (t - 1));
+ }
+ return 0.5 * (-Math.pow(2, -10 * --t) + 2);
+ },
+
+ easeInCirc: function(t) {
+ if (t >= 1) {
+ return t;
+ }
+ return -(Math.sqrt(1 - t * t) - 1);
+ },
+
+ easeOutCirc: function(t) {
+ return Math.sqrt(1 - (t = t - 1) * t);
+ },
+
+ easeInOutCirc: function(t) {
+ if ((t /= 0.5) < 1) {
+ return -0.5 * (Math.sqrt(1 - t * t) - 1);
+ }
+ return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
+ },
+
+ easeInElastic: function(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ },
+
+ easeOutElastic: function(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if (t === 1) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.3;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;
+ },
+
+ easeInOutElastic: function(t) {
+ var s = 1.70158;
+ var p = 0;
+ var a = 1;
+ if (t === 0) {
+ return 0;
+ }
+ if ((t /= 0.5) === 2) {
+ return 1;
+ }
+ if (!p) {
+ p = 0.45;
+ }
+ if (a < 1) {
+ a = 1;
+ s = p / 4;
+ } else {
+ s = p / (2 * Math.PI) * Math.asin(1 / a);
+ }
+ if (t < 1) {
+ return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
+ }
+ return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;
+ },
+ easeInBack: function(t) {
+ var s = 1.70158;
+ return t * t * ((s + 1) * t - s);
+ },
+
+ easeOutBack: function(t) {
+ var s = 1.70158;
+ return (t = t - 1) * t * ((s + 1) * t + s) + 1;
+ },
+
+ easeInOutBack: function(t) {
+ var s = 1.70158;
+ if ((t /= 0.5) < 1) {
+ return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));
+ }
+ return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
+ },
+
+ easeInBounce: function(t) {
+ return 1 - effects.easeOutBounce(1 - t);
+ },
+
+ easeOutBounce: function(t) {
+ if (t < (1 / 2.75)) {
+ return 7.5625 * t * t;
+ }
+ if (t < (2 / 2.75)) {
+ return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;
+ }
+ if (t < (2.5 / 2.75)) {
+ return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;
+ }
+ return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;
+ },
+
+ easeInOutBounce: function(t) {
+ if (t < 0.5) {
+ return effects.easeInBounce(t * 2) * 0.5;
+ }
+ return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;
+ }
+};
+
+var helpers_easing = {
+ effects: effects
+};
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.easing.effects instead.
+ * @function Chart.helpers.easingEffects
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.easingEffects = effects;
+
+var PI = Math.PI;
+var RAD_PER_DEG = PI / 180;
+var DOUBLE_PI = PI * 2;
+var HALF_PI = PI / 2;
+var QUARTER_PI = PI / 4;
+var TWO_THIRDS_PI = PI * 2 / 3;
+
+/**
+ * @namespace Chart.helpers.canvas
+ */
+var exports$1 = {
+ /**
+ * Clears the entire canvas associated to the given `chart`.
+ * @param {Chart} chart - The chart for which to clear the canvas.
+ */
+ clear: function(chart) {
+ chart.ctx.clearRect(0, 0, chart.width, chart.height);
+ },
+
+ /**
+ * Creates a "path" for a rectangle with rounded corners at position (x, y) with a
+ * given size (width, height) and the same `radius` for all corners.
+ * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.
+ * @param {number} x - The x axis of the coordinate for the rectangle starting point.
+ * @param {number} y - The y axis of the coordinate for the rectangle starting point.
+ * @param {number} width - The rectangle's width.
+ * @param {number} height - The rectangle's height.
+ * @param {number} radius - The rounded amount (in pixels) for the four corners.
+ * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?
+ */
+ roundedRect: function(ctx, x, y, width, height, radius) {
+ if (radius) {
+ var r = Math.min(radius, height / 2, width / 2);
+ var left = x + r;
+ var top = y + r;
+ var right = x + width - r;
+ var bottom = y + height - r;
+
+ ctx.moveTo(x, top);
+ if (left < right && top < bottom) {
+ ctx.arc(left, top, r, -PI, -HALF_PI);
+ ctx.arc(right, top, r, -HALF_PI, 0);
+ ctx.arc(right, bottom, r, 0, HALF_PI);
+ ctx.arc(left, bottom, r, HALF_PI, PI);
+ } else if (left < right) {
+ ctx.moveTo(left, y);
+ ctx.arc(right, top, r, -HALF_PI, HALF_PI);
+ ctx.arc(left, top, r, HALF_PI, PI + HALF_PI);
+ } else if (top < bottom) {
+ ctx.arc(left, top, r, -PI, 0);
+ ctx.arc(left, bottom, r, 0, PI);
+ } else {
+ ctx.arc(left, top, r, -PI, PI);
+ }
+ ctx.closePath();
+ ctx.moveTo(x, y);
+ } else {
+ ctx.rect(x, y, width, height);
+ }
+ },
+
+ drawPoint: function(ctx, style, radius, x, y, rotation) {
+ var type, xOffset, yOffset, size, cornerRadius;
+ var rad = (rotation || 0) * RAD_PER_DEG;
+
+ if (style && typeof style === 'object') {
+ type = style.toString();
+ if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
+ ctx.save();
+ ctx.translate(x, y);
+ ctx.rotate(rad);
+ ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);
+ ctx.restore();
+ return;
+ }
+ }
+
+ if (isNaN(radius) || radius <= 0) {
+ return;
+ }
+
+ ctx.beginPath();
+
+ switch (style) {
+ // Default includes circle
+ default:
+ ctx.arc(x, y, radius, 0, DOUBLE_PI);
+ ctx.closePath();
+ break;
+ case 'triangle':
+ ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ rad += TWO_THIRDS_PI;
+ ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);
+ ctx.closePath();
+ break;
+ case 'rectRounded':
+ // NOTE: the rounded rect implementation changed to use `arc` instead of
+ // `quadraticCurveTo` since it generates better results when rect is
+ // almost a circle. 0.516 (instead of 0.5) produces results with visually
+ // closer proportion to the previous impl and it is inscribed in the
+ // circle with `radius`. For more details, see the following PRs:
+ // https://github.com/chartjs/Chart.js/issues/5597
+ // https://github.com/chartjs/Chart.js/issues/5858
+ cornerRadius = radius * 0.516;
+ size = radius - cornerRadius;
+ xOffset = Math.cos(rad + QUARTER_PI) * size;
+ yOffset = Math.sin(rad + QUARTER_PI) * size;
+ ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);
+ ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);
+ ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);
+ ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);
+ ctx.closePath();
+ break;
+ case 'rect':
+ if (!rotation) {
+ size = Math.SQRT1_2 * radius;
+ ctx.rect(x - size, y - size, 2 * size, 2 * size);
+ break;
+ }
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'rectRot':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ ctx.closePath();
+ break;
+ case 'crossRot':
+ rad += QUARTER_PI;
+ /* falls through */
+ case 'cross':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'star':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ rad += QUARTER_PI;
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ ctx.moveTo(x + yOffset, y - xOffset);
+ ctx.lineTo(x - yOffset, y + xOffset);
+ break;
+ case 'line':
+ xOffset = Math.cos(rad) * radius;
+ yOffset = Math.sin(rad) * radius;
+ ctx.moveTo(x - xOffset, y - yOffset);
+ ctx.lineTo(x + xOffset, y + yOffset);
+ break;
+ case 'dash':
+ ctx.moveTo(x, y);
+ ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);
+ break;
+ }
+
+ ctx.fill();
+ ctx.stroke();
+ },
+
+ /**
+ * Returns true if the point is inside the rectangle
+ * @param {object} point - The point to test
+ * @param {object} area - The rectangle
+ * @returns {boolean}
+ * @private
+ */
+ _isPointInArea: function(point, area) {
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+
+ return point.x > area.left - epsilon && point.x < area.right + epsilon &&
+ point.y > area.top - epsilon && point.y < area.bottom + epsilon;
+ },
+
+ clipArea: function(ctx, area) {
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);
+ ctx.clip();
+ },
+
+ unclipArea: function(ctx) {
+ ctx.restore();
+ },
+
+ lineTo: function(ctx, previous, target, flip) {
+ var stepped = target.steppedLine;
+ if (stepped) {
+ if (stepped === 'middle') {
+ var midpoint = (previous.x + target.x) / 2.0;
+ ctx.lineTo(midpoint, flip ? target.y : previous.y);
+ ctx.lineTo(midpoint, flip ? previous.y : target.y);
+ } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {
+ ctx.lineTo(previous.x, target.y);
+ } else {
+ ctx.lineTo(target.x, previous.y);
+ }
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+
+ if (!target.tension) {
+ ctx.lineTo(target.x, target.y);
+ return;
+ }
+
+ ctx.bezierCurveTo(
+ flip ? previous.controlPointPreviousX : previous.controlPointNextX,
+ flip ? previous.controlPointPreviousY : previous.controlPointNextY,
+ flip ? target.controlPointNextX : target.controlPointPreviousX,
+ flip ? target.controlPointNextY : target.controlPointPreviousY,
+ target.x,
+ target.y);
+ }
+};
+
+var helpers_canvas = exports$1;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.
+ * @namespace Chart.helpers.clear
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.clear = exports$1.clear;
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.
+ * @namespace Chart.helpers.drawRoundedRectangle
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.drawRoundedRectangle = function(ctx) {
+ ctx.beginPath();
+ exports$1.roundedRect.apply(exports$1, arguments);
+};
+
+var defaults = {
+ /**
+ * @private
+ */
+ _set: function(scope, values) {
+ return helpers_core.merge(this[scope] || (this[scope] = {}), values);
+ }
+};
+
+// TODO(v3): remove 'global' from namespace. all default are global and
+// there's inconsistency around which options are under 'global'
+defaults._set('global', {
+ defaultColor: 'rgba(0,0,0,0.1)',
+ defaultFontColor: '#666',
+ defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
+ defaultFontSize: 12,
+ defaultFontStyle: 'normal',
+ defaultLineHeight: 1.2,
+ showLines: true
+});
+
+var core_defaults = defaults;
+
+var valueOrDefault = helpers_core.valueOrDefault;
+
+/**
+ * Converts the given font object into a CSS font string.
+ * @param {object} font - A font object.
+ * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font
+ * @private
+ */
+function toFontString(font) {
+ if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {
+ return null;
+ }
+
+ return (font.style ? font.style + ' ' : '')
+ + (font.weight ? font.weight + ' ' : '')
+ + font.size + 'px '
+ + font.family;
+}
+
+/**
+ * @alias Chart.helpers.options
+ * @namespace
+ */
+var helpers_options = {
+ /**
+ * Converts the given line height `value` in pixels for a specific font `size`.
+ * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').
+ * @param {number} size - The font size (in pixels) used to resolve relative `value`.
+ * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height
+ * @since 2.7.0
+ */
+ toLineHeight: function(value, size) {
+ var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);
+ if (!matches || matches[1] === 'normal') {
+ return size * 1.2;
+ }
+
+ value = +matches[2];
+
+ switch (matches[3]) {
+ case 'px':
+ return value;
+ case '%':
+ value /= 100;
+ break;
+ }
+
+ return size * value;
+ },
+
+ /**
+ * Converts the given value into a padding object with pre-computed width/height.
+ * @param {number|object} value - If a number, set the value to all TRBL component,
+ * else, if and object, use defined properties and sets undefined ones to 0.
+ * @returns {object} The padding values (top, right, bottom, left, width, height)
+ * @since 2.7.0
+ */
+ toPadding: function(value) {
+ var t, r, b, l;
+
+ if (helpers_core.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l,
+ height: t + b,
+ width: l + r
+ };
+ },
+
+ /**
+ * Parses font options and returns the font object.
+ * @param {object} options - A object that contains font options to be parsed.
+ * @return {object} The font object.
+ * @todo Support font.* options and renamed to toFont().
+ * @private
+ */
+ _parseFont: function(options) {
+ var globalDefaults = core_defaults.global;
+ var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);
+ var font = {
+ family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),
+ lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),
+ size: size,
+ style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),
+ weight: null,
+ string: ''
+ };
+
+ font.string = toFontString(font);
+ return font;
+ },
+
+ /**
+ * Evaluates the given `inputs` sequentially and returns the first defined value.
+ * @param {Array} inputs - An array of values, falling back to the last value.
+ * @param {object} [context] - If defined and the current value is a function, the value
+ * is called with `context` as first argument and the result becomes the new input.
+ * @param {number} [index] - If defined and the current value is an array, the value
+ * at `index` become the new input.
+ * @param {object} [info] - object to return information about resolution in
+ * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.
+ * @since 2.7.0
+ */
+ resolve: function(inputs, context, index, info) {
+ var cacheable = true;
+ var i, ilen, value;
+
+ for (i = 0, ilen = inputs.length; i < ilen; ++i) {
+ value = inputs[i];
+ if (value === undefined) {
+ continue;
+ }
+ if (context !== undefined && typeof value === 'function') {
+ value = value(context);
+ cacheable = false;
+ }
+ if (index !== undefined && helpers_core.isArray(value)) {
+ value = value[index];
+ cacheable = false;
+ }
+ if (value !== undefined) {
+ if (info && !cacheable) {
+ info.cacheable = false;
+ }
+ return value;
+ }
+ }
+ }
+};
+
+/**
+ * @alias Chart.helpers.math
+ * @namespace
+ */
+var exports$2 = {
+ /**
+ * Returns an array of factors sorted from 1 to sqrt(value)
+ * @private
+ */
+ _factorize: function(value) {
+ var result = [];
+ var sqrt = Math.sqrt(value);
+ var i;
+
+ for (i = 1; i < sqrt; i++) {
+ if (value % i === 0) {
+ result.push(i);
+ result.push(value / i);
+ }
+ }
+ if (sqrt === (sqrt | 0)) { // if value is a square number
+ result.push(sqrt);
+ }
+
+ result.sort(function(a, b) {
+ return a - b;
+ }).pop();
+ return result;
+ },
+
+ log10: Math.log10 || function(x) {
+ var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.
+ // Check for whole powers of 10,
+ // which due to floating point rounding error should be corrected.
+ var powerOf10 = Math.round(exponent);
+ var isPowerOf10 = x === Math.pow(10, powerOf10);
+
+ return isPowerOf10 ? powerOf10 : exponent;
+ }
+};
+
+var helpers_math = exports$2;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.math.log10 instead.
+ * @namespace Chart.helpers.log10
+ * @deprecated since version 2.9.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers_core.log10 = exports$2.log10;
+
+var getRtlAdapter = function(rectX, width) {
+ return {
+ x: function(x) {
+ return rectX + rectX + width - x;
+ },
+ setWidth: function(w) {
+ width = w;
+ },
+ textAlign: function(align) {
+ if (align === 'center') {
+ return align;
+ }
+ return align === 'right' ? 'left' : 'right';
+ },
+ xPlus: function(x, value) {
+ return x - value;
+ },
+ leftForLtr: function(x, itemWidth) {
+ return x - itemWidth;
+ },
+ };
+};
+
+var getLtrAdapter = function() {
+ return {
+ x: function(x) {
+ return x;
+ },
+ setWidth: function(w) { // eslint-disable-line no-unused-vars
+ },
+ textAlign: function(align) {
+ return align;
+ },
+ xPlus: function(x, value) {
+ return x + value;
+ },
+ leftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars
+ return x;
+ },
+ };
+};
+
+var getAdapter = function(rtl, rectX, width) {
+ return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();
+};
+
+var overrideTextDirection = function(ctx, direction) {
+ var style, original;
+ if (direction === 'ltr' || direction === 'rtl') {
+ style = ctx.canvas.style;
+ original = [
+ style.getPropertyValue('direction'),
+ style.getPropertyPriority('direction'),
+ ];
+
+ style.setProperty('direction', direction, 'important');
+ ctx.prevTextDirection = original;
+ }
+};
+
+var restoreTextDirection = function(ctx) {
+ var original = ctx.prevTextDirection;
+ if (original !== undefined) {
+ delete ctx.prevTextDirection;
+ ctx.canvas.style.setProperty('direction', original[0], original[1]);
+ }
+};
+
+var helpers_rtl = {
+ getRtlAdapter: getAdapter,
+ overrideTextDirection: overrideTextDirection,
+ restoreTextDirection: restoreTextDirection,
+};
+
+var helpers$1 = helpers_core;
+var easing = helpers_easing;
+var canvas = helpers_canvas;
+var options = helpers_options;
+var math = helpers_math;
+var rtl = helpers_rtl;
+helpers$1.easing = easing;
+helpers$1.canvas = canvas;
+helpers$1.options = options;
+helpers$1.math = math;
+helpers$1.rtl = rtl;
+
+function interpolate(start, view, model, ease) {
+ var keys = Object.keys(model);
+ var i, ilen, key, actual, origin, target, type, c0, c1;
+
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+
+ target = model[key];
+
+ // if a value is added to the model after pivot() has been called, the view
+ // doesn't contain it, so let's initialize the view to the target value.
+ if (!view.hasOwnProperty(key)) {
+ view[key] = target;
+ }
+
+ actual = view[key];
+
+ if (actual === target || key[0] === '_') {
+ continue;
+ }
+
+ if (!start.hasOwnProperty(key)) {
+ start[key] = actual;
+ }
+
+ origin = start[key];
+
+ type = typeof target;
+
+ if (type === typeof origin) {
+ if (type === 'string') {
+ c0 = chartjsColor(origin);
+ if (c0.valid) {
+ c1 = chartjsColor(target);
+ if (c1.valid) {
+ view[key] = c1.mix(c0, ease).rgbString();
+ continue;
+ }
+ }
+ } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {
+ view[key] = origin + (target - origin) * ease;
+ continue;
+ }
+ }
+
+ view[key] = target;
+ }
+}
+
+var Element = function(configuration) {
+ helpers$1.extend(this, configuration);
+ this.initialize.apply(this, arguments);
+};
+
+helpers$1.extend(Element.prototype, {
+ _type: undefined,
+
+ initialize: function() {
+ this.hidden = false;
+ },
+
+ pivot: function() {
+ var me = this;
+ if (!me._view) {
+ me._view = helpers$1.extend({}, me._model);
+ }
+ me._start = {};
+ return me;
+ },
+
+ transition: function(ease) {
+ var me = this;
+ var model = me._model;
+ var start = me._start;
+ var view = me._view;
+
+ // No animation -> No Transition
+ if (!model || ease === 1) {
+ me._view = helpers$1.extend({}, model);
+ me._start = null;
+ return me;
+ }
+
+ if (!view) {
+ view = me._view = {};
+ }
+
+ if (!start) {
+ start = me._start = {};
+ }
+
+ interpolate(start, view, model, ease);
+
+ return me;
+ },
+
+ tooltipPosition: function() {
+ return {
+ x: this._model.x,
+ y: this._model.y
+ };
+ },
+
+ hasValue: function() {
+ return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);
+ }
+});
+
+Element.extend = helpers$1.inherits;
+
+var core_element = Element;
+
+var exports$3 = core_element.extend({
+ chart: null, // the animation associated chart instance
+ currentStep: 0, // the current animation step
+ numSteps: 60, // default number of steps
+ easing: '', // the easing to use for this animation
+ render: null, // render function used by the animation service
+
+ onAnimationProgress: null, // user specified callback to fire on each step of the animation
+ onAnimationComplete: null, // user specified callback to fire when the animation finishes
+});
+
+var core_animation = exports$3;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart.Animation instead
+ * @prop Chart.Animation#animationObject
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+Object.defineProperty(exports$3.prototype, 'animationObject', {
+ get: function() {
+ return this;
+ }
+});
+
+/**
+ * Provided for backward compatibility, use Chart.Animation#chart instead
+ * @prop Chart.Animation#chartInstance
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ */
+Object.defineProperty(exports$3.prototype, 'chartInstance', {
+ get: function() {
+ return this.chart;
+ },
+ set: function(value) {
+ this.chart = value;
+ }
+});
+
+core_defaults._set('global', {
+ animation: {
+ duration: 1000,
+ easing: 'easeOutQuart',
+ onProgress: helpers$1.noop,
+ onComplete: helpers$1.noop
+ }
+});
+
+var core_animations = {
+ animations: [],
+ request: null,
+
+ /**
+ * @param {Chart} chart - The chart to animate.
+ * @param {Chart.Animation} animation - The animation that we will animate.
+ * @param {number} duration - The animation duration in ms.
+ * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions
+ */
+ addAnimation: function(chart, animation, duration, lazy) {
+ var animations = this.animations;
+ var i, ilen;
+
+ animation.chart = chart;
+ animation.startTime = Date.now();
+ animation.duration = duration;
+
+ if (!lazy) {
+ chart.animating = true;
+ }
+
+ for (i = 0, ilen = animations.length; i < ilen; ++i) {
+ if (animations[i].chart === chart) {
+ animations[i] = animation;
+ return;
+ }
+ }
+
+ animations.push(animation);
+
+ // If there are no animations queued, manually kickstart a digest, for lack of a better word
+ if (animations.length === 1) {
+ this.requestAnimationFrame();
+ }
+ },
+
+ cancelAnimation: function(chart) {
+ var index = helpers$1.findIndex(this.animations, function(animation) {
+ return animation.chart === chart;
+ });
+
+ if (index !== -1) {
+ this.animations.splice(index, 1);
+ chart.animating = false;
+ }
+ },
+
+ requestAnimationFrame: function() {
+ var me = this;
+ if (me.request === null) {
+ // Skip animation frame requests until the active one is executed.
+ // This can happen when processing mouse events, e.g. 'mousemove'
+ // and 'mouseout' events will trigger multiple renders.
+ me.request = helpers$1.requestAnimFrame.call(window, function() {
+ me.request = null;
+ me.startDigest();
+ });
+ }
+ },
+
+ /**
+ * @private
+ */
+ startDigest: function() {
+ var me = this;
+
+ me.advance();
+
+ // Do we have more stuff to animate?
+ if (me.animations.length > 0) {
+ me.requestAnimationFrame();
+ }
+ },
+
+ /**
+ * @private
+ */
+ advance: function() {
+ var animations = this.animations;
+ var animation, chart, numSteps, nextStep;
+ var i = 0;
+
+ // 1 animation per chart, so we are looping charts here
+ while (i < animations.length) {
+ animation = animations[i];
+ chart = animation.chart;
+ numSteps = animation.numSteps;
+
+ // Make sure that currentStep starts at 1
+ // https://github.com/chartjs/Chart.js/issues/6104
+ nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;
+ animation.currentStep = Math.min(nextStep, numSteps);
+
+ helpers$1.callback(animation.render, [chart, animation], chart);
+ helpers$1.callback(animation.onAnimationProgress, [animation], chart);
+
+ if (animation.currentStep >= numSteps) {
+ helpers$1.callback(animation.onAnimationComplete, [animation], chart);
+ chart.animating = false;
+ animations.splice(i, 1);
+ } else {
+ ++i;
+ }
+ }
+ }
+};
+
+var resolve = helpers$1.options.resolve;
+
+var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];
+
+/**
+ * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',
+ * 'unshift') and notify the listener AFTER the array has been altered. Listeners are
+ * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.
+ */
+function listenArrayEvents(array, listener) {
+ if (array._chartjs) {
+ array._chartjs.listeners.push(listener);
+ return;
+ }
+
+ Object.defineProperty(array, '_chartjs', {
+ configurable: true,
+ enumerable: false,
+ value: {
+ listeners: [listener]
+ }
+ });
+
+ arrayEvents.forEach(function(key) {
+ var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);
+ var base = array[key];
+
+ Object.defineProperty(array, key, {
+ configurable: true,
+ enumerable: false,
+ value: function() {
+ var args = Array.prototype.slice.call(arguments);
+ var res = base.apply(this, args);
+
+ helpers$1.each(array._chartjs.listeners, function(object) {
+ if (typeof object[method] === 'function') {
+ object[method].apply(object, args);
+ }
+ });
+
+ return res;
+ }
+ });
+ });
+}
+
+/**
+ * Removes the given array event listener and cleanup extra attached properties (such as
+ * the _chartjs stub and overridden methods) if array doesn't have any more listeners.
+ */
+function unlistenArrayEvents(array, listener) {
+ var stub = array._chartjs;
+ if (!stub) {
+ return;
+ }
+
+ var listeners = stub.listeners;
+ var index = listeners.indexOf(listener);
+ if (index !== -1) {
+ listeners.splice(index, 1);
+ }
+
+ if (listeners.length > 0) {
+ return;
+ }
+
+ arrayEvents.forEach(function(key) {
+ delete array[key];
+ });
+
+ delete array._chartjs;
+}
+
+// Base class for all dataset controllers (line, bar, etc)
+var DatasetController = function(chart, datasetIndex) {
+ this.initialize(chart, datasetIndex);
+};
+
+helpers$1.extend(DatasetController.prototype, {
+
+ /**
+ * Element type used to generate a meta dataset (e.g. Chart.element.Line).
+ * @type {Chart.core.element}
+ */
+ datasetElementType: null,
+
+ /**
+ * Element type used to generate a meta data (e.g. Chart.element.Point).
+ * @type {Chart.core.element}
+ */
+ dataElementType: null,
+
+ /**
+ * Dataset element option keys to be resolved in _resolveDatasetElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth'
+ ],
+
+ /**
+ * Data element option keys to be resolved in _resolveDataElementOptions.
+ * A derived controller may override this to resolve controller-specific options.
+ * The keys defined here are for backward compatibility for legend styles.
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'pointStyle'
+ ],
+
+ initialize: function(chart, datasetIndex) {
+ var me = this;
+ me.chart = chart;
+ me.index = datasetIndex;
+ me.linkScales();
+ me.addElements();
+ me._type = me.getMeta().type;
+ },
+
+ updateIndex: function(datasetIndex) {
+ this.index = datasetIndex;
+ },
+
+ linkScales: function() {
+ var me = this;
+ var meta = me.getMeta();
+ var chart = me.chart;
+ var scales = chart.scales;
+ var dataset = me.getDataset();
+ var scalesOpts = chart.options.scales;
+
+ if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {
+ meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;
+ }
+ if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {
+ meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;
+ }
+ },
+
+ getDataset: function() {
+ return this.chart.data.datasets[this.index];
+ },
+
+ getMeta: function() {
+ return this.chart.getDatasetMeta(this.index);
+ },
+
+ getScaleForId: function(scaleID) {
+ return this.chart.scales[scaleID];
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.getMeta().yAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.getMeta().xAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScale: function() {
+ return this.getScaleForId(this._getValueScaleId());
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScale: function() {
+ return this.getScaleForId(this._getIndexScaleId());
+ },
+
+ reset: function() {
+ this._update(true);
+ },
+
+ /**
+ * @private
+ */
+ destroy: function() {
+ if (this._data) {
+ unlistenArrayEvents(this._data, this);
+ }
+ },
+
+ createMetaDataset: function() {
+ var me = this;
+ var type = me.datasetElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index
+ });
+ },
+
+ createMetaData: function(index) {
+ var me = this;
+ var type = me.dataElementType;
+ return type && new type({
+ _chart: me.chart,
+ _datasetIndex: me.index,
+ _index: index
+ });
+ },
+
+ addElements: function() {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data || [];
+ var metaData = meta.data;
+ var i, ilen;
+
+ for (i = 0, ilen = data.length; i < ilen; ++i) {
+ metaData[i] = metaData[i] || me.createMetaData(i);
+ }
+
+ meta.dataset = meta.dataset || me.createMetaDataset();
+ },
+
+ addElementAndReset: function(index) {
+ var element = this.createMetaData(index);
+ this.getMeta().data.splice(index, 0, element);
+ this.updateElement(element, index, true);
+ },
+
+ buildOrUpdateElements: function() {
+ var me = this;
+ var dataset = me.getDataset();
+ var data = dataset.data || (dataset.data = []);
+
+ // In order to correctly handle data addition/deletion animation (an thus simulate
+ // real-time charts), we need to monitor these data modifications and synchronize
+ // the internal meta data accordingly.
+ if (me._data !== data) {
+ if (me._data) {
+ // This case happens when the user replaced the data array instance.
+ unlistenArrayEvents(me._data, me);
+ }
+
+ if (data && Object.isExtensible(data)) {
+ listenArrayEvents(data, me);
+ }
+ me._data = data;
+ }
+
+ // Re-sync meta data in case the user replaced the data array or if we missed
+ // any updates and so make sure that we handle number of datapoints changing.
+ me.resyncElements();
+ },
+
+ /**
+ * Returns the merged user-supplied and default dataset-level options
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ me._config = helpers$1.merge({}, [
+ me.chart.options.datasets[me._type],
+ me.getDataset(),
+ ], {
+ merger: function(key, target, source) {
+ if (key !== '_meta' && key !== 'data') {
+ helpers$1._merger(key, target, source);
+ }
+ }
+ });
+ },
+
+ _update: function(reset) {
+ var me = this;
+ me._configure();
+ me._cachedDataOpts = null;
+ me.update(reset);
+ },
+
+ update: helpers$1.noop,
+
+ transition: function(easingValue) {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+
+ for (; i < ilen; ++i) {
+ elements[i].transition(easingValue);
+ }
+
+ if (meta.dataset) {
+ meta.dataset.transition(easingValue);
+ }
+ },
+
+ draw: function() {
+ var meta = this.getMeta();
+ var elements = meta.data || [];
+ var ilen = elements.length;
+ var i = 0;
+
+ if (meta.dataset) {
+ meta.dataset.draw();
+ }
+
+ for (; i < ilen; ++i) {
+ elements[i].draw();
+ }
+ },
+
+ /**
+ * Returns a set of predefined style properties that should be used to represent the dataset
+ * or the data if the index is specified
+ * @param {number} index - data index
+ * @return {IStyleInterface} style object
+ */
+ getStyle: function(index) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = meta.dataset;
+ var style;
+
+ me._configure();
+ if (dataset && index === undefined) {
+ style = me._resolveDatasetElementOptions(dataset || {});
+ } else {
+ index = index || 0;
+ style = me._resolveDataElementOptions(meta.data[index] || {}, index);
+ }
+
+ if (style.fill === false || style.fill === null) {
+ style.backgroundColor = style.borderColor;
+ }
+
+ return style;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDatasetElementOptions: function(element, hover) {
+ var me = this;
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var custom = element.custom || {};
+ var options = chart.options.elements[me.datasetElementType.prototype._type] || {};
+ var elementOptions = me._datasetElementOptions;
+ var values = {};
+ var i, ilen, key, readKey;
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataset: me.getDataset(),
+ datasetIndex: me.index,
+ hover: hover
+ };
+
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;
+ values[key] = resolve([
+ custom[readKey],
+ datasetOpts[readKey],
+ options[readKey]
+ ], context);
+ }
+
+ return values;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDataElementOptions: function(element, index) {
+ var me = this;
+ var custom = element && element.custom;
+ var cached = me._cachedDataOpts;
+ if (cached && !custom) {
+ return cached;
+ }
+ var chart = me.chart;
+ var datasetOpts = me._config;
+ var options = chart.options.elements[me.dataElementType.prototype._type] || {};
+ var elementOptions = me._dataElementOptions;
+ var values = {};
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: me.getDataset(),
+ datasetIndex: me.index
+ };
+
+ // `resolve` sets cacheable to `false` if any option is indexed or scripted
+ var info = {cacheable: !custom};
+
+ var keys, i, ilen, key;
+
+ custom = custom || {};
+
+ if (helpers$1.isArray(elementOptions)) {
+ for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
+ key = elementOptions[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ } else {
+ keys = Object.keys(elementOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ values[key] = resolve([
+ custom[key],
+ datasetOpts[elementOptions[key]],
+ datasetOpts[key],
+ options[key]
+ ], context, index, info);
+ }
+ }
+
+ if (info.cacheable) {
+ me._cachedDataOpts = Object.freeze(values);
+ }
+
+ return values;
+ },
+
+ removeHoverStyle: function(element) {
+ helpers$1.merge(element._model, element.$previousStyle || {});
+ delete element.$previousStyle;
+ },
+
+ setHoverStyle: function(element) {
+ var dataset = this.chart.data.datasets[element._datasetIndex];
+ var index = element._index;
+ var custom = element.custom || {};
+ var model = element._model;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ element.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth
+ };
+
+ model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);
+ model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);
+ model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
+ },
+
+ /**
+ * @private
+ */
+ _removeDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+
+ if (element) {
+ this.removeHoverStyle(element);
+ }
+ },
+
+ /**
+ * @private
+ */
+ _setDatasetHoverStyle: function() {
+ var element = this.getMeta().dataset;
+ var prev = {};
+ var i, ilen, key, keys, hoverOptions, model;
+
+ if (!element) {
+ return;
+ }
+
+ model = element._model;
+ hoverOptions = this._resolveDatasetElementOptions(element, true);
+
+ keys = Object.keys(hoverOptions);
+ for (i = 0, ilen = keys.length; i < ilen; ++i) {
+ key = keys[i];
+ prev[key] = model[key];
+ model[key] = hoverOptions[key];
+ }
+
+ element.$previousStyle = prev;
+ },
+
+ /**
+ * @private
+ */
+ resyncElements: function() {
+ var me = this;
+ var meta = me.getMeta();
+ var data = me.getDataset().data;
+ var numMeta = meta.data.length;
+ var numData = data.length;
+
+ if (numData < numMeta) {
+ meta.data.splice(numData, numMeta - numData);
+ } else if (numData > numMeta) {
+ me.insertElements(numMeta, numData - numMeta);
+ }
+ },
+
+ /**
+ * @private
+ */
+ insertElements: function(start, count) {
+ for (var i = 0; i < count; ++i) {
+ this.addElementAndReset(start + i);
+ }
+ },
+
+ /**
+ * @private
+ */
+ onDataPush: function() {
+ var count = arguments.length;
+ this.insertElements(this.getDataset().data.length - count, count);
+ },
+
+ /**
+ * @private
+ */
+ onDataPop: function() {
+ this.getMeta().data.pop();
+ },
+
+ /**
+ * @private
+ */
+ onDataShift: function() {
+ this.getMeta().data.shift();
+ },
+
+ /**
+ * @private
+ */
+ onDataSplice: function(start, count) {
+ this.getMeta().data.splice(start, count);
+ this.insertElements(start, arguments.length - 2);
+ },
+
+ /**
+ * @private
+ */
+ onDataUnshift: function() {
+ this.insertElements(0, arguments.length);
+ }
+});
+
+DatasetController.extend = helpers$1.inherits;
+
+var core_datasetController = DatasetController;
+
+var TAU = Math.PI * 2;
+
+core_defaults._set('global', {
+ elements: {
+ arc: {
+ backgroundColor: core_defaults.global.defaultColor,
+ borderColor: '#fff',
+ borderWidth: 2,
+ borderAlign: 'center'
+ }
+ }
+});
+
+function clipArc(ctx, arc) {
+ var startAngle = arc.startAngle;
+ var endAngle = arc.endAngle;
+ var pixelMargin = arc.pixelMargin;
+ var angleMargin = pixelMargin / arc.outerRadius;
+ var x = arc.x;
+ var y = arc.y;
+
+ // Draw an inner border by cliping the arc and drawing a double-width border
+ // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders
+ ctx.beginPath();
+ ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);
+ if (arc.innerRadius > pixelMargin) {
+ angleMargin = pixelMargin / arc.innerRadius;
+ ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);
+ } else {
+ ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);
+ }
+ ctx.closePath();
+ ctx.clip();
+}
+
+function drawFullCircleBorders(ctx, vm, arc, inner) {
+ var endAngle = arc.endAngle;
+ var i;
+
+ if (inner) {
+ arc.endAngle = arc.startAngle + TAU;
+ clipArc(ctx, arc);
+ arc.endAngle = endAngle;
+ if (arc.endAngle === arc.startAngle && arc.fullCircles) {
+ arc.endAngle += TAU;
+ arc.fullCircles--;
+ }
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.stroke();
+ }
+}
+
+function drawBorder(ctx, vm, arc) {
+ var inner = vm.borderAlign === 'inner';
+
+ if (inner) {
+ ctx.lineWidth = vm.borderWidth * 2;
+ ctx.lineJoin = 'round';
+ } else {
+ ctx.lineWidth = vm.borderWidth;
+ ctx.lineJoin = 'bevel';
+ }
+
+ if (arc.fullCircles) {
+ drawFullCircleBorders(ctx, vm, arc, inner);
+ }
+
+ if (inner) {
+ clipArc(ctx, arc);
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ ctx.stroke();
+}
+
+var element_arc = core_element.extend({
+ _type: 'arc',
+
+ inLabelRange: function(mouseX) {
+ var vm = this._view;
+
+ if (vm) {
+ return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));
+ }
+ return false;
+ },
+
+ inRange: function(chartX, chartY) {
+ var vm = this._view;
+
+ if (vm) {
+ var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});
+ var angle = pointRelativePosition.angle;
+ var distance = pointRelativePosition.distance;
+
+ // Sanitise angle range
+ var startAngle = vm.startAngle;
+ var endAngle = vm.endAngle;
+ while (endAngle < startAngle) {
+ endAngle += TAU;
+ }
+ while (angle > endAngle) {
+ angle -= TAU;
+ }
+ while (angle < startAngle) {
+ angle += TAU;
+ }
+
+ // Check if within the range of the open/close angle
+ var betweenAngles = (angle >= startAngle && angle <= endAngle);
+ var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);
+
+ return (betweenAngles && withinRadius);
+ }
+ return false;
+ },
+
+ getCenterPoint: function() {
+ var vm = this._view;
+ var halfAngle = (vm.startAngle + vm.endAngle) / 2;
+ var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;
+ return {
+ x: vm.x + Math.cos(halfAngle) * halfRadius,
+ y: vm.y + Math.sin(halfAngle) * halfRadius
+ };
+ },
+
+ getArea: function() {
+ var vm = this._view;
+ return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));
+ },
+
+ tooltipPosition: function() {
+ var vm = this._view;
+ var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);
+ var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;
+
+ return {
+ x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),
+ y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)
+ };
+ },
+
+ draw: function() {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;
+ var arc = {
+ x: vm.x,
+ y: vm.y,
+ innerRadius: vm.innerRadius,
+ outerRadius: Math.max(vm.outerRadius - pixelMargin, 0),
+ pixelMargin: pixelMargin,
+ startAngle: vm.startAngle,
+ endAngle: vm.endAngle,
+ fullCircles: Math.floor(vm.circumference / TAU)
+ };
+ var i;
+
+ ctx.save();
+
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.strokeStyle = vm.borderColor;
+
+ if (arc.fullCircles) {
+ arc.endAngle = arc.startAngle + TAU;
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ for (i = 0; i < arc.fullCircles; ++i) {
+ ctx.fill();
+ }
+ arc.endAngle = arc.startAngle + vm.circumference % TAU;
+ }
+
+ ctx.beginPath();
+ ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);
+ ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);
+ ctx.closePath();
+ ctx.fill();
+
+ if (vm.borderWidth) {
+ drawBorder(ctx, vm, arc);
+ }
+
+ ctx.restore();
+ }
+});
+
+var valueOrDefault$1 = helpers$1.valueOrDefault;
+
+var defaultColor = core_defaults.global.defaultColor;
+
+core_defaults._set('global', {
+ elements: {
+ line: {
+ tension: 0.4,
+ backgroundColor: defaultColor,
+ borderWidth: 3,
+ borderColor: defaultColor,
+ borderCapStyle: 'butt',
+ borderDash: [],
+ borderDashOffset: 0.0,
+ borderJoinStyle: 'miter',
+ capBezierPoints: true,
+ fill: true, // do we fill in the area between the line and its base axis
+ }
+ }
+});
+
+var element_line = core_element.extend({
+ _type: 'line',
+
+ draw: function() {
+ var me = this;
+ var vm = me._view;
+ var ctx = me._chart.ctx;
+ var spanGaps = vm.spanGaps;
+ var points = me._children.slice(); // clone array
+ var globalDefaults = core_defaults.global;
+ var globalOptionLineElements = globalDefaults.elements.line;
+ var lastDrawnIndex = -1;
+ var closePath = me._loop;
+ var index, previous, currentVM;
+
+ if (!points.length) {
+ return;
+ }
+
+ if (me._loop) {
+ for (index = 0; index < points.length; ++index) {
+ previous = helpers$1.previousItem(points, index);
+ // If the line has an open path, shift the point array
+ if (!points[index]._view.skip && previous._view.skip) {
+ points = points.slice(index).concat(points.slice(0, index));
+ closePath = spanGaps;
+ break;
+ }
+ }
+ // If the line has a close path, add the first point again
+ if (closePath) {
+ points.push(points[0]);
+ }
+ }
+
+ ctx.save();
+
+ // Stroke Line Options
+ ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;
+
+ // IE 9 and 10 do not support line dash
+ if (ctx.setLineDash) {
+ ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);
+ }
+
+ ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);
+ ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;
+ ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);
+ ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;
+
+ // Stroke Line
+ ctx.beginPath();
+
+ // First point moves to it's starting position no matter what
+ currentVM = points[0]._view;
+ if (!currentVM.skip) {
+ ctx.moveTo(currentVM.x, currentVM.y);
+ lastDrawnIndex = 0;
+ }
+
+ for (index = 1; index < points.length; ++index) {
+ currentVM = points[index]._view;
+ previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];
+
+ if (!currentVM.skip) {
+ if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {
+ // There was a gap and this is the first point after the gap
+ ctx.moveTo(currentVM.x, currentVM.y);
+ } else {
+ // Line to next point
+ helpers$1.canvas.lineTo(ctx, previous._view, currentVM);
+ }
+ lastDrawnIndex = index;
+ }
+ }
+
+ if (closePath) {
+ ctx.closePath();
+ }
+
+ ctx.stroke();
+ ctx.restore();
+ }
+});
+
+var valueOrDefault$2 = helpers$1.valueOrDefault;
+
+var defaultColor$1 = core_defaults.global.defaultColor;
+
+core_defaults._set('global', {
+ elements: {
+ point: {
+ radius: 3,
+ pointStyle: 'circle',
+ backgroundColor: defaultColor$1,
+ borderColor: defaultColor$1,
+ borderWidth: 1,
+ // Hover
+ hitRadius: 1,
+ hoverRadius: 4,
+ hoverBorderWidth: 1
+ }
+ }
+});
+
+function xRange(mouseX) {
+ var vm = this._view;
+ return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;
+}
+
+function yRange(mouseY) {
+ var vm = this._view;
+ return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;
+}
+
+var element_point = core_element.extend({
+ _type: 'point',
+
+ inRange: function(mouseX, mouseY) {
+ var vm = this._view;
+ return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;
+ },
+
+ inLabelRange: xRange,
+ inXRange: xRange,
+ inYRange: yRange,
+
+ getCenterPoint: function() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ },
+
+ getArea: function() {
+ return Math.PI * Math.pow(this._view.radius, 2);
+ },
+
+ tooltipPosition: function() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y,
+ padding: vm.radius + vm.borderWidth
+ };
+ },
+
+ draw: function(chartArea) {
+ var vm = this._view;
+ var ctx = this._chart.ctx;
+ var pointStyle = vm.pointStyle;
+ var rotation = vm.rotation;
+ var radius = vm.radius;
+ var x = vm.x;
+ var y = vm.y;
+ var globalDefaults = core_defaults.global;
+ var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow
+
+ if (vm.skip) {
+ return;
+ }
+
+ // Clipping for Points.
+ if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {
+ ctx.strokeStyle = vm.borderColor || defaultColor;
+ ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);
+ ctx.fillStyle = vm.backgroundColor || defaultColor;
+ helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);
+ }
+ }
+});
+
+var defaultColor$2 = core_defaults.global.defaultColor;
+
+core_defaults._set('global', {
+ elements: {
+ rectangle: {
+ backgroundColor: defaultColor$2,
+ borderColor: defaultColor$2,
+ borderSkipped: 'bottom',
+ borderWidth: 0
+ }
+ }
+});
+
+function isVertical(vm) {
+ return vm && vm.width !== undefined;
+}
+
+/**
+ * Helper function to get the bounds of the bar regardless of the orientation
+ * @param bar {Chart.Element.Rectangle} the bar
+ * @return {Bounds} bounds of the bar
+ * @private
+ */
+function getBarBounds(vm) {
+ var x1, x2, y1, y2, half;
+
+ if (isVertical(vm)) {
+ half = vm.width / 2;
+ x1 = vm.x - half;
+ x2 = vm.x + half;
+ y1 = Math.min(vm.y, vm.base);
+ y2 = Math.max(vm.y, vm.base);
+ } else {
+ half = vm.height / 2;
+ x1 = Math.min(vm.x, vm.base);
+ x2 = Math.max(vm.x, vm.base);
+ y1 = vm.y - half;
+ y2 = vm.y + half;
+ }
+
+ return {
+ left: x1,
+ top: y1,
+ right: x2,
+ bottom: y2
+ };
+}
+
+function swap(orig, v1, v2) {
+ return orig === v1 ? v2 : orig === v2 ? v1 : orig;
+}
+
+function parseBorderSkipped(vm) {
+ var edge = vm.borderSkipped;
+ var res = {};
+
+ if (!edge) {
+ return res;
+ }
+
+ if (vm.horizontal) {
+ if (vm.base > vm.x) {
+ edge = swap(edge, 'left', 'right');
+ }
+ } else if (vm.base < vm.y) {
+ edge = swap(edge, 'bottom', 'top');
+ }
+
+ res[edge] = true;
+ return res;
+}
+
+function parseBorderWidth(vm, maxW, maxH) {
+ var value = vm.borderWidth;
+ var skip = parseBorderSkipped(vm);
+ var t, r, b, l;
+
+ if (helpers$1.isObject(value)) {
+ t = +value.top || 0;
+ r = +value.right || 0;
+ b = +value.bottom || 0;
+ l = +value.left || 0;
+ } else {
+ t = r = b = l = +value || 0;
+ }
+
+ return {
+ t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,
+ r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,
+ b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,
+ l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l
+ };
+}
+
+function boundingRects(vm) {
+ var bounds = getBarBounds(vm);
+ var width = bounds.right - bounds.left;
+ var height = bounds.bottom - bounds.top;
+ var border = parseBorderWidth(vm, width / 2, height / 2);
+
+ return {
+ outer: {
+ x: bounds.left,
+ y: bounds.top,
+ w: width,
+ h: height
+ },
+ inner: {
+ x: bounds.left + border.l,
+ y: bounds.top + border.t,
+ w: width - border.l - border.r,
+ h: height - border.t - border.b
+ }
+ };
+}
+
+function inRange(vm, x, y) {
+ var skipX = x === null;
+ var skipY = y === null;
+ var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);
+
+ return bounds
+ && (skipX || x >= bounds.left && x <= bounds.right)
+ && (skipY || y >= bounds.top && y <= bounds.bottom);
+}
+
+var element_rectangle = core_element.extend({
+ _type: 'rectangle',
+
+ draw: function() {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var rects = boundingRects(vm);
+ var outer = rects.outer;
+ var inner = rects.inner;
+
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.fillRect(outer.x, outer.y, outer.w, outer.h);
+
+ if (outer.w === inner.w && outer.h === inner.h) {
+ return;
+ }
+
+ ctx.save();
+ ctx.beginPath();
+ ctx.rect(outer.x, outer.y, outer.w, outer.h);
+ ctx.clip();
+ ctx.fillStyle = vm.borderColor;
+ ctx.rect(inner.x, inner.y, inner.w, inner.h);
+ ctx.fill('evenodd');
+ ctx.restore();
+ },
+
+ height: function() {
+ var vm = this._view;
+ return vm.base - vm.y;
+ },
+
+ inRange: function(mouseX, mouseY) {
+ return inRange(this._view, mouseX, mouseY);
+ },
+
+ inLabelRange: function(mouseX, mouseY) {
+ var vm = this._view;
+ return isVertical(vm)
+ ? inRange(vm, mouseX, null)
+ : inRange(vm, null, mouseY);
+ },
+
+ inXRange: function(mouseX) {
+ return inRange(this._view, mouseX, null);
+ },
+
+ inYRange: function(mouseY) {
+ return inRange(this._view, null, mouseY);
+ },
+
+ getCenterPoint: function() {
+ var vm = this._view;
+ var x, y;
+ if (isVertical(vm)) {
+ x = vm.x;
+ y = (vm.y + vm.base) / 2;
+ } else {
+ x = (vm.x + vm.base) / 2;
+ y = vm.y;
+ }
+
+ return {x: x, y: y};
+ },
+
+ getArea: function() {
+ var vm = this._view;
+
+ return isVertical(vm)
+ ? vm.width * Math.abs(vm.y - vm.base)
+ : vm.height * Math.abs(vm.x - vm.base);
+ },
+
+ tooltipPosition: function() {
+ var vm = this._view;
+ return {
+ x: vm.x,
+ y: vm.y
+ };
+ }
+});
+
+var elements = {};
+var Arc = element_arc;
+var Line = element_line;
+var Point = element_point;
+var Rectangle = element_rectangle;
+elements.Arc = Arc;
+elements.Line = Line;
+elements.Point = Point;
+elements.Rectangle = Rectangle;
+
+var deprecated = helpers$1._deprecated;
+var valueOrDefault$3 = helpers$1.valueOrDefault;
+
+core_defaults._set('bar', {
+ hover: {
+ mode: 'label'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'category',
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }],
+
+ yAxes: [{
+ type: 'linear'
+ }]
+ }
+});
+
+core_defaults._set('global', {
+ datasets: {
+ bar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
+/**
+ * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap.
+ * @private
+ */
+function computeMinSampleSize(scale, pixels) {
+ var min = scale._length;
+ var prev, curr, i, ilen;
+
+ for (i = 1, ilen = pixels.length; i < ilen; ++i) {
+ min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));
+ }
+
+ for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {
+ curr = scale.getPixelForTick(i);
+ min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;
+ prev = curr;
+ }
+
+ return min;
+}
+
+/**
+ * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null,
+ * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This
+ * mode currently always generates bars equally sized (until we introduce scriptable options?).
+ * @private
+ */
+function computeFitCategoryTraits(index, ruler, options) {
+ var thickness = options.barThickness;
+ var count = ruler.stackCount;
+ var curr = ruler.pixels[index];
+ var min = helpers$1.isNullOrUndef(thickness)
+ ? computeMinSampleSize(ruler.scale, ruler.pixels)
+ : -1;
+ var size, ratio;
+
+ if (helpers$1.isNullOrUndef(thickness)) {
+ size = min * options.categoryPercentage;
+ ratio = options.barPercentage;
+ } else {
+ // When bar thickness is enforced, category and bar percentages are ignored.
+ // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')
+ // and deprecate barPercentage since this value is ignored when thickness is absolute.
+ size = thickness * count;
+ ratio = 1;
+ }
+
+ return {
+ chunk: size / count,
+ ratio: ratio,
+ start: curr - (size / 2)
+ };
+}
+
+/**
+ * Computes an "optimal" category that globally arranges bars side by side (no gap when
+ * percentage options are 1), based on the previous and following categories. This mode
+ * generates bars with different widths when data are not evenly spaced.
+ * @private
+ */
+function computeFlexCategoryTraits(index, ruler, options) {
+ var pixels = ruler.pixels;
+ var curr = pixels[index];
+ var prev = index > 0 ? pixels[index - 1] : null;
+ var next = index < pixels.length - 1 ? pixels[index + 1] : null;
+ var percent = options.categoryPercentage;
+ var start, size;
+
+ if (prev === null) {
+ // first data: its size is double based on the next point or,
+ // if it's also the last data, we use the scale size.
+ prev = curr - (next === null ? ruler.end - ruler.start : next - curr);
+ }
+
+ if (next === null) {
+ // last data: its size is also double based on the previous point.
+ next = curr + curr - prev;
+ }
+
+ start = curr - (curr - Math.min(prev, next)) / 2 * percent;
+ size = Math.abs(next - prev) / 2 * percent;
+
+ return {
+ chunk: size / ruler.stackCount,
+ ratio: options.barPercentage,
+ start: start
+ };
+}
+
+var controller_bar = core_datasetController.extend({
+
+ dataElementType: elements.Rectangle,
+
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderSkipped',
+ 'borderWidth',
+ 'barPercentage',
+ 'barThickness',
+ 'categoryPercentage',
+ 'maxBarThickness',
+ 'minBarLength'
+ ],
+
+ initialize: function() {
+ var me = this;
+ var meta, scaleOpts;
+
+ core_datasetController.prototype.initialize.apply(me, arguments);
+
+ meta = me.getMeta();
+ meta.stack = me.getDataset().stack;
+ meta.bar = true;
+
+ scaleOpts = me._getIndexScale().options;
+ deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');
+ deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');
+ deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');
+ deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');
+ deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');
+ },
+
+ update: function(reset) {
+ var me = this;
+ var rects = me.getMeta().data;
+ var i, ilen;
+
+ me._ruler = me.getRuler();
+
+ for (i = 0, ilen = rects.length; i < ilen; ++i) {
+ me.updateElement(rects[i], i, reset);
+ }
+ },
+
+ updateElement: function(rectangle, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var dataset = me.getDataset();
+ var options = me._resolveDataElementOptions(rectangle, index);
+
+ rectangle._xScale = me.getScaleForId(meta.xAxisID);
+ rectangle._yScale = me.getScaleForId(meta.yAxisID);
+ rectangle._datasetIndex = me.index;
+ rectangle._index = index;
+ rectangle._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderSkipped: options.borderSkipped,
+ borderWidth: options.borderWidth,
+ datasetLabel: dataset.label,
+ label: me.chart.data.labels[index]
+ };
+
+ if (helpers$1.isArray(dataset.data[index])) {
+ rectangle._model.borderSkipped = null;
+ }
+
+ me._updateElementGeometry(rectangle, index, reset, options);
+
+ rectangle.pivot();
+ },
+
+ /**
+ * @private
+ */
+ _updateElementGeometry: function(rectangle, index, reset, options) {
+ var me = this;
+ var model = rectangle._model;
+ var vscale = me._getValueScale();
+ var base = vscale.getBasePixel();
+ var horizontal = vscale.isHorizontal();
+ var ruler = me._ruler || me.getRuler();
+ var vpixels = me.calculateBarValuePixels(me.index, index, options);
+ var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);
+
+ model.horizontal = horizontal;
+ model.base = reset ? base : vpixels.base;
+ model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;
+ model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;
+ model.height = horizontal ? ipixels.size : undefined;
+ model.width = horizontal ? undefined : ipixels.size;
+ },
+
+ /**
+ * Returns the stacks based on groups and bar visibility.
+ * @param {number} [last] - The dataset index
+ * @returns {string[]} The list of stack IDs
+ * @private
+ */
+ _getStacks: function(last) {
+ var me = this;
+ var scale = me._getIndexScale();
+ var metasets = scale._getMatchingVisibleMetas(me._type);
+ var stacked = scale.options.stacked;
+ var ilen = metasets.length;
+ var stacks = [];
+ var i, meta;
+
+ for (i = 0; i < ilen; ++i) {
+ meta = metasets[i];
+ // stacked | meta.stack
+ // | found | not found | undefined
+ // false | x | x | x
+ // true | | x |
+ // undefined | | x | x
+ if (stacked === false || stacks.indexOf(meta.stack) === -1 ||
+ (stacked === undefined && meta.stack === undefined)) {
+ stacks.push(meta.stack);
+ }
+ if (meta.index === last) {
+ break;
+ }
+ }
+
+ return stacks;
+ },
+
+ /**
+ * Returns the effective number of stacks based on groups and bar visibility.
+ * @private
+ */
+ getStackCount: function() {
+ return this._getStacks().length;
+ },
+
+ /**
+ * Returns the stack index for the given dataset based on groups and bar visibility.
+ * @param {number} [datasetIndex] - The dataset index
+ * @param {string} [name] - The stack name to find
+ * @returns {number} The stack index
+ * @private
+ */
+ getStackIndex: function(datasetIndex, name) {
+ var stacks = this._getStacks(datasetIndex);
+ var index = (name !== undefined)
+ ? stacks.indexOf(name)
+ : -1; // indexOf returns -1 if element is not present
+
+ return (index === -1)
+ ? stacks.length - 1
+ : index;
+ },
+
+ /**
+ * @private
+ */
+ getRuler: function() {
+ var me = this;
+ var scale = me._getIndexScale();
+ var pixels = [];
+ var i, ilen;
+
+ for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {
+ pixels.push(scale.getPixelForValue(null, i, me.index));
+ }
+
+ return {
+ pixels: pixels,
+ start: scale._startPixel,
+ end: scale._endPixel,
+ stackCount: me.getStackCount(),
+ scale: scale
+ };
+ },
+
+ /**
+ * Note: pixel values are not clamped to the scale area.
+ * @private
+ */
+ calculateBarValuePixels: function(datasetIndex, index, options) {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getValueScale();
+ var isHorizontal = scale.isHorizontal();
+ var datasets = chart.data.datasets;
+ var metasets = scale._getMatchingVisibleMetas(me._type);
+ var value = scale._parseValue(datasets[datasetIndex].data[index]);
+ var minBarLength = options.minBarLength;
+ var stacked = scale.options.stacked;
+ var stack = me.getMeta().stack;
+ var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;
+ var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;
+ var ilen = metasets.length;
+ var i, imeta, ivalue, base, head, size, stackLength;
+
+ if (stacked || (stacked === undefined && stack !== undefined)) {
+ for (i = 0; i < ilen; ++i) {
+ imeta = metasets[i];
+
+ if (imeta.index === datasetIndex) {
+ break;
+ }
+
+ if (imeta.stack === stack) {
+ stackLength = scale._parseValue(datasets[imeta.index].data[index]);
+ ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;
+
+ if ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {
+ start += ivalue;
+ }
+ }
+ }
+ }
+
+ base = scale.getPixelForValue(start);
+ head = scale.getPixelForValue(start + length);
+ size = head - base;
+
+ if (minBarLength !== undefined && Math.abs(size) < minBarLength) {
+ size = minBarLength;
+ if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {
+ head = base - minBarLength;
+ } else {
+ head = base + minBarLength;
+ }
+ }
+
+ return {
+ size: size,
+ base: base,
+ head: head,
+ center: head + size / 2
+ };
+ },
+
+ /**
+ * @private
+ */
+ calculateBarIndexPixels: function(datasetIndex, index, ruler, options) {
+ var me = this;
+ var range = options.barThickness === 'flex'
+ ? computeFlexCategoryTraits(index, ruler, options)
+ : computeFitCategoryTraits(index, ruler, options);
+
+ var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);
+ var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);
+ var size = Math.min(
+ valueOrDefault$3(options.maxBarThickness, Infinity),
+ range.chunk * range.ratio);
+
+ return {
+ base: center - size / 2,
+ head: center + size / 2,
+ center: center,
+ size: size
+ };
+ },
+
+ draw: function() {
+ var me = this;
+ var chart = me.chart;
+ var scale = me._getValueScale();
+ var rects = me.getMeta().data;
+ var dataset = me.getDataset();
+ var ilen = rects.length;
+ var i = 0;
+
+ helpers$1.canvas.clipArea(chart.ctx, chart.chartArea);
+
+ for (; i < ilen; ++i) {
+ var val = scale._parseValue(dataset.data[i]);
+ if (!isNaN(val.min) && !isNaN(val.max)) {
+ rects[i].draw();
+ }
+ }
+
+ helpers$1.canvas.unclipArea(chart.ctx);
+ },
+
+ /**
+ * @private
+ */
+ _resolveDataElementOptions: function() {
+ var me = this;
+ var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));
+ var indexOpts = me._getIndexScale().options;
+ var valueOpts = me._getValueScale().options;
+
+ values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);
+ values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);
+ values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);
+ values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);
+ values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);
+
+ return values;
+ }
+
+});
+
+var valueOrDefault$4 = helpers$1.valueOrDefault;
+var resolve$1 = helpers$1.options.resolve;
+
+core_defaults._set('bubble', {
+ hover: {
+ mode: 'single'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'linear', // bubble should probably use a linear scale by default
+ position: 'bottom',
+ id: 'x-axis-0' // need an ID so datasets can reference the scale
+ }],
+ yAxes: [{
+ type: 'linear',
+ position: 'left',
+ id: 'y-axis-0'
+ }]
+ },
+
+ tooltips: {
+ callbacks: {
+ title: function() {
+ // Title doesn't make sense for scatter since we format the data as a point
+ return '';
+ },
+ label: function(item, data) {
+ var datasetLabel = data.datasets[item.datasetIndex].label || '';
+ var dataPoint = data.datasets[item.datasetIndex].data[item.index];
+ return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';
+ }
+ }
+ }
+});
+
+var controller_bubble = core_datasetController.extend({
+ /**
+ * @protected
+ */
+ dataElementType: elements.Point,
+
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ 'hoverRadius',
+ 'hitRadius',
+ 'pointStyle',
+ 'rotation'
+ ],
+
+ /**
+ * @protected
+ */
+ update: function(reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var points = meta.data;
+
+ // Update Points
+ helpers$1.each(points, function(point, index) {
+ me.updateElement(point, index, reset);
+ });
+ },
+
+ /**
+ * @protected
+ */
+ updateElement: function(point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var xScale = me.getScaleForId(meta.xAxisID);
+ var yScale = me.getScaleForId(meta.yAxisID);
+ var options = me._resolveDataElementOptions(point, index);
+ var data = me.getDataset().data[index];
+ var dsIndex = me.index;
+
+ var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);
+ var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);
+
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = dsIndex;
+ point._index = index;
+ point._model = {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ hitRadius: options.hitRadius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ radius: reset ? 0 : options.radius,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ x: x,
+ y: y,
+ };
+
+ point.pivot();
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function(point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+
+ model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);
+ model.radius = options.radius + options.hoverRadius;
+ },
+
+ /**
+ * @private
+ */
+ _resolveDataElementOptions: function(point, index) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = me.getDataset();
+ var custom = point.custom || {};
+ var data = dataset.data[index] || {};
+ var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);
+
+ // Scriptable options
+ var context = {
+ chart: chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ // In case values were cached (and thus frozen), we need to clone the values
+ if (me._cachedDataOpts === values) {
+ values = helpers$1.extend({}, values);
+ }
+
+ // Custom radius resolution
+ values.radius = resolve$1([
+ custom.radius,
+ data.r,
+ me._config.radius,
+ chart.options.elements.point.radius
+ ], context, index);
+
+ return values;
+ }
+});
+
+var valueOrDefault$5 = helpers$1.valueOrDefault;
+
+var PI$1 = Math.PI;
+var DOUBLE_PI$1 = PI$1 * 2;
+var HALF_PI$1 = PI$1 / 2;
+
+core_defaults._set('doughnut', {
+ animation: {
+ // Boolean - Whether we animate the rotation of the Doughnut
+ animateRotate: true,
+ // Boolean - Whether we animate scaling the Doughnut from the centre
+ animateScale: false
+ },
+ hover: {
+ mode: 'single'
+ },
+ legendCallback: function(chart) {
+ var list = document.createElement('ul');
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+
+ list.setAttribute('class', chart.id + '-legend');
+ if (datasets.length) {
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
+ if (labels[i]) {
+ listItem.appendChild(document.createTextNode(labels[i]));
+ }
+ }
+ }
+
+ return list.outerHTML;
+ },
+ legend: {
+ labels: {
+ generateLabels: function(chart) {
+ var data = chart.data;
+ if (data.labels.length && data.datasets.length) {
+ return data.labels.map(function(label, i) {
+ var meta = chart.getDatasetMeta(0);
+ var style = meta.controller.getStyle(i);
+
+ return {
+ text: label,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
+
+ // Extra data used for toggling the correct item
+ index: i
+ };
+ });
+ }
+ return [];
+ }
+ },
+
+ onClick: function(e, legendItem) {
+ var index = legendItem.index;
+ var chart = this.chart;
+ var i, ilen, meta;
+
+ for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ // toggle visibility of index if exists
+ if (meta.data[index]) {
+ meta.data[index].hidden = !meta.data[index].hidden;
+ }
+ }
+
+ chart.update();
+ }
+ },
+
+ // The percentage of the chart that we cut out of the middle.
+ cutoutPercentage: 50,
+
+ // The rotation of the chart, where the first data arc begins.
+ rotation: -HALF_PI$1,
+
+ // The total circumference of the chart.
+ circumference: DOUBLE_PI$1,
+
+ // Need to override these to give a nice default
+ tooltips: {
+ callbacks: {
+ title: function() {
+ return '';
+ },
+ label: function(tooltipItem, data) {
+ var dataLabel = data.labels[tooltipItem.index];
+ var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
+
+ if (helpers$1.isArray(dataLabel)) {
+ // show value on first line of multiline label
+ // need to clone because we are changing the value
+ dataLabel = dataLabel.slice();
+ dataLabel[0] += value;
+ } else {
+ dataLabel += value;
+ }
+
+ return dataLabel;
+ }
+ }
+ }
+});
+
+var controller_doughnut = core_datasetController.extend({
+
+ dataElementType: elements.Arc,
+
+ linkScales: helpers$1.noop,
+
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
+ // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
+ getRingIndex: function(datasetIndex) {
+ var ringIndex = 0;
+
+ for (var j = 0; j < datasetIndex; ++j) {
+ if (this.chart.isDatasetVisible(j)) {
+ ++ringIndex;
+ }
+ }
+
+ return ringIndex;
+ },
+
+ update: function(reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var ratioX = 1;
+ var ratioY = 1;
+ var offsetX = 0;
+ var offsetY = 0;
+ var meta = me.getMeta();
+ var arcs = meta.data;
+ var cutout = opts.cutoutPercentage / 100 || 0;
+ var circumference = opts.circumference;
+ var chartWeight = me._getRingWeight(me.index);
+ var maxWidth, maxHeight, i, ilen;
+
+ // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc
+ if (circumference < DOUBLE_PI$1) {
+ var startAngle = opts.rotation % DOUBLE_PI$1;
+ startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;
+ var endAngle = startAngle + circumference;
+ var startX = Math.cos(startAngle);
+ var startY = Math.sin(startAngle);
+ var endX = Math.cos(endAngle);
+ var endY = Math.sin(endAngle);
+ var contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;
+ var contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;
+ var contains180 = startAngle === -PI$1 || endAngle >= PI$1;
+ var contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;
+ var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);
+ var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);
+ var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);
+ var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);
+ ratioX = (maxX - minX) / 2;
+ ratioY = (maxY - minY) / 2;
+ offsetX = -(maxX + minX) / 2;
+ offsetY = -(maxY + minY) / 2;
+ }
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
+ }
+
+ chart.borderWidth = me.getMaxBorderWidth();
+ maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;
+ maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;
+ chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);
+ chart.innerRadius = Math.max(chart.outerRadius * cutout, 0);
+ chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);
+ chart.offsetX = offsetX * chart.outerRadius;
+ chart.offsetY = offsetY * chart.outerRadius;
+
+ meta.total = me.calculateTotal();
+
+ me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);
+ me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ me.updateElement(arcs[i], i, reset);
+ }
+ },
+
+ updateElement: function(arc, index, reset) {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var animationOpts = opts.animation;
+ var centerX = (chartArea.left + chartArea.right) / 2;
+ var centerY = (chartArea.top + chartArea.bottom) / 2;
+ var startAngle = opts.rotation; // non reset case handled later
+ var endAngle = opts.rotation; // non reset case handled later
+ var dataset = me.getDataset();
+ var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);
+ var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;
+ var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;
+ var options = arc._options || {};
+
+ helpers$1.extend(arc, {
+ // Utility
+ _datasetIndex: me.index,
+ _index: index,
+
+ // Desired view properties
+ _model: {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ borderAlign: options.borderAlign,
+ x: centerX + chart.offsetX,
+ y: centerY + chart.offsetY,
+ startAngle: startAngle,
+ endAngle: endAngle,
+ circumference: circumference,
+ outerRadius: outerRadius,
+ innerRadius: innerRadius,
+ label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])
+ }
+ });
+
+ var model = arc._model;
+
+ // Set correct angles if not resetting
+ if (!reset || !animationOpts.animateRotate) {
+ if (index === 0) {
+ model.startAngle = opts.rotation;
+ } else {
+ model.startAngle = me.getMeta().data[index - 1]._model.endAngle;
+ }
+
+ model.endAngle = model.startAngle + model.circumference;
+ }
+
+ arc.pivot();
+ },
+
+ calculateTotal: function() {
+ var dataset = this.getDataset();
+ var meta = this.getMeta();
+ var total = 0;
+ var value;
+
+ helpers$1.each(meta.data, function(element, index) {
+ value = dataset.data[index];
+ if (!isNaN(value) && !element.hidden) {
+ total += Math.abs(value);
+ }
+ });
+
+ /* if (total === 0) {
+ total = NaN;
+ }*/
+
+ return total;
+ },
+
+ calculateCircumference: function(value) {
+ var total = this.getMeta().total;
+ if (total > 0 && !isNaN(value)) {
+ return DOUBLE_PI$1 * (Math.abs(value) / total);
+ }
+ return 0;
+ },
+
+ // gets the max border or hover width to properly scale pie charts
+ getMaxBorderWidth: function(arcs) {
+ var me = this;
+ var max = 0;
+ var chart = me.chart;
+ var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;
+
+ if (!arcs) {
+ // Find the outmost visible dataset
+ for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
+ if (chart.isDatasetVisible(i)) {
+ meta = chart.getDatasetMeta(i);
+ arcs = meta.data;
+ if (i !== me.index) {
+ controller = meta.controller;
+ }
+ break;
+ }
+ }
+ }
+
+ if (!arcs) {
+ return 0;
+ }
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arc = arcs[i];
+ if (controller) {
+ controller._configure();
+ options = controller._resolveDataElementOptions(arc, i);
+ } else {
+ options = arc._options;
+ }
+ if (options.borderAlign !== 'inner') {
+ borderWidth = options.borderWidth;
+ hoverWidth = options.hoverBorderWidth;
+
+ max = borderWidth > max ? borderWidth : max;
+ max = hoverWidth > max ? hoverWidth : max;
+ }
+ }
+ return max;
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function(arc) {
+ var model = arc._model;
+ var options = arc._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ arc.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ };
+
+ model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);
+ },
+
+ /**
+ * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly
+ * @private
+ */
+ _getRingWeightOffset: function(datasetIndex) {
+ var ringWeightOffset = 0;
+
+ for (var i = 0; i < datasetIndex; ++i) {
+ if (this.chart.isDatasetVisible(i)) {
+ ringWeightOffset += this._getRingWeight(i);
+ }
+ }
+
+ return ringWeightOffset;
+ },
+
+ /**
+ * @private
+ */
+ _getRingWeight: function(dataSetIndex) {
+ return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);
+ },
+
+ /**
+ * Returns the sum of all visibile data set weights. This value can be 0.
+ * @private
+ */
+ _getVisibleDatasetWeightTotal: function() {
+ return this._getRingWeightOffset(this.chart.data.datasets.length);
+ }
+});
+
+core_defaults._set('horizontalBar', {
+ hover: {
+ mode: 'index',
+ axis: 'y'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'linear',
+ position: 'bottom'
+ }],
+
+ yAxes: [{
+ type: 'category',
+ position: 'left',
+ offset: true,
+ gridLines: {
+ offsetGridLines: true
+ }
+ }]
+ },
+
+ elements: {
+ rectangle: {
+ borderSkipped: 'left'
+ }
+ },
+
+ tooltips: {
+ mode: 'index',
+ axis: 'y'
+ }
+});
+
+core_defaults._set('global', {
+ datasets: {
+ horizontalBar: {
+ categoryPercentage: 0.8,
+ barPercentage: 0.9
+ }
+ }
+});
+
+var controller_horizontalBar = controller_bar.extend({
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.getMeta().xAxisID;
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.getMeta().yAxisID;
+ }
+});
+
+var valueOrDefault$6 = helpers$1.valueOrDefault;
+var resolve$2 = helpers$1.options.resolve;
+var isPointInArea = helpers$1.canvas._isPointInArea;
+
+core_defaults._set('line', {
+ showLines: true,
+ spanGaps: false,
+
+ hover: {
+ mode: 'label'
+ },
+
+ scales: {
+ xAxes: [{
+ type: 'category',
+ id: 'x-axis-0'
+ }],
+ yAxes: [{
+ type: 'linear',
+ id: 'y-axis-0'
+ }]
+ }
+});
+
+function scaleClip(scale, halfBorderWidth) {
+ var tickOpts = scale && scale.options.ticks || {};
+ var reverse = tickOpts.reverse;
+ var min = tickOpts.min === undefined ? halfBorderWidth : 0;
+ var max = tickOpts.max === undefined ? halfBorderWidth : 0;
+ return {
+ start: reverse ? max : min,
+ end: reverse ? min : max
+ };
+}
+
+function defaultClip(xScale, yScale, borderWidth) {
+ var halfBorderWidth = borderWidth / 2;
+ var x = scaleClip(xScale, halfBorderWidth);
+ var y = scaleClip(yScale, halfBorderWidth);
+
+ return {
+ top: y.end,
+ right: x.end,
+ bottom: y.start,
+ left: x.start
+ };
+}
+
+function toClip(value) {
+ var t, r, b, l;
+
+ if (helpers$1.isObject(value)) {
+ t = value.top;
+ r = value.right;
+ b = value.bottom;
+ l = value.left;
+ } else {
+ t = r = b = l = value;
+ }
+
+ return {
+ top: t,
+ right: r,
+ bottom: b,
+ left: l
+ };
+}
+
+
+var controller_line = core_datasetController.extend({
+
+ datasetElementType: elements.Line,
+
+ dataElementType: elements.Point,
+
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderCapStyle',
+ 'borderColor',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'borderWidth',
+ 'cubicInterpolationMode',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
+ update: function(reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var line = meta.dataset;
+ var points = meta.data || [];
+ var options = me.chart.options;
+ var config = me._config;
+ var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);
+ var i, ilen;
+
+ me._xScale = me.getScaleForId(meta.xAxisID);
+ me._yScale = me.getScaleForId(meta.yAxisID);
+
+ // Update Line
+ if (showLine) {
+ // Compatibility: If the properties are defined with only the old name, use those values
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
+ }
+
+ // Utility
+ line._scale = me._yScale;
+ line._datasetIndex = me.index;
+ // Data
+ line._children = points;
+ // Model
+ line._model = me._resolveDatasetElementOptions(line);
+
+ line.pivot();
+ }
+
+ // Update Points
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ me.updateElement(points[i], i, reset);
+ }
+
+ if (showLine && line._model.tension !== 0) {
+ me.updateBezierControlPoints();
+ }
+
+ // Now pivot the point for animation
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ points[i].pivot();
+ }
+ },
+
+ updateElement: function(point, index, reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var custom = point.custom || {};
+ var dataset = me.getDataset();
+ var datasetIndex = me.index;
+ var value = dataset.data[index];
+ var xScale = me._xScale;
+ var yScale = me._yScale;
+ var lineModel = meta.dataset._model;
+ var x, y;
+
+ var options = me._resolveDataElementOptions(point, index);
+
+ x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);
+ y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);
+
+ // Utility
+ point._xScale = xScale;
+ point._yScale = yScale;
+ point._options = options;
+ point._datasetIndex = datasetIndex;
+ point._index = index;
+
+ // Desired view properties
+ point._model = {
+ x: x,
+ y: y,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ // Appearance
+ radius: options.radius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),
+ steppedLine: lineModel ? lineModel.steppedLine : false,
+ // Tooltip
+ hitRadius: options.hitRadius
+ };
+ },
+
+ /**
+ * @private
+ */
+ _resolveDatasetElementOptions: function(element) {
+ var me = this;
+ var config = me._config;
+ var custom = element.custom || {};
+ var options = me.chart.options;
+ var lineOptions = options.elements.line;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
+
+ // The default behavior of lines is to break at null values, according
+ // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
+ // This option gives lines the ability to span gaps
+ values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);
+ values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);
+ values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));
+
+ return values;
+ },
+
+ calculatePointY: function(value, index, datasetIndex) {
+ var me = this;
+ var chart = me.chart;
+ var yScale = me._yScale;
+ var sumPos = 0;
+ var sumNeg = 0;
+ var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;
+
+ if (yScale.options.stacked) {
+ rightValue = +yScale.getRightValue(value);
+ metasets = chart._getSortedVisibleDatasetMetas();
+ ilen = metasets.length;
+
+ for (i = 0; i < ilen; ++i) {
+ dsMeta = metasets[i];
+ if (dsMeta.index === datasetIndex) {
+ break;
+ }
+
+ ds = chart.data.datasets[dsMeta.index];
+ if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {
+ stackedRightValue = +yScale.getRightValue(ds.data[index]);
+ if (stackedRightValue < 0) {
+ sumNeg += stackedRightValue || 0;
+ } else {
+ sumPos += stackedRightValue || 0;
+ }
+ }
+ }
+
+ if (rightValue < 0) {
+ return yScale.getPixelForValue(sumNeg + rightValue);
+ }
+ return yScale.getPixelForValue(sumPos + rightValue);
+ }
+ return yScale.getPixelForValue(value);
+ },
+
+ updateBezierControlPoints: function() {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var lineModel = meta.dataset._model;
+ var area = chart.chartArea;
+ var points = meta.data || [];
+ var i, ilen, model, controlPoints;
+
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (lineModel.spanGaps) {
+ points = points.filter(function(pt) {
+ return !pt._model.skip;
+ });
+ }
+
+ function capControlPoint(pt, min, max) {
+ return Math.max(Math.min(pt, max), min);
+ }
+
+ if (lineModel.cubicInterpolationMode === 'monotone') {
+ helpers$1.splineCurveMonotone(points);
+ } else {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ controlPoints = helpers$1.splineCurve(
+ helpers$1.previousItem(points, i)._model,
+ model,
+ helpers$1.nextItem(points, i)._model,
+ lineModel.tension
+ );
+ model.controlPointPreviousX = controlPoints.previous.x;
+ model.controlPointPreviousY = controlPoints.previous.y;
+ model.controlPointNextX = controlPoints.next.x;
+ model.controlPointNextY = controlPoints.next.y;
+ }
+ }
+
+ if (chart.options.elements.line.capBezierPoints) {
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ if (isPointInArea(model, area)) {
+ if (i > 0 && isPointInArea(points[i - 1]._model, area)) {
+ model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);
+ model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);
+ }
+ if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {
+ model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);
+ model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);
+ }
+ }
+ }
+ }
+ },
+
+ draw: function() {
+ var me = this;
+ var chart = me.chart;
+ var meta = me.getMeta();
+ var points = meta.data || [];
+ var area = chart.chartArea;
+ var canvas = chart.canvas;
+ var i = 0;
+ var ilen = points.length;
+ var clip;
+
+ if (me._showLine) {
+ clip = meta.dataset._model.clip;
+
+ helpers$1.canvas.clipArea(chart.ctx, {
+ left: clip.left === false ? 0 : area.left - clip.left,
+ right: clip.right === false ? canvas.width : area.right + clip.right,
+ top: clip.top === false ? 0 : area.top - clip.top,
+ bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom
+ });
+
+ meta.dataset.draw();
+
+ helpers$1.canvas.unclipArea(chart.ctx);
+ }
+
+ // Draw the points
+ for (; i < ilen; ++i) {
+ points[i].draw(area);
+ }
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function(point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+
+ model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$6(options.hoverRadius, options.radius);
+ },
+});
+
+var resolve$3 = helpers$1.options.resolve;
+
+core_defaults._set('polarArea', {
+ scale: {
+ type: 'radialLinear',
+ angleLines: {
+ display: false
+ },
+ gridLines: {
+ circular: true
+ },
+ pointLabels: {
+ display: false
+ },
+ ticks: {
+ beginAtZero: true
+ }
+ },
+
+ // Boolean - Whether to animate the rotation of the chart
+ animation: {
+ animateRotate: true,
+ animateScale: true
+ },
+
+ startAngle: -0.5 * Math.PI,
+ legendCallback: function(chart) {
+ var list = document.createElement('ul');
+ var data = chart.data;
+ var datasets = data.datasets;
+ var labels = data.labels;
+ var i, ilen, listItem, listItemSpan;
+
+ list.setAttribute('class', chart.id + '-legend');
+ if (datasets.length) {
+ for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];
+ if (labels[i]) {
+ listItem.appendChild(document.createTextNode(labels[i]));
+ }
+ }
+ }
+
+ return list.outerHTML;
+ },
+ legend: {
+ labels: {
+ generateLabels: function(chart) {
+ var data = chart.data;
+ if (data.labels.length && data.datasets.length) {
+ return data.labels.map(function(label, i) {
+ var meta = chart.getDatasetMeta(0);
+ var style = meta.controller.getStyle(i);
+
+ return {
+ text: label,
+ fillStyle: style.backgroundColor,
+ strokeStyle: style.borderColor,
+ lineWidth: style.borderWidth,
+ hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
+
+ // Extra data used for toggling the correct item
+ index: i
+ };
+ });
+ }
+ return [];
+ }
+ },
+
+ onClick: function(e, legendItem) {
+ var index = legendItem.index;
+ var chart = this.chart;
+ var i, ilen, meta;
+
+ for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
+ meta = chart.getDatasetMeta(i);
+ meta.data[index].hidden = !meta.data[index].hidden;
+ }
+
+ chart.update();
+ }
+ },
+
+ // Need to override these to give a nice default
+ tooltips: {
+ callbacks: {
+ title: function() {
+ return '';
+ },
+ label: function(item, data) {
+ return data.labels[item.index] + ': ' + item.yLabel;
+ }
+ }
+ }
+});
+
+var controller_polarArea = core_datasetController.extend({
+
+ dataElementType: elements.Arc,
+
+ linkScales: helpers$1.noop,
+
+ /**
+ * @private
+ */
+ _dataElementOptions: [
+ 'backgroundColor',
+ 'borderColor',
+ 'borderWidth',
+ 'borderAlign',
+ 'hoverBackgroundColor',
+ 'hoverBorderColor',
+ 'hoverBorderWidth',
+ ],
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ update: function(reset) {
+ var me = this;
+ var dataset = me.getDataset();
+ var meta = me.getMeta();
+ var start = me.chart.options.startAngle || 0;
+ var starts = me._starts = [];
+ var angles = me._angles = [];
+ var arcs = meta.data;
+ var i, ilen, angle;
+
+ me._updateRadius();
+
+ meta.count = me.countVisibleElements();
+
+ for (i = 0, ilen = dataset.data.length; i < ilen; i++) {
+ starts[i] = start;
+ angle = me._computeAngle(i);
+ angles[i] = angle;
+ start += angle;
+ }
+
+ for (i = 0, ilen = arcs.length; i < ilen; ++i) {
+ arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
+ me.updateElement(arcs[i], i, reset);
+ }
+ },
+
+ /**
+ * @private
+ */
+ _updateRadius: function() {
+ var me = this;
+ var chart = me.chart;
+ var chartArea = chart.chartArea;
+ var opts = chart.options;
+ var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
+
+ chart.outerRadius = Math.max(minSize / 2, 0);
+ chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);
+ chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();
+
+ me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);
+ me.innerRadius = me.outerRadius - chart.radiusLength;
+ },
+
+ updateElement: function(arc, index, reset) {
+ var me = this;
+ var chart = me.chart;
+ var dataset = me.getDataset();
+ var opts = chart.options;
+ var animationOpts = opts.animation;
+ var scale = chart.scale;
+ var labels = chart.data.labels;
+
+ var centerX = scale.xCenter;
+ var centerY = scale.yCenter;
+
+ // var negHalfPI = -0.5 * Math.PI;
+ var datasetStartAngle = opts.startAngle;
+ var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
+ var startAngle = me._starts[index];
+ var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);
+
+ var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
+ var options = arc._options || {};
+
+ helpers$1.extend(arc, {
+ // Utility
+ _datasetIndex: me.index,
+ _index: index,
+ _scale: scale,
+
+ // Desired view properties
+ _model: {
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ borderAlign: options.borderAlign,
+ x: centerX,
+ y: centerY,
+ innerRadius: 0,
+ outerRadius: reset ? resetRadius : distance,
+ startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,
+ endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,
+ label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])
+ }
+ });
+
+ arc.pivot();
+ },
+
+ countVisibleElements: function() {
+ var dataset = this.getDataset();
+ var meta = this.getMeta();
+ var count = 0;
+
+ helpers$1.each(meta.data, function(element, index) {
+ if (!isNaN(dataset.data[index]) && !element.hidden) {
+ count++;
+ }
+ });
+
+ return count;
+ },
+
+ /**
+ * @protected
+ */
+ setHoverStyle: function(arc) {
+ var model = arc._model;
+ var options = arc._options;
+ var getHoverColor = helpers$1.getHoverColor;
+ var valueOrDefault = helpers$1.valueOrDefault;
+
+ arc.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ };
+
+ model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
+ },
+
+ /**
+ * @private
+ */
+ _computeAngle: function(index) {
+ var me = this;
+ var count = this.getMeta().count;
+ var dataset = me.getDataset();
+ var meta = me.getMeta();
+
+ if (isNaN(dataset.data[index]) || meta.data[index].hidden) {
+ return 0;
+ }
+
+ // Scriptable options
+ var context = {
+ chart: me.chart,
+ dataIndex: index,
+ dataset: dataset,
+ datasetIndex: me.index
+ };
+
+ return resolve$3([
+ me.chart.options.elements.arc.angle,
+ (2 * Math.PI) / count
+ ], context, index);
+ }
+});
+
+core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));
+core_defaults._set('pie', {
+ cutoutPercentage: 0
+});
+
+// Pie charts are Doughnut chart with different defaults
+var controller_pie = controller_doughnut;
+
+var valueOrDefault$7 = helpers$1.valueOrDefault;
+
+core_defaults._set('radar', {
+ spanGaps: false,
+ scale: {
+ type: 'radialLinear'
+ },
+ elements: {
+ line: {
+ fill: 'start',
+ tension: 0 // no bezier in radar
+ }
+ }
+});
+
+var controller_radar = core_datasetController.extend({
+ datasetElementType: elements.Line,
+
+ dataElementType: elements.Point,
+
+ linkScales: helpers$1.noop,
+
+ /**
+ * @private
+ */
+ _datasetElementOptions: [
+ 'backgroundColor',
+ 'borderWidth',
+ 'borderColor',
+ 'borderCapStyle',
+ 'borderDash',
+ 'borderDashOffset',
+ 'borderJoinStyle',
+ 'fill'
+ ],
+
+ /**
+ * @private
+ */
+ _dataElementOptions: {
+ backgroundColor: 'pointBackgroundColor',
+ borderColor: 'pointBorderColor',
+ borderWidth: 'pointBorderWidth',
+ hitRadius: 'pointHitRadius',
+ hoverBackgroundColor: 'pointHoverBackgroundColor',
+ hoverBorderColor: 'pointHoverBorderColor',
+ hoverBorderWidth: 'pointHoverBorderWidth',
+ hoverRadius: 'pointHoverRadius',
+ pointStyle: 'pointStyle',
+ radius: 'pointRadius',
+ rotation: 'pointRotation'
+ },
+
+ /**
+ * @private
+ */
+ _getIndexScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ /**
+ * @private
+ */
+ _getValueScaleId: function() {
+ return this.chart.scale.id;
+ },
+
+ update: function(reset) {
+ var me = this;
+ var meta = me.getMeta();
+ var line = meta.dataset;
+ var points = meta.data || [];
+ var scale = me.chart.scale;
+ var config = me._config;
+ var i, ilen;
+
+ // Compatibility: If the properties are defined with only the old name, use those values
+ if (config.tension !== undefined && config.lineTension === undefined) {
+ config.lineTension = config.tension;
+ }
+
+ // Utility
+ line._scale = scale;
+ line._datasetIndex = me.index;
+ // Data
+ line._children = points;
+ line._loop = true;
+ // Model
+ line._model = me._resolveDatasetElementOptions(line);
+
+ line.pivot();
+
+ // Update Points
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ me.updateElement(points[i], i, reset);
+ }
+
+ // Update bezier control points
+ me.updateBezierControlPoints();
+
+ // Now pivot the point for animation
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ points[i].pivot();
+ }
+ },
+
+ updateElement: function(point, index, reset) {
+ var me = this;
+ var custom = point.custom || {};
+ var dataset = me.getDataset();
+ var scale = me.chart.scale;
+ var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);
+ var options = me._resolveDataElementOptions(point, index);
+ var lineModel = me.getMeta().dataset._model;
+ var x = reset ? scale.xCenter : pointPosition.x;
+ var y = reset ? scale.yCenter : pointPosition.y;
+
+ // Utility
+ point._scale = scale;
+ point._options = options;
+ point._datasetIndex = me.index;
+ point._index = index;
+
+ // Desired view properties
+ point._model = {
+ x: x, // value not used in dataset scale, but we want a consistent API between scales
+ y: y,
+ skip: custom.skip || isNaN(x) || isNaN(y),
+ // Appearance
+ radius: options.radius,
+ pointStyle: options.pointStyle,
+ rotation: options.rotation,
+ backgroundColor: options.backgroundColor,
+ borderColor: options.borderColor,
+ borderWidth: options.borderWidth,
+ tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),
+
+ // Tooltip
+ hitRadius: options.hitRadius
+ };
+ },
+
+ /**
+ * @private
+ */
+ _resolveDatasetElementOptions: function() {
+ var me = this;
+ var config = me._config;
+ var options = me.chart.options;
+ var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);
+
+ values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);
+ values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);
+
+ return values;
+ },
+
+ updateBezierControlPoints: function() {
+ var me = this;
+ var meta = me.getMeta();
+ var area = me.chart.chartArea;
+ var points = meta.data || [];
+ var i, ilen, model, controlPoints;
+
+ // Only consider points that are drawn in case the spanGaps option is used
+ if (meta.dataset._model.spanGaps) {
+ points = points.filter(function(pt) {
+ return !pt._model.skip;
+ });
+ }
+
+ function capControlPoint(pt, min, max) {
+ return Math.max(Math.min(pt, max), min);
+ }
+
+ for (i = 0, ilen = points.length; i < ilen; ++i) {
+ model = points[i]._model;
+ controlPoints = helpers$1.splineCurve(
+ helpers$1.previousItem(points, i, true)._model,
+ model,
+ helpers$1.nextItem(points, i, true)._model,
+ model.tension
+ );
+
+ // Prevent the bezier going outside of the bounds of the graph
+ model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);
+ model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);
+ model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);
+ model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);
+ }
+ },
+
+ setHoverStyle: function(point) {
+ var model = point._model;
+ var options = point._options;
+ var getHoverColor = helpers$1.getHoverColor;
+
+ point.$previousStyle = {
+ backgroundColor: model.backgroundColor,
+ borderColor: model.borderColor,
+ borderWidth: model.borderWidth,
+ radius: model.radius
+ };
+
+ model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
+ model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));
+ model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);
+ model.radius = valueOrDefault$7(options.hoverRadius, options.radius);
+ }
+});
+
+core_defaults._set('scatter', {
+ hover: {
+ mode: 'single'
+ },
+
+ scales: {
+ xAxes: [{
+ id: 'x-axis-1', // need an ID so datasets can reference the scale
+ type: 'linear', // scatter should not use a category axis
+ position: 'bottom'
+ }],
+ yAxes: [{
+ id: 'y-axis-1',
+ type: 'linear',
+ position: 'left'
+ }]
+ },
+
+ tooltips: {
+ callbacks: {
+ title: function() {
+ return ''; // doesn't make sense for scatter since data are formatted as a point
+ },
+ label: function(item) {
+ return '(' + item.xLabel + ', ' + item.yLabel + ')';
+ }
+ }
+ }
+});
+
+core_defaults._set('global', {
+ datasets: {
+ scatter: {
+ showLine: false
+ }
+ }
+});
+
+// Scatter charts use line controllers
+var controller_scatter = controller_line;
+
+// NOTE export a map in which the key represents the controller type, not
+// the class, and so must be CamelCase in order to be correctly retrieved
+// by the controller in core.controller.js (`controllers[meta.type]`).
+
+var controllers = {
+ bar: controller_bar,
+ bubble: controller_bubble,
+ doughnut: controller_doughnut,
+ horizontalBar: controller_horizontalBar,
+ line: controller_line,
+ polarArea: controller_polarArea,
+ pie: controller_pie,
+ radar: controller_radar,
+ scatter: controller_scatter
+};
+
+/**
+ * Helper function to get relative position for an event
+ * @param {Event|IEvent} event - The event to get the position for
+ * @param {Chart} chart - The chart
+ * @returns {object} the event position
+ */
+function getRelativePosition(e, chart) {
+ if (e.native) {
+ return {
+ x: e.x,
+ y: e.y
+ };
+ }
+
+ return helpers$1.getRelativePosition(e, chart);
+}
+
+/**
+ * Helper function to traverse all of the visible elements in the chart
+ * @param {Chart} chart - the chart
+ * @param {function} handler - the callback to execute for each visible item
+ */
+function parseVisibleItems(chart, handler) {
+ var metasets = chart._getSortedVisibleDatasetMetas();
+ var metadata, i, j, ilen, jlen, element;
+
+ for (i = 0, ilen = metasets.length; i < ilen; ++i) {
+ metadata = metasets[i].data;
+ for (j = 0, jlen = metadata.length; j < jlen; ++j) {
+ element = metadata[j];
+ if (!element._view.skip) {
+ handler(element);
+ }
+ }
+ }
+}
+
+/**
+ * Helper function to get the items that intersect the event position
+ * @param {ChartElement[]} items - elements to filter
+ * @param {object} position - the point to be nearest to
+ * @return {ChartElement[]} the nearest items
+ */
+function getIntersectItems(chart, position) {
+ var elements = [];
+
+ parseVisibleItems(chart, function(element) {
+ if (element.inRange(position.x, position.y)) {
+ elements.push(element);
+ }
+ });
+
+ return elements;
+}
+
+/**
+ * Helper function to get the items nearest to the event position considering all visible items in teh chart
+ * @param {Chart} chart - the chart to look at elements from
+ * @param {object} position - the point to be nearest to
+ * @param {boolean} intersect - if true, only consider items that intersect the position
+ * @param {function} distanceMetric - function to provide the distance between points
+ * @return {ChartElement[]} the nearest items
+ */
+function getNearestItems(chart, position, intersect, distanceMetric) {
+ var minDistance = Number.POSITIVE_INFINITY;
+ var nearestItems = [];
+
+ parseVisibleItems(chart, function(element) {
+ if (intersect && !element.inRange(position.x, position.y)) {
+ return;
+ }
+
+ var center = element.getCenterPoint();
+ var distance = distanceMetric(position, center);
+ if (distance < minDistance) {
+ nearestItems = [element];
+ minDistance = distance;
+ } else if (distance === minDistance) {
+ // Can have multiple items at the same distance in which case we sort by size
+ nearestItems.push(element);
+ }
+ });
+
+ return nearestItems;
+}
+
+/**
+ * Get a distance metric function for two points based on the
+ * axis mode setting
+ * @param {string} axis - the axis mode. x|y|xy
+ */
+function getDistanceMetricForAxis(axis) {
+ var useX = axis.indexOf('x') !== -1;
+ var useY = axis.indexOf('y') !== -1;
+
+ return function(pt1, pt2) {
+ var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;
+ var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;
+ return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));
+ };
+}
+
+function indexMode(chart, e, options) {
+ var position = getRelativePosition(e, chart);
+ // Default axis for index mode is 'x' to match old behaviour
+ options.axis = options.axis || 'x';
+ var distanceMetric = getDistanceMetricForAxis(options.axis);
+ var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);
+ var elements = [];
+
+ if (!items.length) {
+ return [];
+ }
+
+ chart._getSortedVisibleDatasetMetas().forEach(function(meta) {
+ var element = meta.data[items[0]._index];
+
+ // don't count items that are skipped (null data)
+ if (element && !element._view.skip) {
+ elements.push(element);
+ }
+ });
+
+ return elements;
+}
+
+/**
+ * @interface IInteractionOptions
+ */
+/**
+ * If true, only consider items that intersect the point
+ * @name IInterfaceOptions#boolean
+ * @type Boolean
+ */
+
+/**
+ * Contains interaction related functions
+ * @namespace Chart.Interaction
+ */
+var core_interaction = {
+ // Helper function for different modes
+ modes: {
+ single: function(chart, e) {
+ var position = getRelativePosition(e, chart);
+ var elements = [];
+
+ parseVisibleItems(chart, function(element) {
+ if (element.inRange(position.x, position.y)) {
+ elements.push(element);
+ return elements;
+ }
+ });
+
+ return elements.slice(0, 1);
+ },
+
+ /**
+ * @function Chart.Interaction.modes.label
+ * @deprecated since version 2.4.0
+ * @todo remove at version 3
+ * @private
+ */
+ label: indexMode,
+
+ /**
+ * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something
+ * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item
+ * @function Chart.Interaction.modes.index
+ * @since v2.4.0
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @param {IInteractionOptions} options - options to use during interaction
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ index: indexMode,
+
+ /**
+ * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something
+ * If the options.intersect is false, we find the nearest item and return the items in that dataset
+ * @function Chart.Interaction.modes.dataset
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @param {IInteractionOptions} options - options to use during interaction
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ dataset: function(chart, e, options) {
+ var position = getRelativePosition(e, chart);
+ options.axis = options.axis || 'xy';
+ var distanceMetric = getDistanceMetricForAxis(options.axis);
+ var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);
+
+ if (items.length > 0) {
+ items = chart.getDatasetMeta(items[0]._datasetIndex).data;
+ }
+
+ return items;
+ },
+
+ /**
+ * @function Chart.Interaction.modes.x-axis
+ * @deprecated since version 2.4.0. Use index mode and intersect == true
+ * @todo remove at version 3
+ * @private
+ */
+ 'x-axis': function(chart, e) {
+ return indexMode(chart, e, {intersect: false});
+ },
+
+ /**
+ * Point mode returns all elements that hit test based on the event position
+ * of the event
+ * @function Chart.Interaction.modes.intersect
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ point: function(chart, e) {
+ var position = getRelativePosition(e, chart);
+ return getIntersectItems(chart, position);
+ },
+
+ /**
+ * nearest mode returns the element closest to the point
+ * @function Chart.Interaction.modes.intersect
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @param {IInteractionOptions} options - options to use
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ nearest: function(chart, e, options) {
+ var position = getRelativePosition(e, chart);
+ options.axis = options.axis || 'xy';
+ var distanceMetric = getDistanceMetricForAxis(options.axis);
+ return getNearestItems(chart, position, options.intersect, distanceMetric);
+ },
+
+ /**
+ * x mode returns the elements that hit-test at the current x coordinate
+ * @function Chart.Interaction.modes.x
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @param {IInteractionOptions} options - options to use
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ x: function(chart, e, options) {
+ var position = getRelativePosition(e, chart);
+ var items = [];
+ var intersectsItem = false;
+
+ parseVisibleItems(chart, function(element) {
+ if (element.inXRange(position.x)) {
+ items.push(element);
+ }
+
+ if (element.inRange(position.x, position.y)) {
+ intersectsItem = true;
+ }
+ });
+
+ // If we want to trigger on an intersect and we don't have any items
+ // that intersect the position, return nothing
+ if (options.intersect && !intersectsItem) {
+ items = [];
+ }
+ return items;
+ },
+
+ /**
+ * y mode returns the elements that hit-test at the current y coordinate
+ * @function Chart.Interaction.modes.y
+ * @param {Chart} chart - the chart we are returning items from
+ * @param {Event} e - the event we are find things at
+ * @param {IInteractionOptions} options - options to use
+ * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned
+ */
+ y: function(chart, e, options) {
+ var position = getRelativePosition(e, chart);
+ var items = [];
+ var intersectsItem = false;
+
+ parseVisibleItems(chart, function(element) {
+ if (element.inYRange(position.y)) {
+ items.push(element);
+ }
+
+ if (element.inRange(position.x, position.y)) {
+ intersectsItem = true;
+ }
+ });
+
+ // If we want to trigger on an intersect and we don't have any items
+ // that intersect the position, return nothing
+ if (options.intersect && !intersectsItem) {
+ items = [];
+ }
+ return items;
+ }
+ }
+};
+
+var extend = helpers$1.extend;
+
+function filterByPosition(array, position) {
+ return helpers$1.where(array, function(v) {
+ return v.pos === position;
+ });
+}
+
+function sortByWeight(array, reverse) {
+ return array.sort(function(a, b) {
+ var v0 = reverse ? b : a;
+ var v1 = reverse ? a : b;
+ return v0.weight === v1.weight ?
+ v0.index - v1.index :
+ v0.weight - v1.weight;
+ });
+}
+
+function wrapBoxes(boxes) {
+ var layoutBoxes = [];
+ var i, ilen, box;
+
+ for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {
+ box = boxes[i];
+ layoutBoxes.push({
+ index: i,
+ box: box,
+ pos: box.position,
+ horizontal: box.isHorizontal(),
+ weight: box.weight
+ });
+ }
+ return layoutBoxes;
+}
+
+function setLayoutDims(layouts, params) {
+ var i, ilen, layout;
+ for (i = 0, ilen = layouts.length; i < ilen; ++i) {
+ layout = layouts[i];
+ // store width used instead of chartArea.w in fitBoxes
+ layout.width = layout.horizontal
+ ? layout.box.fullWidth && params.availableWidth
+ : params.vBoxMaxWidth;
+ // store height used instead of chartArea.h in fitBoxes
+ layout.height = layout.horizontal && params.hBoxMaxHeight;
+ }
+}
+
+function buildLayoutBoxes(boxes) {
+ var layoutBoxes = wrapBoxes(boxes);
+ var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);
+ var right = sortByWeight(filterByPosition(layoutBoxes, 'right'));
+ var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);
+ var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));
+
+ return {
+ leftAndTop: left.concat(top),
+ rightAndBottom: right.concat(bottom),
+ chartArea: filterByPosition(layoutBoxes, 'chartArea'),
+ vertical: left.concat(right),
+ horizontal: top.concat(bottom)
+ };
+}
+
+function getCombinedMax(maxPadding, chartArea, a, b) {
+ return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);
+}
+
+function updateDims(chartArea, params, layout) {
+ var box = layout.box;
+ var maxPadding = chartArea.maxPadding;
+ var newWidth, newHeight;
+
+ if (layout.size) {
+ // this layout was already counted for, lets first reduce old size
+ chartArea[layout.pos] -= layout.size;
+ }
+ layout.size = layout.horizontal ? box.height : box.width;
+ chartArea[layout.pos] += layout.size;
+
+ if (box.getPadding) {
+ var boxPadding = box.getPadding();
+ maxPadding.top = Math.max(maxPadding.top, boxPadding.top);
+ maxPadding.left = Math.max(maxPadding.left, boxPadding.left);
+ maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);
+ maxPadding.right = Math.max(maxPadding.right, boxPadding.right);
+ }
+
+ newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');
+ newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');
+
+ if (newWidth !== chartArea.w || newHeight !== chartArea.h) {
+ chartArea.w = newWidth;
+ chartArea.h = newHeight;
+
+ // return true if chart area changed in layout's direction
+ return layout.horizontal ? newWidth !== chartArea.w : newHeight !== chartArea.h;
+ }
+}
+
+function handleMaxPadding(chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function updatePos(pos) {
+ var change = Math.max(maxPadding[pos] - chartArea[pos], 0);
+ chartArea[pos] += change;
+ return change;
+ }
+ chartArea.y += updatePos('top');
+ chartArea.x += updatePos('left');
+ updatePos('right');
+ updatePos('bottom');
+}
+
+function getMargins(horizontal, chartArea) {
+ var maxPadding = chartArea.maxPadding;
+
+ function marginForPositions(positions) {
+ var margin = {left: 0, top: 0, right: 0, bottom: 0};
+ positions.forEach(function(pos) {
+ margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);
+ });
+ return margin;
+ }
+
+ return horizontal
+ ? marginForPositions(['left', 'right'])
+ : marginForPositions(['top', 'bottom']);
+}
+
+function fitBoxes(boxes, chartArea, params) {
+ var refitBoxes = [];
+ var i, ilen, layout, box, refit, changed;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+
+ box.update(
+ layout.width || chartArea.w,
+ layout.height || chartArea.h,
+ getMargins(layout.horizontal, chartArea)
+ );
+ if (updateDims(chartArea, params, layout)) {
+ changed = true;
+ if (refitBoxes.length) {
+ // Dimensions changed and there were non full width boxes before this
+ // -> we have to refit those
+ refit = true;
+ }
+ }
+ if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case
+ refitBoxes.push(layout);
+ }
+ }
+
+ return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;
+}
+
+function placeBoxes(boxes, chartArea, params) {
+ var userPadding = params.padding;
+ var x = chartArea.x;
+ var y = chartArea.y;
+ var i, ilen, layout, box;
+
+ for (i = 0, ilen = boxes.length; i < ilen; ++i) {
+ layout = boxes[i];
+ box = layout.box;
+ if (layout.horizontal) {
+ box.left = box.fullWidth ? userPadding.left : chartArea.left;
+ box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;
+ box.top = y;
+ box.bottom = y + box.height;
+ box.width = box.right - box.left;
+ y = box.bottom;
+ } else {
+ box.left = x;
+ box.right = x + box.width;
+ box.top = chartArea.top;
+ box.bottom = chartArea.top + chartArea.h;
+ box.height = box.bottom - box.top;
+ x = box.right;
+ }
+ }
+
+ chartArea.x = x;
+ chartArea.y = y;
+}
+
+core_defaults._set('global', {
+ layout: {
+ padding: {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0
+ }
+ }
+});
+
+/**
+ * @interface ILayoutItem
+ * @prop {string} position - The position of the item in the chart layout. Possible values are
+ * 'left', 'top', 'right', 'bottom', and 'chartArea'
+ * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area
+ * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down
+ * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)
+ * @prop {function} update - Takes two parameters: width and height. Returns size of item
+ * @prop {function} getPadding - Returns an object with padding on the edges
+ * @prop {number} width - Width of item. Must be valid after update()
+ * @prop {number} height - Height of item. Must be valid after update()
+ * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update
+ * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update
+ * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update
+ * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update
+ */
+
+// The layout service is very self explanatory. It's responsible for the layout within a chart.
+// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need
+// It is this service's responsibility of carrying out that layout.
+var core_layouts = {
+ defaults: {},
+
+ /**
+ * Register a box to a chart.
+ * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.
+ * @param {Chart} chart - the chart to use
+ * @param {ILayoutItem} item - the item to add to be layed out
+ */
+ addBox: function(chart, item) {
+ if (!chart.boxes) {
+ chart.boxes = [];
+ }
+
+ // initialize item with default values
+ item.fullWidth = item.fullWidth || false;
+ item.position = item.position || 'top';
+ item.weight = item.weight || 0;
+ item._layers = item._layers || function() {
+ return [{
+ z: 0,
+ draw: function() {
+ item.draw.apply(item, arguments);
+ }
+ }];
+ };
+
+ chart.boxes.push(item);
+ },
+
+ /**
+ * Remove a layoutItem from a chart
+ * @param {Chart} chart - the chart to remove the box from
+ * @param {ILayoutItem} layoutItem - the item to remove from the layout
+ */
+ removeBox: function(chart, layoutItem) {
+ var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;
+ if (index !== -1) {
+ chart.boxes.splice(index, 1);
+ }
+ },
+
+ /**
+ * Sets (or updates) options on the given `item`.
+ * @param {Chart} chart - the chart in which the item lives (or will be added to)
+ * @param {ILayoutItem} item - the item to configure with the given options
+ * @param {object} options - the new item options.
+ */
+ configure: function(chart, item, options) {
+ var props = ['fullWidth', 'position', 'weight'];
+ var ilen = props.length;
+ var i = 0;
+ var prop;
+
+ for (; i < ilen; ++i) {
+ prop = props[i];
+ if (options.hasOwnProperty(prop)) {
+ item[prop] = options[prop];
+ }
+ }
+ },
+
+ /**
+ * Fits boxes of the given chart into the given size by having each box measure itself
+ * then running a fitting algorithm
+ * @param {Chart} chart - the chart
+ * @param {number} width - the width to fit into
+ * @param {number} height - the height to fit into
+ */
+ update: function(chart, width, height) {
+ if (!chart) {
+ return;
+ }
+
+ var layoutOptions = chart.options.layout || {};
+ var padding = helpers$1.options.toPadding(layoutOptions.padding);
+
+ var availableWidth = width - padding.width;
+ var availableHeight = height - padding.height;
+ var boxes = buildLayoutBoxes(chart.boxes);
+ var verticalBoxes = boxes.vertical;
+ var horizontalBoxes = boxes.horizontal;
+
+ // Essentially we now have any number of boxes on each of the 4 sides.
+ // Our canvas looks like the following.
+ // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and
+ // B1 is the bottom axis
+ // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays
+ // These locations are single-box locations only, when trying to register a chartArea location that is already taken,
+ // an error will be thrown.
+ //
+ // |----------------------------------------------------|
+ // | T1 (Full Width) |
+ // |----------------------------------------------------|
+ // | | | T2 | |
+ // | |----|-------------------------------------|----|
+ // | | | C1 | | C2 | |
+ // | | |----| |----| |
+ // | | | | |
+ // | L1 | L2 | ChartArea (C0) | R1 |
+ // | | | | |
+ // | | |----| |----| |
+ // | | | C3 | | C4 | |
+ // | |----|-------------------------------------|----|
+ // | | | B1 | |
+ // |----------------------------------------------------|
+ // | B2 (Full Width) |
+ // |----------------------------------------------------|
+ //
+
+ var params = Object.freeze({
+ outerWidth: width,
+ outerHeight: height,
+ padding: padding,
+ availableWidth: availableWidth,
+ vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,
+ hBoxMaxHeight: availableHeight / 2
+ });
+ var chartArea = extend({
+ maxPadding: extend({}, padding),
+ w: availableWidth,
+ h: availableHeight,
+ x: padding.left,
+ y: padding.top
+ }, padding);
+
+ setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);
+
+ // First fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
+
+ // Then fit horizontal boxes
+ if (fitBoxes(horizontalBoxes, chartArea, params)) {
+ // if the area changed, re-fit vertical boxes
+ fitBoxes(verticalBoxes, chartArea, params);
+ }
+
+ handleMaxPadding(chartArea);
+
+ // Finally place the boxes to correct coordinates
+ placeBoxes(boxes.leftAndTop, chartArea, params);
+
+ // Move to opposite side of chart
+ chartArea.x += chartArea.w;
+ chartArea.y += chartArea.h;
+
+ placeBoxes(boxes.rightAndBottom, chartArea, params);
+
+ chart.chartArea = {
+ left: chartArea.left,
+ top: chartArea.top,
+ right: chartArea.left + chartArea.w,
+ bottom: chartArea.top + chartArea.h
+ };
+
+ // Finally update boxes in chartArea (radial scale for example)
+ helpers$1.each(boxes.chartArea, function(layout) {
+ var box = layout.box;
+ extend(box, chart.chartArea);
+ box.update(chartArea.w, chartArea.h);
+ });
+ }
+};
+
+/**
+ * Platform fallback implementation (minimal).
+ * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939
+ */
+
+var platform_basic = {
+ acquireContext: function(item) {
+ if (item && item.canvas) {
+ // Support for any object associated to a canvas (including a context2d)
+ item = item.canvas;
+ }
+
+ return item && item.getContext('2d') || null;
+ }
+};
+
+var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n";
+
+var platform_dom$1 = /*#__PURE__*/Object.freeze({
+__proto__: null,
+'default': platform_dom
+});
+
+var stylesheet = getCjsExportFromNamespace(platform_dom$1);
+
+var EXPANDO_KEY = '$chartjs';
+var CSS_PREFIX = 'chartjs-';
+var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';
+var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';
+var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';
+var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];
+
+/**
+ * DOM event types -> Chart.js event types.
+ * Note: only events with different types are mapped.
+ * @see https://developer.mozilla.org/en-US/docs/Web/Events
+ */
+var EVENT_TYPES = {
+ touchstart: 'mousedown',
+ touchmove: 'mousemove',
+ touchend: 'mouseup',
+ pointerenter: 'mouseenter',
+ pointerdown: 'mousedown',
+ pointermove: 'mousemove',
+ pointerup: 'mouseup',
+ pointerleave: 'mouseout',
+ pointerout: 'mouseout'
+};
+
+/**
+ * The "used" size is the final value of a dimension property after all calculations have
+ * been performed. This method uses the computed style of `element` but returns undefined
+ * if the computed style is not expressed in pixels. That can happen in some cases where
+ * `element` has a size relative to its parent and this last one is not yet displayed,
+ * for example because of `display: none` on a parent node.
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
+ * @returns {number} Size in pixels or undefined if unknown.
+ */
+function readUsedSize(element, property) {
+ var value = helpers$1.getStyle(element, property);
+ var matches = value && value.match(/^(\d+)(\.\d+)?px$/);
+ return matches ? Number(matches[1]) : undefined;
+}
+
+/**
+ * Initializes the canvas style and render size without modifying the canvas display size,
+ * since responsiveness is handled by the controller.resize() method. The config is used
+ * to determine the aspect ratio to apply in case no explicit height has been specified.
+ */
+function initCanvas(canvas, config) {
+ var style = canvas.style;
+
+ // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it
+ // returns null or '' if no explicit value has been set to the canvas attribute.
+ var renderHeight = canvas.getAttribute('height');
+ var renderWidth = canvas.getAttribute('width');
+
+ // Chart.js modifies some canvas values that we want to restore on destroy
+ canvas[EXPANDO_KEY] = {
+ initial: {
+ height: renderHeight,
+ width: renderWidth,
+ style: {
+ display: style.display,
+ height: style.height,
+ width: style.width
+ }
+ }
+ };
+
+ // Force canvas to display as block to avoid extra space caused by inline
+ // elements, which would interfere with the responsive resize process.
+ // https://github.com/chartjs/Chart.js/issues/2538
+ style.display = style.display || 'block';
+
+ if (renderWidth === null || renderWidth === '') {
+ var displayWidth = readUsedSize(canvas, 'width');
+ if (displayWidth !== undefined) {
+ canvas.width = displayWidth;
+ }
+ }
+
+ if (renderHeight === null || renderHeight === '') {
+ if (canvas.style.height === '') {
+ // If no explicit render height and style height, let's apply the aspect ratio,
+ // which one can be specified by the user but also by charts as default option
+ // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.
+ canvas.height = canvas.width / (config.options.aspectRatio || 2);
+ } else {
+ var displayHeight = readUsedSize(canvas, 'height');
+ if (displayWidth !== undefined) {
+ canvas.height = displayHeight;
+ }
+ }
+ }
+
+ return canvas;
+}
+
+/**
+ * Detects support for options object argument in addEventListener.
+ * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support
+ * @private
+ */
+var supportsEventListenerOptions = (function() {
+ var supports = false;
+ try {
+ var options = Object.defineProperty({}, 'passive', {
+ // eslint-disable-next-line getter-return
+ get: function() {
+ supports = true;
+ }
+ });
+ window.addEventListener('e', null, options);
+ } catch (e) {
+ // continue regardless of error
+ }
+ return supports;
+}());
+
+// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.
+// https://github.com/chartjs/Chart.js/issues/4287
+var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;
+
+function addListener(node, type, listener) {
+ node.addEventListener(type, listener, eventListenerOptions);
+}
+
+function removeListener(node, type, listener) {
+ node.removeEventListener(type, listener, eventListenerOptions);
+}
+
+function createEvent(type, chart, x, y, nativeEvent) {
+ return {
+ type: type,
+ chart: chart,
+ native: nativeEvent || null,
+ x: x !== undefined ? x : null,
+ y: y !== undefined ? y : null,
+ };
+}
+
+function fromNativeEvent(event, chart) {
+ var type = EVENT_TYPES[event.type] || event.type;
+ var pos = helpers$1.getRelativePosition(event, chart);
+ return createEvent(type, chart, pos.x, pos.y, event);
+}
+
+function throttled(fn, thisArg) {
+ var ticking = false;
+ var args = [];
+
+ return function() {
+ args = Array.prototype.slice.call(arguments);
+ thisArg = thisArg || this;
+
+ if (!ticking) {
+ ticking = true;
+ helpers$1.requestAnimFrame.call(window, function() {
+ ticking = false;
+ fn.apply(thisArg, args);
+ });
+ }
+ };
+}
+
+function createDiv(cls) {
+ var el = document.createElement('div');
+ el.className = cls || '';
+ return el;
+}
+
+// Implementation based on https://github.com/marcj/css-element-queries
+function createResizer(handler) {
+ var maxSize = 1000000;
+
+ // NOTE(SB) Don't use innerHTML because it could be considered unsafe.
+ // https://github.com/chartjs/Chart.js/issues/5902
+ var resizer = createDiv(CSS_SIZE_MONITOR);
+ var expand = createDiv(CSS_SIZE_MONITOR + '-expand');
+ var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');
+
+ expand.appendChild(createDiv());
+ shrink.appendChild(createDiv());
+
+ resizer.appendChild(expand);
+ resizer.appendChild(shrink);
+ resizer._reset = function() {
+ expand.scrollLeft = maxSize;
+ expand.scrollTop = maxSize;
+ shrink.scrollLeft = maxSize;
+ shrink.scrollTop = maxSize;
+ };
+
+ var onScroll = function() {
+ resizer._reset();
+ handler();
+ };
+
+ addListener(expand, 'scroll', onScroll.bind(expand, 'expand'));
+ addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));
+
+ return resizer;
+}
+
+// https://davidwalsh.name/detect-node-insertion
+function watchForRender(node, handler) {
+ var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});
+ var proxy = expando.renderProxy = function(e) {
+ if (e.animationName === CSS_RENDER_ANIMATION) {
+ handler();
+ }
+ };
+
+ helpers$1.each(ANIMATION_START_EVENTS, function(type) {
+ addListener(node, type, proxy);
+ });
+
+ // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class
+ // is removed then added back immediately (same animation frame?). Accessing the
+ // `offsetParent` property will force a reflow and re-evaluate the CSS animation.
+ // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics
+ // https://github.com/chartjs/Chart.js/issues/4737
+ expando.reflow = !!node.offsetParent;
+
+ node.classList.add(CSS_RENDER_MONITOR);
+}
+
+function unwatchForRender(node) {
+ var expando = node[EXPANDO_KEY] || {};
+ var proxy = expando.renderProxy;
+
+ if (proxy) {
+ helpers$1.each(ANIMATION_START_EVENTS, function(type) {
+ removeListener(node, type, proxy);
+ });
+
+ delete expando.renderProxy;
+ }
+
+ node.classList.remove(CSS_RENDER_MONITOR);
+}
+
+function addResizeListener(node, listener, chart) {
+ var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});
+
+ // Let's keep track of this added resizer and thus avoid DOM query when removing it.
+ var resizer = expando.resizer = createResizer(throttled(function() {
+ if (expando.resizer) {
+ var container = chart.options.maintainAspectRatio && node.parentNode;
+ var w = container ? container.clientWidth : 0;
+ listener(createEvent('resize', chart));
+ if (container && container.clientWidth < w && chart.canvas) {
+ // If the container size shrank during chart resize, let's assume
+ // scrollbar appeared. So we resize again with the scrollbar visible -
+ // effectively making chart smaller and the scrollbar hidden again.
+ // Because we are inside `throttled`, and currently `ticking`, scroll
+ // events are ignored during this whole 2 resize process.
+ // If we assumed wrong and something else happened, we are resizing
+ // twice in a frame (potential performance issue)
+ listener(createEvent('resize', chart));
+ }
+ }
+ }));
+
+ // The resizer needs to be attached to the node parent, so we first need to be
+ // sure that `node` is attached to the DOM before injecting the resizer element.
+ watchForRender(node, function() {
+ if (expando.resizer) {
+ var container = node.parentNode;
+ if (container && container !== resizer.parentNode) {
+ container.insertBefore(resizer, container.firstChild);
+ }
+
+ // The container size might have changed, let's reset the resizer state.
+ resizer._reset();
+ }
+ });
+}
+
+function removeResizeListener(node) {
+ var expando = node[EXPANDO_KEY] || {};
+ var resizer = expando.resizer;
+
+ delete expando.resizer;
+ unwatchForRender(node);
+
+ if (resizer && resizer.parentNode) {
+ resizer.parentNode.removeChild(resizer);
+ }
+}
+
+/**
+ * Injects CSS styles inline if the styles are not already present.
+ * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the <style>.
+ * @param {string} css - the CSS to be injected.
+ */
+function injectCSS(rootNode, css) {
+ // https://stackoverflow.com/q/3922139
+ var expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});
+ if (!expando.containsStyles) {
+ expando.containsStyles = true;
+ css = '/* Chart.js */\n' + css;
+ var style = document.createElement('style');
+ style.setAttribute('type', 'text/css');
+ style.appendChild(document.createTextNode(css));
+ rootNode.appendChild(style);
+ }
+}
+
+var platform_dom$2 = {
+ /**
+ * When `true`, prevents the automatic injection of the stylesheet required to
+ * correctly detect when the chart is added to the DOM and then resized. This
+ * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`)
+ * to be manually imported to make this library compatible with any CSP.
+ * See https://github.com/chartjs/Chart.js/issues/5208
+ */
+ disableCSSInjection: false,
+
+ /**
+ * This property holds whether this platform is enabled for the current environment.
+ * Currently used by platform.js to select the proper implementation.
+ * @private
+ */
+ _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',
+
+ /**
+ * Initializes resources that depend on platform options.
+ * @param {HTMLCanvasElement} canvas - The Canvas element.
+ * @private
+ */
+ _ensureLoaded: function(canvas) {
+ if (!this.disableCSSInjection) {
+ // If the canvas is in a shadow DOM, then the styles must also be inserted
+ // into the same shadow DOM.
+ // https://github.com/chartjs/Chart.js/issues/5763
+ var root = canvas.getRootNode ? canvas.getRootNode() : document;
+ var targetNode = root.host ? root : document.head;
+ injectCSS(targetNode, stylesheet);
+ }
+ },
+
+ acquireContext: function(item, config) {
+ if (typeof item === 'string') {
+ item = document.getElementById(item);
+ } else if (item.length) {
+ // Support for array based queries (such as jQuery)
+ item = item[0];
+ }
+
+ if (item && item.canvas) {
+ // Support for any object associated to a canvas (including a context2d)
+ item = item.canvas;
+ }
+
+ // To prevent canvas fingerprinting, some add-ons undefine the getContext
+ // method, for example: https://github.com/kkapsner/CanvasBlocker
+ // https://github.com/chartjs/Chart.js/issues/2807
+ var context = item && item.getContext && item.getContext('2d');
+
+ // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is
+ // inside an iframe or when running in a protected environment. We could guess the
+ // types from their toString() value but let's keep things flexible and assume it's
+ // a sufficient condition if the item has a context2D which has item as `canvas`.
+ // https://github.com/chartjs/Chart.js/issues/3887
+ // https://github.com/chartjs/Chart.js/issues/4102
+ // https://github.com/chartjs/Chart.js/issues/4152
+ if (context && context.canvas === item) {
+ // Load platform resources on first chart creation, to make it possible to
+ // import the library before setting platform options.
+ this._ensureLoaded(item);
+ initCanvas(item, config);
+ return context;
+ }
+
+ return null;
+ },
+
+ releaseContext: function(context) {
+ var canvas = context.canvas;
+ if (!canvas[EXPANDO_KEY]) {
+ return;
+ }
+
+ var initial = canvas[EXPANDO_KEY].initial;
+ ['height', 'width'].forEach(function(prop) {
+ var value = initial[prop];
+ if (helpers$1.isNullOrUndef(value)) {
+ canvas.removeAttribute(prop);
+ } else {
+ canvas.setAttribute(prop, value);
+ }
+ });
+
+ helpers$1.each(initial.style || {}, function(value, key) {
+ canvas.style[key] = value;
+ });
+
+ // The canvas render size might have been changed (and thus the state stack discarded),
+ // we can't use save() and restore() to restore the initial state. So make sure that at
+ // least the canvas context is reset to the default state by setting the canvas width.
+ // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html
+ // eslint-disable-next-line no-self-assign
+ canvas.width = canvas.width;
+
+ delete canvas[EXPANDO_KEY];
+ },
+
+ addEventListener: function(chart, type, listener) {
+ var canvas = chart.canvas;
+ if (type === 'resize') {
+ // Note: the resize event is not supported on all browsers.
+ addResizeListener(canvas, listener, chart);
+ return;
+ }
+
+ var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});
+ var proxies = expando.proxies || (expando.proxies = {});
+ var proxy = proxies[chart.id + '_' + type] = function(event) {
+ listener(fromNativeEvent(event, chart));
+ };
+
+ addListener(canvas, type, proxy);
+ },
+
+ removeEventListener: function(chart, type, listener) {
+ var canvas = chart.canvas;
+ if (type === 'resize') {
+ // Note: the resize event is not supported on all browsers.
+ removeResizeListener(canvas);
+ return;
+ }
+
+ var expando = listener[EXPANDO_KEY] || {};
+ var proxies = expando.proxies || {};
+ var proxy = proxies[chart.id + '_' + type];
+ if (!proxy) {
+ return;
+ }
+
+ removeListener(canvas, type, proxy);
+ }
+};
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use EventTarget.addEventListener instead.
+ * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
+ * @function Chart.helpers.addEvent
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers$1.addEvent = addListener;
+
+/**
+ * Provided for backward compatibility, use EventTarget.removeEventListener instead.
+ * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener
+ * @function Chart.helpers.removeEvent
+ * @deprecated since version 2.7.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers$1.removeEvent = removeListener;
+
+// @TODO Make possible to select another platform at build time.
+var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;
+
+/**
+ * @namespace Chart.platform
+ * @see https://chartjs.gitbooks.io/proposals/content/Platform.html
+ * @since 2.4.0
+ */
+var platform = helpers$1.extend({
+ /**
+ * @since 2.7.0
+ */
+ initialize: function() {},
+
+ /**
+ * Called at chart construction time, returns a context2d instance implementing
+ * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.
+ * @param {*} item - The native item from which to acquire context (platform specific)
+ * @param {object} options - The chart options
+ * @returns {CanvasRenderingContext2D} context2d instance
+ */
+ acquireContext: function() {},
+
+ /**
+ * Called at chart destruction time, releases any resources associated to the context
+ * previously returned by the acquireContext() method.
+ * @param {CanvasRenderingContext2D} context - The context2d instance
+ * @returns {boolean} true if the method succeeded, else false
+ */
+ releaseContext: function() {},
+
+ /**
+ * Registers the specified listener on the given chart.
+ * @param {Chart} chart - Chart from which to listen for event
+ * @param {string} type - The ({@link IEvent}) type to listen for
+ * @param {function} listener - Receives a notification (an object that implements
+ * the {@link IEvent} interface) when an event of the specified type occurs.
+ */
+ addEventListener: function() {},
+
+ /**
+ * Removes the specified listener previously registered with addEventListener.
+ * @param {Chart} chart - Chart from which to remove the listener
+ * @param {string} type - The ({@link IEvent}) type to remove
+ * @param {function} listener - The listener function to remove from the event target.
+ */
+ removeEventListener: function() {}
+
+}, implementation);
+
+core_defaults._set('global', {
+ plugins: {}
+});
+
+/**
+ * The plugin service singleton
+ * @namespace Chart.plugins
+ * @since 2.1.0
+ */
+var core_plugins = {
+ /**
+ * Globally registered plugins.
+ * @private
+ */
+ _plugins: [],
+
+ /**
+ * This identifier is used to invalidate the descriptors cache attached to each chart
+ * when a global plugin is registered or unregistered. In this case, the cache ID is
+ * incremented and descriptors are regenerated during following API calls.
+ * @private
+ */
+ _cacheId: 0,
+
+ /**
+ * Registers the given plugin(s) if not already registered.
+ * @param {IPlugin[]|IPlugin} plugins plugin instance(s).
+ */
+ register: function(plugins) {
+ var p = this._plugins;
+ ([]).concat(plugins).forEach(function(plugin) {
+ if (p.indexOf(plugin) === -1) {
+ p.push(plugin);
+ }
+ });
+
+ this._cacheId++;
+ },
+
+ /**
+ * Unregisters the given plugin(s) only if registered.
+ * @param {IPlugin[]|IPlugin} plugins plugin instance(s).
+ */
+ unregister: function(plugins) {
+ var p = this._plugins;
+ ([]).concat(plugins).forEach(function(plugin) {
+ var idx = p.indexOf(plugin);
+ if (idx !== -1) {
+ p.splice(idx, 1);
+ }
+ });
+
+ this._cacheId++;
+ },
+
+ /**
+ * Remove all registered plugins.
+ * @since 2.1.5
+ */
+ clear: function() {
+ this._plugins = [];
+ this._cacheId++;
+ },
+
+ /**
+ * Returns the number of registered plugins?
+ * @returns {number}
+ * @since 2.1.5
+ */
+ count: function() {
+ return this._plugins.length;
+ },
+
+ /**
+ * Returns all registered plugin instances.
+ * @returns {IPlugin[]} array of plugin objects.
+ * @since 2.1.5
+ */
+ getAll: function() {
+ return this._plugins;
+ },
+
+ /**
+ * Calls enabled plugins for `chart` on the specified hook and with the given args.
+ * This method immediately returns as soon as a plugin explicitly returns false. The
+ * returned value can be used, for instance, to interrupt the current action.
+ * @param {Chart} chart - The chart instance for which plugins should be called.
+ * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').
+ * @param {Array} [args] - Extra arguments to apply to the hook call.
+ * @returns {boolean} false if any of the plugins return false, else returns true.
+ */
+ notify: function(chart, hook, args) {
+ var descriptors = this.descriptors(chart);
+ var ilen = descriptors.length;
+ var i, descriptor, plugin, params, method;
+
+ for (i = 0; i < ilen; ++i) {
+ descriptor = descriptors[i];
+ plugin = descriptor.plugin;
+ method = plugin[hook];
+ if (typeof method === 'function') {
+ params = [chart].concat(args || []);
+ params.push(descriptor.options);
+ if (method.apply(plugin, params) === false) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ },
+
+ /**
+ * Returns descriptors of enabled plugins for the given chart.
+ * @returns {object[]} [{ plugin, options }]
+ * @private
+ */
+ descriptors: function(chart) {
+ var cache = chart.$plugins || (chart.$plugins = {});
+ if (cache.id === this._cacheId) {
+ return cache.descriptors;
+ }
+
+ var plugins = [];
+ var descriptors = [];
+ var config = (chart && chart.config) || {};
+ var options = (config.options && config.options.plugins) || {};
+
+ this._plugins.concat(config.plugins || []).forEach(function(plugin) {
+ var idx = plugins.indexOf(plugin);
+ if (idx !== -1) {
+ return;
+ }
+
+ var id = plugin.id;
+ var opts = options[id];
+ if (opts === false) {
+ return;
+ }
+
+ if (opts === true) {
+ opts = helpers$1.clone(core_defaults.global.plugins[id]);
+ }
+
+ plugins.push(plugin);
+ descriptors.push({
+ plugin: plugin,
+ options: opts || {}
+ });
+ });
+
+ cache.descriptors = descriptors;
+ cache.id = this._cacheId;
+ return descriptors;
+ },
+
+ /**
+ * Invalidates cache for the given chart: descriptors hold a reference on plugin option,
+ * but in some cases, this reference can be changed by the user when updating options.
+ * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167
+ * @private
+ */
+ _invalidate: function(chart) {
+ delete chart.$plugins;
+ }
+};
+
+var core_scaleService = {
+ // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then
+ // use the new chart options to grab the correct scale
+ constructors: {},
+ // Use a registration function so that we can move to an ES6 map when we no longer need to support
+ // old browsers
+
+ // Scale config defaults
+ defaults: {},
+ registerScaleType: function(type, scaleConstructor, scaleDefaults) {
+ this.constructors[type] = scaleConstructor;
+ this.defaults[type] = helpers$1.clone(scaleDefaults);
+ },
+ getScaleConstructor: function(type) {
+ return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;
+ },
+ getScaleDefaults: function(type) {
+ // Return the scale defaults merged with the global settings so that we always use the latest ones
+ return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {};
+ },
+ updateScaleDefaults: function(type, additions) {
+ var me = this;
+ if (me.defaults.hasOwnProperty(type)) {
+ me.defaults[type] = helpers$1.extend(me.defaults[type], additions);
+ }
+ },
+ addScalesToLayout: function(chart) {
+ // Adds each scale to the chart.boxes array to be sized accordingly
+ helpers$1.each(chart.scales, function(scale) {
+ // Set ILayoutItem parameters for backwards compatibility
+ scale.fullWidth = scale.options.fullWidth;
+ scale.position = scale.options.position;
+ scale.weight = scale.options.weight;
+ core_layouts.addBox(chart, scale);
+ });
+ }
+};
+
+var valueOrDefault$8 = helpers$1.valueOrDefault;
+var getRtlHelper = helpers$1.rtl.getRtlAdapter;
+
+core_defaults._set('global', {
+ tooltips: {
+ enabled: true,
+ custom: null,
+ mode: 'nearest',
+ position: 'average',
+ intersect: true,
+ backgroundColor: 'rgba(0,0,0,0.8)',
+ titleFontStyle: 'bold',
+ titleSpacing: 2,
+ titleMarginBottom: 6,
+ titleFontColor: '#fff',
+ titleAlign: 'left',
+ bodySpacing: 2,
+ bodyFontColor: '#fff',
+ bodyAlign: 'left',
+ footerFontStyle: 'bold',
+ footerSpacing: 2,
+ footerMarginTop: 6,
+ footerFontColor: '#fff',
+ footerAlign: 'left',
+ yPadding: 6,
+ xPadding: 6,
+ caretPadding: 2,
+ caretSize: 5,
+ cornerRadius: 6,
+ multiKeyBackground: '#fff',
+ displayColors: true,
+ borderColor: 'rgba(0,0,0,0)',
+ borderWidth: 0,
+ callbacks: {
+ // Args are: (tooltipItems, data)
+ beforeTitle: helpers$1.noop,
+ title: function(tooltipItems, data) {
+ var title = '';
+ var labels = data.labels;
+ var labelCount = labels ? labels.length : 0;
+
+ if (tooltipItems.length > 0) {
+ var item = tooltipItems[0];
+ if (item.label) {
+ title = item.label;
+ } else if (item.xLabel) {
+ title = item.xLabel;
+ } else if (labelCount > 0 && item.index < labelCount) {
+ title = labels[item.index];
+ }
+ }
+
+ return title;
+ },
+ afterTitle: helpers$1.noop,
+
+ // Args are: (tooltipItems, data)
+ beforeBody: helpers$1.noop,
+
+ // Args are: (tooltipItem, data)
+ beforeLabel: helpers$1.noop,
+ label: function(tooltipItem, data) {
+ var label = data.datasets[tooltipItem.datasetIndex].label || '';
+
+ if (label) {
+ label += ': ';
+ }
+ if (!helpers$1.isNullOrUndef(tooltipItem.value)) {
+ label += tooltipItem.value;
+ } else {
+ label += tooltipItem.yLabel;
+ }
+ return label;
+ },
+ labelColor: function(tooltipItem, chart) {
+ var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);
+ var activeElement = meta.data[tooltipItem.index];
+ var view = activeElement._view;
+ return {
+ borderColor: view.borderColor,
+ backgroundColor: view.backgroundColor
+ };
+ },
+ labelTextColor: function() {
+ return this._options.bodyFontColor;
+ },
+ afterLabel: helpers$1.noop,
+
+ // Args are: (tooltipItems, data)
+ afterBody: helpers$1.noop,
+
+ // Args are: (tooltipItems, data)
+ beforeFooter: helpers$1.noop,
+ footer: helpers$1.noop,
+ afterFooter: helpers$1.noop
+ }
+ }
+});
+
+var positioners = {
+ /**
+ * Average mode places the tooltip at the average position of the elements shown
+ * @function Chart.Tooltip.positioners.average
+ * @param elements {ChartElement[]} the elements being displayed in the tooltip
+ * @returns {object} tooltip position
+ */
+ average: function(elements) {
+ if (!elements.length) {
+ return false;
+ }
+
+ var i, len;
+ var x = 0;
+ var y = 0;
+ var count = 0;
+
+ for (i = 0, len = elements.length; i < len; ++i) {
+ var el = elements[i];
+ if (el && el.hasValue()) {
+ var pos = el.tooltipPosition();
+ x += pos.x;
+ y += pos.y;
+ ++count;
+ }
+ }
+
+ return {
+ x: x / count,
+ y: y / count
+ };
+ },
+
+ /**
+ * Gets the tooltip position nearest of the item nearest to the event position
+ * @function Chart.Tooltip.positioners.nearest
+ * @param elements {Chart.Element[]} the tooltip elements
+ * @param eventPosition {object} the position of the event in canvas coordinates
+ * @returns {object} the tooltip position
+ */
+ nearest: function(elements, eventPosition) {
+ var x = eventPosition.x;
+ var y = eventPosition.y;
+ var minDistance = Number.POSITIVE_INFINITY;
+ var i, len, nearestElement;
+
+ for (i = 0, len = elements.length; i < len; ++i) {
+ var el = elements[i];
+ if (el && el.hasValue()) {
+ var center = el.getCenterPoint();
+ var d = helpers$1.distanceBetweenPoints(eventPosition, center);
+
+ if (d < minDistance) {
+ minDistance = d;
+ nearestElement = el;
+ }
+ }
+ }
+
+ if (nearestElement) {
+ var tp = nearestElement.tooltipPosition();
+ x = tp.x;
+ y = tp.y;
+ }
+
+ return {
+ x: x,
+ y: y
+ };
+ }
+};
+
+// Helper to push or concat based on if the 2nd parameter is an array or not
+function pushOrConcat(base, toPush) {
+ if (toPush) {
+ if (helpers$1.isArray(toPush)) {
+ // base = base.concat(toPush);
+ Array.prototype.push.apply(base, toPush);
+ } else {
+ base.push(toPush);
+ }
+ }
+
+ return base;
+}
+
+/**
+ * Returns array of strings split by newline
+ * @param {string} value - The value to split by newline.
+ * @returns {string[]} value if newline present - Returned from String split() method
+ * @function
+ */
+function splitNewlines(str) {
+ if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) {
+ return str.split('\n');
+ }
+ return str;
+}
+
+
+/**
+ * Private helper to create a tooltip item model
+ * @param element - the chart element (point, arc, bar) to create the tooltip item for
+ * @return new tooltip item
+ */
+function createTooltipItem(element) {
+ var xScale = element._xScale;
+ var yScale = element._yScale || element._scale; // handle radar || polarArea charts
+ var index = element._index;
+ var datasetIndex = element._datasetIndex;
+ var controller = element._chart.getDatasetMeta(datasetIndex).controller;
+ var indexScale = controller._getIndexScale();
+ var valueScale = controller._getValueScale();
+
+ return {
+ xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',
+ yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',
+ label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',
+ value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',
+ index: index,
+ datasetIndex: datasetIndex,
+ x: element._model.x,
+ y: element._model.y
+ };
+}
+
+/**
+ * Helper to get the reset model for the tooltip
+ * @param tooltipOpts {object} the tooltip options
+ */
+function getBaseModel(tooltipOpts) {
+ var globalDefaults = core_defaults.global;
+
+ return {
+ // Positioning
+ xPadding: tooltipOpts.xPadding,
+ yPadding: tooltipOpts.yPadding,
+ xAlign: tooltipOpts.xAlign,
+ yAlign: tooltipOpts.yAlign,
+
+ // Drawing direction and text direction
+ rtl: tooltipOpts.rtl,
+ textDirection: tooltipOpts.textDirection,
+
+ // Body
+ bodyFontColor: tooltipOpts.bodyFontColor,
+ _bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),
+ _bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),
+ _bodyAlign: tooltipOpts.bodyAlign,
+ bodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),
+ bodySpacing: tooltipOpts.bodySpacing,
+
+ // Title
+ titleFontColor: tooltipOpts.titleFontColor,
+ _titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),
+ _titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),
+ titleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),
+ _titleAlign: tooltipOpts.titleAlign,
+ titleSpacing: tooltipOpts.titleSpacing,
+ titleMarginBottom: tooltipOpts.titleMarginBottom,
+
+ // Footer
+ footerFontColor: tooltipOpts.footerFontColor,
+ _footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),
+ _footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),
+ footerFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),
+ _footerAlign: tooltipOpts.footerAlign,
+ footerSpacing: tooltipOpts.footerSpacing,
+ footerMarginTop: tooltipOpts.footerMarginTop,
+
+ // Appearance
+ caretSize: tooltipOpts.caretSize,
+ cornerRadius: tooltipOpts.cornerRadius,
+ backgroundColor: tooltipOpts.backgroundColor,
+ opacity: 0,
+ legendColorBackground: tooltipOpts.multiKeyBackground,
+ displayColors: tooltipOpts.displayColors,
+ borderColor: tooltipOpts.borderColor,
+ borderWidth: tooltipOpts.borderWidth
+ };
+}
+
+/**
+ * Get the size of the tooltip
+ */
+function getTooltipSize(tooltip, model) {
+ var ctx = tooltip._chart.ctx;
+
+ var height = model.yPadding * 2; // Tooltip Padding
+ var width = 0;
+
+ // Count of all lines in the body
+ var body = model.body;
+ var combinedBodyLength = body.reduce(function(count, bodyItem) {
+ return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;
+ }, 0);
+ combinedBodyLength += model.beforeBody.length + model.afterBody.length;
+
+ var titleLineCount = model.title.length;
+ var footerLineCount = model.footer.length;
+ var titleFontSize = model.titleFontSize;
+ var bodyFontSize = model.bodyFontSize;
+ var footerFontSize = model.footerFontSize;
+
+ height += titleLineCount * titleFontSize; // Title Lines
+ height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing
+ height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin
+ height += combinedBodyLength * bodyFontSize; // Body Lines
+ height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing
+ height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin
+ height += footerLineCount * (footerFontSize); // Footer Lines
+ height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing
+
+ // Title width
+ var widthPadding = 0;
+ var maxLineWidth = function(line) {
+ width = Math.max(width, ctx.measureText(line).width + widthPadding);
+ };
+
+ ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);
+ helpers$1.each(model.title, maxLineWidth);
+
+ // Body width
+ ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);
+ helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth);
+
+ // Body lines may include some extra width due to the color box
+ widthPadding = model.displayColors ? (bodyFontSize + 2) : 0;
+ helpers$1.each(body, function(bodyItem) {
+ helpers$1.each(bodyItem.before, maxLineWidth);
+ helpers$1.each(bodyItem.lines, maxLineWidth);
+ helpers$1.each(bodyItem.after, maxLineWidth);
+ });
+
+ // Reset back to 0
+ widthPadding = 0;
+
+ // Footer width
+ ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);
+ helpers$1.each(model.footer, maxLineWidth);
+
+ // Add padding
+ width += 2 * model.xPadding;
+
+ return {
+ width: width,
+ height: height
+ };
+}
+
+/**
+ * Helper to get the alignment of a tooltip given the size
+ */
+function determineAlignment(tooltip, size) {
+ var model = tooltip._model;
+ var chart = tooltip._chart;
+ var chartArea = tooltip._chart.chartArea;
+ var xAlign = 'center';
+ var yAlign = 'center';
+
+ if (model.y < size.height) {
+ yAlign = 'top';
+ } else if (model.y > (chart.height - size.height)) {
+ yAlign = 'bottom';
+ }
+
+ var lf, rf; // functions to determine left, right alignment
+ var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart
+ var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges
+ var midX = (chartArea.left + chartArea.right) / 2;
+ var midY = (chartArea.top + chartArea.bottom) / 2;
+
+ if (yAlign === 'center') {
+ lf = function(x) {
+ return x <= midX;
+ };
+ rf = function(x) {
+ return x > midX;
+ };
+ } else {
+ lf = function(x) {
+ return x <= (size.width / 2);
+ };
+ rf = function(x) {
+ return x >= (chart.width - (size.width / 2));
+ };
+ }
+
+ olf = function(x) {
+ return x + size.width + model.caretSize + model.caretPadding > chart.width;
+ };
+ orf = function(x) {
+ return x - size.width - model.caretSize - model.caretPadding < 0;
+ };
+ yf = function(y) {
+ return y <= midY ? 'top' : 'bottom';
+ };
+
+ if (lf(model.x)) {
+ xAlign = 'left';
+
+ // Is tooltip too wide and goes over the right side of the chart.?
+ if (olf(model.x)) {
+ xAlign = 'center';
+ yAlign = yf(model.y);
+ }
+ } else if (rf(model.x)) {
+ xAlign = 'right';
+
+ // Is tooltip too wide and goes outside left edge of canvas?
+ if (orf(model.x)) {
+ xAlign = 'center';
+ yAlign = yf(model.y);
+ }
+ }
+
+ var opts = tooltip._options;
+ return {
+ xAlign: opts.xAlign ? opts.xAlign : xAlign,
+ yAlign: opts.yAlign ? opts.yAlign : yAlign
+ };
+}
+
+/**
+ * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment
+ */
+function getBackgroundPoint(vm, size, alignment, chart) {
+ // Background Position
+ var x = vm.x;
+ var y = vm.y;
+
+ var caretSize = vm.caretSize;
+ var caretPadding = vm.caretPadding;
+ var cornerRadius = vm.cornerRadius;
+ var xAlign = alignment.xAlign;
+ var yAlign = alignment.yAlign;
+ var paddingAndSize = caretSize + caretPadding;
+ var radiusAndPadding = cornerRadius + caretPadding;
+
+ if (xAlign === 'right') {
+ x -= size.width;
+ } else if (xAlign === 'center') {
+ x -= (size.width / 2);
+ if (x + size.width > chart.width) {
+ x = chart.width - size.width;
+ }
+ if (x < 0) {
+ x = 0;
+ }
+ }
+
+ if (yAlign === 'top') {
+ y += paddingAndSize;
+ } else if (yAlign === 'bottom') {
+ y -= size.height + paddingAndSize;
+ } else {
+ y -= (size.height / 2);
+ }
+
+ if (yAlign === 'center') {
+ if (xAlign === 'left') {
+ x += paddingAndSize;
+ } else if (xAlign === 'right') {
+ x -= paddingAndSize;
+ }
+ } else if (xAlign === 'left') {
+ x -= radiusAndPadding;
+ } else if (xAlign === 'right') {
+ x += radiusAndPadding;
+ }
+
+ return {
+ x: x,
+ y: y
+ };
+}
+
+function getAlignedX(vm, align) {
+ return align === 'center'
+ ? vm.x + vm.width / 2
+ : align === 'right'
+ ? vm.x + vm.width - vm.xPadding
+ : vm.x + vm.xPadding;
+}
+
+/**
+ * Helper to build before and after body lines
+ */
+function getBeforeAfterBodyLines(callback) {
+ return pushOrConcat([], splitNewlines(callback));
+}
+
+var exports$4 = core_element.extend({
+ initialize: function() {
+ this._model = getBaseModel(this._options);
+ this._lastActive = [];
+ },
+
+ // Get the title
+ // Args are: (tooltipItem, data)
+ getTitle: function() {
+ var me = this;
+ var opts = me._options;
+ var callbacks = opts.callbacks;
+
+ var beforeTitle = callbacks.beforeTitle.apply(me, arguments);
+ var title = callbacks.title.apply(me, arguments);
+ var afterTitle = callbacks.afterTitle.apply(me, arguments);
+
+ var lines = [];
+ lines = pushOrConcat(lines, splitNewlines(beforeTitle));
+ lines = pushOrConcat(lines, splitNewlines(title));
+ lines = pushOrConcat(lines, splitNewlines(afterTitle));
+
+ return lines;
+ },
+
+ // Args are: (tooltipItem, data)
+ getBeforeBody: function() {
+ return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));
+ },
+
+ // Args are: (tooltipItem, data)
+ getBody: function(tooltipItems, data) {
+ var me = this;
+ var callbacks = me._options.callbacks;
+ var bodyItems = [];
+
+ helpers$1.each(tooltipItems, function(tooltipItem) {
+ var bodyItem = {
+ before: [],
+ lines: [],
+ after: []
+ };
+ pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));
+ pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));
+ pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));
+
+ bodyItems.push(bodyItem);
+ });
+
+ return bodyItems;
+ },
+
+ // Args are: (tooltipItem, data)
+ getAfterBody: function() {
+ return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));
+ },
+
+ // Get the footer and beforeFooter and afterFooter lines
+ // Args are: (tooltipItem, data)
+ getFooter: function() {
+ var me = this;
+ var callbacks = me._options.callbacks;
+
+ var beforeFooter = callbacks.beforeFooter.apply(me, arguments);
+ var footer = callbacks.footer.apply(me, arguments);
+ var afterFooter = callbacks.afterFooter.apply(me, arguments);
+
+ var lines = [];
+ lines = pushOrConcat(lines, splitNewlines(beforeFooter));
+ lines = pushOrConcat(lines, splitNewlines(footer));
+ lines = pushOrConcat(lines, splitNewlines(afterFooter));
+
+ return lines;
+ },
+
+ update: function(changed) {
+ var me = this;
+ var opts = me._options;
+
+ // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition
+ // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time
+ // which breaks any animations.
+ var existingModel = me._model;
+ var model = me._model = getBaseModel(opts);
+ var active = me._active;
+
+ var data = me._data;
+
+ // In the case where active.length === 0 we need to keep these at existing values for good animations
+ var alignment = {
+ xAlign: existingModel.xAlign,
+ yAlign: existingModel.yAlign
+ };
+ var backgroundPoint = {
+ x: existingModel.x,
+ y: existingModel.y
+ };
+ var tooltipSize = {
+ width: existingModel.width,
+ height: existingModel.height
+ };
+ var tooltipPosition = {
+ x: existingModel.caretX,
+ y: existingModel.caretY
+ };
+
+ var i, len;
+
+ if (active.length) {
+ model.opacity = 1;
+
+ var labelColors = [];
+ var labelTextColors = [];
+ tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);
+
+ var tooltipItems = [];
+ for (i = 0, len = active.length; i < len; ++i) {
+ tooltipItems.push(createTooltipItem(active[i]));
+ }
+
+ // If the user provided a filter function, use it to modify the tooltip items
+ if (opts.filter) {
+ tooltipItems = tooltipItems.filter(function(a) {
+ return opts.filter(a, data);
+ });
+ }
+
+ // If the user provided a sorting function, use it to modify the tooltip items
+ if (opts.itemSort) {
+ tooltipItems = tooltipItems.sort(function(a, b) {
+ return opts.itemSort(a, b, data);
+ });
+ }
+
+ // Determine colors for boxes
+ helpers$1.each(tooltipItems, function(tooltipItem) {
+ labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));
+ labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));
+ });
+
+
+ // Build the Text Lines
+ model.title = me.getTitle(tooltipItems, data);
+ model.beforeBody = me.getBeforeBody(tooltipItems, data);
+ model.body = me.getBody(tooltipItems, data);
+ model.afterBody = me.getAfterBody(tooltipItems, data);
+ model.footer = me.getFooter(tooltipItems, data);
+
+ // Initial positioning and colors
+ model.x = tooltipPosition.x;
+ model.y = tooltipPosition.y;
+ model.caretPadding = opts.caretPadding;
+ model.labelColors = labelColors;
+ model.labelTextColors = labelTextColors;
+
+ // data points
+ model.dataPoints = tooltipItems;
+
+ // We need to determine alignment of the tooltip
+ tooltipSize = getTooltipSize(this, model);
+ alignment = determineAlignment(this, tooltipSize);
+ // Final Size and Position
+ backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);
+ } else {
+ model.opacity = 0;
+ }
+
+ model.xAlign = alignment.xAlign;
+ model.yAlign = alignment.yAlign;
+ model.x = backgroundPoint.x;
+ model.y = backgroundPoint.y;
+ model.width = tooltipSize.width;
+ model.height = tooltipSize.height;
+
+ // Point where the caret on the tooltip points to
+ model.caretX = tooltipPosition.x;
+ model.caretY = tooltipPosition.y;
+
+ me._model = model;
+
+ if (changed && opts.custom) {
+ opts.custom.call(me, model);
+ }
+
+ return me;
+ },
+
+ drawCaret: function(tooltipPoint, size) {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+ var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);
+
+ ctx.lineTo(caretPosition.x1, caretPosition.y1);
+ ctx.lineTo(caretPosition.x2, caretPosition.y2);
+ ctx.lineTo(caretPosition.x3, caretPosition.y3);
+ },
+ getCaretPosition: function(tooltipPoint, size, vm) {
+ var x1, x2, x3, y1, y2, y3;
+ var caretSize = vm.caretSize;
+ var cornerRadius = vm.cornerRadius;
+ var xAlign = vm.xAlign;
+ var yAlign = vm.yAlign;
+ var ptX = tooltipPoint.x;
+ var ptY = tooltipPoint.y;
+ var width = size.width;
+ var height = size.height;
+
+ if (yAlign === 'center') {
+ y2 = ptY + (height / 2);
+
+ if (xAlign === 'left') {
+ x1 = ptX;
+ x2 = x1 - caretSize;
+ x3 = x1;
+
+ y1 = y2 + caretSize;
+ y3 = y2 - caretSize;
+ } else {
+ x1 = ptX + width;
+ x2 = x1 + caretSize;
+ x3 = x1;
+
+ y1 = y2 - caretSize;
+ y3 = y2 + caretSize;
+ }
+ } else {
+ if (xAlign === 'left') {
+ x2 = ptX + cornerRadius + (caretSize);
+ x1 = x2 - caretSize;
+ x3 = x2 + caretSize;
+ } else if (xAlign === 'right') {
+ x2 = ptX + width - cornerRadius - caretSize;
+ x1 = x2 - caretSize;
+ x3 = x2 + caretSize;
+ } else {
+ x2 = vm.caretX;
+ x1 = x2 - caretSize;
+ x3 = x2 + caretSize;
+ }
+ if (yAlign === 'top') {
+ y1 = ptY;
+ y2 = y1 - caretSize;
+ y3 = y1;
+ } else {
+ y1 = ptY + height;
+ y2 = y1 + caretSize;
+ y3 = y1;
+ // invert drawing order
+ var tmp = x3;
+ x3 = x1;
+ x1 = tmp;
+ }
+ }
+ return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};
+ },
+
+ drawTitle: function(pt, vm, ctx) {
+ var title = vm.title;
+ var length = title.length;
+ var titleFontSize, titleSpacing, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
+
+ pt.x = getAlignedX(vm, vm._titleAlign);
+
+ ctx.textAlign = rtlHelper.textAlign(vm._titleAlign);
+ ctx.textBaseline = 'middle';
+
+ titleFontSize = vm.titleFontSize;
+ titleSpacing = vm.titleSpacing;
+
+ ctx.fillStyle = vm.titleFontColor;
+ ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
+
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);
+ pt.y += titleFontSize + titleSpacing; // Line Height and spacing
+
+ if (i + 1 === length) {
+ pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing
+ }
+ }
+ }
+ },
+
+ drawBody: function(pt, vm, ctx) {
+ var bodyFontSize = vm.bodyFontSize;
+ var bodySpacing = vm.bodySpacing;
+ var bodyAlign = vm._bodyAlign;
+ var body = vm.body;
+ var drawColorBoxes = vm.displayColors;
+ var xLinePadding = 0;
+ var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;
+
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
+
+ var fillLineOfText = function(line) {
+ ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);
+ pt.y += bodyFontSize + bodySpacing;
+ };
+
+ var bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;
+ var bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);
+
+ ctx.textAlign = bodyAlign;
+ ctx.textBaseline = 'middle';
+ ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
+
+ pt.x = getAlignedX(vm, bodyAlignForCalculation);
+
+ // Before body lines
+ ctx.fillStyle = vm.bodyFontColor;
+ helpers$1.each(vm.beforeBody, fillLineOfText);
+
+ xLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right'
+ ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)
+ : 0;
+
+ // Draw body lines now
+ for (i = 0, ilen = body.length; i < ilen; ++i) {
+ bodyItem = body[i];
+ textColor = vm.labelTextColors[i];
+ labelColors = vm.labelColors[i];
+
+ ctx.fillStyle = textColor;
+ helpers$1.each(bodyItem.before, fillLineOfText);
+
+ lines = bodyItem.lines;
+ for (j = 0, jlen = lines.length; j < jlen; ++j) {
+ // Draw Legend-like boxes if needed
+ if (drawColorBoxes) {
+ var rtlColorX = rtlHelper.x(colorX);
+
+ // Fill a white rect so that colours merge nicely if the opacity is < 1
+ ctx.fillStyle = vm.legendColorBackground;
+ ctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
+
+ // Border
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = labelColors.borderColor;
+ ctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);
+
+ // Inner square
+ ctx.fillStyle = labelColors.backgroundColor;
+ ctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);
+ ctx.fillStyle = textColor;
+ }
+
+ fillLineOfText(lines[j]);
+ }
+
+ helpers$1.each(bodyItem.after, fillLineOfText);
+ }
+
+ // Reset back to 0 for after body
+ xLinePadding = 0;
+
+ // After body lines
+ helpers$1.each(vm.afterBody, fillLineOfText);
+ pt.y -= bodySpacing; // Remove last body spacing
+ },
+
+ drawFooter: function(pt, vm, ctx) {
+ var footer = vm.footer;
+ var length = footer.length;
+ var footerFontSize, i;
+
+ if (length) {
+ var rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);
+
+ pt.x = getAlignedX(vm, vm._footerAlign);
+ pt.y += vm.footerMarginTop;
+
+ ctx.textAlign = rtlHelper.textAlign(vm._footerAlign);
+ ctx.textBaseline = 'middle';
+
+ footerFontSize = vm.footerFontSize;
+
+ ctx.fillStyle = vm.footerFontColor;
+ ctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
+
+ for (i = 0; i < length; ++i) {
+ ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);
+ pt.y += footerFontSize + vm.footerSpacing;
+ }
+ }
+ },
+
+ drawBackground: function(pt, vm, ctx, tooltipSize) {
+ ctx.fillStyle = vm.backgroundColor;
+ ctx.strokeStyle = vm.borderColor;
+ ctx.lineWidth = vm.borderWidth;
+ var xAlign = vm.xAlign;
+ var yAlign = vm.yAlign;
+ var x = pt.x;
+ var y = pt.y;
+ var width = tooltipSize.width;
+ var height = tooltipSize.height;
+ var radius = vm.cornerRadius;
+
+ ctx.beginPath();
+ ctx.moveTo(x + radius, y);
+ if (yAlign === 'top') {
+ this.drawCaret(pt, tooltipSize);
+ }
+ ctx.lineTo(x + width - radius, y);
+ ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
+ if (yAlign === 'center' && xAlign === 'right') {
+ this.drawCaret(pt, tooltipSize);
+ }
+ ctx.lineTo(x + width, y + height - radius);
+ ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
+ if (yAlign === 'bottom') {
+ this.drawCaret(pt, tooltipSize);
+ }
+ ctx.lineTo(x + radius, y + height);
+ ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
+ if (yAlign === 'center' && xAlign === 'left') {
+ this.drawCaret(pt, tooltipSize);
+ }
+ ctx.lineTo(x, y + radius);
+ ctx.quadraticCurveTo(x, y, x + radius, y);
+ ctx.closePath();
+
+ ctx.fill();
+
+ if (vm.borderWidth > 0) {
+ ctx.stroke();
+ }
+ },
+
+ draw: function() {
+ var ctx = this._chart.ctx;
+ var vm = this._view;
+
+ if (vm.opacity === 0) {
+ return;
+ }
+
+ var tooltipSize = {
+ width: vm.width,
+ height: vm.height
+ };
+ var pt = {
+ x: vm.x,
+ y: vm.y
+ };
+
+ // IE11/Edge does not like very small opacities, so snap to 0
+ var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;
+
+ // Truthy/falsey value for empty tooltip
+ var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;
+
+ if (this._options.enabled && hasTooltipContent) {
+ ctx.save();
+ ctx.globalAlpha = opacity;
+
+ // Draw Background
+ this.drawBackground(pt, vm, ctx, tooltipSize);
+
+ // Draw Title, Body, and Footer
+ pt.y += vm.yPadding;
+
+ helpers$1.rtl.overrideTextDirection(ctx, vm.textDirection);
+
+ // Titles
+ this.drawTitle(pt, vm, ctx);
+
+ // Body
+ this.drawBody(pt, vm, ctx);
+
+ // Footer
+ this.drawFooter(pt, vm, ctx);
+
+ helpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);
+
+ ctx.restore();
+ }
+ },
+
+ /**
+ * Handle an event
+ * @private
+ * @param {IEvent} event - The event to handle
+ * @returns {boolean} true if the tooltip changed
+ */
+ handleEvent: function(e) {
+ var me = this;
+ var options = me._options;
+ var changed = false;
+
+ me._lastActive = me._lastActive || [];
+
+ // Find Active Elements for tooltips
+ if (e.type === 'mouseout') {
+ me._active = [];
+ } else {
+ me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
+ if (options.reverse) {
+ me._active.reverse();
+ }
+ }
+
+ // Remember Last Actives
+ changed = !helpers$1.arrayEquals(me._active, me._lastActive);
+
+ // Only handle target event on tooltip change
+ if (changed) {
+ me._lastActive = me._active;
+
+ if (options.enabled || options.custom) {
+ me._eventPosition = {
+ x: e.x,
+ y: e.y
+ };
+
+ me.update(true);
+ me.pivot();
+ }
+ }
+
+ return changed;
+ }
+});
+
+/**
+ * @namespace Chart.Tooltip.positioners
+ */
+var positioners_1 = positioners;
+
+var core_tooltip = exports$4;
+core_tooltip.positioners = positioners_1;
+
+var valueOrDefault$9 = helpers$1.valueOrDefault;
+
+core_defaults._set('global', {
+ elements: {},
+ events: [
+ 'mousemove',
+ 'mouseout',
+ 'click',
+ 'touchstart',
+ 'touchmove'
+ ],
+ hover: {
+ onHover: null,
+ mode: 'nearest',
+ intersect: true,
+ animationDuration: 400
+ },
+ onClick: null,
+ maintainAspectRatio: true,
+ responsive: true,
+ responsiveAnimationDuration: 0
+});
+
+/**
+ * Recursively merge the given config objects representing the `scales` option
+ * by incorporating scale defaults in `xAxes` and `yAxes` array items, then
+ * returns a deep copy of the result, thus doesn't alter inputs.
+ */
+function mergeScaleConfig(/* config objects ... */) {
+ return helpers$1.merge({}, [].slice.call(arguments), {
+ merger: function(key, target, source, options) {
+ if (key === 'xAxes' || key === 'yAxes') {
+ var slen = source[key].length;
+ var i, type, scale;
+
+ if (!target[key]) {
+ target[key] = [];
+ }
+
+ for (i = 0; i < slen; ++i) {
+ scale = source[key][i];
+ type = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');
+
+ if (i >= target[key].length) {
+ target[key].push({});
+ }
+
+ if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {
+ // new/untyped scale or type changed: let's apply the new defaults
+ // then merge source scale to correctly overwrite the defaults.
+ helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);
+ } else {
+ // scales type are the same
+ helpers$1.merge(target[key][i], scale);
+ }
+ }
+ } else {
+ helpers$1._merger(key, target, source, options);
+ }
+ }
+ });
+}
+
+/**
+ * Recursively merge the given config objects as the root options by handling
+ * default scale options for the `scales` and `scale` properties, then returns
+ * a deep copy of the result, thus doesn't alter inputs.
+ */
+function mergeConfig(/* config objects ... */) {
+ return helpers$1.merge({}, [].slice.call(arguments), {
+ merger: function(key, target, source, options) {
+ var tval = target[key] || {};
+ var sval = source[key];
+
+ if (key === 'scales') {
+ // scale config merging is complex. Add our own function here for that
+ target[key] = mergeScaleConfig(tval, sval);
+ } else if (key === 'scale') {
+ // used in polar area & radar charts since there is only one scale
+ target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);
+ } else {
+ helpers$1._merger(key, target, source, options);
+ }
+ }
+ });
+}
+
+function initConfig(config) {
+ config = config || {};
+
+ // Do NOT use mergeConfig for the data object because this method merges arrays
+ // and so would change references to labels and datasets, preventing data updates.
+ var data = config.data = config.data || {};
+ data.datasets = data.datasets || [];
+ data.labels = data.labels || [];
+
+ config.options = mergeConfig(
+ core_defaults.global,
+ core_defaults[config.type],
+ config.options || {});
+
+ return config;
+}
+
+function updateConfig(chart) {
+ var newOptions = chart.options;
+
+ helpers$1.each(chart.scales, function(scale) {
+ core_layouts.removeBox(chart, scale);
+ });
+
+ newOptions = mergeConfig(
+ core_defaults.global,
+ core_defaults[chart.config.type],
+ newOptions);
+
+ chart.options = chart.config.options = newOptions;
+ chart.ensureScalesHaveIDs();
+ chart.buildOrUpdateScales();
+
+ // Tooltip
+ chart.tooltip._options = newOptions.tooltips;
+ chart.tooltip.initialize();
+}
+
+function nextAvailableScaleId(axesOpts, prefix, index) {
+ var id;
+ var hasId = function(obj) {
+ return obj.id === id;
+ };
+
+ do {
+ id = prefix + index++;
+ } while (helpers$1.findIndex(axesOpts, hasId) >= 0);
+
+ return id;
+}
+
+function positionIsHorizontal(position) {
+ return position === 'top' || position === 'bottom';
+}
+
+function compare2Level(l1, l2) {
+ return function(a, b) {
+ return a[l1] === b[l1]
+ ? a[l2] - b[l2]
+ : a[l1] - b[l1];
+ };
+}
+
+var Chart = function(item, config) {
+ this.construct(item, config);
+ return this;
+};
+
+helpers$1.extend(Chart.prototype, /** @lends Chart */ {
+ /**
+ * @private
+ */
+ construct: function(item, config) {
+ var me = this;
+
+ config = initConfig(config);
+
+ var context = platform.acquireContext(item, config);
+ var canvas = context && context.canvas;
+ var height = canvas && canvas.height;
+ var width = canvas && canvas.width;
+
+ me.id = helpers$1.uid();
+ me.ctx = context;
+ me.canvas = canvas;
+ me.config = config;
+ me.width = width;
+ me.height = height;
+ me.aspectRatio = height ? width / height : null;
+ me.options = config.options;
+ me._bufferedRender = false;
+ me._layers = [];
+
+ /**
+ * Provided for backward compatibility, Chart and Chart.Controller have been merged,
+ * the "instance" still need to be defined since it might be called from plugins.
+ * @prop Chart#chart
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ * @private
+ */
+ me.chart = me;
+ me.controller = me; // chart.chart.controller #inception
+
+ // Add the chart instance to the global namespace
+ Chart.instances[me.id] = me;
+
+ // Define alias to the config data: `chart.data === chart.config.data`
+ Object.defineProperty(me, 'data', {
+ get: function() {
+ return me.config.data;
+ },
+ set: function(value) {
+ me.config.data = value;
+ }
+ });
+
+ if (!context || !canvas) {
+ // The given item is not a compatible context2d element, let's return before finalizing
+ // the chart initialization but after setting basic chart / controller properties that
+ // can help to figure out that the chart is not valid (e.g chart.canvas !== null);
+ // https://github.com/chartjs/Chart.js/issues/2807
+ console.error("Failed to create chart: can't acquire context from the given item");
+ return;
+ }
+
+ me.initialize();
+ me.update();
+ },
+
+ /**
+ * @private
+ */
+ initialize: function() {
+ var me = this;
+
+ // Before init plugin notification
+ core_plugins.notify(me, 'beforeInit');
+
+ helpers$1.retinaScale(me, me.options.devicePixelRatio);
+
+ me.bindEvents();
+
+ if (me.options.responsive) {
+ // Initial resize before chart draws (must be silent to preserve initial animations).
+ me.resize(true);
+ }
+
+ me.initToolTip();
+
+ // After init plugin notification
+ core_plugins.notify(me, 'afterInit');
+
+ return me;
+ },
+
+ clear: function() {
+ helpers$1.canvas.clear(this);
+ return this;
+ },
+
+ stop: function() {
+ // Stops any current animation loop occurring
+ core_animations.cancelAnimation(this);
+ return this;
+ },
+
+ resize: function(silent) {
+ var me = this;
+ var options = me.options;
+ var canvas = me.canvas;
+ var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;
+
+ // the canvas render width and height will be casted to integers so make sure that
+ // the canvas display style uses the same integer values to avoid blurring effect.
+
+ // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed
+ var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));
+ var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));
+
+ if (me.width === newWidth && me.height === newHeight) {
+ return;
+ }
+
+ canvas.width = me.width = newWidth;
+ canvas.height = me.height = newHeight;
+ canvas.style.width = newWidth + 'px';
+ canvas.style.height = newHeight + 'px';
+
+ helpers$1.retinaScale(me, options.devicePixelRatio);
+
+ if (!silent) {
+ // Notify any plugins about the resize
+ var newSize = {width: newWidth, height: newHeight};
+ core_plugins.notify(me, 'resize', [newSize]);
+
+ // Notify of resize
+ if (options.onResize) {
+ options.onResize(me, newSize);
+ }
+
+ me.stop();
+ me.update({
+ duration: options.responsiveAnimationDuration
+ });
+ }
+ },
+
+ ensureScalesHaveIDs: function() {
+ var options = this.options;
+ var scalesOptions = options.scales || {};
+ var scaleOptions = options.scale;
+
+ helpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {
+ if (!xAxisOptions.id) {
+ xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);
+ }
+ });
+
+ helpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {
+ if (!yAxisOptions.id) {
+ yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);
+ }
+ });
+
+ if (scaleOptions) {
+ scaleOptions.id = scaleOptions.id || 'scale';
+ }
+ },
+
+ /**
+ * Builds a map of scale ID to scale object for future lookup.
+ */
+ buildOrUpdateScales: function() {
+ var me = this;
+ var options = me.options;
+ var scales = me.scales || {};
+ var items = [];
+ var updated = Object.keys(scales).reduce(function(obj, id) {
+ obj[id] = false;
+ return obj;
+ }, {});
+
+ if (options.scales) {
+ items = items.concat(
+ (options.scales.xAxes || []).map(function(xAxisOptions) {
+ return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};
+ }),
+ (options.scales.yAxes || []).map(function(yAxisOptions) {
+ return {options: yAxisOptions, dtype: 'linear', dposition: 'left'};
+ })
+ );
+ }
+
+ if (options.scale) {
+ items.push({
+ options: options.scale,
+ dtype: 'radialLinear',
+ isDefault: true,
+ dposition: 'chartArea'
+ });
+ }
+
+ helpers$1.each(items, function(item) {
+ var scaleOptions = item.options;
+ var id = scaleOptions.id;
+ var scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);
+
+ if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {
+ scaleOptions.position = item.dposition;
+ }
+
+ updated[id] = true;
+ var scale = null;
+ if (id in scales && scales[id].type === scaleType) {
+ scale = scales[id];
+ scale.options = scaleOptions;
+ scale.ctx = me.ctx;
+ scale.chart = me;
+ } else {
+ var scaleClass = core_scaleService.getScaleConstructor(scaleType);
+ if (!scaleClass) {
+ return;
+ }
+ scale = new scaleClass({
+ id: id,
+ type: scaleType,
+ options: scaleOptions,
+ ctx: me.ctx,
+ chart: me
+ });
+ scales[scale.id] = scale;
+ }
+
+ scale.mergeTicksOptions();
+
+ // TODO(SB): I think we should be able to remove this custom case (options.scale)
+ // and consider it as a regular scale part of the "scales"" map only! This would
+ // make the logic easier and remove some useless? custom code.
+ if (item.isDefault) {
+ me.scale = scale;
+ }
+ });
+ // clear up discarded scales
+ helpers$1.each(updated, function(hasUpdated, id) {
+ if (!hasUpdated) {
+ delete scales[id];
+ }
+ });
+
+ me.scales = scales;
+
+ core_scaleService.addScalesToLayout(this);
+ },
+
+ buildOrUpdateControllers: function() {
+ var me = this;
+ var newControllers = [];
+ var datasets = me.data.datasets;
+ var i, ilen;
+
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ var dataset = datasets[i];
+ var meta = me.getDatasetMeta(i);
+ var type = dataset.type || me.config.type;
+
+ if (meta.type && meta.type !== type) {
+ me.destroyDatasetMeta(i);
+ meta = me.getDatasetMeta(i);
+ }
+ meta.type = type;
+ meta.order = dataset.order || 0;
+ meta.index = i;
+
+ if (meta.controller) {
+ meta.controller.updateIndex(i);
+ meta.controller.linkScales();
+ } else {
+ var ControllerClass = controllers[meta.type];
+ if (ControllerClass === undefined) {
+ throw new Error('"' + meta.type + '" is not a chart type.');
+ }
+
+ meta.controller = new ControllerClass(me, i);
+ newControllers.push(meta.controller);
+ }
+ }
+
+ return newControllers;
+ },
+
+ /**
+ * Reset the elements of all datasets
+ * @private
+ */
+ resetElements: function() {
+ var me = this;
+ helpers$1.each(me.data.datasets, function(dataset, datasetIndex) {
+ me.getDatasetMeta(datasetIndex).controller.reset();
+ }, me);
+ },
+
+ /**
+ * Resets the chart back to it's state before the initial animation
+ */
+ reset: function() {
+ this.resetElements();
+ this.tooltip.initialize();
+ },
+
+ update: function(config) {
+ var me = this;
+ var i, ilen;
+
+ if (!config || typeof config !== 'object') {
+ // backwards compatibility
+ config = {
+ duration: config,
+ lazy: arguments[1]
+ };
+ }
+
+ updateConfig(me);
+
+ // plugins options references might have change, let's invalidate the cache
+ // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167
+ core_plugins._invalidate(me);
+
+ if (core_plugins.notify(me, 'beforeUpdate') === false) {
+ return;
+ }
+
+ // In case the entire data object changed
+ me.tooltip._data = me.data;
+
+ // Make sure dataset controllers are updated and new controllers are reset
+ var newControllers = me.buildOrUpdateControllers();
+
+ // Make sure all dataset controllers have correct meta data counts
+ for (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {
+ me.getDatasetMeta(i).controller.buildOrUpdateElements();
+ }
+
+ me.updateLayout();
+
+ // Can only reset the new controllers after the scales have been updated
+ if (me.options.animation && me.options.animation.duration) {
+ helpers$1.each(newControllers, function(controller) {
+ controller.reset();
+ });
+ }
+
+ me.updateDatasets();
+
+ // Need to reset tooltip in case it is displayed with elements that are removed
+ // after update.
+ me.tooltip.initialize();
+
+ // Last active contains items that were previously in the tooltip.
+ // When we reset the tooltip, we need to clear it
+ me.lastActive = [];
+
+ // Do this before render so that any plugins that need final scale updates can use it
+ core_plugins.notify(me, 'afterUpdate');
+
+ me._layers.sort(compare2Level('z', '_idx'));
+
+ if (me._bufferedRender) {
+ me._bufferedRequest = {
+ duration: config.duration,
+ easing: config.easing,
+ lazy: config.lazy
+ };
+ } else {
+ me.render(config);
+ }
+ },
+
+ /**
+ * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`
+ * hook, in which case, plugins will not be called on `afterLayout`.
+ * @private
+ */
+ updateLayout: function() {
+ var me = this;
+
+ if (core_plugins.notify(me, 'beforeLayout') === false) {
+ return;
+ }
+
+ core_layouts.update(this, this.width, this.height);
+
+ me._layers = [];
+ helpers$1.each(me.boxes, function(box) {
+ // _configure is called twice, once in core.scale.update and once here.
+ // Here the boxes are fully updated and at their final positions.
+ if (box._configure) {
+ box._configure();
+ }
+ me._layers.push.apply(me._layers, box._layers());
+ }, me);
+
+ me._layers.forEach(function(item, index) {
+ item._idx = index;
+ });
+
+ /**
+ * Provided for backward compatibility, use `afterLayout` instead.
+ * @method IPlugin#afterScaleUpdate
+ * @deprecated since version 2.5.0
+ * @todo remove at version 3
+ * @private
+ */
+ core_plugins.notify(me, 'afterScaleUpdate');
+ core_plugins.notify(me, 'afterLayout');
+ },
+
+ /**
+ * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`
+ * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.
+ * @private
+ */
+ updateDatasets: function() {
+ var me = this;
+
+ if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {
+ return;
+ }
+
+ for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {
+ me.updateDataset(i);
+ }
+
+ core_plugins.notify(me, 'afterDatasetsUpdate');
+ },
+
+ /**
+ * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`
+ * hook, in which case, plugins will not be called on `afterDatasetUpdate`.
+ * @private
+ */
+ updateDataset: function(index) {
+ var me = this;
+ var meta = me.getDatasetMeta(index);
+ var args = {
+ meta: meta,
+ index: index
+ };
+
+ if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {
+ return;
+ }
+
+ meta.controller._update();
+
+ core_plugins.notify(me, 'afterDatasetUpdate', [args]);
+ },
+
+ render: function(config) {
+ var me = this;
+
+ if (!config || typeof config !== 'object') {
+ // backwards compatibility
+ config = {
+ duration: config,
+ lazy: arguments[1]
+ };
+ }
+
+ var animationOptions = me.options.animation;
+ var duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);
+ var lazy = config.lazy;
+
+ if (core_plugins.notify(me, 'beforeRender') === false) {
+ return;
+ }
+
+ var onComplete = function(animation) {
+ core_plugins.notify(me, 'afterRender');
+ helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);
+ };
+
+ if (animationOptions && duration) {
+ var animation = new core_animation({
+ numSteps: duration / 16.66, // 60 fps
+ easing: config.easing || animationOptions.easing,
+
+ render: function(chart, animationObject) {
+ var easingFunction = helpers$1.easing.effects[animationObject.easing];
+ var currentStep = animationObject.currentStep;
+ var stepDecimal = currentStep / animationObject.numSteps;
+
+ chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);
+ },
+
+ onAnimationProgress: animationOptions.onProgress,
+ onAnimationComplete: onComplete
+ });
+
+ core_animations.addAnimation(me, animation, duration, lazy);
+ } else {
+ me.draw();
+
+ // See https://github.com/chartjs/Chart.js/issues/3781
+ onComplete(new core_animation({numSteps: 0, chart: me}));
+ }
+
+ return me;
+ },
+
+ draw: function(easingValue) {
+ var me = this;
+ var i, layers;
+
+ me.clear();
+
+ if (helpers$1.isNullOrUndef(easingValue)) {
+ easingValue = 1;
+ }
+
+ me.transition(easingValue);
+
+ if (me.width <= 0 || me.height <= 0) {
+ return;
+ }
+
+ if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {
+ return;
+ }
+
+ // Because of plugin hooks (before/afterDatasetsDraw), datasets can't
+ // currently be part of layers. Instead, we draw
+ // layers <= 0 before(default, backward compat), and the rest after
+ layers = me._layers;
+ for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {
+ layers[i].draw(me.chartArea);
+ }
+
+ me.drawDatasets(easingValue);
+
+ // Rest of layers
+ for (; i < layers.length; ++i) {
+ layers[i].draw(me.chartArea);
+ }
+
+ me._drawTooltip(easingValue);
+
+ core_plugins.notify(me, 'afterDraw', [easingValue]);
+ },
+
+ /**
+ * @private
+ */
+ transition: function(easingValue) {
+ var me = this;
+
+ for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
+ if (me.isDatasetVisible(i)) {
+ me.getDatasetMeta(i).controller.transition(easingValue);
+ }
+ }
+
+ me.tooltip.transition(easingValue);
+ },
+
+ /**
+ * @private
+ */
+ _getSortedDatasetMetas: function(filterVisible) {
+ var me = this;
+ var datasets = me.data.datasets || [];
+ var result = [];
+ var i, ilen;
+
+ for (i = 0, ilen = datasets.length; i < ilen; ++i) {
+ if (!filterVisible || me.isDatasetVisible(i)) {
+ result.push(me.getDatasetMeta(i));
+ }
+ }
+
+ result.sort(compare2Level('order', 'index'));
+
+ return result;
+ },
+
+ /**
+ * @private
+ */
+ _getSortedVisibleDatasetMetas: function() {
+ return this._getSortedDatasetMetas(true);
+ },
+
+ /**
+ * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`
+ * hook, in which case, plugins will not be called on `afterDatasetsDraw`.
+ * @private
+ */
+ drawDatasets: function(easingValue) {
+ var me = this;
+ var metasets, i;
+
+ if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {
+ return;
+ }
+
+ metasets = me._getSortedVisibleDatasetMetas();
+ for (i = metasets.length - 1; i >= 0; --i) {
+ me.drawDataset(metasets[i], easingValue);
+ }
+
+ core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);
+ },
+
+ /**
+ * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`
+ * hook, in which case, plugins will not be called on `afterDatasetDraw`.
+ * @private
+ */
+ drawDataset: function(meta, easingValue) {
+ var me = this;
+ var args = {
+ meta: meta,
+ index: meta.index,
+ easingValue: easingValue
+ };
+
+ if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {
+ return;
+ }
+
+ meta.controller.draw(easingValue);
+
+ core_plugins.notify(me, 'afterDatasetDraw', [args]);
+ },
+
+ /**
+ * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`
+ * hook, in which case, plugins will not be called on `afterTooltipDraw`.
+ * @private
+ */
+ _drawTooltip: function(easingValue) {
+ var me = this;
+ var tooltip = me.tooltip;
+ var args = {
+ tooltip: tooltip,
+ easingValue: easingValue
+ };
+
+ if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {
+ return;
+ }
+
+ tooltip.draw();
+
+ core_plugins.notify(me, 'afterTooltipDraw', [args]);
+ },
+
+ /**
+ * Get the single element that was clicked on
+ * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw
+ */
+ getElementAtEvent: function(e) {
+ return core_interaction.modes.single(this, e);
+ },
+
+ getElementsAtEvent: function(e) {
+ return core_interaction.modes.label(this, e, {intersect: true});
+ },
+
+ getElementsAtXAxis: function(e) {
+ return core_interaction.modes['x-axis'](this, e, {intersect: true});
+ },
+
+ getElementsAtEventForMode: function(e, mode, options) {
+ var method = core_interaction.modes[mode];
+ if (typeof method === 'function') {
+ return method(this, e, options);
+ }
+
+ return [];
+ },
+
+ getDatasetAtEvent: function(e) {
+ return core_interaction.modes.dataset(this, e, {intersect: true});
+ },
+
+ getDatasetMeta: function(datasetIndex) {
+ var me = this;
+ var dataset = me.data.datasets[datasetIndex];
+ if (!dataset._meta) {
+ dataset._meta = {};
+ }
+
+ var meta = dataset._meta[me.id];
+ if (!meta) {
+ meta = dataset._meta[me.id] = {
+ type: null,
+ data: [],
+ dataset: null,
+ controller: null,
+ hidden: null, // See isDatasetVisible() comment
+ xAxisID: null,
+ yAxisID: null,
+ order: dataset.order || 0,
+ index: datasetIndex
+ };
+ }
+
+ return meta;
+ },
+
+ getVisibleDatasetCount: function() {
+ var count = 0;
+ for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
+ if (this.isDatasetVisible(i)) {
+ count++;
+ }
+ }
+ return count;
+ },
+
+ isDatasetVisible: function(datasetIndex) {
+ var meta = this.getDatasetMeta(datasetIndex);
+
+ // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,
+ // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.
+ return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;
+ },
+
+ generateLegend: function() {
+ return this.options.legendCallback(this);
+ },
+
+ /**
+ * @private
+ */
+ destroyDatasetMeta: function(datasetIndex) {
+ var id = this.id;
+ var dataset = this.data.datasets[datasetIndex];
+ var meta = dataset._meta && dataset._meta[id];
+
+ if (meta) {
+ meta.controller.destroy();
+ delete dataset._meta[id];
+ }
+ },
+
+ destroy: function() {
+ var me = this;
+ var canvas = me.canvas;
+ var i, ilen;
+
+ me.stop();
+
+ // dataset controllers need to cleanup associated data
+ for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {
+ me.destroyDatasetMeta(i);
+ }
+
+ if (canvas) {
+ me.unbindEvents();
+ helpers$1.canvas.clear(me);
+ platform.releaseContext(me.ctx);
+ me.canvas = null;
+ me.ctx = null;
+ }
+
+ core_plugins.notify(me, 'destroy');
+
+ delete Chart.instances[me.id];
+ },
+
+ toBase64Image: function() {
+ return this.canvas.toDataURL.apply(this.canvas, arguments);
+ },
+
+ initToolTip: function() {
+ var me = this;
+ me.tooltip = new core_tooltip({
+ _chart: me,
+ _chartInstance: me, // deprecated, backward compatibility
+ _data: me.data,
+ _options: me.options.tooltips
+ }, me);
+ },
+
+ /**
+ * @private
+ */
+ bindEvents: function() {
+ var me = this;
+ var listeners = me._listeners = {};
+ var listener = function() {
+ me.eventHandler.apply(me, arguments);
+ };
+
+ helpers$1.each(me.options.events, function(type) {
+ platform.addEventListener(me, type, listener);
+ listeners[type] = listener;
+ });
+
+ // Elements used to detect size change should not be injected for non responsive charts.
+ // See https://github.com/chartjs/Chart.js/issues/2210
+ if (me.options.responsive) {
+ listener = function() {
+ me.resize();
+ };
+
+ platform.addEventListener(me, 'resize', listener);
+ listeners.resize = listener;
+ }
+ },
+
+ /**
+ * @private
+ */
+ unbindEvents: function() {
+ var me = this;
+ var listeners = me._listeners;
+ if (!listeners) {
+ return;
+ }
+
+ delete me._listeners;
+ helpers$1.each(listeners, function(listener, type) {
+ platform.removeEventListener(me, type, listener);
+ });
+ },
+
+ updateHoverStyle: function(elements, mode, enabled) {
+ var prefix = enabled ? 'set' : 'remove';
+ var element, i, ilen;
+
+ for (i = 0, ilen = elements.length; i < ilen; ++i) {
+ element = elements[i];
+ if (element) {
+ this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);
+ }
+ }
+
+ if (mode === 'dataset') {
+ this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();
+ }
+ },
+
+ /**
+ * @private
+ */
+ eventHandler: function(e) {
+ var me = this;
+ var tooltip = me.tooltip;
+
+ if (core_plugins.notify(me, 'beforeEvent', [e]) === false) {
+ return;
+ }
+
+ // Buffer any update calls so that renders do not occur
+ me._bufferedRender = true;
+ me._bufferedRequest = null;
+
+ var changed = me.handleEvent(e);
+ // for smooth tooltip animations issue #4989
+ // the tooltip should be the source of change
+ // Animation check workaround:
+ // tooltip._start will be null when tooltip isn't animating
+ if (tooltip) {
+ changed = tooltip._start
+ ? tooltip.handleEvent(e)
+ : changed | tooltip.handleEvent(e);
+ }
+
+ core_plugins.notify(me, 'afterEvent', [e]);
+
+ var bufferedRequest = me._bufferedRequest;
+ if (bufferedRequest) {
+ // If we have an update that was triggered, we need to do a normal render
+ me.render(bufferedRequest);
+ } else if (changed && !me.animating) {
+ // If entering, leaving, or changing elements, animate the change via pivot
+ me.stop();
+
+ // We only need to render at this point. Updating will cause scales to be
+ // recomputed generating flicker & using more memory than necessary.
+ me.render({
+ duration: me.options.hover.animationDuration,
+ lazy: true
+ });
+ }
+
+ me._bufferedRender = false;
+ me._bufferedRequest = null;
+
+ return me;
+ },
+
+ /**
+ * Handle an event
+ * @private
+ * @param {IEvent} event the event to handle
+ * @return {boolean} true if the chart needs to re-render
+ */
+ handleEvent: function(e) {
+ var me = this;
+ var options = me.options || {};
+ var hoverOptions = options.hover;
+ var changed = false;
+
+ me.lastActive = me.lastActive || [];
+
+ // Find Active Elements for hover and tooltips
+ if (e.type === 'mouseout') {
+ me.active = [];
+ } else {
+ me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);
+ }
+
+ // Invoke onHover hook
+ // Need to call with native event here to not break backwards compatibility
+ helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);
+
+ if (e.type === 'mouseup' || e.type === 'click') {
+ if (options.onClick) {
+ // Use e.native here for backwards compatibility
+ options.onClick.call(me, e.native, me.active);
+ }
+ }
+
+ // Remove styling for last active (even if it may still be active)
+ if (me.lastActive.length) {
+ me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
+ }
+
+ // Built in hover styling
+ if (me.active.length && hoverOptions.mode) {
+ me.updateHoverStyle(me.active, hoverOptions.mode, true);
+ }
+
+ changed = !helpers$1.arrayEquals(me.active, me.lastActive);
+
+ // Remember Last Actives
+ me.lastActive = me.active;
+
+ return changed;
+ }
+});
+
+/**
+ * NOTE(SB) We actually don't use this container anymore but we need to keep it
+ * for backward compatibility. Though, it can still be useful for plugins that
+ * would need to work on multiple charts?!
+ */
+Chart.instances = {};
+
+var core_controller = Chart;
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, use Chart instead.
+ * @class Chart.Controller
+ * @deprecated since version 2.6
+ * @todo remove at version 3
+ * @private
+ */
+Chart.Controller = Chart;
+
+/**
+ * Provided for backward compatibility, not available anymore.
+ * @namespace Chart
+ * @deprecated since version 2.8
+ * @todo remove at version 3
+ * @private
+ */
+Chart.types = {};
+
+/**
+ * Provided for backward compatibility, not available anymore.
+ * @namespace Chart.helpers.configMerge
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers$1.configMerge = mergeConfig;
+
+/**
+ * Provided for backward compatibility, not available anymore.
+ * @namespace Chart.helpers.scaleMerge
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ * @private
+ */
+helpers$1.scaleMerge = mergeScaleConfig;
+
+var core_helpers = function() {
+
+ // -- Basic js utility methods
+
+ helpers$1.where = function(collection, filterCallback) {
+ if (helpers$1.isArray(collection) && Array.prototype.filter) {
+ return collection.filter(filterCallback);
+ }
+ var filtered = [];
+
+ helpers$1.each(collection, function(item) {
+ if (filterCallback(item)) {
+ filtered.push(item);
+ }
+ });
+
+ return filtered;
+ };
+ helpers$1.findIndex = Array.prototype.findIndex ?
+ function(array, callback, scope) {
+ return array.findIndex(callback, scope);
+ } :
+ function(array, callback, scope) {
+ scope = scope === undefined ? array : scope;
+ for (var i = 0, ilen = array.length; i < ilen; ++i) {
+ if (callback.call(scope, array[i], i, array)) {
+ return i;
+ }
+ }
+ return -1;
+ };
+ helpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {
+ // Default to start of the array
+ if (helpers$1.isNullOrUndef(startIndex)) {
+ startIndex = -1;
+ }
+ for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
+ var currentItem = arrayToSearch[i];
+ if (filterCallback(currentItem)) {
+ return currentItem;
+ }
+ }
+ };
+ helpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {
+ // Default to end of the array
+ if (helpers$1.isNullOrUndef(startIndex)) {
+ startIndex = arrayToSearch.length;
+ }
+ for (var i = startIndex - 1; i >= 0; i--) {
+ var currentItem = arrayToSearch[i];
+ if (filterCallback(currentItem)) {
+ return currentItem;
+ }
+ }
+ };
+
+ // -- Math methods
+ helpers$1.isNumber = function(n) {
+ return !isNaN(parseFloat(n)) && isFinite(n);
+ };
+ helpers$1.almostEquals = function(x, y, epsilon) {
+ return Math.abs(x - y) < epsilon;
+ };
+ helpers$1.almostWhole = function(x, epsilon) {
+ var rounded = Math.round(x);
+ return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);
+ };
+ helpers$1.max = function(array) {
+ return array.reduce(function(max, value) {
+ if (!isNaN(value)) {
+ return Math.max(max, value);
+ }
+ return max;
+ }, Number.NEGATIVE_INFINITY);
+ };
+ helpers$1.min = function(array) {
+ return array.reduce(function(min, value) {
+ if (!isNaN(value)) {
+ return Math.min(min, value);
+ }
+ return min;
+ }, Number.POSITIVE_INFINITY);
+ };
+ helpers$1.sign = Math.sign ?
+ function(x) {
+ return Math.sign(x);
+ } :
+ function(x) {
+ x = +x; // convert to a number
+ if (x === 0 || isNaN(x)) {
+ return x;
+ }
+ return x > 0 ? 1 : -1;
+ };
+ helpers$1.toRadians = function(degrees) {
+ return degrees * (Math.PI / 180);
+ };
+ helpers$1.toDegrees = function(radians) {
+ return radians * (180 / Math.PI);
+ };
+
+ /**
+ * Returns the number of decimal places
+ * i.e. the number of digits after the decimal point, of the value of this Number.
+ * @param {number} x - A number.
+ * @returns {number} The number of decimal places.
+ * @private
+ */
+ helpers$1._decimalPlaces = function(x) {
+ if (!helpers$1.isFinite(x)) {
+ return;
+ }
+ var e = 1;
+ var p = 0;
+ while (Math.round(x * e) / e !== x) {
+ e *= 10;
+ p++;
+ }
+ return p;
+ };
+
+ // Gets the angle from vertical upright to the point about a centre.
+ helpers$1.getAngleFromPoint = function(centrePoint, anglePoint) {
+ var distanceFromXCenter = anglePoint.x - centrePoint.x;
+ var distanceFromYCenter = anglePoint.y - centrePoint.y;
+ var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
+
+ var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);
+
+ if (angle < (-0.5 * Math.PI)) {
+ angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]
+ }
+
+ return {
+ angle: angle,
+ distance: radialDistanceFromCenter
+ };
+ };
+ helpers$1.distanceBetweenPoints = function(pt1, pt2) {
+ return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));
+ };
+
+ /**
+ * Provided for backward compatibility, not available anymore
+ * @function Chart.helpers.aliasPixel
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ */
+ helpers$1.aliasPixel = function(pixelWidth) {
+ return (pixelWidth % 2 === 0) ? 0 : 0.5;
+ };
+
+ /**
+ * Returns the aligned pixel value to avoid anti-aliasing blur
+ * @param {Chart} chart - The chart instance.
+ * @param {number} pixel - A pixel value.
+ * @param {number} width - The width of the element.
+ * @returns {number} The aligned pixel value.
+ * @private
+ */
+ helpers$1._alignPixel = function(chart, pixel, width) {
+ var devicePixelRatio = chart.currentDevicePixelRatio;
+ var halfWidth = width / 2;
+ return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;
+ };
+
+ helpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {
+ // Props to Rob Spencer at scaled innovation for his post on splining between points
+ // http://scaledinnovation.com/analytics/splines/aboutSplines.html
+
+ // This function must also respect "skipped" points
+
+ var previous = firstPoint.skip ? middlePoint : firstPoint;
+ var current = middlePoint;
+ var next = afterPoint.skip ? middlePoint : afterPoint;
+
+ var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
+ var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
+
+ var s01 = d01 / (d01 + d12);
+ var s12 = d12 / (d01 + d12);
+
+ // If all points are the same, s01 & s02 will be inf
+ s01 = isNaN(s01) ? 0 : s01;
+ s12 = isNaN(s12) ? 0 : s12;
+
+ var fa = t * s01; // scaling factor for triangle Ta
+ var fb = t * s12;
+
+ return {
+ previous: {
+ x: current.x - fa * (next.x - previous.x),
+ y: current.y - fa * (next.y - previous.y)
+ },
+ next: {
+ x: current.x + fb * (next.x - previous.x),
+ y: current.y + fb * (next.y - previous.y)
+ }
+ };
+ };
+ helpers$1.EPSILON = Number.EPSILON || 1e-14;
+ helpers$1.splineCurveMonotone = function(points) {
+ // This function calculates Bézier control points in a similar way than |splineCurve|,
+ // but preserves monotonicity of the provided data and ensures no local extremums are added
+ // between the dataset discrete points due to the interpolation.
+ // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation
+
+ var pointsWithTangents = (points || []).map(function(point) {
+ return {
+ model: point._model,
+ deltaK: 0,
+ mK: 0
+ };
+ });
+
+ // Calculate slopes (deltaK) and initialize tangents (mK)
+ var pointsLen = pointsWithTangents.length;
+ var i, pointBefore, pointCurrent, pointAfter;
+ for (i = 0; i < pointsLen; ++i) {
+ pointCurrent = pointsWithTangents[i];
+ if (pointCurrent.model.skip) {
+ continue;
+ }
+
+ pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;
+ pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;
+ if (pointAfter && !pointAfter.model.skip) {
+ var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);
+
+ // In the case of two points that appear at the same x pixel, slopeDeltaX is 0
+ pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;
+ }
+
+ if (!pointBefore || pointBefore.model.skip) {
+ pointCurrent.mK = pointCurrent.deltaK;
+ } else if (!pointAfter || pointAfter.model.skip) {
+ pointCurrent.mK = pointBefore.deltaK;
+ } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {
+ pointCurrent.mK = 0;
+ } else {
+ pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;
+ }
+ }
+
+ // Adjust tangents to ensure monotonic properties
+ var alphaK, betaK, tauK, squaredMagnitude;
+ for (i = 0; i < pointsLen - 1; ++i) {
+ pointCurrent = pointsWithTangents[i];
+ pointAfter = pointsWithTangents[i + 1];
+ if (pointCurrent.model.skip || pointAfter.model.skip) {
+ continue;
+ }
+
+ if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {
+ pointCurrent.mK = pointAfter.mK = 0;
+ continue;
+ }
+
+ alphaK = pointCurrent.mK / pointCurrent.deltaK;
+ betaK = pointAfter.mK / pointCurrent.deltaK;
+ squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);
+ if (squaredMagnitude <= 9) {
+ continue;
+ }
+
+ tauK = 3 / Math.sqrt(squaredMagnitude);
+ pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;
+ pointAfter.mK = betaK * tauK * pointCurrent.deltaK;
+ }
+
+ // Compute control points
+ var deltaX;
+ for (i = 0; i < pointsLen; ++i) {
+ pointCurrent = pointsWithTangents[i];
+ if (pointCurrent.model.skip) {
+ continue;
+ }
+
+ pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;
+ pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;
+ if (pointBefore && !pointBefore.model.skip) {
+ deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;
+ pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;
+ pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;
+ }
+ if (pointAfter && !pointAfter.model.skip) {
+ deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;
+ pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;
+ pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;
+ }
+ }
+ };
+ helpers$1.nextItem = function(collection, index, loop) {
+ if (loop) {
+ return index >= collection.length - 1 ? collection[0] : collection[index + 1];
+ }
+ return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];
+ };
+ helpers$1.previousItem = function(collection, index, loop) {
+ if (loop) {
+ return index <= 0 ? collection[collection.length - 1] : collection[index - 1];
+ }
+ return index <= 0 ? collection[0] : collection[index - 1];
+ };
+ // Implementation of the nice number algorithm used in determining where axis labels will go
+ helpers$1.niceNum = function(range, round) {
+ var exponent = Math.floor(helpers$1.log10(range));
+ var fraction = range / Math.pow(10, exponent);
+ var niceFraction;
+
+ if (round) {
+ if (fraction < 1.5) {
+ niceFraction = 1;
+ } else if (fraction < 3) {
+ niceFraction = 2;
+ } else if (fraction < 7) {
+ niceFraction = 5;
+ } else {
+ niceFraction = 10;
+ }
+ } else if (fraction <= 1.0) {
+ niceFraction = 1;
+ } else if (fraction <= 2) {
+ niceFraction = 2;
+ } else if (fraction <= 5) {
+ niceFraction = 5;
+ } else {
+ niceFraction = 10;
+ }
+
+ return niceFraction * Math.pow(10, exponent);
+ };
+ // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
+ helpers$1.requestAnimFrame = (function() {
+ if (typeof window === 'undefined') {
+ return function(callback) {
+ callback();
+ };
+ }
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
+ function(callback) {
+ return window.setTimeout(callback, 1000 / 60);
+ };
+ }());
+ // -- DOM methods
+ helpers$1.getRelativePosition = function(evt, chart) {
+ var mouseX, mouseY;
+ var e = evt.originalEvent || evt;
+ var canvas = evt.target || evt.srcElement;
+ var boundingRect = canvas.getBoundingClientRect();
+
+ var touches = e.touches;
+ if (touches && touches.length > 0) {
+ mouseX = touches[0].clientX;
+ mouseY = touches[0].clientY;
+
+ } else {
+ mouseX = e.clientX;
+ mouseY = e.clientY;
+ }
+
+ // Scale mouse coordinates into canvas coordinates
+ // by following the pattern laid out by 'jerryj' in the comments of
+ // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
+ var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));
+ var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));
+ var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));
+ var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom'));
+ var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;
+ var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;
+
+ // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However
+ // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here
+ mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);
+ mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);
+
+ return {
+ x: mouseX,
+ y: mouseY
+ };
+
+ };
+
+ // Private helper function to convert max-width/max-height values that may be percentages into a number
+ function parseMaxStyle(styleValue, node, parentProperty) {
+ var valueInPixels;
+ if (typeof styleValue === 'string') {
+ valueInPixels = parseInt(styleValue, 10);
+
+ if (styleValue.indexOf('%') !== -1) {
+ // percentage * size in dimension
+ valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];
+ }
+ } else {
+ valueInPixels = styleValue;
+ }
+
+ return valueInPixels;
+ }
+
+ /**
+ * Returns if the given value contains an effective constraint.
+ * @private
+ */
+ function isConstrainedValue(value) {
+ return value !== undefined && value !== null && value !== 'none';
+ }
+
+ /**
+ * Returns the max width or height of the given DOM node in a cross-browser compatible fashion
+ * @param {HTMLElement} domNode - the node to check the constraint on
+ * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height')
+ * @param {string} percentageProperty - property of parent to use when calculating width as a percentage
+ * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser}
+ */
+ function getConstraintDimension(domNode, maxStyle, percentageProperty) {
+ var view = document.defaultView;
+ var parentNode = helpers$1._getParentNode(domNode);
+ var constrainedNode = view.getComputedStyle(domNode)[maxStyle];
+ var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];
+ var hasCNode = isConstrainedValue(constrainedNode);
+ var hasCContainer = isConstrainedValue(constrainedContainer);
+ var infinity = Number.POSITIVE_INFINITY;
+
+ if (hasCNode || hasCContainer) {
+ return Math.min(
+ hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,
+ hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);
+ }
+
+ return 'none';
+ }
+ // returns Number or undefined if no constraint
+ helpers$1.getConstraintWidth = function(domNode) {
+ return getConstraintDimension(domNode, 'max-width', 'clientWidth');
+ };
+ // returns Number or undefined if no constraint
+ helpers$1.getConstraintHeight = function(domNode) {
+ return getConstraintDimension(domNode, 'max-height', 'clientHeight');
+ };
+ /**
+ * @private
+ */
+ helpers$1._calculatePadding = function(container, padding, parentDimension) {
+ padding = helpers$1.getStyle(container, padding);
+
+ return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);
+ };
+ /**
+ * @private
+ */
+ helpers$1._getParentNode = function(domNode) {
+ var parent = domNode.parentNode;
+ if (parent && parent.toString() === '[object ShadowRoot]') {
+ parent = parent.host;
+ }
+ return parent;
+ };
+ helpers$1.getMaximumWidth = function(domNode) {
+ var container = helpers$1._getParentNode(domNode);
+ if (!container) {
+ return domNode.clientWidth;
+ }
+
+ var clientWidth = container.clientWidth;
+ var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);
+ var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);
+
+ var w = clientWidth - paddingLeft - paddingRight;
+ var cw = helpers$1.getConstraintWidth(domNode);
+ return isNaN(cw) ? w : Math.min(w, cw);
+ };
+ helpers$1.getMaximumHeight = function(domNode) {
+ var container = helpers$1._getParentNode(domNode);
+ if (!container) {
+ return domNode.clientHeight;
+ }
+
+ var clientHeight = container.clientHeight;
+ var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);
+ var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);
+
+ var h = clientHeight - paddingTop - paddingBottom;
+ var ch = helpers$1.getConstraintHeight(domNode);
+ return isNaN(ch) ? h : Math.min(h, ch);
+ };
+ helpers$1.getStyle = function(el, property) {
+ return el.currentStyle ?
+ el.currentStyle[property] :
+ document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
+ };
+ helpers$1.retinaScale = function(chart, forceRatio) {
+ var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1;
+ if (pixelRatio === 1) {
+ return;
+ }
+
+ var canvas = chart.canvas;
+ var height = chart.height;
+ var width = chart.width;
+
+ canvas.height = height * pixelRatio;
+ canvas.width = width * pixelRatio;
+ chart.ctx.scale(pixelRatio, pixelRatio);
+
+ // If no style has been set on the canvas, the render size is used as display size,
+ // making the chart visually bigger, so let's enforce it to the "correct" values.
+ // See https://github.com/chartjs/Chart.js/issues/3575
+ if (!canvas.style.height && !canvas.style.width) {
+ canvas.style.height = height + 'px';
+ canvas.style.width = width + 'px';
+ }
+ };
+ // -- Canvas methods
+ helpers$1.fontString = function(pixelSize, fontStyle, fontFamily) {
+ return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;
+ };
+ helpers$1.longestText = function(ctx, font, arrayOfThings, cache) {
+ cache = cache || {};
+ var data = cache.data = cache.data || {};
+ var gc = cache.garbageCollect = cache.garbageCollect || [];
+
+ if (cache.font !== font) {
+ data = cache.data = {};
+ gc = cache.garbageCollect = [];
+ cache.font = font;
+ }
+
+ ctx.font = font;
+ var longest = 0;
+ var ilen = arrayOfThings.length;
+ var i, j, jlen, thing, nestedThing;
+ for (i = 0; i < ilen; i++) {
+ thing = arrayOfThings[i];
+
+ // Undefined strings and arrays should not be measured
+ if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {
+ longest = helpers$1.measureText(ctx, data, gc, longest, thing);
+ } else if (helpers$1.isArray(thing)) {
+ // if it is an array lets measure each element
+ // to do maybe simplify this function a bit so we can do this more recursively?
+ for (j = 0, jlen = thing.length; j < jlen; j++) {
+ nestedThing = thing[j];
+ // Undefined strings and arrays should not be measured
+ if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {
+ longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);
+ }
+ }
+ }
+ }
+
+ var gcLen = gc.length / 2;
+ if (gcLen > arrayOfThings.length) {
+ for (i = 0; i < gcLen; i++) {
+ delete data[gc[i]];
+ }
+ gc.splice(0, gcLen);
+ }
+ return longest;
+ };
+ helpers$1.measureText = function(ctx, data, gc, longest, string) {
+ var textWidth = data[string];
+ if (!textWidth) {
+ textWidth = data[string] = ctx.measureText(string).width;
+ gc.push(string);
+ }
+ if (textWidth > longest) {
+ longest = textWidth;
+ }
+ return longest;
+ };
+
+ /**
+ * @deprecated
+ */
+ helpers$1.numberOfLabelLines = function(arrayOfThings) {
+ var numberOfLines = 1;
+ helpers$1.each(arrayOfThings, function(thing) {
+ if (helpers$1.isArray(thing)) {
+ if (thing.length > numberOfLines) {
+ numberOfLines = thing.length;
+ }
+ }
+ });
+ return numberOfLines;
+ };
+
+ helpers$1.color = !chartjsColor ?
+ function(value) {
+ console.error('Color.js not found!');
+ return value;
+ } :
+ function(value) {
+ /* global CanvasGradient */
+ if (value instanceof CanvasGradient) {
+ value = core_defaults.global.defaultColor;
+ }
+
+ return chartjsColor(value);
+ };
+
+ helpers$1.getHoverColor = function(colorValue) {
+ /* global CanvasPattern */
+ return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ?
+ colorValue :
+ helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();
+ };
+};
+
+function abstract() {
+ throw new Error(
+ 'This method is not implemented: either no adapter can ' +
+ 'be found or an incomplete integration was provided.'
+ );
+}
+
+/**
+ * Date adapter (current used by the time scale)
+ * @namespace Chart._adapters._date
+ * @memberof Chart._adapters
+ * @private
+ */
+
+/**
+ * Currently supported unit string values.
+ * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')}
+ * @memberof Chart._adapters._date
+ * @name Unit
+ */
+
+/**
+ * @class
+ */
+function DateAdapter(options) {
+ this.options = options || {};
+}
+
+helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ {
+ /**
+ * Returns a map of time formats for the supported formatting units defined
+ * in Unit as well as 'datetime' representing a detailed date/time string.
+ * @returns {{string: string}}
+ */
+ formats: abstract,
+
+ /**
+ * Parses the given `value` and return the associated timestamp.
+ * @param {any} value - the value to parse (usually comes from the data)
+ * @param {string} [format] - the expected data format
+ * @returns {(number|null)}
+ * @function
+ */
+ parse: abstract,
+
+ /**
+ * Returns the formatted date in the specified `format` for a given `timestamp`.
+ * @param {number} timestamp - the timestamp to format
+ * @param {string} format - the date/time token
+ * @return {string}
+ * @function
+ */
+ format: abstract,
+
+ /**
+ * Adds the specified `amount` of `unit` to the given `timestamp`.
+ * @param {number} timestamp - the input timestamp
+ * @param {number} amount - the amount to add
+ * @param {Unit} unit - the unit as string
+ * @return {number}
+ * @function
+ */
+ add: abstract,
+
+ /**
+ * Returns the number of `unit` between the given timestamps.
+ * @param {number} max - the input timestamp (reference)
+ * @param {number} min - the timestamp to substract
+ * @param {Unit} unit - the unit as string
+ * @return {number}
+ * @function
+ */
+ diff: abstract,
+
+ /**
+ * Returns start of `unit` for the given `timestamp`.
+ * @param {number} timestamp - the input timestamp
+ * @param {Unit} unit - the unit as string
+ * @param {number} [weekday] - the ISO day of the week with 1 being Monday
+ * and 7 being Sunday (only needed if param *unit* is `isoWeek`).
+ * @function
+ */
+ startOf: abstract,
+
+ /**
+ * Returns end of `unit` for the given `timestamp`.
+ * @param {number} timestamp - the input timestamp
+ * @param {Unit} unit - the unit as string
+ * @function
+ */
+ endOf: abstract,
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility for scale.getValueForPixel(),
+ * this method should be overridden only by the moment adapter.
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ * @private
+ */
+ _create: function(value) {
+ return value;
+ }
+});
+
+DateAdapter.override = function(members) {
+ helpers$1.extend(DateAdapter.prototype, members);
+};
+
+var _date = DateAdapter;
+
+var core_adapters = {
+ _date: _date
+};
+
+/**
+ * Namespace to hold static tick generation functions
+ * @namespace Chart.Ticks
+ */
+var core_ticks = {
+ /**
+ * Namespace to hold formatters for different types of ticks
+ * @namespace Chart.Ticks.formatters
+ */
+ formatters: {
+ /**
+ * Formatter for value labels
+ * @method Chart.Ticks.formatters.values
+ * @param value the value to display
+ * @return {string|string[]} the label to display
+ */
+ values: function(value) {
+ return helpers$1.isArray(value) ? value : '' + value;
+ },
+
+ /**
+ * Formatter for linear numeric ticks
+ * @method Chart.Ticks.formatters.linear
+ * @param tickValue {number} the value to be formatted
+ * @param index {number} the position of the tickValue parameter in the ticks array
+ * @param ticks {number[]} the list of ticks being converted
+ * @return {string} string representation of the tickValue parameter
+ */
+ linear: function(tickValue, index, ticks) {
+ // If we have lots of ticks, don't use the ones
+ var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];
+
+ // If we have a number like 2.5 as the delta, figure out how many decimal places we need
+ if (Math.abs(delta) > 1) {
+ if (tickValue !== Math.floor(tickValue)) {
+ // not an integer
+ delta = tickValue - Math.floor(tickValue);
+ }
+ }
+
+ var logDelta = helpers$1.log10(Math.abs(delta));
+ var tickString = '';
+
+ if (tickValue !== 0) {
+ var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));
+ if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation
+ var logTick = helpers$1.log10(Math.abs(tickValue));
+ var numExponential = Math.floor(logTick) - Math.floor(logDelta);
+ numExponential = Math.max(Math.min(numExponential, 20), 0);
+ tickString = tickValue.toExponential(numExponential);
+ } else {
+ var numDecimal = -1 * Math.floor(logDelta);
+ numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places
+ tickString = tickValue.toFixed(numDecimal);
+ }
+ } else {
+ tickString = '0'; // never show decimal places for 0
+ }
+
+ return tickString;
+ },
+
+ logarithmic: function(tickValue, index, ticks) {
+ var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue))));
+
+ if (tickValue === 0) {
+ return '0';
+ } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {
+ return tickValue.toExponential();
+ }
+ return '';
+ }
+ }
+};
+
+var isArray = helpers$1.isArray;
+var isNullOrUndef = helpers$1.isNullOrUndef;
+var valueOrDefault$a = helpers$1.valueOrDefault;
+var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;
+
+core_defaults._set('scale', {
+ display: true,
+ position: 'left',
+ offset: false,
+
+ // grid line settings
+ gridLines: {
+ display: true,
+ color: 'rgba(0,0,0,0.1)',
+ lineWidth: 1,
+ drawBorder: true,
+ drawOnChartArea: true,
+ drawTicks: true,
+ tickMarkLength: 10,
+ zeroLineWidth: 1,
+ zeroLineColor: 'rgba(0,0,0,0.25)',
+ zeroLineBorderDash: [],
+ zeroLineBorderDashOffset: 0.0,
+ offsetGridLines: false,
+ borderDash: [],
+ borderDashOffset: 0.0
+ },
+
+ // scale label
+ scaleLabel: {
+ // display property
+ display: false,
+
+ // actual label
+ labelString: '',
+
+ // top/bottom padding
+ padding: {
+ top: 4,
+ bottom: 4
+ }
+ },
+
+ // label settings
+ ticks: {
+ beginAtZero: false,
+ minRotation: 0,
+ maxRotation: 50,
+ mirror: false,
+ padding: 0,
+ reverse: false,
+ display: true,
+ autoSkip: true,
+ autoSkipPadding: 0,
+ labelOffset: 0,
+ // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.
+ callback: core_ticks.formatters.values,
+ minor: {},
+ major: {}
+ }
+});
+
+/** Returns a new array containing numItems from arr */
+function sample(arr, numItems) {
+ var result = [];
+ var increment = arr.length / numItems;
+ var i = 0;
+ var len = arr.length;
+
+ for (; i < len; i += increment) {
+ result.push(arr[Math.floor(i)]);
+ }
+ return result;
+}
+
+function getPixelForGridLine(scale, index, offsetGridLines) {
+ var length = scale.getTicks().length;
+ var validIndex = Math.min(index, length - 1);
+ var lineValue = scale.getPixelForTick(validIndex);
+ var start = scale._startPixel;
+ var end = scale._endPixel;
+ var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.
+ var offset;
+
+ if (offsetGridLines) {
+ if (length === 1) {
+ offset = Math.max(lineValue - start, end - lineValue);
+ } else if (index === 0) {
+ offset = (scale.getPixelForTick(1) - lineValue) / 2;
+ } else {
+ offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;
+ }
+ lineValue += validIndex < index ? offset : -offset;
+
+ // Return undefined if the pixel is out of the range
+ if (lineValue < start - epsilon || lineValue > end + epsilon) {
+ return;
+ }
+ }
+ return lineValue;
+}
+
+function garbageCollect(caches, length) {
+ helpers$1.each(caches, function(cache) {
+ var gc = cache.gc;
+ var gcLen = gc.length / 2;
+ var i;
+ if (gcLen > length) {
+ for (i = 0; i < gcLen; ++i) {
+ delete cache.data[gc[i]];
+ }
+ gc.splice(0, gcLen);
+ }
+ });
+}
+
+/**
+ * Returns {width, height, offset} objects for the first, last, widest, highest tick
+ * labels where offset indicates the anchor point offset from the top in pixels.
+ */
+function computeLabelSizes(ctx, tickFonts, ticks, caches) {
+ var length = ticks.length;
+ var widths = [];
+ var heights = [];
+ var offsets = [];
+ var i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;
+
+ for (i = 0; i < length; ++i) {
+ label = ticks[i].label;
+ tickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;
+ ctx.font = fontString = tickFont.string;
+ cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};
+ lineHeight = tickFont.lineHeight;
+ width = height = 0;
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(label) && !isArray(label)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);
+ height = lineHeight;
+ } else if (isArray(label)) {
+ // if it is an array let's measure each element
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ nestedLabel = label[j];
+ // Undefined labels and arrays should not be measured
+ if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {
+ width = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);
+ height += lineHeight;
+ }
+ }
+ }
+ widths.push(width);
+ heights.push(height);
+ offsets.push(lineHeight / 2);
+ }
+ garbageCollect(caches, length);
+
+ widest = widths.indexOf(Math.max.apply(null, widths));
+ highest = heights.indexOf(Math.max.apply(null, heights));
+
+ function valueAt(idx) {
+ return {
+ width: widths[idx] || 0,
+ height: heights[idx] || 0,
+ offset: offsets[idx] || 0
+ };
+ }
+
+ return {
+ first: valueAt(0),
+ last: valueAt(length - 1),
+ widest: valueAt(widest),
+ highest: valueAt(highest)
+ };
+}
+
+function getTickMarkLength(options) {
+ return options.drawTicks ? options.tickMarkLength : 0;
+}
+
+function getScaleLabelHeight(options) {
+ var font, padding;
+
+ if (!options.display) {
+ return 0;
+ }
+
+ font = helpers$1.options._parseFont(options);
+ padding = helpers$1.options.toPadding(options.padding);
+
+ return font.lineHeight + padding.height;
+}
+
+function parseFontOptions(options, nestedOpts) {
+ return helpers$1.extend(helpers$1.options._parseFont({
+ fontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),
+ fontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),
+ fontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),
+ lineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)
+ }), {
+ color: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])
+ });
+}
+
+function parseTickFontOptions(options) {
+ var minor = parseFontOptions(options, options.minor);
+ var major = options.major.enabled ? parseFontOptions(options, options.major) : minor;
+
+ return {minor: minor, major: major};
+}
+
+function nonSkipped(ticksToFilter) {
+ var filtered = [];
+ var item, index, len;
+ for (index = 0, len = ticksToFilter.length; index < len; ++index) {
+ item = ticksToFilter[index];
+ if (typeof item._index !== 'undefined') {
+ filtered.push(item);
+ }
+ }
+ return filtered;
+}
+
+function getEvenSpacing(arr) {
+ var len = arr.length;
+ var i, diff;
+
+ if (len < 2) {
+ return false;
+ }
+
+ for (diff = arr[0], i = 1; i < len; ++i) {
+ if (arr[i] - arr[i - 1] !== diff) {
+ return false;
+ }
+ }
+ return diff;
+}
+
+function calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {
+ var evenMajorSpacing = getEvenSpacing(majorIndices);
+ var spacing = (ticks.length - 1) / ticksLimit;
+ var factors, factor, i, ilen;
+
+ // If the major ticks are evenly spaced apart, place the minor ticks
+ // so that they divide the major ticks into even chunks
+ if (!evenMajorSpacing) {
+ return Math.max(spacing, 1);
+ }
+
+ factors = helpers$1.math._factorize(evenMajorSpacing);
+ for (i = 0, ilen = factors.length - 1; i < ilen; i++) {
+ factor = factors[i];
+ if (factor > spacing) {
+ return factor;
+ }
+ }
+ return Math.max(spacing, 1);
+}
+
+function getMajorIndices(ticks) {
+ var result = [];
+ var i, ilen;
+ for (i = 0, ilen = ticks.length; i < ilen; i++) {
+ if (ticks[i].major) {
+ result.push(i);
+ }
+ }
+ return result;
+}
+
+function skipMajors(ticks, majorIndices, spacing) {
+ var count = 0;
+ var next = majorIndices[0];
+ var i, tick;
+
+ spacing = Math.ceil(spacing);
+ for (i = 0; i < ticks.length; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = majorIndices[count * spacing];
+ } else {
+ delete tick.label;
+ }
+ }
+}
+
+function skip(ticks, spacing, majorStart, majorEnd) {
+ var start = valueOrDefault$a(majorStart, 0);
+ var end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);
+ var count = 0;
+ var length, i, tick, next;
+
+ spacing = Math.ceil(spacing);
+ if (majorEnd) {
+ length = majorEnd - majorStart;
+ spacing = length / Math.floor(length / spacing);
+ }
+
+ next = start;
+
+ while (next < 0) {
+ count++;
+ next = Math.round(start + count * spacing);
+ }
+
+ for (i = Math.max(start, 0); i < end; i++) {
+ tick = ticks[i];
+ if (i === next) {
+ tick._index = i;
+ count++;
+ next = Math.round(start + count * spacing);
+ } else {
+ delete tick.label;
+ }
+ }
+}
+
+var Scale = core_element.extend({
+
+ zeroLineIndex: 0,
+
+ /**
+ * Get the padding needed for the scale
+ * @method getPadding
+ * @private
+ * @returns {Padding} the necessary padding
+ */
+ getPadding: function() {
+ var me = this;
+ return {
+ left: me.paddingLeft || 0,
+ top: me.paddingTop || 0,
+ right: me.paddingRight || 0,
+ bottom: me.paddingBottom || 0
+ };
+ },
+
+ /**
+ * Returns the scale tick objects ({label, major})
+ * @since 2.7
+ */
+ getTicks: function() {
+ return this._ticks;
+ },
+
+ /**
+ * @private
+ */
+ _getLabels: function() {
+ var data = this.chart.data;
+ return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];
+ },
+
+ // These methods are ordered by lifecyle. Utilities then follow.
+ // Any function defined here is inherited by all scale types.
+ // Any function can be extended by the scale type
+
+ /**
+ * Provided for backward compatibility, not available anymore
+ * @function Chart.Scale.mergeTicksOptions
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ */
+ mergeTicksOptions: function() {
+ // noop
+ },
+
+ beforeUpdate: function() {
+ helpers$1.callback(this.options.beforeUpdate, [this]);
+ },
+
+ /**
+ * @param {number} maxWidth - the max width in pixels
+ * @param {number} maxHeight - the max height in pixels
+ * @param {object} margins - the space between the edge of the other scales and edge of the chart
+ * This space comes from two sources:
+ * - padding - space that's required to show the labels at the edges of the scale
+ * - thickness of scales or legends in another orientation
+ */
+ update: function(maxWidth, maxHeight, margins) {
+ var me = this;
+ var tickOpts = me.options.ticks;
+ var sampleSize = tickOpts.sampleSize;
+ var i, ilen, labels, ticks, samplingEnabled;
+
+ // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
+ me.beforeUpdate();
+
+ // Absorb the master measurements
+ me.maxWidth = maxWidth;
+ me.maxHeight = maxHeight;
+ me.margins = helpers$1.extend({
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0
+ }, margins);
+
+ me._ticks = null;
+ me.ticks = null;
+ me._labelSizes = null;
+ me._maxLabelLines = 0;
+ me.longestLabelWidth = 0;
+ me.longestTextCache = me.longestTextCache || {};
+ me._gridLineItems = null;
+ me._labelItems = null;
+
+ // Dimensions
+ me.beforeSetDimensions();
+ me.setDimensions();
+ me.afterSetDimensions();
+
+ // Data min/max
+ me.beforeDataLimits();
+ me.determineDataLimits();
+ me.afterDataLimits();
+
+ // Ticks - `this.ticks` is now DEPRECATED!
+ // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member
+ // and must not be accessed directly from outside this class. `this.ticks` being
+ // around for long time and not marked as private, we can't change its structure
+ // without unexpected breaking changes. If you need to access the scale ticks,
+ // use scale.getTicks() instead.
+
+ me.beforeBuildTicks();
+
+ // New implementations should return an array of objects but for BACKWARD COMPAT,
+ // we still support no return (`this.ticks` internally set by calling this method).
+ ticks = me.buildTicks() || [];
+
+ // Allow modification of ticks in callback.
+ ticks = me.afterBuildTicks(ticks) || ticks;
+
+ // Ensure ticks contains ticks in new tick format
+ if ((!ticks || !ticks.length) && me.ticks) {
+ ticks = [];
+ for (i = 0, ilen = me.ticks.length; i < ilen; ++i) {
+ ticks.push({
+ value: me.ticks[i],
+ major: false
+ });
+ }
+ }
+
+ me._ticks = ticks;
+
+ // Compute tick rotation and fit using a sampled subset of labels
+ // We generally don't need to compute the size of every single label for determining scale size
+ samplingEnabled = sampleSize < ticks.length;
+ labels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks);
+
+ // _configure is called twice, once here, once from core.controller.updateLayout.
+ // Here we haven't been positioned yet, but dimensions are correct.
+ // Variables set in _configure are needed for calculateTickRotation, and
+ // it's ok that coordinates are not correct there, only dimensions matter.
+ me._configure();
+
+ // Tick Rotation
+ me.beforeCalculateTickRotation();
+ me.calculateTickRotation();
+ me.afterCalculateTickRotation();
+
+ me.beforeFit();
+ me.fit();
+ me.afterFit();
+
+ // Auto-skip
+ me._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;
+
+ if (samplingEnabled) {
+ // Generate labels using all non-skipped ticks
+ labels = me._convertTicksToLabels(me._ticksToDraw);
+ }
+
+ me.ticks = labels; // BACKWARD COMPATIBILITY
+
+ // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!
+
+ me.afterUpdate();
+
+ // TODO(v3): remove minSize as a public property and return value from all layout boxes. It is unused
+ // make maxWidth and maxHeight private
+ return me.minSize;
+ },
+
+ /**
+ * @private
+ */
+ _configure: function() {
+ var me = this;
+ var reversePixels = me.options.ticks.reverse;
+ var startPixel, endPixel;
+
+ if (me.isHorizontal()) {
+ startPixel = me.left;
+ endPixel = me.right;
+ } else {
+ startPixel = me.top;
+ endPixel = me.bottom;
+ // by default vertical scales are from bottom to top, so pixels are reversed
+ reversePixels = !reversePixels;
+ }
+ me._startPixel = startPixel;
+ me._endPixel = endPixel;
+ me._reversePixels = reversePixels;
+ me._length = endPixel - startPixel;
+ },
+
+ afterUpdate: function() {
+ helpers$1.callback(this.options.afterUpdate, [this]);
+ },
+
+ //
+
+ beforeSetDimensions: function() {
+ helpers$1.callback(this.options.beforeSetDimensions, [this]);
+ },
+ setDimensions: function() {
+ var me = this;
+ // Set the unconstrained dimension before label rotation
+ if (me.isHorizontal()) {
+ // Reset position before calculating rotation
+ me.width = me.maxWidth;
+ me.left = 0;
+ me.right = me.width;
+ } else {
+ me.height = me.maxHeight;
+
+ // Reset position before calculating rotation
+ me.top = 0;
+ me.bottom = me.height;
+ }
+
+ // Reset padding
+ me.paddingLeft = 0;
+ me.paddingTop = 0;
+ me.paddingRight = 0;
+ me.paddingBottom = 0;
+ },
+ afterSetDimensions: function() {
+ helpers$1.callback(this.options.afterSetDimensions, [this]);
+ },
+
+ // Data limits
+ beforeDataLimits: function() {
+ helpers$1.callback(this.options.beforeDataLimits, [this]);
+ },
+ determineDataLimits: helpers$1.noop,
+ afterDataLimits: function() {
+ helpers$1.callback(this.options.afterDataLimits, [this]);
+ },
+
+ //
+ beforeBuildTicks: function() {
+ helpers$1.callback(this.options.beforeBuildTicks, [this]);
+ },
+ buildTicks: helpers$1.noop,
+ afterBuildTicks: function(ticks) {
+ var me = this;
+ // ticks is empty for old axis implementations here
+ if (isArray(ticks) && ticks.length) {
+ return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);
+ }
+ // Support old implementations (that modified `this.ticks` directly in buildTicks)
+ me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;
+ return ticks;
+ },
+
+ beforeTickToLabelConversion: function() {
+ helpers$1.callback(this.options.beforeTickToLabelConversion, [this]);
+ },
+ convertTicksToLabels: function() {
+ var me = this;
+ // Convert ticks to strings
+ var tickOpts = me.options.ticks;
+ me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);
+ },
+ afterTickToLabelConversion: function() {
+ helpers$1.callback(this.options.afterTickToLabelConversion, [this]);
+ },
+
+ //
+
+ beforeCalculateTickRotation: function() {
+ helpers$1.callback(this.options.beforeCalculateTickRotation, [this]);
+ },
+ calculateTickRotation: function() {
+ var me = this;
+ var options = me.options;
+ var tickOpts = options.ticks;
+ var numTicks = me.getTicks().length;
+ var minRotation = tickOpts.minRotation || 0;
+ var maxRotation = tickOpts.maxRotation;
+ var labelRotation = minRotation;
+ var labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;
+
+ if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {
+ me.labelRotation = minRotation;
+ return;
+ }
+
+ labelSizes = me._getLabelSizes();
+ maxLabelWidth = labelSizes.widest.width;
+ maxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset;
+
+ // Estimate the width of each grid based on the canvas width, the maximum
+ // label width and the number of tick intervals
+ maxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);
+ tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);
+
+ // Allow 3 pixels x2 padding either side for label readability
+ if (maxLabelWidth + 6 > tickWidth) {
+ tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));
+ maxHeight = me.maxHeight - getTickMarkLength(options.gridLines)
+ - tickOpts.padding - getScaleLabelHeight(options.scaleLabel);
+ maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);
+ labelRotation = helpers$1.toDegrees(Math.min(
+ Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),
+ Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)
+ ));
+ labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));
+ }
+
+ me.labelRotation = labelRotation;
+ },
+ afterCalculateTickRotation: function() {
+ helpers$1.callback(this.options.afterCalculateTickRotation, [this]);
+ },
+
+ //
+
+ beforeFit: function() {
+ helpers$1.callback(this.options.beforeFit, [this]);
+ },
+ fit: function() {
+ var me = this;
+ // Reset
+ var minSize = me.minSize = {
+ width: 0,
+ height: 0
+ };
+
+ var chart = me.chart;
+ var opts = me.options;
+ var tickOpts = opts.ticks;
+ var scaleLabelOpts = opts.scaleLabel;
+ var gridLineOpts = opts.gridLines;
+ var display = me._isVisible();
+ var isBottom = opts.position === 'bottom';
+ var isHorizontal = me.isHorizontal();
+
+ // Width
+ if (isHorizontal) {
+ minSize.width = me.maxWidth;
+ } else if (display) {
+ minSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
+ }
+
+ // height
+ if (!isHorizontal) {
+ minSize.height = me.maxHeight; // fill all the height
+ } else if (display) {
+ minSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);
+ }
+
+ // Don't bother fitting the ticks if we are not showing the labels
+ if (tickOpts.display && display) {
+ var tickFonts = parseTickFontOptions(tickOpts);
+ var labelSizes = me._getLabelSizes();
+ var firstLabelSize = labelSizes.first;
+ var lastLabelSize = labelSizes.last;
+ var widestLabelSize = labelSizes.widest;
+ var highestLabelSize = labelSizes.highest;
+ var lineSpace = tickFonts.minor.lineHeight * 0.4;
+ var tickPadding = tickOpts.padding;
+
+ if (isHorizontal) {
+ // A horizontal axis is more constrained by the height.
+ var isRotated = me.labelRotation !== 0;
+ var angleRadians = helpers$1.toRadians(me.labelRotation);
+ var cosRotation = Math.cos(angleRadians);
+ var sinRotation = Math.sin(angleRadians);
+
+ var labelHeight = sinRotation * widestLabelSize.width
+ + cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0))
+ + (isRotated ? 0 : lineSpace); // padding
+
+ minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);
+
+ var offsetLeft = me.getPixelForTick(0) - me.left;
+ var offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);
+ var paddingLeft, paddingRight;
+
+ // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned
+ // which means that the right padding is dominated by the font height
+ if (isRotated) {
+ paddingLeft = isBottom ?
+ cosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset :
+ sinRotation * (firstLabelSize.height - firstLabelSize.offset);
+ paddingRight = isBottom ?
+ sinRotation * (lastLabelSize.height - lastLabelSize.offset) :
+ cosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;
+ } else {
+ paddingLeft = firstLabelSize.width / 2;
+ paddingRight = lastLabelSize.width / 2;
+ }
+
+ // Adjust padding taking into account changes in offsets
+ // and add 3 px to move away from canvas edges
+ me.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;
+ me.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;
+ } else {
+ // A vertical axis is more constrained by the width. Labels are the
+ // dominant factor here, so get that length first and account for padding
+ var labelWidth = tickOpts.mirror ? 0 :
+ // use lineSpace for consistency with horizontal axis
+ // tickPadding is not implemented for horizontal
+ widestLabelSize.width + tickPadding + lineSpace;
+
+ minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);
+
+ me.paddingTop = firstLabelSize.height / 2;
+ me.paddingBottom = lastLabelSize.height / 2;
+ }
+ }
+
+ me.handleMargins();
+
+ if (isHorizontal) {
+ me.width = me._length = chart.width - me.margins.left - me.margins.right;
+ me.height = minSize.height;
+ } else {
+ me.width = minSize.width;
+ me.height = me._length = chart.height - me.margins.top - me.margins.bottom;
+ }
+ },
+
+ /**
+ * Handle margins and padding interactions
+ * @private
+ */
+ handleMargins: function() {
+ var me = this;
+ if (me.margins) {
+ me.margins.left = Math.max(me.paddingLeft, me.margins.left);
+ me.margins.top = Math.max(me.paddingTop, me.margins.top);
+ me.margins.right = Math.max(me.paddingRight, me.margins.right);
+ me.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);
+ }
+ },
+
+ afterFit: function() {
+ helpers$1.callback(this.options.afterFit, [this]);
+ },
+
+ // Shared Methods
+ isHorizontal: function() {
+ var pos = this.options.position;
+ return pos === 'top' || pos === 'bottom';
+ },
+ isFullWidth: function() {
+ return this.options.fullWidth;
+ },
+
+ // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not
+ getRightValue: function(rawValue) {
+ // Null and undefined values first
+ if (isNullOrUndef(rawValue)) {
+ return NaN;
+ }
+ // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values
+ if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {
+ return NaN;
+ }
+
+ // If it is in fact an object, dive in one more level
+ if (rawValue) {
+ if (this.isHorizontal()) {
+ if (rawValue.x !== undefined) {
+ return this.getRightValue(rawValue.x);
+ }
+ } else if (rawValue.y !== undefined) {
+ return this.getRightValue(rawValue.y);
+ }
+ }
+
+ // Value is good, return it
+ return rawValue;
+ },
+
+ _convertTicksToLabels: function(ticks) {
+ var me = this;
+ var labels, i, ilen;
+
+ me.ticks = ticks.map(function(tick) {
+ return tick.value;
+ });
+
+ me.beforeTickToLabelConversion();
+
+ // New implementations should return the formatted tick labels but for BACKWARD
+ // COMPAT, we still support no return (`this.ticks` internally changed by calling
+ // this method and supposed to contain only string values).
+ labels = me.convertTicksToLabels(ticks) || me.ticks;
+
+ me.afterTickToLabelConversion();
+
+ // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ ticks[i].label = labels[i];
+ }
+
+ return labels;
+ },
+
+ /**
+ * @private
+ */
+ _getLabelSizes: function() {
+ var me = this;
+ var labelSizes = me._labelSizes;
+
+ if (!labelSizes) {
+ me._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);
+ me.longestLabelWidth = labelSizes.widest.width;
+ }
+
+ return labelSizes;
+ },
+
+ /**
+ * @private
+ */
+ _parseValue: function(value) {
+ var start, end, min, max;
+
+ if (isArray(value)) {
+ start = +this.getRightValue(value[0]);
+ end = +this.getRightValue(value[1]);
+ min = Math.min(start, end);
+ max = Math.max(start, end);
+ } else {
+ value = +this.getRightValue(value);
+ start = undefined;
+ end = value;
+ min = value;
+ max = value;
+ }
+
+ return {
+ min: min,
+ max: max,
+ start: start,
+ end: end
+ };
+ },
+
+ /**
+ * @private
+ */
+ _getScaleLabel: function(rawValue) {
+ var v = this._parseValue(rawValue);
+ if (v.start !== undefined) {
+ return '[' + v.start + ', ' + v.end + ']';
+ }
+
+ return +this.getRightValue(rawValue);
+ },
+
+ /**
+ * Used to get the value to display in the tooltip for the data at the given index
+ * @param index
+ * @param datasetIndex
+ */
+ getLabelForIndex: helpers$1.noop,
+
+ /**
+ * Returns the location of the given data point. Value can either be an index or a numerical value
+ * The coordinate (0, 0) is at the upper-left corner of the canvas
+ * @param value
+ * @param index
+ * @param datasetIndex
+ */
+ getPixelForValue: helpers$1.noop,
+
+ /**
+ * Used to get the data value from a given pixel. This is the inverse of getPixelForValue
+ * The coordinate (0, 0) is at the upper-left corner of the canvas
+ * @param pixel
+ */
+ getValueForPixel: helpers$1.noop,
+
+ /**
+ * Returns the location of the tick at the given index
+ * The coordinate (0, 0) is at the upper-left corner of the canvas
+ */
+ getPixelForTick: function(index) {
+ var me = this;
+ var offset = me.options.offset;
+ var numTicks = me._ticks.length;
+ var tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);
+
+ return index < 0 || index > numTicks - 1
+ ? null
+ : me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));
+ },
+
+ /**
+ * Utility for getting the pixel location of a percentage of scale
+ * The coordinate (0, 0) is at the upper-left corner of the canvas
+ */
+ getPixelForDecimal: function(decimal) {
+ var me = this;
+
+ if (me._reversePixels) {
+ decimal = 1 - decimal;
+ }
+
+ return me._startPixel + decimal * me._length;
+ },
+
+ getDecimalForPixel: function(pixel) {
+ var decimal = (pixel - this._startPixel) / this._length;
+ return this._reversePixels ? 1 - decimal : decimal;
+ },
+
+ /**
+ * Returns the pixel for the minimum chart value
+ * The coordinate (0, 0) is at the upper-left corner of the canvas
+ */
+ getBasePixel: function() {
+ return this.getPixelForValue(this.getBaseValue());
+ },
+
+ getBaseValue: function() {
+ var me = this;
+ var min = me.min;
+ var max = me.max;
+
+ return me.beginAtZero ? 0 :
+ min < 0 && max < 0 ? max :
+ min > 0 && max > 0 ? min :
+ 0;
+ },
+
+ /**
+ * Returns a subset of ticks to be plotted to avoid overlapping labels.
+ * @private
+ */
+ _autoSkip: function(ticks) {
+ var me = this;
+ var tickOpts = me.options.ticks;
+ var axisLength = me._length;
+ var ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;
+ var majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];
+ var numMajorIndices = majorIndices.length;
+ var first = majorIndices[0];
+ var last = majorIndices[numMajorIndices - 1];
+ var i, ilen, spacing, avgMajorSpacing;
+
+ // If there are too many major ticks to display them all
+ if (numMajorIndices > ticksLimit) {
+ skipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);
+ return nonSkipped(ticks);
+ }
+
+ spacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);
+
+ if (numMajorIndices > 0) {
+ for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {
+ skip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);
+ }
+ avgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;
+ skip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);
+ skip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);
+ return nonSkipped(ticks);
+ }
+ skip(ticks, spacing);
+ return nonSkipped(ticks);
+ },
+
+ /**
+ * @private
+ */
+ _tickSize: function() {
+ var me = this;
+ var optionTicks = me.options.ticks;
+
+ // Calculate space needed by label in axis direction.
+ var rot = helpers$1.toRadians(me.labelRotation);
+ var cos = Math.abs(Math.cos(rot));
+ var sin = Math.abs(Math.sin(rot));
+
+ var labelSizes = me._getLabelSizes();
+ var padding = optionTicks.autoSkipPadding || 0;
+ var w = labelSizes ? labelSizes.widest.width + padding : 0;
+ var h = labelSizes ? labelSizes.highest.height + padding : 0;
+
+ // Calculate space needed for 1 tick in axis direction.
+ return me.isHorizontal()
+ ? h * cos > w * sin ? w / cos : h / sin
+ : h * sin < w * cos ? h / cos : w / sin;
+ },
+
+ /**
+ * @private
+ */
+ _isVisible: function() {
+ var me = this;
+ var chart = me.chart;
+ var display = me.options.display;
+ var i, ilen, meta;
+
+ if (display !== 'auto') {
+ return !!display;
+ }
+
+ // When 'auto', the scale is visible if at least one associated dataset is visible.
+ for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {
+ if (chart.isDatasetVisible(i)) {
+ meta = chart.getDatasetMeta(i);
+ if (meta.xAxisID === me.id || meta.yAxisID === me.id) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * @private
+ */
+ _computeGridLineItems: function(chartArea) {
+ var me = this;
+ var chart = me.chart;
+ var options = me.options;
+ var gridLines = options.gridLines;
+ var position = options.position;
+ var offsetGridLines = gridLines.offsetGridLines;
+ var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var ticksLength = ticks.length + (offsetGridLines ? 1 : 0);
+
+ var tl = getTickMarkLength(gridLines);
+ var items = [];
+ var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var axisHalfWidth = axisWidth / 2;
+ var alignPixel = helpers$1._alignPixel;
+ var alignBorderValue = function(pixel) {
+ return alignPixel(chart, pixel, axisWidth);
+ };
+ var borderValue, i, tick, lineValue, alignedLineValue;
+ var tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;
+
+ if (position === 'top') {
+ borderValue = alignBorderValue(me.bottom);
+ ty1 = me.bottom - tl;
+ ty2 = borderValue - axisHalfWidth;
+ y1 = alignBorderValue(chartArea.top) + axisHalfWidth;
+ y2 = chartArea.bottom;
+ } else if (position === 'bottom') {
+ borderValue = alignBorderValue(me.top);
+ y1 = chartArea.top;
+ y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;
+ ty1 = borderValue + axisHalfWidth;
+ ty2 = me.top + tl;
+ } else if (position === 'left') {
+ borderValue = alignBorderValue(me.right);
+ tx1 = me.right - tl;
+ tx2 = borderValue - axisHalfWidth;
+ x1 = alignBorderValue(chartArea.left) + axisHalfWidth;
+ x2 = chartArea.right;
+ } else {
+ borderValue = alignBorderValue(me.left);
+ x1 = chartArea.left;
+ x2 = alignBorderValue(chartArea.right) - axisHalfWidth;
+ tx1 = borderValue + axisHalfWidth;
+ tx2 = me.left + tl;
+ }
+
+ for (i = 0; i < ticksLength; ++i) {
+ tick = ticks[i] || {};
+
+ // autoskipper skipped this tick (#4635)
+ if (isNullOrUndef(tick.label) && i < ticks.length) {
+ continue;
+ }
+
+ if (i === me.zeroLineIndex && options.offset === offsetGridLines) {
+ // Draw the first index specially
+ lineWidth = gridLines.zeroLineWidth;
+ lineColor = gridLines.zeroLineColor;
+ borderDash = gridLines.zeroLineBorderDash || [];
+ borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;
+ } else {
+ lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);
+ lineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');
+ borderDash = gridLines.borderDash || [];
+ borderDashOffset = gridLines.borderDashOffset || 0.0;
+ }
+
+ lineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines);
+
+ // Skip if the pixel is out of the range
+ if (lineValue === undefined) {
+ continue;
+ }
+
+ alignedLineValue = alignPixel(chart, lineValue, lineWidth);
+
+ if (isHorizontal) {
+ tx1 = tx2 = x1 = x2 = alignedLineValue;
+ } else {
+ ty1 = ty2 = y1 = y2 = alignedLineValue;
+ }
+
+ items.push({
+ tx1: tx1,
+ ty1: ty1,
+ tx2: tx2,
+ ty2: ty2,
+ x1: x1,
+ y1: y1,
+ x2: x2,
+ y2: y2,
+ width: lineWidth,
+ color: lineColor,
+ borderDash: borderDash,
+ borderDashOffset: borderDashOffset,
+ });
+ }
+
+ items.ticksLength = ticksLength;
+ items.borderValue = borderValue;
+
+ return items;
+ },
+
+ /**
+ * @private
+ */
+ _computeLabelItems: function() {
+ var me = this;
+ var options = me.options;
+ var optionTicks = options.ticks;
+ var position = options.position;
+ var isMirrored = optionTicks.mirror;
+ var isHorizontal = me.isHorizontal();
+ var ticks = me._ticksToDraw;
+ var fonts = parseTickFontOptions(optionTicks);
+ var tickPadding = optionTicks.padding;
+ var tl = getTickMarkLength(options.gridLines);
+ var rotation = -helpers$1.toRadians(me.labelRotation);
+ var items = [];
+ var i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;
+
+ if (position === 'top') {
+ y = me.bottom - tl - tickPadding;
+ textAlign = !rotation ? 'center' : 'left';
+ } else if (position === 'bottom') {
+ y = me.top + tl + tickPadding;
+ textAlign = !rotation ? 'center' : 'right';
+ } else if (position === 'left') {
+ x = me.right - (isMirrored ? 0 : tl) - tickPadding;
+ textAlign = isMirrored ? 'left' : 'right';
+ } else {
+ x = me.left + (isMirrored ? 0 : tl) + tickPadding;
+ textAlign = isMirrored ? 'right' : 'left';
+ }
+
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ tick = ticks[i];
+ label = tick.label;
+
+ // autoskipper skipped this tick (#4635)
+ if (isNullOrUndef(label)) {
+ continue;
+ }
+
+ pixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;
+ font = tick.major ? fonts.major : fonts.minor;
+ lineHeight = font.lineHeight;
+ lineCount = isArray(label) ? label.length : 1;
+
+ if (isHorizontal) {
+ x = pixel;
+ textOffset = position === 'top'
+ ? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight
+ : (!rotation ? 0.5 : 0) * lineHeight;
+ } else {
+ y = pixel;
+ textOffset = (1 - lineCount) * lineHeight / 2;
+ }
+
+ items.push({
+ x: x,
+ y: y,
+ rotation: rotation,
+ label: label,
+ font: font,
+ textOffset: textOffset,
+ textAlign: textAlign
+ });
+ }
+
+ return items;
+ },
+
+ /**
+ * @private
+ */
+ _drawGrid: function(chartArea) {
+ var me = this;
+ var gridLines = me.options.gridLines;
+
+ if (!gridLines.display) {
+ return;
+ }
+
+ var ctx = me.ctx;
+ var chart = me.chart;
+ var alignPixel = helpers$1._alignPixel;
+ var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;
+ var items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));
+ var width, color, i, ilen, item;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ width = item.width;
+ color = item.color;
+
+ if (width && color) {
+ ctx.save();
+ ctx.lineWidth = width;
+ ctx.strokeStyle = color;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(item.borderDash);
+ ctx.lineDashOffset = item.borderDashOffset;
+ }
+
+ ctx.beginPath();
+
+ if (gridLines.drawTicks) {
+ ctx.moveTo(item.tx1, item.ty1);
+ ctx.lineTo(item.tx2, item.ty2);
+ }
+
+ if (gridLines.drawOnChartArea) {
+ ctx.moveTo(item.x1, item.y1);
+ ctx.lineTo(item.x2, item.y2);
+ }
+
+ ctx.stroke();
+ ctx.restore();
+ }
+ }
+
+ if (axisWidth) {
+ // Draw the line at the edge of the axis
+ var firstLineWidth = axisWidth;
+ var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);
+ var borderValue = items.borderValue;
+ var x1, x2, y1, y2;
+
+ if (me.isHorizontal()) {
+ x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;
+ x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;
+ y1 = y2 = borderValue;
+ } else {
+ y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;
+ y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;
+ x1 = x2 = borderValue;
+ }
+
+ ctx.lineWidth = axisWidth;
+ ctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);
+ ctx.beginPath();
+ ctx.moveTo(x1, y1);
+ ctx.lineTo(x2, y2);
+ ctx.stroke();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawLabels: function() {
+ var me = this;
+ var optionTicks = me.options.ticks;
+
+ if (!optionTicks.display) {
+ return;
+ }
+
+ var ctx = me.ctx;
+ var items = me._labelItems || (me._labelItems = me._computeLabelItems());
+ var i, j, ilen, jlen, item, tickFont, label, y;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ tickFont = item.font;
+
+ // Make sure we draw text in the correct color and font
+ ctx.save();
+ ctx.translate(item.x, item.y);
+ ctx.rotate(item.rotation);
+ ctx.font = tickFont.string;
+ ctx.fillStyle = tickFont.color;
+ ctx.textBaseline = 'middle';
+ ctx.textAlign = item.textAlign;
+
+ label = item.label;
+ y = item.textOffset;
+ if (isArray(label)) {
+ for (j = 0, jlen = label.length; j < jlen; ++j) {
+ // We just make sure the multiline element is a string here..
+ ctx.fillText('' + label[j], 0, y);
+ y += tickFont.lineHeight;
+ }
+ } else {
+ ctx.fillText(label, 0, y);
+ }
+ ctx.restore();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var options = me.options;
+ var scaleLabel = options.scaleLabel;
+
+ if (!scaleLabel.display) {
+ return;
+ }
+
+ var scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);
+ var scaleLabelFont = helpers$1.options._parseFont(scaleLabel);
+ var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);
+ var halfLineHeight = scaleLabelFont.lineHeight / 2;
+ var position = options.position;
+ var rotation = 0;
+ var scaleLabelX, scaleLabelY;
+
+ if (me.isHorizontal()) {
+ scaleLabelX = me.left + me.width / 2; // midpoint of the width
+ scaleLabelY = position === 'bottom'
+ ? me.bottom - halfLineHeight - scaleLabelPadding.bottom
+ : me.top + halfLineHeight + scaleLabelPadding.top;
+ } else {
+ var isLeft = position === 'left';
+ scaleLabelX = isLeft
+ ? me.left + halfLineHeight + scaleLabelPadding.top
+ : me.right - halfLineHeight - scaleLabelPadding.top;
+ scaleLabelY = me.top + me.height / 2;
+ rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;
+ }
+
+ ctx.save();
+ ctx.translate(scaleLabelX, scaleLabelY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+ ctx.fillStyle = scaleLabelFontColor; // render in correct colour
+ ctx.font = scaleLabelFont.string;
+ ctx.fillText(scaleLabel.labelString, 0, 0);
+ ctx.restore();
+ },
+
+ draw: function(chartArea) {
+ var me = this;
+
+ if (!me._isVisible()) {
+ return;
+ }
+
+ me._drawGrid(chartArea);
+ me._drawTitle();
+ me._drawLabels();
+ },
+
+ /**
+ * @private
+ */
+ _layers: function() {
+ var me = this;
+ var opts = me.options;
+ var tz = opts.ticks && opts.ticks.z || 0;
+ var gz = opts.gridLines && opts.gridLines.z || 0;
+
+ if (!me._isVisible() || tz === gz || me.draw !== me._draw) {
+ // backward compatibility: draw has been overridden by custom scale
+ return [{
+ z: tz,
+ draw: function() {
+ me.draw.apply(me, arguments);
+ }
+ }];
+ }
+
+ return [{
+ z: gz,
+ draw: function() {
+ me._drawGrid.apply(me, arguments);
+ me._drawTitle.apply(me, arguments);
+ }
+ }, {
+ z: tz,
+ draw: function() {
+ me._drawLabels.apply(me, arguments);
+ }
+ }];
+ },
+
+ /**
+ * @private
+ */
+ _getMatchingVisibleMetas: function(type) {
+ var me = this;
+ var isHorizontal = me.isHorizontal();
+ return me.chart._getSortedVisibleDatasetMetas()
+ .filter(function(meta) {
+ return (!type || meta.type === type)
+ && (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);
+ });
+ }
+});
+
+Scale.prototype._draw = Scale.prototype.draw;
+
+var core_scale = Scale;
+
+var isNullOrUndef$1 = helpers$1.isNullOrUndef;
+
+var defaultConfig = {
+ position: 'bottom'
+};
+
+var scale_category = core_scale.extend({
+ determineDataLimits: function() {
+ var me = this;
+ var labels = me._getLabels();
+ var ticksOpts = me.options.ticks;
+ var min = ticksOpts.min;
+ var max = ticksOpts.max;
+ var minIndex = 0;
+ var maxIndex = labels.length - 1;
+ var findIndex;
+
+ if (min !== undefined) {
+ // user specified min value
+ findIndex = labels.indexOf(min);
+ if (findIndex >= 0) {
+ minIndex = findIndex;
+ }
+ }
+
+ if (max !== undefined) {
+ // user specified max value
+ findIndex = labels.indexOf(max);
+ if (findIndex >= 0) {
+ maxIndex = findIndex;
+ }
+ }
+
+ me.minIndex = minIndex;
+ me.maxIndex = maxIndex;
+ me.min = labels[minIndex];
+ me.max = labels[maxIndex];
+ },
+
+ buildTicks: function() {
+ var me = this;
+ var labels = me._getLabels();
+ var minIndex = me.minIndex;
+ var maxIndex = me.maxIndex;
+
+ // If we are viewing some subset of labels, slice the original array
+ me.ticks = (minIndex === 0 && maxIndex === labels.length - 1) ? labels : labels.slice(minIndex, maxIndex + 1);
+ },
+
+ getLabelForIndex: function(index, datasetIndex) {
+ var me = this;
+ var chart = me.chart;
+
+ if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {
+ return me.getRightValue(chart.data.datasets[datasetIndex].data[index]);
+ }
+
+ return me._getLabels()[index];
+ },
+
+ _configure: function() {
+ var me = this;
+ var offset = me.options.offset;
+ var ticks = me.ticks;
+
+ core_scale.prototype._configure.call(me);
+
+ if (!me.isHorizontal()) {
+ // For backward compatibility, vertical category scale reverse is inverted.
+ me._reversePixels = !me._reversePixels;
+ }
+
+ if (!ticks) {
+ return;
+ }
+
+ me._startValue = me.minIndex - (offset ? 0.5 : 0);
+ me._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);
+ },
+
+ // Used to get data value locations. Value can either be an index or a numerical value
+ getPixelForValue: function(value, index, datasetIndex) {
+ var me = this;
+ var valueCategory, labels, idx;
+
+ if (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {
+ value = me.chart.data.datasets[datasetIndex].data[index];
+ }
+
+ // If value is a data object, then index is the index in the data array,
+ // not the index of the scale. We need to change that.
+ if (!isNullOrUndef$1(value)) {
+ valueCategory = me.isHorizontal() ? value.x : value.y;
+ }
+ if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {
+ labels = me._getLabels();
+ value = helpers$1.valueOrDefault(valueCategory, value);
+ idx = labels.indexOf(value);
+ index = idx !== -1 ? idx : index;
+ if (isNaN(index)) {
+ index = value;
+ }
+ }
+ return me.getPixelForDecimal((index - me._startValue) / me._valueRange);
+ },
+
+ getPixelForTick: function(index) {
+ var ticks = this.ticks;
+ return index < 0 || index > ticks.length - 1
+ ? null
+ : this.getPixelForValue(ticks[index], index + this.minIndex);
+ },
+
+ getValueForPixel: function(pixel) {
+ var me = this;
+ var value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);
+ return Math.min(Math.max(value, 0), me.ticks.length - 1);
+ },
+
+ getBasePixel: function() {
+ return this.bottom;
+ }
+});
+
+// INTERNAL: static default options, registered in src/index.js
+var _defaults = defaultConfig;
+scale_category._defaults = _defaults;
+
+var noop = helpers$1.noop;
+var isNullOrUndef$2 = helpers$1.isNullOrUndef;
+
+/**
+ * Generate a set of linear ticks
+ * @param generationOptions the options used to generate the ticks
+ * @param dataRange the range of the data
+ * @returns {number[]} array of tick values
+ */
+function generateTicks(generationOptions, dataRange) {
+ var ticks = [];
+ // To get a "nice" value for the tick spacing, we will use the appropriately named
+ // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks
+ // for details.
+
+ var MIN_SPACING = 1e-14;
+ var stepSize = generationOptions.stepSize;
+ var unit = stepSize || 1;
+ var maxNumSpaces = generationOptions.maxTicks - 1;
+ var min = generationOptions.min;
+ var max = generationOptions.max;
+ var precision = generationOptions.precision;
+ var rmin = dataRange.min;
+ var rmax = dataRange.max;
+ var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;
+ var factor, niceMin, niceMax, numSpaces;
+
+ // Beyond MIN_SPACING floating point numbers being to lose precision
+ // such that we can't do the math necessary to generate ticks
+ if (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {
+ return [rmin, rmax];
+ }
+
+ numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);
+ if (numSpaces > maxNumSpaces) {
+ // If the calculated num of spaces exceeds maxNumSpaces, recalculate it
+ spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;
+ }
+
+ if (stepSize || isNullOrUndef$2(precision)) {
+ // If a precision is not specified, calculate factor based on spacing
+ factor = Math.pow(10, helpers$1._decimalPlaces(spacing));
+ } else {
+ // If the user specified a precision, round to that number of decimal places
+ factor = Math.pow(10, precision);
+ spacing = Math.ceil(spacing * factor) / factor;
+ }
+
+ niceMin = Math.floor(rmin / spacing) * spacing;
+ niceMax = Math.ceil(rmax / spacing) * spacing;
+
+ // If min, max and stepSize is set and they make an evenly spaced scale use it.
+ if (stepSize) {
+ // If very close to our whole number, use it.
+ if (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {
+ niceMin = min;
+ }
+ if (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {
+ niceMax = max;
+ }
+ }
+
+ numSpaces = (niceMax - niceMin) / spacing;
+ // If very close to our rounded value, use it.
+ if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {
+ numSpaces = Math.round(numSpaces);
+ } else {
+ numSpaces = Math.ceil(numSpaces);
+ }
+
+ niceMin = Math.round(niceMin * factor) / factor;
+ niceMax = Math.round(niceMax * factor) / factor;
+ ticks.push(isNullOrUndef$2(min) ? niceMin : min);
+ for (var j = 1; j < numSpaces; ++j) {
+ ticks.push(Math.round((niceMin + j * spacing) * factor) / factor);
+ }
+ ticks.push(isNullOrUndef$2(max) ? niceMax : max);
+
+ return ticks;
+}
+
+var scale_linearbase = core_scale.extend({
+ getRightValue: function(value) {
+ if (typeof value === 'string') {
+ return +value;
+ }
+ return core_scale.prototype.getRightValue.call(this, value);
+ },
+
+ handleTickRangeOptions: function() {
+ var me = this;
+ var opts = me.options;
+ var tickOpts = opts.ticks;
+
+ // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,
+ // do nothing since that would make the chart weird. If the user really wants a weird chart
+ // axis, they can manually override it
+ if (tickOpts.beginAtZero) {
+ var minSign = helpers$1.sign(me.min);
+ var maxSign = helpers$1.sign(me.max);
+
+ if (minSign < 0 && maxSign < 0) {
+ // move the top up to 0
+ me.max = 0;
+ } else if (minSign > 0 && maxSign > 0) {
+ // move the bottom down to 0
+ me.min = 0;
+ }
+ }
+
+ var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;
+ var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;
+
+ if (tickOpts.min !== undefined) {
+ me.min = tickOpts.min;
+ } else if (tickOpts.suggestedMin !== undefined) {
+ if (me.min === null) {
+ me.min = tickOpts.suggestedMin;
+ } else {
+ me.min = Math.min(me.min, tickOpts.suggestedMin);
+ }
+ }
+
+ if (tickOpts.max !== undefined) {
+ me.max = tickOpts.max;
+ } else if (tickOpts.suggestedMax !== undefined) {
+ if (me.max === null) {
+ me.max = tickOpts.suggestedMax;
+ } else {
+ me.max = Math.max(me.max, tickOpts.suggestedMax);
+ }
+ }
+
+ if (setMin !== setMax) {
+ // We set the min or the max but not both.
+ // So ensure that our range is good
+ // Inverted or 0 length range can happen when
+ // ticks.min is set, and no datasets are visible
+ if (me.min >= me.max) {
+ if (setMin) {
+ me.max = me.min + 1;
+ } else {
+ me.min = me.max - 1;
+ }
+ }
+ }
+
+ if (me.min === me.max) {
+ me.max++;
+
+ if (!tickOpts.beginAtZero) {
+ me.min--;
+ }
+ }
+ },
+
+ getTickLimit: function() {
+ var me = this;
+ var tickOpts = me.options.ticks;
+ var stepSize = tickOpts.stepSize;
+ var maxTicksLimit = tickOpts.maxTicksLimit;
+ var maxTicks;
+
+ if (stepSize) {
+ maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;
+ } else {
+ maxTicks = me._computeTickLimit();
+ maxTicksLimit = maxTicksLimit || 11;
+ }
+
+ if (maxTicksLimit) {
+ maxTicks = Math.min(maxTicksLimit, maxTicks);
+ }
+
+ return maxTicks;
+ },
+
+ _computeTickLimit: function() {
+ return Number.POSITIVE_INFINITY;
+ },
+
+ handleDirectionalChanges: noop,
+
+ buildTicks: function() {
+ var me = this;
+ var opts = me.options;
+ var tickOpts = opts.ticks;
+
+ // Figure out what the max number of ticks we can support it is based on the size of
+ // the axis area. For now, we say that the minimum tick spacing in pixels must be 40
+ // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on
+ // the graph. Make sure we always have at least 2 ticks
+ var maxTicks = me.getTickLimit();
+ maxTicks = Math.max(2, maxTicks);
+
+ var numericGeneratorOptions = {
+ maxTicks: maxTicks,
+ min: tickOpts.min,
+ max: tickOpts.max,
+ precision: tickOpts.precision,
+ stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)
+ };
+ var ticks = me.ticks = generateTicks(numericGeneratorOptions, me);
+
+ me.handleDirectionalChanges();
+
+ // At this point, we need to update our max and min given the tick values since we have expanded the
+ // range of the scale
+ me.max = helpers$1.max(ticks);
+ me.min = helpers$1.min(ticks);
+
+ if (tickOpts.reverse) {
+ ticks.reverse();
+
+ me.start = me.max;
+ me.end = me.min;
+ } else {
+ me.start = me.min;
+ me.end = me.max;
+ }
+ },
+
+ convertTicksToLabels: function() {
+ var me = this;
+ me.ticksAsNumbers = me.ticks.slice();
+ me.zeroLineIndex = me.ticks.indexOf(0);
+
+ core_scale.prototype.convertTicksToLabels.call(me);
+ },
+
+ _configure: function() {
+ var me = this;
+ var ticks = me.getTicks();
+ var start = me.min;
+ var end = me.max;
+ var offset;
+
+ core_scale.prototype._configure.call(me);
+
+ if (me.options.offset && ticks.length) {
+ offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;
+ start -= offset;
+ end += offset;
+ }
+ me._startValue = start;
+ me._endValue = end;
+ me._valueRange = end - start;
+ }
+});
+
+var defaultConfig$1 = {
+ position: 'left',
+ ticks: {
+ callback: core_ticks.formatters.linear
+ }
+};
+
+var DEFAULT_MIN = 0;
+var DEFAULT_MAX = 1;
+
+function getOrCreateStack(stacks, stacked, meta) {
+ var key = [
+ meta.type,
+ // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
+ stacked === undefined && meta.stack === undefined ? meta.index : '',
+ meta.stack
+ ].join('.');
+
+ if (stacks[key] === undefined) {
+ stacks[key] = {
+ pos: [],
+ neg: []
+ };
+ }
+
+ return stacks[key];
+}
+
+function stackData(scale, stacks, meta, data) {
+ var opts = scale.options;
+ var stacked = opts.stacked;
+ var stack = getOrCreateStack(stacks, stacked, meta);
+ var pos = stack.pos;
+ var neg = stack.neg;
+ var ilen = data.length;
+ var i, value;
+
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
+ }
+
+ pos[i] = pos[i] || 0;
+ neg[i] = neg[i] || 0;
+
+ if (opts.relativePoints) {
+ pos[i] = 100;
+ } else if (value.min < 0 || value.max < 0) {
+ neg[i] += value.min;
+ } else {
+ pos[i] += value.max;
+ }
+ }
+}
+
+function updateMinMax(scale, meta, data) {
+ var ilen = data.length;
+ var i, value;
+
+ for (i = 0; i < ilen; ++i) {
+ value = scale._parseValue(data[i]);
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {
+ continue;
+ }
+
+ scale.min = Math.min(scale.min, value.min);
+ scale.max = Math.max(scale.max, value.max);
+ }
+}
+
+var scale_linear = scale_linearbase.extend({
+ determineDataLimits: function() {
+ var me = this;
+ var opts = me.options;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var metasets = me._getMatchingVisibleMetas();
+ var hasStacks = opts.stacked;
+ var stacks = {};
+ var ilen = metasets.length;
+ var i, meta, data, values;
+
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
+
+ if (hasStacks === undefined) {
+ for (i = 0; !hasStacks && i < ilen; ++i) {
+ meta = metasets[i];
+ hasStacks = meta.stack !== undefined;
+ }
+ }
+
+ for (i = 0; i < ilen; ++i) {
+ meta = metasets[i];
+ data = datasets[meta.index].data;
+ if (hasStacks) {
+ stackData(me, stacks, meta, data);
+ } else {
+ updateMinMax(me, meta, data);
+ }
+ }
+
+ helpers$1.each(stacks, function(stackValues) {
+ values = stackValues.pos.concat(stackValues.neg);
+ me.min = Math.min(me.min, helpers$1.min(values));
+ me.max = Math.max(me.max, helpers$1.max(values));
+ });
+
+ me.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;
+ me.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;
+
+ // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero
+ me.handleTickRangeOptions();
+ },
+
+ // Returns the maximum number of ticks based on the scale dimension
+ _computeTickLimit: function() {
+ var me = this;
+ var tickFont;
+
+ if (me.isHorizontal()) {
+ return Math.ceil(me.width / 40);
+ }
+ tickFont = helpers$1.options._parseFont(me.options.ticks);
+ return Math.ceil(me.height / tickFont.lineHeight);
+ },
+
+ // Called after the ticks are built. We need
+ handleDirectionalChanges: function() {
+ if (!this.isHorizontal()) {
+ // We are in a vertical orientation. The top value is the highest. So reverse the array
+ this.ticks.reverse();
+ }
+ },
+
+ getLabelForIndex: function(index, datasetIndex) {
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
+ },
+
+ // Utils
+ getPixelForValue: function(value) {
+ var me = this;
+ return me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);
+ },
+
+ getValueForPixel: function(pixel) {
+ return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;
+ },
+
+ getPixelForTick: function(index) {
+ var ticks = this.ticksAsNumbers;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
+ }
+});
+
+// INTERNAL: static default options, registered in src/index.js
+var _defaults$1 = defaultConfig$1;
+scale_linear._defaults = _defaults$1;
+
+var valueOrDefault$b = helpers$1.valueOrDefault;
+var log10 = helpers$1.math.log10;
+
+/**
+ * Generate a set of logarithmic ticks
+ * @param generationOptions the options used to generate the ticks
+ * @param dataRange the range of the data
+ * @returns {number[]} array of tick values
+ */
+function generateTicks$1(generationOptions, dataRange) {
+ var ticks = [];
+
+ var tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));
+
+ var endExp = Math.floor(log10(dataRange.max));
+ var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));
+ var exp, significand;
+
+ if (tickVal === 0) {
+ exp = Math.floor(log10(dataRange.minNotZero));
+ significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));
+
+ ticks.push(tickVal);
+ tickVal = significand * Math.pow(10, exp);
+ } else {
+ exp = Math.floor(log10(tickVal));
+ significand = Math.floor(tickVal / Math.pow(10, exp));
+ }
+ var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;
+
+ do {
+ ticks.push(tickVal);
+
+ ++significand;
+ if (significand === 10) {
+ significand = 1;
+ ++exp;
+ precision = exp >= 0 ? 1 : precision;
+ }
+
+ tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;
+ } while (exp < endExp || (exp === endExp && significand < endSignificand));
+
+ var lastTick = valueOrDefault$b(generationOptions.max, tickVal);
+ ticks.push(lastTick);
+
+ return ticks;
+}
+
+var defaultConfig$2 = {
+ position: 'left',
+
+ // label settings
+ ticks: {
+ callback: core_ticks.formatters.logarithmic
+ }
+};
+
+// TODO(v3): change this to positiveOrDefault
+function nonNegativeOrDefault(value, defaultValue) {
+ return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;
+}
+
+var scale_logarithmic = core_scale.extend({
+ determineDataLimits: function() {
+ var me = this;
+ var opts = me.options;
+ var chart = me.chart;
+ var datasets = chart.data.datasets;
+ var isHorizontal = me.isHorizontal();
+ function IDMatches(meta) {
+ return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;
+ }
+ var datasetIndex, meta, value, data, i, ilen;
+
+ // Calculate Range
+ me.min = Number.POSITIVE_INFINITY;
+ me.max = Number.NEGATIVE_INFINITY;
+ me.minNotZero = Number.POSITIVE_INFINITY;
+
+ var hasStacks = opts.stacked;
+ if (hasStacks === undefined) {
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
+ if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&
+ meta.stack !== undefined) {
+ hasStacks = true;
+ break;
+ }
+ }
+ }
+
+ if (opts.stacked || hasStacks) {
+ var valuesPerStack = {};
+
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
+ var key = [
+ meta.type,
+ // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined
+ ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),
+ meta.stack
+ ].join('.');
+
+ if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
+ if (valuesPerStack[key] === undefined) {
+ valuesPerStack[key] = [];
+ }
+
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
+ var values = valuesPerStack[key];
+ value = me._parseValue(data[i]);
+ // invalid, hidden and negative values are ignored
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
+ }
+ values[i] = values[i] || 0;
+ values[i] += value.max;
+ }
+ }
+ }
+
+ helpers$1.each(valuesPerStack, function(valuesForType) {
+ if (valuesForType.length > 0) {
+ var minVal = helpers$1.min(valuesForType);
+ var maxVal = helpers$1.max(valuesForType);
+ me.min = Math.min(me.min, minVal);
+ me.max = Math.max(me.max, maxVal);
+ }
+ });
+
+ } else {
+ for (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {
+ meta = chart.getDatasetMeta(datasetIndex);
+ if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {
+ data = datasets[datasetIndex].data;
+ for (i = 0, ilen = data.length; i < ilen; i++) {
+ value = me._parseValue(data[i]);
+ // invalid, hidden and negative values are ignored
+ if (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {
+ continue;
+ }
+
+ me.min = Math.min(value.min, me.min);
+ me.max = Math.max(value.max, me.max);
+
+ if (value.min !== 0) {
+ me.minNotZero = Math.min(value.min, me.minNotZero);
+ }
+ }
+ }
+ }
+ }
+
+ me.min = helpers$1.isFinite(me.min) ? me.min : null;
+ me.max = helpers$1.isFinite(me.max) ? me.max : null;
+ me.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null;
+
+ // Common base implementation to handle ticks.min, ticks.max
+ this.handleTickRangeOptions();
+ },
+
+ handleTickRangeOptions: function() {
+ var me = this;
+ var tickOpts = me.options.ticks;
+ var DEFAULT_MIN = 1;
+ var DEFAULT_MAX = 10;
+
+ me.min = nonNegativeOrDefault(tickOpts.min, me.min);
+ me.max = nonNegativeOrDefault(tickOpts.max, me.max);
+
+ if (me.min === me.max) {
+ if (me.min !== 0 && me.min !== null) {
+ me.min = Math.pow(10, Math.floor(log10(me.min)) - 1);
+ me.max = Math.pow(10, Math.floor(log10(me.max)) + 1);
+ } else {
+ me.min = DEFAULT_MIN;
+ me.max = DEFAULT_MAX;
+ }
+ }
+ if (me.min === null) {
+ me.min = Math.pow(10, Math.floor(log10(me.max)) - 1);
+ }
+ if (me.max === null) {
+ me.max = me.min !== 0
+ ? Math.pow(10, Math.floor(log10(me.min)) + 1)
+ : DEFAULT_MAX;
+ }
+ if (me.minNotZero === null) {
+ if (me.min > 0) {
+ me.minNotZero = me.min;
+ } else if (me.max < 1) {
+ me.minNotZero = Math.pow(10, Math.floor(log10(me.max)));
+ } else {
+ me.minNotZero = DEFAULT_MIN;
+ }
+ }
+ },
+
+ buildTicks: function() {
+ var me = this;
+ var tickOpts = me.options.ticks;
+ var reverse = !me.isHorizontal();
+
+ var generationOptions = {
+ min: nonNegativeOrDefault(tickOpts.min),
+ max: nonNegativeOrDefault(tickOpts.max)
+ };
+ var ticks = me.ticks = generateTicks$1(generationOptions, me);
+
+ // At this point, we need to update our max and min given the tick values since we have expanded the
+ // range of the scale
+ me.max = helpers$1.max(ticks);
+ me.min = helpers$1.min(ticks);
+
+ if (tickOpts.reverse) {
+ reverse = !reverse;
+ me.start = me.max;
+ me.end = me.min;
+ } else {
+ me.start = me.min;
+ me.end = me.max;
+ }
+ if (reverse) {
+ ticks.reverse();
+ }
+ },
+
+ convertTicksToLabels: function() {
+ this.tickValues = this.ticks.slice();
+
+ core_scale.prototype.convertTicksToLabels.call(this);
+ },
+
+ // Get the correct tooltip label
+ getLabelForIndex: function(index, datasetIndex) {
+ return this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);
+ },
+
+ getPixelForTick: function(index) {
+ var ticks = this.tickValues;
+ if (index < 0 || index > ticks.length - 1) {
+ return null;
+ }
+ return this.getPixelForValue(ticks[index]);
+ },
+
+ /**
+ * Returns the value of the first tick.
+ * @param {number} value - The minimum not zero value.
+ * @return {number} The first tick value.
+ * @private
+ */
+ _getFirstTickValue: function(value) {
+ var exp = Math.floor(log10(value));
+ var significand = Math.floor(value / Math.pow(10, exp));
+
+ return significand * Math.pow(10, exp);
+ },
+
+ _configure: function() {
+ var me = this;
+ var start = me.min;
+ var offset = 0;
+
+ core_scale.prototype._configure.call(me);
+
+ if (start === 0) {
+ start = me._getFirstTickValue(me.minNotZero);
+ offset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;
+ }
+
+ me._startValue = log10(start);
+ me._valueOffset = offset;
+ me._valueRange = (log10(me.max) - log10(start)) / (1 - offset);
+ },
+
+ getPixelForValue: function(value) {
+ var me = this;
+ var decimal = 0;
+
+ value = +me.getRightValue(value);
+
+ if (value > me.min && value > 0) {
+ decimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;
+ }
+ return me.getPixelForDecimal(decimal);
+ },
+
+ getValueForPixel: function(pixel) {
+ var me = this;
+ var decimal = me.getDecimalForPixel(pixel);
+ return decimal === 0 && me.min === 0
+ ? 0
+ : Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);
+ }
+});
+
+// INTERNAL: static default options, registered in src/index.js
+var _defaults$2 = defaultConfig$2;
+scale_logarithmic._defaults = _defaults$2;
+
+var valueOrDefault$c = helpers$1.valueOrDefault;
+var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;
+var resolve$4 = helpers$1.options.resolve;
+
+var defaultConfig$3 = {
+ display: true,
+
+ // Boolean - Whether to animate scaling the chart from the centre
+ animate: true,
+ position: 'chartArea',
+
+ angleLines: {
+ display: true,
+ color: 'rgba(0,0,0,0.1)',
+ lineWidth: 1,
+ borderDash: [],
+ borderDashOffset: 0.0
+ },
+
+ gridLines: {
+ circular: false
+ },
+
+ // label settings
+ ticks: {
+ // Boolean - Show a backdrop to the scale label
+ showLabelBackdrop: true,
+
+ // String - The colour of the label backdrop
+ backdropColor: 'rgba(255,255,255,0.75)',
+
+ // Number - The backdrop padding above & below the label in pixels
+ backdropPaddingY: 2,
+
+ // Number - The backdrop padding to the side of the label in pixels
+ backdropPaddingX: 2,
+
+ callback: core_ticks.formatters.linear
+ },
+
+ pointLabels: {
+ // Boolean - if true, show point labels
+ display: true,
+
+ // Number - Point label font size in pixels
+ fontSize: 10,
+
+ // Function - Used to convert point labels
+ callback: function(label) {
+ return label;
+ }
+ }
+};
+
+function getTickBackdropHeight(opts) {
+ var tickOpts = opts.ticks;
+
+ if (tickOpts.display && opts.display) {
+ return valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;
+ }
+ return 0;
+}
+
+function measureLabelSize(ctx, lineHeight, label) {
+ if (helpers$1.isArray(label)) {
+ return {
+ w: helpers$1.longestText(ctx, ctx.font, label),
+ h: label.length * lineHeight
+ };
+ }
+
+ return {
+ w: ctx.measureText(label).width,
+ h: lineHeight
+ };
+}
+
+function determineLimits(angle, pos, size, min, max) {
+ if (angle === min || angle === max) {
+ return {
+ start: pos - (size / 2),
+ end: pos + (size / 2)
+ };
+ } else if (angle < min || angle > max) {
+ return {
+ start: pos - size,
+ end: pos
+ };
+ }
+
+ return {
+ start: pos,
+ end: pos + size
+ };
+}
+
+/**
+ * Helper function to fit a radial linear scale with point labels
+ */
+function fitWithPointLabels(scale) {
+
+ // Right, this is really confusing and there is a lot of maths going on here
+ // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9
+ //
+ // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif
+ //
+ // Solution:
+ //
+ // We assume the radius of the polygon is half the size of the canvas at first
+ // at each index we check if the text overlaps.
+ //
+ // Where it does, we store that angle and that index.
+ //
+ // After finding the largest index and angle we calculate how much we need to remove
+ // from the shape radius to move the point inwards by that x.
+ //
+ // We average the left and right distances to get the maximum shape radius that can fit in the box
+ // along with labels.
+ //
+ // Once we have that, we can find the centre point for the chart, by taking the x text protrusion
+ // on each side, removing that from the size, halving it and adding the left x protrusion width.
+ //
+ // This will mean we have a shape fitted to the canvas, as large as it can be with the labels
+ // and position it in the most space efficient manner
+ //
+ // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif
+
+ var plFont = helpers$1.options._parseFont(scale.options.pointLabels);
+
+ // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.
+ // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points
+ var furthestLimits = {
+ l: 0,
+ r: scale.width,
+ t: 0,
+ b: scale.height - scale.paddingTop
+ };
+ var furthestAngles = {};
+ var i, textSize, pointPosition;
+
+ scale.ctx.font = plFont.string;
+ scale._pointLabelSizes = [];
+
+ var valueCount = scale.chart.data.labels.length;
+ for (i = 0; i < valueCount; i++) {
+ pointPosition = scale.getPointPosition(i, scale.drawingArea + 5);
+ textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);
+ scale._pointLabelSizes[i] = textSize;
+
+ // Add quarter circle to make degree 0 mean top of circle
+ var angleRadians = scale.getIndexAngle(i);
+ var angle = helpers$1.toDegrees(angleRadians) % 360;
+ var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);
+ var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);
+
+ if (hLimits.start < furthestLimits.l) {
+ furthestLimits.l = hLimits.start;
+ furthestAngles.l = angleRadians;
+ }
+
+ if (hLimits.end > furthestLimits.r) {
+ furthestLimits.r = hLimits.end;
+ furthestAngles.r = angleRadians;
+ }
+
+ if (vLimits.start < furthestLimits.t) {
+ furthestLimits.t = vLimits.start;
+ furthestAngles.t = angleRadians;
+ }
+
+ if (vLimits.end > furthestLimits.b) {
+ furthestLimits.b = vLimits.end;
+ furthestAngles.b = angleRadians;
+ }
+ }
+
+ scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);
+}
+
+function getTextAlignForAngle(angle) {
+ if (angle === 0 || angle === 180) {
+ return 'center';
+ } else if (angle < 180) {
+ return 'left';
+ }
+
+ return 'right';
+}
+
+function fillText(ctx, text, position, lineHeight) {
+ var y = position.y + lineHeight / 2;
+ var i, ilen;
+
+ if (helpers$1.isArray(text)) {
+ for (i = 0, ilen = text.length; i < ilen; ++i) {
+ ctx.fillText(text[i], position.x, y);
+ y += lineHeight;
+ }
+ } else {
+ ctx.fillText(text, position.x, y);
+ }
+}
+
+function adjustPointPositionForLabelHeight(angle, textSize, position) {
+ if (angle === 90 || angle === 270) {
+ position.y -= (textSize.h / 2);
+ } else if (angle > 270 || angle < 90) {
+ position.y -= textSize.h;
+ }
+}
+
+function drawPointLabels(scale) {
+ var ctx = scale.ctx;
+ var opts = scale.options;
+ var pointLabelOpts = opts.pointLabels;
+ var tickBackdropHeight = getTickBackdropHeight(opts);
+ var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);
+ var plFont = helpers$1.options._parseFont(pointLabelOpts);
+
+ ctx.save();
+
+ ctx.font = plFont.string;
+ ctx.textBaseline = 'middle';
+
+ for (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {
+ // Extra pixels out for some label spacing
+ var extra = (i === 0 ? tickBackdropHeight / 2 : 0);
+ var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);
+
+ // Keep this in loop since we may support array properties here
+ var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);
+ ctx.fillStyle = pointLabelFontColor;
+
+ var angleRadians = scale.getIndexAngle(i);
+ var angle = helpers$1.toDegrees(angleRadians);
+ ctx.textAlign = getTextAlignForAngle(angle);
+ adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);
+ fillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);
+ }
+ ctx.restore();
+}
+
+function drawRadiusLine(scale, gridLineOpts, radius, index) {
+ var ctx = scale.ctx;
+ var circular = gridLineOpts.circular;
+ var valueCount = scale.chart.data.labels.length;
+ var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);
+ var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);
+ var pointPosition;
+
+ if ((!circular && !valueCount) || !lineColor || !lineWidth) {
+ return;
+ }
+
+ ctx.save();
+ ctx.strokeStyle = lineColor;
+ ctx.lineWidth = lineWidth;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(gridLineOpts.borderDash || []);
+ ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;
+ }
+
+ ctx.beginPath();
+ if (circular) {
+ // Draw circular arcs between the points
+ ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);
+ } else {
+ // Draw straight lines connecting each index
+ pointPosition = scale.getPointPosition(0, radius);
+ ctx.moveTo(pointPosition.x, pointPosition.y);
+
+ for (var i = 1; i < valueCount; i++) {
+ pointPosition = scale.getPointPosition(i, radius);
+ ctx.lineTo(pointPosition.x, pointPosition.y);
+ }
+ }
+ ctx.closePath();
+ ctx.stroke();
+ ctx.restore();
+}
+
+function numberOrZero(param) {
+ return helpers$1.isNumber(param) ? param : 0;
+}
+
+var scale_radialLinear = scale_linearbase.extend({
+ setDimensions: function() {
+ var me = this;
+
+ // Set the unconstrained dimension before label rotation
+ me.width = me.maxWidth;
+ me.height = me.maxHeight;
+ me.paddingTop = getTickBackdropHeight(me.options) / 2;
+ me.xCenter = Math.floor(me.width / 2);
+ me.yCenter = Math.floor((me.height - me.paddingTop) / 2);
+ me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;
+ },
+
+ determineDataLimits: function() {
+ var me = this;
+ var chart = me.chart;
+ var min = Number.POSITIVE_INFINITY;
+ var max = Number.NEGATIVE_INFINITY;
+
+ helpers$1.each(chart.data.datasets, function(dataset, datasetIndex) {
+ if (chart.isDatasetVisible(datasetIndex)) {
+ var meta = chart.getDatasetMeta(datasetIndex);
+
+ helpers$1.each(dataset.data, function(rawValue, index) {
+ var value = +me.getRightValue(rawValue);
+ if (isNaN(value) || meta.data[index].hidden) {
+ return;
+ }
+
+ min = Math.min(value, min);
+ max = Math.max(value, max);
+ });
+ }
+ });
+
+ me.min = (min === Number.POSITIVE_INFINITY ? 0 : min);
+ me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);
+
+ // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero
+ me.handleTickRangeOptions();
+ },
+
+ // Returns the maximum number of ticks based on the scale dimension
+ _computeTickLimit: function() {
+ return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));
+ },
+
+ convertTicksToLabels: function() {
+ var me = this;
+
+ scale_linearbase.prototype.convertTicksToLabels.call(me);
+
+ // Point labels
+ me.pointLabels = me.chart.data.labels.map(function() {
+ var label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);
+ return label || label === 0 ? label : '';
+ });
+ },
+
+ getLabelForIndex: function(index, datasetIndex) {
+ return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
+ },
+
+ fit: function() {
+ var me = this;
+ var opts = me.options;
+
+ if (opts.display && opts.pointLabels.display) {
+ fitWithPointLabels(me);
+ } else {
+ me.setCenterPoint(0, 0, 0, 0);
+ }
+ },
+
+ /**
+ * Set radius reductions and determine new radius and center point
+ * @private
+ */
+ setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {
+ var me = this;
+ var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);
+ var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);
+ var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);
+ var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);
+
+ radiusReductionLeft = numberOrZero(radiusReductionLeft);
+ radiusReductionRight = numberOrZero(radiusReductionRight);
+ radiusReductionTop = numberOrZero(radiusReductionTop);
+ radiusReductionBottom = numberOrZero(radiusReductionBottom);
+
+ me.drawingArea = Math.min(
+ Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),
+ Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));
+ me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);
+ },
+
+ setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {
+ var me = this;
+ var maxRight = me.width - rightMovement - me.drawingArea;
+ var maxLeft = leftMovement + me.drawingArea;
+ var maxTop = topMovement + me.drawingArea;
+ var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;
+
+ me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);
+ me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);
+ },
+
+ getIndexAngle: function(index) {
+ var chart = this.chart;
+ var angleMultiplier = 360 / chart.data.labels.length;
+ var options = chart.options || {};
+ var startAngle = options.startAngle || 0;
+
+ // Start from the top instead of right, so remove a quarter of the circle
+ var angle = (index * angleMultiplier + startAngle) % 360;
+
+ return (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;
+ },
+
+ getDistanceFromCenterForValue: function(value) {
+ var me = this;
+
+ if (helpers$1.isNullOrUndef(value)) {
+ return NaN;
+ }
+
+ // Take into account half font size + the yPadding of the top value
+ var scalingFactor = me.drawingArea / (me.max - me.min);
+ if (me.options.ticks.reverse) {
+ return (me.max - value) * scalingFactor;
+ }
+ return (value - me.min) * scalingFactor;
+ },
+
+ getPointPosition: function(index, distanceFromCenter) {
+ var me = this;
+ var thisAngle = me.getIndexAngle(index) - (Math.PI / 2);
+ return {
+ x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,
+ y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter
+ };
+ },
+
+ getPointPositionForValue: function(index, value) {
+ return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
+ },
+
+ getBasePosition: function(index) {
+ var me = this;
+ var min = me.min;
+ var max = me.max;
+
+ return me.getPointPositionForValue(index || 0,
+ me.beginAtZero ? 0 :
+ min < 0 && max < 0 ? max :
+ min > 0 && max > 0 ? min :
+ 0);
+ },
+
+ /**
+ * @private
+ */
+ _drawGrid: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var opts = me.options;
+ var gridLineOpts = opts.gridLines;
+ var angleLineOpts = opts.angleLines;
+ var lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);
+ var lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);
+ var i, offset, position;
+
+ if (opts.pointLabels.display) {
+ drawPointLabels(me);
+ }
+
+ if (gridLineOpts.display) {
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index !== 0) {
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+ drawRadiusLine(me, gridLineOpts, offset, index);
+ }
+ });
+ }
+
+ if (angleLineOpts.display && lineWidth && lineColor) {
+ ctx.save();
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = lineColor;
+ if (ctx.setLineDash) {
+ ctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));
+ ctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);
+ }
+
+ for (i = me.chart.data.labels.length - 1; i >= 0; i--) {
+ offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);
+ position = me.getPointPosition(i, offset);
+ ctx.beginPath();
+ ctx.moveTo(me.xCenter, me.yCenter);
+ ctx.lineTo(position.x, position.y);
+ ctx.stroke();
+ }
+
+ ctx.restore();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _drawLabels: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var opts = me.options;
+ var tickOpts = opts.ticks;
+
+ if (!tickOpts.display) {
+ return;
+ }
+
+ var startAngle = me.getIndexAngle(0);
+ var tickFont = helpers$1.options._parseFont(tickOpts);
+ var tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);
+ var offset, width;
+
+ ctx.save();
+ ctx.font = tickFont.string;
+ ctx.translate(me.xCenter, me.yCenter);
+ ctx.rotate(startAngle);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ helpers$1.each(me.ticks, function(label, index) {
+ if (index === 0 && !tickOpts.reverse) {
+ return;
+ }
+
+ offset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);
+
+ if (tickOpts.showLabelBackdrop) {
+ width = ctx.measureText(label).width;
+ ctx.fillStyle = tickOpts.backdropColor;
+
+ ctx.fillRect(
+ -width / 2 - tickOpts.backdropPaddingX,
+ -offset - tickFont.size / 2 - tickOpts.backdropPaddingY,
+ width + tickOpts.backdropPaddingX * 2,
+ tickFont.size + tickOpts.backdropPaddingY * 2
+ );
+ }
+
+ ctx.fillStyle = tickFontColor;
+ ctx.fillText(label, 0, -offset);
+ });
+
+ ctx.restore();
+ },
+
+ /**
+ * @private
+ */
+ _drawTitle: helpers$1.noop
+});
+
+// INTERNAL: static default options, registered in src/index.js
+var _defaults$3 = defaultConfig$3;
+scale_radialLinear._defaults = _defaults$3;
+
+var deprecated$1 = helpers$1._deprecated;
+var resolve$5 = helpers$1.options.resolve;
+var valueOrDefault$d = helpers$1.valueOrDefault;
+
+// Integer constants are from the ES6 spec.
+var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
+var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
+
+var INTERVALS = {
+ millisecond: {
+ common: true,
+ size: 1,
+ steps: 1000
+ },
+ second: {
+ common: true,
+ size: 1000,
+ steps: 60
+ },
+ minute: {
+ common: true,
+ size: 60000,
+ steps: 60
+ },
+ hour: {
+ common: true,
+ size: 3600000,
+ steps: 24
+ },
+ day: {
+ common: true,
+ size: 86400000,
+ steps: 30
+ },
+ week: {
+ common: false,
+ size: 604800000,
+ steps: 4
+ },
+ month: {
+ common: true,
+ size: 2.628e9,
+ steps: 12
+ },
+ quarter: {
+ common: false,
+ size: 7.884e9,
+ steps: 4
+ },
+ year: {
+ common: true,
+ size: 3.154e10
+ }
+};
+
+var UNITS = Object.keys(INTERVALS);
+
+function sorter(a, b) {
+ return a - b;
+}
+
+function arrayUnique(items) {
+ var hash = {};
+ var out = [];
+ var i, ilen, item;
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ item = items[i];
+ if (!hash[item]) {
+ hash[item] = true;
+ out.push(item);
+ }
+ }
+
+ return out;
+}
+
+function getMin(options) {
+ return helpers$1.valueOrDefault(options.time.min, options.ticks.min);
+}
+
+function getMax(options) {
+ return helpers$1.valueOrDefault(options.time.max, options.ticks.max);
+}
+
+/**
+ * Returns an array of {time, pos} objects used to interpolate a specific `time` or position
+ * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is
+ * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other
+ * extremity (left + width or top + height). Note that it would be more optimized to directly
+ * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need
+ * to create the lookup table. The table ALWAYS contains at least two items: min and max.
+ *
+ * @param {number[]} timestamps - timestamps sorted from lowest to highest.
+ * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min
+ * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.
+ * If 'series', timestamps will be positioned at the same distance from each other. In this
+ * case, only timestamps that break the time linearity are registered, meaning that in the
+ * best case, all timestamps are linear, the table contains only min and max.
+ */
+function buildLookupTable(timestamps, min, max, distribution) {
+ if (distribution === 'linear' || !timestamps.length) {
+ return [
+ {time: min, pos: 0},
+ {time: max, pos: 1}
+ ];
+ }
+
+ var table = [];
+ var items = [min];
+ var i, ilen, prev, curr, next;
+
+ for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
+ curr = timestamps[i];
+ if (curr > min && curr < max) {
+ items.push(curr);
+ }
+ }
+
+ items.push(max);
+
+ for (i = 0, ilen = items.length; i < ilen; ++i) {
+ next = items[i + 1];
+ prev = items[i - 1];
+ curr = items[i];
+
+ // only add points that breaks the scale linearity
+ if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {
+ table.push({time: curr, pos: i / (ilen - 1)});
+ }
+ }
+
+ return table;
+}
+
+// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/
+function lookup(table, key, value) {
+ var lo = 0;
+ var hi = table.length - 1;
+ var mid, i0, i1;
+
+ while (lo >= 0 && lo <= hi) {
+ mid = (lo + hi) >> 1;
+ i0 = table[mid - 1] || null;
+ i1 = table[mid];
+
+ if (!i0) {
+ // given value is outside table (before first item)
+ return {lo: null, hi: i1};
+ } else if (i1[key] < value) {
+ lo = mid + 1;
+ } else if (i0[key] > value) {
+ hi = mid - 1;
+ } else {
+ return {lo: i0, hi: i1};
+ }
+ }
+
+ // given value is outside table (after last item)
+ return {lo: i1, hi: null};
+}
+
+/**
+ * Linearly interpolates the given source `value` using the table items `skey` values and
+ * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')
+ * returns the position for a timestamp equal to 42. If value is out of bounds, values at
+ * index [0, 1] or [n - 1, n] are used for the interpolation.
+ */
+function interpolate$1(table, skey, sval, tkey) {
+ var range = lookup(table, skey, sval);
+
+ // Note: the lookup table ALWAYS contains at least 2 items (min and max)
+ var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;
+ var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;
+
+ var span = next[skey] - prev[skey];
+ var ratio = span ? (sval - prev[skey]) / span : 0;
+ var offset = (next[tkey] - prev[tkey]) * ratio;
+
+ return prev[tkey] + offset;
+}
+
+function toTimestamp(scale, input) {
+ var adapter = scale._adapter;
+ var options = scale.options.time;
+ var parser = options.parser;
+ var format = parser || options.format;
+ var value = input;
+
+ if (typeof parser === 'function') {
+ value = parser(value);
+ }
+
+ // Only parse if its not a timestamp already
+ if (!helpers$1.isFinite(value)) {
+ value = typeof format === 'string'
+ ? adapter.parse(value, format)
+ : adapter.parse(value);
+ }
+
+ if (value !== null) {
+ return +value;
+ }
+
+ // Labels are in an incompatible format and no `parser` has been provided.
+ // The user might still use the deprecated `format` option for parsing.
+ if (!parser && typeof format === 'function') {
+ value = format(input);
+
+ // `format` could return something else than a timestamp, if so, parse it
+ if (!helpers$1.isFinite(value)) {
+ value = adapter.parse(value);
+ }
+ }
+
+ return value;
+}
+
+function parse(scale, input) {
+ if (helpers$1.isNullOrUndef(input)) {
+ return null;
+ }
+
+ var options = scale.options.time;
+ var value = toTimestamp(scale, scale.getRightValue(input));
+ if (value === null) {
+ return value;
+ }
+
+ if (options.round) {
+ value = +scale._adapter.startOf(value, options.round);
+ }
+
+ return value;
+}
+
+/**
+ * Figures out what unit results in an appropriate number of auto-generated ticks
+ */
+function determineUnitForAutoTicks(minUnit, min, max, capacity) {
+ var ilen = UNITS.length;
+ var i, interval, factor;
+
+ for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {
+ interval = INTERVALS[UNITS[i]];
+ factor = interval.steps ? interval.steps : MAX_INTEGER;
+
+ if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {
+ return UNITS[i];
+ }
+ }
+
+ return UNITS[ilen - 1];
+}
+
+/**
+ * Figures out what unit to format a set of ticks with
+ */
+function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {
+ var i, unit;
+
+ for (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {
+ unit = UNITS[i];
+ if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {
+ return unit;
+ }
+ }
+
+ return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];
+}
+
+function determineMajorUnit(unit) {
+ for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {
+ if (INTERVALS[UNITS[i]].common) {
+ return UNITS[i];
+ }
+ }
+}
+
+/**
+ * Generates a maximum of `capacity` timestamps between min and max, rounded to the
+ * `minor` unit using the given scale time `options`.
+ * Important: this method can return ticks outside the min and max range, it's the
+ * responsibility of the calling code to clamp values if needed.
+ */
+function generate(scale, min, max, capacity) {
+ var adapter = scale._adapter;
+ var options = scale.options;
+ var timeOpts = options.time;
+ var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);
+ var stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);
+ var weekday = minor === 'week' ? timeOpts.isoWeekday : false;
+ var first = min;
+ var ticks = [];
+ var time;
+
+ // For 'week' unit, handle the first day of week option
+ if (weekday) {
+ first = +adapter.startOf(first, 'isoWeek', weekday);
+ }
+
+ // Align first ticks on unit
+ first = +adapter.startOf(first, weekday ? 'day' : minor);
+
+ // Prevent browser from freezing in case user options request millions of milliseconds
+ if (adapter.diff(max, min, minor) > 100000 * stepSize) {
+ throw min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;
+ }
+
+ for (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {
+ ticks.push(time);
+ }
+
+ if (time === max || options.bounds === 'ticks') {
+ ticks.push(time);
+ }
+
+ return ticks;
+}
+
+/**
+ * Returns the start and end offsets from edges in the form of {start, end}
+ * where each value is a relative width to the scale and ranges between 0 and 1.
+ * They add extra margins on the both sides by scaling down the original scale.
+ * Offsets are added when the `offset` option is true.
+ */
+function computeOffsets(table, ticks, min, max, options) {
+ var start = 0;
+ var end = 0;
+ var first, last;
+
+ if (options.offset && ticks.length) {
+ first = interpolate$1(table, 'time', ticks[0], 'pos');
+ if (ticks.length === 1) {
+ start = 1 - first;
+ } else {
+ start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;
+ }
+ last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');
+ if (ticks.length === 1) {
+ end = last;
+ } else {
+ end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;
+ }
+ }
+
+ return {start: start, end: end, factor: 1 / (start + 1 + end)};
+}
+
+function setMajorTicks(scale, ticks, map, majorUnit) {
+ var adapter = scale._adapter;
+ var first = +adapter.startOf(ticks[0].value, majorUnit);
+ var last = ticks[ticks.length - 1].value;
+ var major, index;
+
+ for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {
+ index = map[major];
+ if (index >= 0) {
+ ticks[index].major = true;
+ }
+ }
+ return ticks;
+}
+
+function ticksFromTimestamps(scale, values, majorUnit) {
+ var ticks = [];
+ var map = {};
+ var ilen = values.length;
+ var i, value;
+
+ for (i = 0; i < ilen; ++i) {
+ value = values[i];
+ map[value] = i;
+
+ ticks.push({
+ value: value,
+ major: false
+ });
+ }
+
+ // We set the major ticks separately from the above loop because calling startOf for every tick
+ // is expensive when there is a large number of ticks
+ return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);
+}
+
+var defaultConfig$4 = {
+ position: 'bottom',
+
+ /**
+ * Data distribution along the scale:
+ * - 'linear': data are spread according to their time (distances can vary),
+ * - 'series': data are spread at the same distance from each other.
+ * @see https://github.com/chartjs/Chart.js/pull/4507
+ * @since 2.7.0
+ */
+ distribution: 'linear',
+
+ /**
+ * Scale boundary strategy (bypassed by min/max time options)
+ * - `data`: make sure data are fully visible, ticks outside are removed
+ * - `ticks`: make sure ticks are fully visible, data outside are truncated
+ * @see https://github.com/chartjs/Chart.js/pull/4556
+ * @since 2.7.0
+ */
+ bounds: 'data',
+
+ adapters: {},
+ time: {
+ parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment
+ unit: false, // false == automatic or override with week, month, year, etc.
+ round: false, // none, or override with week, month, year, etc.
+ displayFormat: false, // DEPRECATED
+ isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/
+ minUnit: 'millisecond',
+ displayFormats: {}
+ },
+ ticks: {
+ autoSkip: false,
+
+ /**
+ * Ticks generation input values:
+ * - 'auto': generates "optimal" ticks based on scale size and time options.
+ * - 'data': generates ticks from data (including labels from data {t|x|y} objects).
+ * - 'labels': generates ticks from user given `data.labels` values ONLY.
+ * @see https://github.com/chartjs/Chart.js/pull/4507
+ * @since 2.7.0
+ */
+ source: 'auto',
+
+ major: {
+ enabled: false
+ }
+ }
+};
+
+var scale_time = core_scale.extend({
+ initialize: function() {
+ this.mergeTicksOptions();
+ core_scale.prototype.initialize.call(this);
+ },
+
+ update: function() {
+ var me = this;
+ var options = me.options;
+ var time = options.time || (options.time = {});
+ var adapter = me._adapter = new core_adapters._date(options.adapters.date);
+
+ // DEPRECATIONS: output a message only one time per update
+ deprecated$1('time scale', time.format, 'time.format', 'time.parser');
+ deprecated$1('time scale', time.min, 'time.min', 'ticks.min');
+ deprecated$1('time scale', time.max, 'time.max', 'ticks.max');
+
+ // Backward compatibility: before introducing adapter, `displayFormats` was
+ // supposed to contain *all* unit/string pairs but this can't be resolved
+ // when loading the scale (adapters are loaded afterward), so let's populate
+ // missing formats on update
+ helpers$1.mergeIf(time.displayFormats, adapter.formats());
+
+ return core_scale.prototype.update.apply(me, arguments);
+ },
+
+ /**
+ * Allows data to be referenced via 't' attribute
+ */
+ getRightValue: function(rawValue) {
+ if (rawValue && rawValue.t !== undefined) {
+ rawValue = rawValue.t;
+ }
+ return core_scale.prototype.getRightValue.call(this, rawValue);
+ },
+
+ determineDataLimits: function() {
+ var me = this;
+ var chart = me.chart;
+ var adapter = me._adapter;
+ var options = me.options;
+ var unit = options.time.unit || 'day';
+ var min = MAX_INTEGER;
+ var max = MIN_INTEGER;
+ var timestamps = [];
+ var datasets = [];
+ var labels = [];
+ var i, j, ilen, jlen, data, timestamp, labelsAdded;
+ var dataLabels = me._getLabels();
+
+ for (i = 0, ilen = dataLabels.length; i < ilen; ++i) {
+ labels.push(parse(me, dataLabels[i]));
+ }
+
+ for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {
+ if (chart.isDatasetVisible(i)) {
+ data = chart.data.datasets[i].data;
+
+ // Let's consider that all data have the same format.
+ if (helpers$1.isObject(data[0])) {
+ datasets[i] = [];
+
+ for (j = 0, jlen = data.length; j < jlen; ++j) {
+ timestamp = parse(me, data[j]);
+ timestamps.push(timestamp);
+ datasets[i][j] = timestamp;
+ }
+ } else {
+ datasets[i] = labels.slice(0);
+ if (!labelsAdded) {
+ timestamps = timestamps.concat(labels);
+ labelsAdded = true;
+ }
+ }
+ } else {
+ datasets[i] = [];
+ }
+ }
+
+ if (labels.length) {
+ min = Math.min(min, labels[0]);
+ max = Math.max(max, labels[labels.length - 1]);
+ }
+
+ if (timestamps.length) {
+ timestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);
+ min = Math.min(min, timestamps[0]);
+ max = Math.max(max, timestamps[timestamps.length - 1]);
+ }
+
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
+
+ // In case there is no valid min/max, set limits based on unit time option
+ min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;
+ max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max;
+
+ // Make sure that max is strictly higher than min (required by the lookup table)
+ me.min = Math.min(min, max);
+ me.max = Math.max(min + 1, max);
+
+ // PRIVATE
+ me._table = [];
+ me._timestamps = {
+ data: timestamps,
+ datasets: datasets,
+ labels: labels
+ };
+ },
+
+ buildTicks: function() {
+ var me = this;
+ var min = me.min;
+ var max = me.max;
+ var options = me.options;
+ var tickOpts = options.ticks;
+ var timeOpts = options.time;
+ var timestamps = me._timestamps;
+ var ticks = [];
+ var capacity = me.getLabelCapacity(min);
+ var source = tickOpts.source;
+ var distribution = options.distribution;
+ var i, ilen, timestamp;
+
+ if (source === 'data' || (source === 'auto' && distribution === 'series')) {
+ timestamps = timestamps.data;
+ } else if (source === 'labels') {
+ timestamps = timestamps.labels;
+ } else {
+ timestamps = generate(me, min, max, capacity);
+ }
+
+ if (options.bounds === 'ticks' && timestamps.length) {
+ min = timestamps[0];
+ max = timestamps[timestamps.length - 1];
+ }
+
+ // Enforce limits with user min/max options
+ min = parse(me, getMin(options)) || min;
+ max = parse(me, getMax(options)) || max;
+
+ // Remove ticks outside the min/max range
+ for (i = 0, ilen = timestamps.length; i < ilen; ++i) {
+ timestamp = timestamps[i];
+ if (timestamp >= min && timestamp <= max) {
+ ticks.push(timestamp);
+ }
+ }
+
+ me.min = min;
+ me.max = max;
+
+ // PRIVATE
+ // determineUnitForFormatting relies on the number of ticks so we don't use it when
+ // autoSkip is enabled because we don't yet know what the final number of ticks will be
+ me._unit = timeOpts.unit || (tickOpts.autoSkip
+ ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity)
+ : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));
+ me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined
+ : determineMajorUnit(me._unit);
+ me._table = buildLookupTable(me._timestamps.data, min, max, distribution);
+ me._offsets = computeOffsets(me._table, ticks, min, max, options);
+
+ if (tickOpts.reverse) {
+ ticks.reverse();
+ }
+
+ return ticksFromTimestamps(me, ticks, me._majorUnit);
+ },
+
+ getLabelForIndex: function(index, datasetIndex) {
+ var me = this;
+ var adapter = me._adapter;
+ var data = me.chart.data;
+ var timeOpts = me.options.time;
+ var label = data.labels && index < data.labels.length ? data.labels[index] : '';
+ var value = data.datasets[datasetIndex].data[index];
+
+ if (helpers$1.isObject(value)) {
+ label = me.getRightValue(value);
+ }
+ if (timeOpts.tooltipFormat) {
+ return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);
+ }
+ if (typeof label === 'string') {
+ return label;
+ }
+ return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);
+ },
+
+ /**
+ * Function to format an individual tick mark
+ * @private
+ */
+ tickFormatFunction: function(time, index, ticks, format) {
+ var me = this;
+ var adapter = me._adapter;
+ var options = me.options;
+ var formats = options.time.displayFormats;
+ var minorFormat = formats[me._unit];
+ var majorUnit = me._majorUnit;
+ var majorFormat = formats[majorUnit];
+ var tick = ticks[index];
+ var tickOpts = options.ticks;
+ var major = majorUnit && majorFormat && tick && tick.major;
+ var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);
+ var nestedTickOpts = major ? tickOpts.major : tickOpts.minor;
+ var formatter = resolve$5([
+ nestedTickOpts.callback,
+ nestedTickOpts.userCallback,
+ tickOpts.callback,
+ tickOpts.userCallback
+ ]);
+
+ return formatter ? formatter(label, index, ticks) : label;
+ },
+
+ convertTicksToLabels: function(ticks) {
+ var labels = [];
+ var i, ilen;
+
+ for (i = 0, ilen = ticks.length; i < ilen; ++i) {
+ labels.push(this.tickFormatFunction(ticks[i].value, i, ticks));
+ }
+
+ return labels;
+ },
+
+ /**
+ * @private
+ */
+ getPixelForOffset: function(time) {
+ var me = this;
+ var offsets = me._offsets;
+ var pos = interpolate$1(me._table, 'time', time, 'pos');
+ return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);
+ },
+
+ getPixelForValue: function(value, index, datasetIndex) {
+ var me = this;
+ var time = null;
+
+ if (index !== undefined && datasetIndex !== undefined) {
+ time = me._timestamps.datasets[datasetIndex][index];
+ }
+
+ if (time === null) {
+ time = parse(me, value);
+ }
+
+ if (time !== null) {
+ return me.getPixelForOffset(time);
+ }
+ },
+
+ getPixelForTick: function(index) {
+ var ticks = this.getTicks();
+ return index >= 0 && index < ticks.length ?
+ this.getPixelForOffset(ticks[index].value) :
+ null;
+ },
+
+ getValueForPixel: function(pixel) {
+ var me = this;
+ var offsets = me._offsets;
+ var pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;
+ var time = interpolate$1(me._table, 'pos', pos, 'time');
+
+ // DEPRECATION, we should return time directly
+ return me._adapter._create(time);
+ },
+
+ /**
+ * @private
+ */
+ _getLabelSize: function(label) {
+ var me = this;
+ var ticksOpts = me.options.ticks;
+ var tickLabelWidth = me.ctx.measureText(label).width;
+ var angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);
+ var cosRotation = Math.cos(angle);
+ var sinRotation = Math.sin(angle);
+ var tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);
+
+ return {
+ w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),
+ h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)
+ };
+ },
+
+ /**
+ * Crude approximation of what the label width might be
+ * @private
+ */
+ getLabelWidth: function(label) {
+ return this._getLabelSize(label).w;
+ },
+
+ /**
+ * @private
+ */
+ getLabelCapacity: function(exampleTime) {
+ var me = this;
+ var timeOpts = me.options.time;
+ var displayFormats = timeOpts.displayFormats;
+
+ // pick the longest format (milliseconds) for guestimation
+ var format = displayFormats[timeOpts.unit] || displayFormats.millisecond;
+ var exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);
+ var size = me._getLabelSize(exampleLabel);
+ var capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);
+
+ if (me.options.offset) {
+ capacity--;
+ }
+
+ return capacity > 0 ? capacity : 1;
+ }
+});
+
+// INTERNAL: static default options, registered in src/index.js
+var _defaults$4 = defaultConfig$4;
+scale_time._defaults = _defaults$4;
+
+var scales = {
+ category: scale_category,
+ linear: scale_linear,
+ logarithmic: scale_logarithmic,
+ radialLinear: scale_radialLinear,
+ time: scale_time
+};
+
+var FORMATS = {
+ datetime: 'MMM D, YYYY, h:mm:ss a',
+ millisecond: 'h:mm:ss.SSS a',
+ second: 'h:mm:ss a',
+ minute: 'h:mm a',
+ hour: 'hA',
+ day: 'MMM D',
+ week: 'll',
+ month: 'MMM YYYY',
+ quarter: '[Q]Q - YYYY',
+ year: 'YYYY'
+};
+
+core_adapters._date.override(typeof moment === 'function' ? {
+ _id: 'moment', // DEBUG ONLY
+
+ formats: function() {
+ return FORMATS;
+ },
+
+ parse: function(value, format) {
+ if (typeof value === 'string' && typeof format === 'string') {
+ value = moment(value, format);
+ } else if (!(value instanceof moment)) {
+ value = moment(value);
+ }
+ return value.isValid() ? value.valueOf() : null;
+ },
+
+ format: function(time, format) {
+ return moment(time).format(format);
+ },
+
+ add: function(time, amount, unit) {
+ return moment(time).add(amount, unit).valueOf();
+ },
+
+ diff: function(max, min, unit) {
+ return moment(max).diff(moment(min), unit);
+ },
+
+ startOf: function(time, unit, weekday) {
+ time = moment(time);
+ if (unit === 'isoWeek') {
+ return time.isoWeekday(weekday).valueOf();
+ }
+ return time.startOf(unit).valueOf();
+ },
+
+ endOf: function(time, unit) {
+ return moment(time).endOf(unit).valueOf();
+ },
+
+ // DEPRECATIONS
+
+ /**
+ * Provided for backward compatibility with scale.getValueForPixel().
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ * @private
+ */
+ _create: function(time) {
+ return moment(time);
+ },
+} : {});
+
+core_defaults._set('global', {
+ plugins: {
+ filler: {
+ propagate: true
+ }
+ }
+});
+
+var mappers = {
+ dataset: function(source) {
+ var index = source.fill;
+ var chart = source.chart;
+ var meta = chart.getDatasetMeta(index);
+ var visible = meta && chart.isDatasetVisible(index);
+ var points = (visible && meta.dataset._children) || [];
+ var length = points.length || 0;
+
+ return !length ? null : function(point, i) {
+ return (i < length && points[i]._view) || null;
+ };
+ },
+
+ boundary: function(source) {
+ var boundary = source.boundary;
+ var x = boundary ? boundary.x : null;
+ var y = boundary ? boundary.y : null;
+
+ if (helpers$1.isArray(boundary)) {
+ return function(point, i) {
+ return boundary[i];
+ };
+ }
+
+ return function(point) {
+ return {
+ x: x === null ? point.x : x,
+ y: y === null ? point.y : y,
+ };
+ };
+ }
+};
+
+// @todo if (fill[0] === '#')
+function decodeFill(el, index, count) {
+ var model = el._model || {};
+ var fill = model.fill;
+ var target;
+
+ if (fill === undefined) {
+ fill = !!model.backgroundColor;
+ }
+
+ if (fill === false || fill === null) {
+ return false;
+ }
+
+ if (fill === true) {
+ return 'origin';
+ }
+
+ target = parseFloat(fill, 10);
+ if (isFinite(target) && Math.floor(target) === target) {
+ if (fill[0] === '-' || fill[0] === '+') {
+ target = index + target;
+ }
+
+ if (target === index || target < 0 || target >= count) {
+ return false;
+ }
+
+ return target;
+ }
+
+ switch (fill) {
+ // compatibility
+ case 'bottom':
+ return 'start';
+ case 'top':
+ return 'end';
+ case 'zero':
+ return 'origin';
+ // supported boundaries
+ case 'origin':
+ case 'start':
+ case 'end':
+ return fill;
+ // invalid fill values
+ default:
+ return false;
+ }
+}
+
+function computeLinearBoundary(source) {
+ var model = source.el._model || {};
+ var scale = source.el._scale || {};
+ var fill = source.fill;
+ var target = null;
+ var horizontal;
+
+ if (isFinite(fill)) {
+ return null;
+ }
+
+ // Backward compatibility: until v3, we still need to support boundary values set on
+ // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and
+ // controllers might still use it (e.g. the Smith chart).
+
+ if (fill === 'start') {
+ target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;
+ } else if (fill === 'end') {
+ target = model.scaleTop === undefined ? scale.top : model.scaleTop;
+ } else if (model.scaleZero !== undefined) {
+ target = model.scaleZero;
+ } else if (scale.getBasePixel) {
+ target = scale.getBasePixel();
+ }
+
+ if (target !== undefined && target !== null) {
+ if (target.x !== undefined && target.y !== undefined) {
+ return target;
+ }
+
+ if (helpers$1.isFinite(target)) {
+ horizontal = scale.isHorizontal();
+ return {
+ x: horizontal ? target : null,
+ y: horizontal ? null : target
+ };
+ }
+ }
+
+ return null;
+}
+
+function computeCircularBoundary(source) {
+ var scale = source.el._scale;
+ var options = scale.options;
+ var length = scale.chart.data.labels.length;
+ var fill = source.fill;
+ var target = [];
+ var start, end, center, i, point;
+
+ if (!length) {
+ return null;
+ }
+
+ start = options.ticks.reverse ? scale.max : scale.min;
+ end = options.ticks.reverse ? scale.min : scale.max;
+ center = scale.getPointPositionForValue(0, start);
+ for (i = 0; i < length; ++i) {
+ point = fill === 'start' || fill === 'end'
+ ? scale.getPointPositionForValue(i, fill === 'start' ? start : end)
+ : scale.getBasePosition(i);
+ if (options.gridLines.circular) {
+ point.cx = center.x;
+ point.cy = center.y;
+ point.angle = scale.getIndexAngle(i) - Math.PI / 2;
+ }
+ target.push(point);
+ }
+ return target;
+}
+
+function computeBoundary(source) {
+ var scale = source.el._scale || {};
+
+ if (scale.getPointPositionForValue) {
+ return computeCircularBoundary(source);
+ }
+ return computeLinearBoundary(source);
+}
+
+function resolveTarget(sources, index, propagate) {
+ var source = sources[index];
+ var fill = source.fill;
+ var visited = [index];
+ var target;
+
+ if (!propagate) {
+ return fill;
+ }
+
+ while (fill !== false && visited.indexOf(fill) === -1) {
+ if (!isFinite(fill)) {
+ return fill;
+ }
+
+ target = sources[fill];
+ if (!target) {
+ return false;
+ }
+
+ if (target.visible) {
+ return fill;
+ }
+
+ visited.push(fill);
+ fill = target.fill;
+ }
+
+ return false;
+}
+
+function createMapper(source) {
+ var fill = source.fill;
+ var type = 'dataset';
+
+ if (fill === false) {
+ return null;
+ }
+
+ if (!isFinite(fill)) {
+ type = 'boundary';
+ }
+
+ return mappers[type](source);
+}
+
+function isDrawable(point) {
+ return point && !point.skip;
+}
+
+function drawArea(ctx, curve0, curve1, len0, len1) {
+ var i, cx, cy, r;
+
+ if (!len0 || !len1) {
+ return;
+ }
+
+ // building first area curve (normal)
+ ctx.moveTo(curve0[0].x, curve0[0].y);
+ for (i = 1; i < len0; ++i) {
+ helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);
+ }
+
+ if (curve1[0].angle !== undefined) {
+ cx = curve1[0].cx;
+ cy = curve1[0].cy;
+ r = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));
+ for (i = len1 - 1; i > 0; --i) {
+ ctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);
+ }
+ return;
+ }
+
+ // joining the two area curves
+ ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);
+
+ // building opposite area curve (reverse)
+ for (i = len1 - 1; i > 0; --i) {
+ helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);
+ }
+}
+
+function doFill(ctx, points, mapper, view, color, loop) {
+ var count = points.length;
+ var span = view.spanGaps;
+ var curve0 = [];
+ var curve1 = [];
+ var len0 = 0;
+ var len1 = 0;
+ var i, ilen, index, p0, p1, d0, d1, loopOffset;
+
+ ctx.beginPath();
+
+ for (i = 0, ilen = count; i < ilen; ++i) {
+ index = i % count;
+ p0 = points[index]._view;
+ p1 = mapper(p0, index, view);
+ d0 = isDrawable(p0);
+ d1 = isDrawable(p1);
+
+ if (loop && loopOffset === undefined && d0) {
+ loopOffset = i + 1;
+ ilen = count + loopOffset;
+ }
+
+ if (d0 && d1) {
+ len0 = curve0.push(p0);
+ len1 = curve1.push(p1);
+ } else if (len0 && len1) {
+ if (!span) {
+ drawArea(ctx, curve0, curve1, len0, len1);
+ len0 = len1 = 0;
+ curve0 = [];
+ curve1 = [];
+ } else {
+ if (d0) {
+ curve0.push(p0);
+ }
+ if (d1) {
+ curve1.push(p1);
+ }
+ }
+ }
+ }
+
+ drawArea(ctx, curve0, curve1, len0, len1);
+
+ ctx.closePath();
+ ctx.fillStyle = color;
+ ctx.fill();
+}
+
+var plugin_filler = {
+ id: 'filler',
+
+ afterDatasetsUpdate: function(chart, options) {
+ var count = (chart.data.datasets || []).length;
+ var propagate = options.propagate;
+ var sources = [];
+ var meta, i, el, source;
+
+ for (i = 0; i < count; ++i) {
+ meta = chart.getDatasetMeta(i);
+ el = meta.dataset;
+ source = null;
+
+ if (el && el._model && el instanceof elements.Line) {
+ source = {
+ visible: chart.isDatasetVisible(i),
+ fill: decodeFill(el, i, count),
+ chart: chart,
+ el: el
+ };
+ }
+
+ meta.$filler = source;
+ sources.push(source);
+ }
+
+ for (i = 0; i < count; ++i) {
+ source = sources[i];
+ if (!source) {
+ continue;
+ }
+
+ source.fill = resolveTarget(sources, i, propagate);
+ source.boundary = computeBoundary(source);
+ source.mapper = createMapper(source);
+ }
+ },
+
+ beforeDatasetsDraw: function(chart) {
+ var metasets = chart._getSortedVisibleDatasetMetas();
+ var ctx = chart.ctx;
+ var meta, i, el, view, points, mapper, color;
+
+ for (i = metasets.length - 1; i >= 0; --i) {
+ meta = metasets[i].$filler;
+
+ if (!meta || !meta.visible) {
+ continue;
+ }
+
+ el = meta.el;
+ view = el._view;
+ points = el._children || [];
+ mapper = meta.mapper;
+ color = view.backgroundColor || core_defaults.global.defaultColor;
+
+ if (mapper && color && points.length) {
+ helpers$1.canvas.clipArea(ctx, chart.chartArea);
+ doFill(ctx, points, mapper, view, color, el._loop);
+ helpers$1.canvas.unclipArea(ctx);
+ }
+ }
+ }
+};
+
+var getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;
+var noop$1 = helpers$1.noop;
+var valueOrDefault$e = helpers$1.valueOrDefault;
+
+core_defaults._set('global', {
+ legend: {
+ display: true,
+ position: 'top',
+ align: 'center',
+ fullWidth: true,
+ reverse: false,
+ weight: 1000,
+
+ // a callback that will handle
+ onClick: function(e, legendItem) {
+ var index = legendItem.datasetIndex;
+ var ci = this.chart;
+ var meta = ci.getDatasetMeta(index);
+
+ // See controller.isDatasetVisible comment
+ meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;
+
+ // We hid a dataset ... rerender the chart
+ ci.update();
+ },
+
+ onHover: null,
+ onLeave: null,
+
+ labels: {
+ boxWidth: 40,
+ padding: 10,
+ // Generates labels shown in the legend
+ // Valid properties to return:
+ // text : text to display
+ // fillStyle : fill of coloured box
+ // strokeStyle: stroke of coloured box
+ // hidden : if this legend item refers to a hidden item
+ // lineCap : cap style for line
+ // lineDash
+ // lineDashOffset :
+ // lineJoin :
+ // lineWidth :
+ generateLabels: function(chart) {
+ var datasets = chart.data.datasets;
+ var options = chart.options.legend || {};
+ var usePointStyle = options.labels && options.labels.usePointStyle;
+
+ return chart._getSortedDatasetMetas().map(function(meta) {
+ var style = meta.controller.getStyle(usePointStyle ? 0 : undefined);
+
+ return {
+ text: datasets[meta.index].label,
+ fillStyle: style.backgroundColor,
+ hidden: !chart.isDatasetVisible(meta.index),
+ lineCap: style.borderCapStyle,
+ lineDash: style.borderDash,
+ lineDashOffset: style.borderDashOffset,
+ lineJoin: style.borderJoinStyle,
+ lineWidth: style.borderWidth,
+ strokeStyle: style.borderColor,
+ pointStyle: style.pointStyle,
+ rotation: style.rotation,
+
+ // Below is extra data used for toggling the datasets
+ datasetIndex: meta.index
+ };
+ }, this);
+ }
+ }
+ },
+
+ legendCallback: function(chart) {
+ var list = document.createElement('ul');
+ var datasets = chart.data.datasets;
+ var i, ilen, listItem, listItemSpan;
+
+ list.setAttribute('class', chart.id + '-legend');
+
+ for (i = 0, ilen = datasets.length; i < ilen; i++) {
+ listItem = list.appendChild(document.createElement('li'));
+ listItemSpan = listItem.appendChild(document.createElement('span'));
+ listItemSpan.style.backgroundColor = datasets[i].backgroundColor;
+ if (datasets[i].label) {
+ listItem.appendChild(document.createTextNode(datasets[i].label));
+ }
+ }
+
+ return list.outerHTML;
+ }
+});
+
+/**
+ * Helper function to get the box width based on the usePointStyle option
+ * @param {object} labelopts - the label options on the legend
+ * @param {number} fontSize - the label font size
+ * @return {number} width of the color box area
+ */
+function getBoxWidth(labelOpts, fontSize) {
+ return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ?
+ fontSize :
+ labelOpts.boxWidth;
+}
+
+/**
+ * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!
+ */
+var Legend = core_element.extend({
+
+ initialize: function(config) {
+ var me = this;
+ helpers$1.extend(me, config);
+
+ // Contains hit boxes for each dataset (in dataset order)
+ me.legendHitBoxes = [];
+
+ /**
+ * @private
+ */
+ me._hoveredItem = null;
+
+ // Are we in doughnut mode which has a different data type
+ me.doughnutMode = false;
+ },
+
+ // These methods are ordered by lifecycle. Utilities then follow.
+ // Any function defined here is inherited by all legend types.
+ // Any function can be extended by the legend type
+
+ beforeUpdate: noop$1,
+ update: function(maxWidth, maxHeight, margins) {
+ var me = this;
+
+ // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
+ me.beforeUpdate();
+
+ // Absorb the master measurements
+ me.maxWidth = maxWidth;
+ me.maxHeight = maxHeight;
+ me.margins = margins;
+
+ // Dimensions
+ me.beforeSetDimensions();
+ me.setDimensions();
+ me.afterSetDimensions();
+ // Labels
+ me.beforeBuildLabels();
+ me.buildLabels();
+ me.afterBuildLabels();
+
+ // Fit
+ me.beforeFit();
+ me.fit();
+ me.afterFit();
+ //
+ me.afterUpdate();
+
+ return me.minSize;
+ },
+ afterUpdate: noop$1,
+
+ //
+
+ beforeSetDimensions: noop$1,
+ setDimensions: function() {
+ var me = this;
+ // Set the unconstrained dimension before label rotation
+ if (me.isHorizontal()) {
+ // Reset position before calculating rotation
+ me.width = me.maxWidth;
+ me.left = 0;
+ me.right = me.width;
+ } else {
+ me.height = me.maxHeight;
+
+ // Reset position before calculating rotation
+ me.top = 0;
+ me.bottom = me.height;
+ }
+
+ // Reset padding
+ me.paddingLeft = 0;
+ me.paddingTop = 0;
+ me.paddingRight = 0;
+ me.paddingBottom = 0;
+
+ // Reset minSize
+ me.minSize = {
+ width: 0,
+ height: 0
+ };
+ },
+ afterSetDimensions: noop$1,
+
+ //
+
+ beforeBuildLabels: noop$1,
+ buildLabels: function() {
+ var me = this;
+ var labelOpts = me.options.labels || {};
+ var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];
+
+ if (labelOpts.filter) {
+ legendItems = legendItems.filter(function(item) {
+ return labelOpts.filter(item, me.chart.data);
+ });
+ }
+
+ if (me.options.reverse) {
+ legendItems.reverse();
+ }
+
+ me.legendItems = legendItems;
+ },
+ afterBuildLabels: noop$1,
+
+ //
+
+ beforeFit: noop$1,
+ fit: function() {
+ var me = this;
+ var opts = me.options;
+ var labelOpts = opts.labels;
+ var display = opts.display;
+
+ var ctx = me.ctx;
+
+ var labelFont = helpers$1.options._parseFont(labelOpts);
+ var fontSize = labelFont.size;
+
+ // Reset hit boxes
+ var hitboxes = me.legendHitBoxes = [];
+
+ var minSize = me.minSize;
+ var isHorizontal = me.isHorizontal();
+
+ if (isHorizontal) {
+ minSize.width = me.maxWidth; // fill all the width
+ minSize.height = display ? 10 : 0;
+ } else {
+ minSize.width = display ? 10 : 0;
+ minSize.height = me.maxHeight; // fill all the height
+ }
+
+ // Increase sizes here
+ if (!display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
+ }
+ ctx.font = labelFont.string;
+
+ if (isHorizontal) {
+ // Labels
+
+ // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
+ var lineWidths = me.lineWidths = [0];
+ var totalHeight = 0;
+
+ ctx.textAlign = 'left';
+ ctx.textBaseline = 'middle';
+
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+
+ if (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {
+ totalHeight += fontSize + labelOpts.padding;
+ lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;
+ }
+
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: width,
+ height: fontSize
+ };
+
+ lineWidths[lineWidths.length - 1] += width + labelOpts.padding;
+ });
+
+ minSize.height += totalHeight;
+
+ } else {
+ var vPadding = labelOpts.padding;
+ var columnWidths = me.columnWidths = [];
+ var columnHeights = me.columnHeights = [];
+ var totalWidth = labelOpts.padding;
+ var currentColWidth = 0;
+ var currentColHeight = 0;
+
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
+
+ // If too tall, go to new column
+ if (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {
+ totalWidth += currentColWidth + labelOpts.padding;
+ columnWidths.push(currentColWidth); // previous column width
+ columnHeights.push(currentColHeight);
+ currentColWidth = 0;
+ currentColHeight = 0;
+ }
+
+ // Get max width
+ currentColWidth = Math.max(currentColWidth, itemWidth);
+ currentColHeight += fontSize + vPadding;
+
+ // Store the hitbox width and height here. Final position will be updated in `draw`
+ hitboxes[i] = {
+ left: 0,
+ top: 0,
+ width: itemWidth,
+ height: fontSize
+ };
+ });
+
+ totalWidth += currentColWidth;
+ columnWidths.push(currentColWidth);
+ columnHeights.push(currentColHeight);
+ minSize.width += totalWidth;
+ }
+
+ me.width = minSize.width;
+ me.height = minSize.height;
+ },
+ afterFit: noop$1,
+
+ // Shared Methods
+ isHorizontal: function() {
+ return this.options.position === 'top' || this.options.position === 'bottom';
+ },
+
+ // Actually draw the legend on the canvas
+ draw: function() {
+ var me = this;
+ var opts = me.options;
+ var labelOpts = opts.labels;
+ var globalDefaults = core_defaults.global;
+ var defaultColor = globalDefaults.defaultColor;
+ var lineDefault = globalDefaults.elements.line;
+ var legendHeight = me.height;
+ var columnHeights = me.columnHeights;
+ var legendWidth = me.width;
+ var lineWidths = me.lineWidths;
+
+ if (!opts.display) {
+ return;
+ }
+
+ var rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);
+ var ctx = me.ctx;
+ var fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);
+ var labelFont = helpers$1.options._parseFont(labelOpts);
+ var fontSize = labelFont.size;
+ var cursor;
+
+ // Canvas setup
+ ctx.textAlign = rtlHelper.textAlign('left');
+ ctx.textBaseline = 'middle';
+ ctx.lineWidth = 0.5;
+ ctx.strokeStyle = fontColor; // for strikethrough effect
+ ctx.fillStyle = fontColor; // render in correct colour
+ ctx.font = labelFont.string;
+
+ var boxWidth = getBoxWidth(labelOpts, fontSize);
+ var hitboxes = me.legendHitBoxes;
+
+ // current position
+ var drawLegendBox = function(x, y, legendItem) {
+ if (isNaN(boxWidth) || boxWidth <= 0) {
+ return;
+ }
+
+ // Set the ctx for the box
+ ctx.save();
+
+ var lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);
+ ctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);
+ ctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);
+ ctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);
+ ctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);
+ ctx.lineWidth = lineWidth;
+ ctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);
+
+ if (ctx.setLineDash) {
+ // IE 9 and 10 do not support line dash
+ ctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));
+ }
+
+ if (labelOpts && labelOpts.usePointStyle) {
+ // Recalculate x and y for drawPoint() because its expecting
+ // x and y to be center of figure (instead of top left)
+ var radius = boxWidth * Math.SQRT2 / 2;
+ var centerX = rtlHelper.xPlus(x, boxWidth / 2);
+ var centerY = y + fontSize / 2;
+
+ // Draw pointStyle as legend symbol
+ helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);
+ } else {
+ // Draw box as legend symbol
+ ctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
+ if (lineWidth !== 0) {
+ ctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);
+ }
+ }
+
+ ctx.restore();
+ };
+
+ var fillText = function(x, y, legendItem, textWidth) {
+ var halfFontSize = fontSize / 2;
+ var xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);
+ var yMiddle = y + halfFontSize;
+
+ ctx.fillText(legendItem.text, xLeft, yMiddle);
+
+ if (legendItem.hidden) {
+ // Strikethrough the text if hidden
+ ctx.beginPath();
+ ctx.lineWidth = 2;
+ ctx.moveTo(xLeft, yMiddle);
+ ctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);
+ ctx.stroke();
+ }
+ };
+
+ var alignmentOffset = function(dimension, blockSize) {
+ switch (opts.align) {
+ case 'start':
+ return labelOpts.padding;
+ case 'end':
+ return dimension - blockSize;
+ default: // center
+ return (dimension - blockSize + labelOpts.padding) / 2;
+ }
+ };
+
+ // Horizontal
+ var isHorizontal = me.isHorizontal();
+ if (isHorizontal) {
+ cursor = {
+ x: me.left + alignmentOffset(legendWidth, lineWidths[0]),
+ y: me.top + labelOpts.padding,
+ line: 0
+ };
+ } else {
+ cursor = {
+ x: me.left + labelOpts.padding,
+ y: me.top + alignmentOffset(legendHeight, columnHeights[0]),
+ line: 0
+ };
+ }
+
+ helpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);
+
+ var itemHeight = fontSize + labelOpts.padding;
+ helpers$1.each(me.legendItems, function(legendItem, i) {
+ var textWidth = ctx.measureText(legendItem.text).width;
+ var width = boxWidth + (fontSize / 2) + textWidth;
+ var x = cursor.x;
+ var y = cursor.y;
+
+ rtlHelper.setWidth(me.minSize.width);
+
+ // Use (me.left + me.minSize.width) and (me.top + me.minSize.height)
+ // instead of me.right and me.bottom because me.width and me.height
+ // may have been changed since me.minSize was calculated
+ if (isHorizontal) {
+ if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {
+ y = cursor.y += itemHeight;
+ cursor.line++;
+ x = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);
+ }
+ } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {
+ x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;
+ cursor.line++;
+ y = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);
+ }
+
+ var realX = rtlHelper.x(x);
+
+ drawLegendBox(realX, y, legendItem);
+
+ hitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);
+ hitboxes[i].top = y;
+
+ // Fill the actual label
+ fillText(realX, y, legendItem, textWidth);
+
+ if (isHorizontal) {
+ cursor.x += width + labelOpts.padding;
+ } else {
+ cursor.y += itemHeight;
+ }
+ });
+
+ helpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);
+ },
+
+ /**
+ * @private
+ */
+ _getLegendItemAt: function(x, y) {
+ var me = this;
+ var i, hitBox, lh;
+
+ if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {
+ // See if we are touching one of the dataset boxes
+ lh = me.legendHitBoxes;
+ for (i = 0; i < lh.length; ++i) {
+ hitBox = lh[i];
+
+ if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {
+ // Touching an element
+ return me.legendItems[i];
+ }
+ }
+ }
+
+ return null;
+ },
+
+ /**
+ * Handle an event
+ * @private
+ * @param {IEvent} event - The event to handle
+ */
+ handleEvent: function(e) {
+ var me = this;
+ var opts = me.options;
+ var type = e.type === 'mouseup' ? 'click' : e.type;
+ var hoveredItem;
+
+ if (type === 'mousemove') {
+ if (!opts.onHover && !opts.onLeave) {
+ return;
+ }
+ } else if (type === 'click') {
+ if (!opts.onClick) {
+ return;
+ }
+ } else {
+ return;
+ }
+
+ // Chart event already has relative position in it
+ hoveredItem = me._getLegendItemAt(e.x, e.y);
+
+ if (type === 'click') {
+ if (hoveredItem && opts.onClick) {
+ // use e.native for backwards compatibility
+ opts.onClick.call(me, e.native, hoveredItem);
+ }
+ } else {
+ if (opts.onLeave && hoveredItem !== me._hoveredItem) {
+ if (me._hoveredItem) {
+ opts.onLeave.call(me, e.native, me._hoveredItem);
+ }
+ me._hoveredItem = hoveredItem;
+ }
+
+ if (opts.onHover && hoveredItem) {
+ // use e.native for backwards compatibility
+ opts.onHover.call(me, e.native, hoveredItem);
+ }
+ }
+ }
+});
+
+function createNewLegendAndAttach(chart, legendOpts) {
+ var legend = new Legend({
+ ctx: chart.ctx,
+ options: legendOpts,
+ chart: chart
+ });
+
+ core_layouts.configure(chart, legend, legendOpts);
+ core_layouts.addBox(chart, legend);
+ chart.legend = legend;
+}
+
+var plugin_legend = {
+ id: 'legend',
+
+ /**
+ * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making
+ * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of
+ * the plugin, which one will be re-exposed in the chart.js file.
+ * https://github.com/chartjs/Chart.js/pull/2640
+ * @private
+ */
+ _element: Legend,
+
+ beforeInit: function(chart) {
+ var legendOpts = chart.options.legend;
+
+ if (legendOpts) {
+ createNewLegendAndAttach(chart, legendOpts);
+ }
+ },
+
+ beforeUpdate: function(chart) {
+ var legendOpts = chart.options.legend;
+ var legend = chart.legend;
+
+ if (legendOpts) {
+ helpers$1.mergeIf(legendOpts, core_defaults.global.legend);
+
+ if (legend) {
+ core_layouts.configure(chart, legend, legendOpts);
+ legend.options = legendOpts;
+ } else {
+ createNewLegendAndAttach(chart, legendOpts);
+ }
+ } else if (legend) {
+ core_layouts.removeBox(chart, legend);
+ delete chart.legend;
+ }
+ },
+
+ afterEvent: function(chart, e) {
+ var legend = chart.legend;
+ if (legend) {
+ legend.handleEvent(e);
+ }
+ }
+};
+
+var noop$2 = helpers$1.noop;
+
+core_defaults._set('global', {
+ title: {
+ display: false,
+ fontStyle: 'bold',
+ fullWidth: true,
+ padding: 10,
+ position: 'top',
+ text: '',
+ weight: 2000 // by default greater than legend (1000) to be above
+ }
+});
+
+/**
+ * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!
+ */
+var Title = core_element.extend({
+ initialize: function(config) {
+ var me = this;
+ helpers$1.extend(me, config);
+
+ // Contains hit boxes for each dataset (in dataset order)
+ me.legendHitBoxes = [];
+ },
+
+ // These methods are ordered by lifecycle. Utilities then follow.
+
+ beforeUpdate: noop$2,
+ update: function(maxWidth, maxHeight, margins) {
+ var me = this;
+
+ // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
+ me.beforeUpdate();
+
+ // Absorb the master measurements
+ me.maxWidth = maxWidth;
+ me.maxHeight = maxHeight;
+ me.margins = margins;
+
+ // Dimensions
+ me.beforeSetDimensions();
+ me.setDimensions();
+ me.afterSetDimensions();
+ // Labels
+ me.beforeBuildLabels();
+ me.buildLabels();
+ me.afterBuildLabels();
+
+ // Fit
+ me.beforeFit();
+ me.fit();
+ me.afterFit();
+ //
+ me.afterUpdate();
+
+ return me.minSize;
+
+ },
+ afterUpdate: noop$2,
+
+ //
+
+ beforeSetDimensions: noop$2,
+ setDimensions: function() {
+ var me = this;
+ // Set the unconstrained dimension before label rotation
+ if (me.isHorizontal()) {
+ // Reset position before calculating rotation
+ me.width = me.maxWidth;
+ me.left = 0;
+ me.right = me.width;
+ } else {
+ me.height = me.maxHeight;
+
+ // Reset position before calculating rotation
+ me.top = 0;
+ me.bottom = me.height;
+ }
+
+ // Reset padding
+ me.paddingLeft = 0;
+ me.paddingTop = 0;
+ me.paddingRight = 0;
+ me.paddingBottom = 0;
+
+ // Reset minSize
+ me.minSize = {
+ width: 0,
+ height: 0
+ };
+ },
+ afterSetDimensions: noop$2,
+
+ //
+
+ beforeBuildLabels: noop$2,
+ buildLabels: noop$2,
+ afterBuildLabels: noop$2,
+
+ //
+
+ beforeFit: noop$2,
+ fit: function() {
+ var me = this;
+ var opts = me.options;
+ var minSize = me.minSize = {};
+ var isHorizontal = me.isHorizontal();
+ var lineCount, textSize;
+
+ if (!opts.display) {
+ me.width = minSize.width = me.height = minSize.height = 0;
+ return;
+ }
+
+ lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;
+ textSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;
+
+ me.width = minSize.width = isHorizontal ? me.maxWidth : textSize;
+ me.height = minSize.height = isHorizontal ? textSize : me.maxHeight;
+ },
+ afterFit: noop$2,
+
+ // Shared Methods
+ isHorizontal: function() {
+ var pos = this.options.position;
+ return pos === 'top' || pos === 'bottom';
+ },
+
+ // Actually draw the title block on the canvas
+ draw: function() {
+ var me = this;
+ var ctx = me.ctx;
+ var opts = me.options;
+
+ if (!opts.display) {
+ return;
+ }
+
+ var fontOpts = helpers$1.options._parseFont(opts);
+ var lineHeight = fontOpts.lineHeight;
+ var offset = lineHeight / 2 + opts.padding;
+ var rotation = 0;
+ var top = me.top;
+ var left = me.left;
+ var bottom = me.bottom;
+ var right = me.right;
+ var maxWidth, titleX, titleY;
+
+ ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour
+ ctx.font = fontOpts.string;
+
+ // Horizontal
+ if (me.isHorizontal()) {
+ titleX = left + ((right - left) / 2); // midpoint of the width
+ titleY = top + offset;
+ maxWidth = right - left;
+ } else {
+ titleX = opts.position === 'left' ? left + offset : right - offset;
+ titleY = top + ((bottom - top) / 2);
+ maxWidth = bottom - top;
+ rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);
+ }
+
+ ctx.save();
+ ctx.translate(titleX, titleY);
+ ctx.rotate(rotation);
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+
+ var text = opts.text;
+ if (helpers$1.isArray(text)) {
+ var y = 0;
+ for (var i = 0; i < text.length; ++i) {
+ ctx.fillText(text[i], 0, y, maxWidth);
+ y += lineHeight;
+ }
+ } else {
+ ctx.fillText(text, 0, 0, maxWidth);
+ }
+
+ ctx.restore();
+ }
+});
+
+function createNewTitleBlockAndAttach(chart, titleOpts) {
+ var title = new Title({
+ ctx: chart.ctx,
+ options: titleOpts,
+ chart: chart
+ });
+
+ core_layouts.configure(chart, title, titleOpts);
+ core_layouts.addBox(chart, title);
+ chart.titleBlock = title;
+}
+
+var plugin_title = {
+ id: 'title',
+
+ /**
+ * Backward compatibility: since 2.1.5, the title is registered as a plugin, making
+ * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of
+ * the plugin, which one will be re-exposed in the chart.js file.
+ * https://github.com/chartjs/Chart.js/pull/2640
+ * @private
+ */
+ _element: Title,
+
+ beforeInit: function(chart) {
+ var titleOpts = chart.options.title;
+
+ if (titleOpts) {
+ createNewTitleBlockAndAttach(chart, titleOpts);
+ }
+ },
+
+ beforeUpdate: function(chart) {
+ var titleOpts = chart.options.title;
+ var titleBlock = chart.titleBlock;
+
+ if (titleOpts) {
+ helpers$1.mergeIf(titleOpts, core_defaults.global.title);
+
+ if (titleBlock) {
+ core_layouts.configure(chart, titleBlock, titleOpts);
+ titleBlock.options = titleOpts;
+ } else {
+ createNewTitleBlockAndAttach(chart, titleOpts);
+ }
+ } else if (titleBlock) {
+ core_layouts.removeBox(chart, titleBlock);
+ delete chart.titleBlock;
+ }
+ }
+};
+
+var plugins = {};
+var filler = plugin_filler;
+var legend = plugin_legend;
+var title = plugin_title;
+plugins.filler = filler;
+plugins.legend = legend;
+plugins.title = title;
+
+/**
+ * @namespace Chart
+ */
+
+
+core_controller.helpers = helpers$1;
+
+// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!
+core_helpers();
+
+core_controller._adapters = core_adapters;
+core_controller.Animation = core_animation;
+core_controller.animationService = core_animations;
+core_controller.controllers = controllers;
+core_controller.DatasetController = core_datasetController;
+core_controller.defaults = core_defaults;
+core_controller.Element = core_element;
+core_controller.elements = elements;
+core_controller.Interaction = core_interaction;
+core_controller.layouts = core_layouts;
+core_controller.platform = platform;
+core_controller.plugins = core_plugins;
+core_controller.Scale = core_scale;
+core_controller.scaleService = core_scaleService;
+core_controller.Ticks = core_ticks;
+core_controller.Tooltip = core_tooltip;
+
+// Register built-in scales
+
+core_controller.helpers.each(scales, function(scale, type) {
+ core_controller.scaleService.registerScaleType(type, scale, scale._defaults);
+});
+
+// Load to register built-in adapters (as side effects)
+
+
+// Loading built-in plugins
+
+for (var k in plugins) {
+ if (plugins.hasOwnProperty(k)) {
+ core_controller.plugins.register(plugins[k]);
+ }
+}
+
+core_controller.platform.initialize();
+
+var src = core_controller;
+if (typeof window !== 'undefined') {
+ window.Chart = core_controller;
+}
+
+// DEPRECATIONS
+
+/**
+ * Provided for backward compatibility, not available anymore
+ * @namespace Chart.Chart
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.Chart = core_controller;
+
+/**
+ * Provided for backward compatibility, not available anymore
+ * @namespace Chart.Legend
+ * @deprecated since version 2.1.5
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.Legend = plugins.legend._element;
+
+/**
+ * Provided for backward compatibility, not available anymore
+ * @namespace Chart.Title
+ * @deprecated since version 2.1.5
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.Title = plugins.title._element;
+
+/**
+ * Provided for backward compatibility, use Chart.plugins instead
+ * @namespace Chart.pluginService
+ * @deprecated since version 2.1.5
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.pluginService = core_controller.plugins;
+
+/**
+ * Provided for backward compatibility, inheriting from Chart.PlugingBase has no
+ * effect, instead simply create/register plugins via plain JavaScript objects.
+ * @interface Chart.PluginBase
+ * @deprecated since version 2.5.0
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.PluginBase = core_controller.Element.extend({});
+
+/**
+ * Provided for backward compatibility, use Chart.helpers.canvas instead.
+ * @namespace Chart.canvasHelpers
+ * @deprecated since version 2.6.0
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.canvasHelpers = core_controller.helpers.canvas;
+
+/**
+ * Provided for backward compatibility, use Chart.layouts instead.
+ * @namespace Chart.layoutService
+ * @deprecated since version 2.7.3
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.layoutService = core_controller.layouts;
+
+/**
+ * Provided for backward compatibility, not available anymore.
+ * @namespace Chart.LinearScaleBase
+ * @deprecated since version 2.8
+ * @todo remove at version 3
+ * @private
+ */
+core_controller.LinearScaleBase = scale_linearbase;
+
+/**
+ * Provided for backward compatibility, instead we should create a new Chart
+ * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`).
+ * @deprecated since version 2.8.0
+ * @todo remove at version 3
+ */
+core_controller.helpers.each(
+ [
+ 'Bar',
+ 'Bubble',
+ 'Doughnut',
+ 'Line',
+ 'PolarArea',
+ 'Radar',
+ 'Scatter'
+ ],
+ function(klass) {
+ core_controller[klass] = function(ctx, cfg) {
+ return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {
+ type: klass.charAt(0).toLowerCase() + klass.slice(1)
+ }));
+ };
+ }
+);
+
+return src;
+
+})));
diff --git a/MLEB/Translate/scripts/__bootstrap.php b/MLEB/Translate/scripts/__bootstrap.php
new file mode 100644
index 00000000..d401adaa
--- /dev/null
+++ b/MLEB/Translate/scripts/__bootstrap.php
@@ -0,0 +1,19 @@
+<?php
+declare( strict_types = 1 );
+
+/*
+ * Boilerpate code for bootstrapping maintenance scripts.
+ *
+ * This code must be in global scope. Callers must define $class;
+ */
+$env = getenv( 'MW_INSTALL_PATH' );
+$IP = $env !== false ? $env : __DIR__ . '/../../..';
+require_once "$IP/maintenance/Maintenance.php";
+// Manually load required classes, as autoloader is not available until RUN_MAINTENANCE_IF_MAIN
+require_once __DIR__ . '/../src/Utilities/BaseMaintenanceScript.php';
+// $maintClass must be after Maintenance.php
+// @phan-suppress-next-line PhanUndeclaredGlobalVariable
+$maintClass = $class;
+$file = strtr( $maintClass, [ 'MediaWiki\\Extension\\Translate\\' => '', '\\' => '/' ] );
+require_once __DIR__ . "/../src/$file.php";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/MLEB/Translate/scripts/characterEditStats.php b/MLEB/Translate/scripts/characterEditStats.php
index 05a75331..d8a3d87b 100644
--- a/MLEB/Translate/scripts/characterEditStats.php
+++ b/MLEB/Translate/scripts/characterEditStats.php
@@ -10,7 +10,8 @@
*/
// Standard boilerplate to define $IP
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\MediaWikiServices;
if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
$IP = getenv( 'MW_INSTALL_PATH' );
@@ -115,19 +116,9 @@ class CharacterEditStats extends Maintenance {
$dbr = wfGetDB( DB_REPLICA );
$cutoff = $dbr->addQuotes( $dbr->timestamp( time() - $days * 24 * 3600 ) );
- // The field renames are to be compatible with recentchanges table query
- if ( is_callable( [ Revision::class, 'getQueryInfo' ] ) ) {
- $revQuery = Revision::getQueryInfo( [ 'page' ] );
- $revUserText = $revQuery['fields']['rev_user_text'] ?? 'rev_user_text';
- } else {
- $revQuery = [
- 'tables' => [ 'revision', 'page' ],
- 'joins' => [
- 'page' => [ 'JOIN', 'rev_page = page_id' ],
- ]
- ];
- $revUserText = 'rev_user_text';
- }
+ $revQuery = MediaWikiServices::getInstance()->getRevisionStore()->getQueryInfo( [ 'page' ] );
+ $revUserText = $revQuery['fields']['rev_user_text'] ?? 'rev_user_text';
+
$conds = [
"rev_timestamp > $cutoff",
'page_namespace' => $namespaces,
diff --git a/MLEB/Translate/scripts/cleanupTranslationProgressStats.php b/MLEB/Translate/scripts/cleanupTranslationProgressStats.php
new file mode 100644
index 00000000..ce636628
--- /dev/null
+++ b/MLEB/Translate/scripts/cleanupTranslationProgressStats.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\Statistics\CleanupTranslationProgressStatsMaintenanceScript;
+
+$class = CleanupTranslationProgressStatsMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/clearGroupSyncCache.php b/MLEB/Translate/scripts/clearGroupSyncCache.php
new file mode 100644
index 00000000..2492f18f
--- /dev/null
+++ b/MLEB/Translate/scripts/clearGroupSyncCache.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\Synchronization\ClearGroupSyncCacheMaintenanceScript;
+
+$class = ClearGroupSyncCacheMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/completeExternalTranslation.php b/MLEB/Translate/scripts/completeExternalTranslation.php
index b25ca59e..cf6bb6db 100644
--- a/MLEB/Translate/scripts/completeExternalTranslation.php
+++ b/MLEB/Translate/scripts/completeExternalTranslation.php
@@ -1,10 +1,6 @@
<?php
-use MediaWiki\Extensions\Translate\Synchronization\CompleteExternalTranslationMaintenanceScript;
+use MediaWiki\Extension\Translate\Synchronization\CompleteExternalTranslationMaintenanceScript;
-$env = getenv( 'MW_INSTALL_PATH' );
-$IP = $env !== false ? $env : __DIR__ . '/../../..';
-require_once "$IP/maintenance/Maintenance.php";
-require_once __DIR__ . '/../src/Synchronization/CompleteExternalTranslationMaintenanceScript.php';
-$maintClass = CompleteExternalTranslationMaintenanceScript::class;
-require_once RUN_MAINTENANCE_IF_MAIN;
+$class = CompleteExternalTranslationMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/createCheckIndex.php b/MLEB/Translate/scripts/createCheckIndex.php
index 24e2ae4a..a21a60d1 100644
--- a/MLEB/Translate/scripts/createCheckIndex.php
+++ b/MLEB/Translate/scripts/createCheckIndex.php
@@ -36,7 +36,7 @@ class CreateCheckIndex extends Maintenance {
'verbose',
'(optional) Enable verbose logging. Default: off',
false, /*required*/
- false /*has arg*/
+ false /*has arg*/
);
$this->requireExtension( 'Translate' );
}
diff --git a/MLEB/Translate/scripts/deleteEqualTranslations.php b/MLEB/Translate/scripts/deleteEqualTranslations.php
new file mode 100644
index 00000000..c85e775d
--- /dev/null
+++ b/MLEB/Translate/scripts/deleteEqualTranslations.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\Diagnostics\DeleteEqualTranslationsMaintenanceScript;
+
+$class = DeleteEqualTranslationsMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/export.php b/MLEB/Translate/scripts/export.php
index b0bc314d..ed802ff4 100644
--- a/MLEB/Translate/scripts/export.php
+++ b/MLEB/Translate/scripts/export.php
@@ -1,389 +1,6 @@
<?php
-/**
- * Script to export translations of one message group to file(s).
- *
- * @author Niklas Laxström
- * @author Siebrand Mazeland
- * @copyright Copyright © 2008-2013, Niklas Laxström, Siebrand Mazeland
- * @license GPL-2.0-or-later
- * @file
- */
-// Standard boilerplate to define $IP
-if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
- $IP = getenv( 'MW_INSTALL_PATH' );
-} else {
- $dir = __DIR__;
- $IP = "$dir/../../..";
-}
-require_once "$IP/maintenance/Maintenance.php";
+use MediaWiki\Extension\Translate\Synchronization\ExportTranslationsMaintenanceScript;
-class CommandlineExport extends Maintenance {
- private const EXPORT_LOG_FILE = 'translation-exports';
-
- public function __construct() {
- parent::__construct();
- $this->addDescription( 'Message exporter.' );
- $this->addOption(
- 'group',
- 'Comma separated list of group IDs (can use * as wildcard)',
- true, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'lang',
- 'Comma separated list of language codes or *',
- true, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'target',
- 'Target directory for exported files',
- true, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'skip',
- '(optional) Languages to skip, comma separated list',
- false, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'skipgroup',
- '(optional) Comma separated list of group IDs that should not be exported',
- false, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'threshold',
- '(optional) Do not export under this percentage translated',
- false, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'hours',
- '(optional) Only export languages with changes in the last given number of hours',
- false, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'ppgettext',
- '(optional) Group root path for checkout of product. "msgmerge" will post ' .
- 'process on the export result based on the current source file ' .
- 'in that location (from sourcePattern or definitionFile)',
- false, /*required*/
- true /*has arg*/
- );
- $this->addOption(
- 'no-location',
- '(optional) Only used combined with "ppgettext". This option will rebuild ' .
- 'the gettext file without location information',
- false, /*required*/
- false /*has arg*/
- );
- $this->addOption(
- 'no-fuzzy',
- '(optional) Do not include any messages marked as fuzzy/outdated',
- false, /*required*/
- false /*has arg*/
- );
- $this->addOption(
- 'codemaponly',
- '(optional) Only export languages that have a codeMap entry',
- false, /*required*/
- false /*has arg*/
- );
-
- $this->addOption(
- 'offline-gettext-format',
- '(optional) Export languages in offline Gettext format. Give a file pattern with '
- . '%GROUPID% and %CODE%. Empty pattern defaults to %GROUPID%/%CODE%.po.',
- false, /*required*/
- true /*has arg*/
- );
- $this->requireExtension( 'Translate' );
- }
-
- public function execute() {
- wfDebugLog( self::EXPORT_LOG_FILE, 'Starting exports for groups - '
- . $this->getOption( 'group' ) . '... ' );
- $exportStartTime = microtime( true );
-
- $target = $this->getOption( 'target' );
- if ( !is_writable( $target ) ) {
- $this->fatalError( "Target directory is not writable ($target)." );
- }
-
- $threshold = $this->getOption( 'threshold' );
- $noFuzzy = $this->hasOption( 'no-fuzzy' );
-
- $noLocation = '';
- if ( $this->hasOption( 'no-location' ) ) {
- $noLocation = '--no-location ';
- }
-
- $skip = [];
- if ( $this->hasOption( 'skip' ) ) {
- $skip = array_map( 'trim', explode( ',', $this->getOption( 'skip' ) ) );
- }
-
- $reqLangs = TranslateUtils::parseLanguageCodes( $this->getOption( 'lang' ) );
- $reqLangs = array_flip( $reqLangs );
- foreach ( $skip as $skipLang ) {
- unset( $reqLangs[$skipLang] );
- }
- $reqLangs = array_flip( $reqLangs );
-
- $codemapOnly = $this->hasOption( 'codemaponly' );
- $forOffline = $this->hasOption( 'offline-gettext-format' );
- $offlineTargetPattern = $this->getOption( 'offline-gettext-format' ) ?: "%GROUPID%/%CODE%.po";
-
- $groupIds = explode( ',', trim( $this->getOption( 'group' ) ) );
- $groupIds = MessageGroups::expandWildcards( $groupIds );
- $groups = MessageGroups::getGroupsById( $groupIds );
- '@phan-var FileBasedMessageGroup[] $groups';
-
- /** @var FileBasedMessageGroup $group */
- foreach ( $groups as $groupId => $group ) {
- if ( $group->isMeta() ) {
- $this->output( "Skipping meta message group $groupId.\n" );
- unset( $groups[$groupId] );
- continue;
- }
-
- if ( !$forOffline && !$group instanceof FileBasedMessageGroup ) {
- $this->output( "EE2: Unexportable message group $groupId.\n" );
- unset( $groups[$groupId] );
- continue;
- }
- }
-
- if ( !count( $groups ) ) {
- $this->fatalError( 'EE1: No valid message groups identified.' );
- }
-
- $changeFilter = false;
- $hours = $this->getOption( 'hours' );
- if ( $hours ) {
- $namespaces = [];
-
- /** @var FileBasedMessageGroup $group */
- foreach ( $groups as $group ) {
- $namespaces[$group->getNamespace()] = true;
- }
-
- $namespaces = array_keys( $namespaces );
- $bots = true;
-
- $changeFilter = [];
- $rows = TranslateUtils::translationChanges( $hours, $bots, $namespaces );
- foreach ( $rows as $row ) {
- $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
- $handle = new MessageHandle( $title );
- $code = $handle->getCode();
- if ( !$code ) {
- continue;
- }
- $groupIds = $handle->getGroupIds();
- foreach ( $groupIds as $groupId ) {
- $changeFilter[$groupId][$code] = true;
- }
- }
- }
-
- $skipGroups = [];
- if ( $this->hasOption( 'skipgroup' ) ) {
- $skipGroups = array_map( 'trim', explode( ',', $this->getOption( 'skipgroup' ) ) );
- }
-
- foreach ( $groups as $groupId => $group ) {
- if ( in_array( $groupId, $skipGroups ) ) {
- $this->output( "Group $groupId is in skipgroup.\n" );
- continue;
- }
-
- // No changes to this group at all
- if ( is_array( $changeFilter ) && !isset( $changeFilter[$groupId] ) ) {
- $this->output( "No recent changes to $groupId.\n" );
- continue;
- }
-
- $langs = $reqLangs;
-
- if ( $codemapOnly ) {
- foreach ( $langs as $index => $code ) {
- if ( $group->mapCode( $code ) === $code ) {
- unset( $langs[$index] );
- }
- }
- }
-
- if ( $threshold ) {
- wfDebugLog( self::EXPORT_LOG_FILE, "Calculating stats for group $groupId" );
- $tStartTime = microtime( true );
- $stats = MessageGroupStats::forGroup( $groupId );
- $emptyLangs = [];
- foreach ( $langs as $index => $code ) {
- if ( !isset( $stats[$code] ) ) {
- unset( $langs[$index] );
- continue;
- }
-
- $total = $stats[$code][MessageGroupStats::TOTAL];
- $translated = $stats[$code][MessageGroupStats::TRANSLATED];
-
- if ( $total === 0 ) {
- $emptyLangs[] = $code;
- unset( $langs[$index] );
- continue;
- }
-
- if ( $translated / $total * 100 < $threshold ) {
- unset( $langs[$index] );
- }
- }
-
- if ( $emptyLangs !== [] ) {
- $this->output(
- "Message group $groupId doesn't contain messages in language(s): " .
- implode( ', ', $emptyLangs ) . "."
- );
- }
-
- $tEndTime = microtime( true );
- wfDebugLog( self::EXPORT_LOG_FILE,
- "Finished calculating stats for group $groupId. Time: "
- . ( $tEndTime - $tStartTime ) . ' secs.' );
- }
-
- // Filter out unchanged languages from requested languages
- if ( is_array( $changeFilter ) ) {
- $langs = array_intersect( $langs, array_keys( $changeFilter[$groupId] ) );
- }
-
- if ( !count( $langs ) ) {
- continue;
- }
-
- $this->output( 'Exporting ' . count( $langs ) . " languages for group $groupId" );
-
- if ( $forOffline ) {
- $fileBasedGroup = FileBasedMessageGroup::newFromMessageGroup( $group, $offlineTargetPattern );
- $ffs = new GettextFFS( $fileBasedGroup );
- $ffs->setOfflineMode( true );
- } else {
- $ffs = $group->getFFS();
- }
-
- $ffs->setWritePath( $target );
- $sourceLanguage = $group->getSourceLanguage();
- $collection = $group->initCollection( $sourceLanguage );
-
- $definitionFile = false;
-
- if ( $this->hasOption( 'ppgettext' ) && $ffs instanceof GettextFFS ) {
- global $wgMaxShellMemory, $wgTranslateGroupRoot;
-
- // Need more shell memory for msgmerge.
- $wgMaxShellMemory = 402400;
-
- $path = $group->getSourceFilePath( $sourceLanguage );
- $definitionFile = str_replace(
- $wgTranslateGroupRoot,
- $this->getOption( 'ppgettext' ),
- $path
- );
- }
-
- $whitelist = $group->getTranslatableLanguages();
-
- wfDebugLog(
- self::EXPORT_LOG_FILE, 'Exporting languages ('
- . count( $langs ) . ") for group - $groupId."
- );
-
- $langExportTimes = [
- 'collection' => 0,
- 'ffs' => 0,
- 'definitionFile' => 0
- ];
- $langStartTime = microtime( true );
- foreach ( $langs as $lang ) {
- // Do not export languages that are blacklisted (or not whitelisted).
- // Also check that whitelist is not null, which means that all
- // languages are allowed for translation and export.
- if ( is_array( $whitelist ) && !isset( $whitelist[$lang] ) ) {
- continue;
- }
-
- $startTime = microtime( true );
- $collection->resetForNewLanguage( $lang );
- $collection->loadTranslations();
- // Don't export ignored, unless it is the source language
- // or message documentation
- global $wgTranslateDocumentationLanguageCode;
- if ( $lang !== $wgTranslateDocumentationLanguageCode
- && $lang !== $sourceLanguage
- ) {
- $collection->filter( 'ignored' );
- }
-
- if ( $noFuzzy ) {
- $collection->filter( 'fuzzy' );
- }
- $endTime = microtime( true );
- $langExportTimes['collection'] += ( $endTime - $startTime );
-
- $startTime = microtime( true );
- $ffs->write( $collection );
- $endTime = microtime( true );
- $langExportTimes['ffs'] += ( $endTime - $startTime );
-
- // Do post processing if requested.
- if ( $definitionFile ) {
- $startTime = microtime( true );
- if ( is_file( $definitionFile ) ) {
- $targetFileName = $ffs->getWritePath() .
- '/' . $group->getTargetFilename( $collection->code );
- $cmd = 'msgmerge --quiet ' . $noLocation . '--output-file=' .
- $targetFileName . ' ' . $targetFileName . ' ' . $definitionFile;
- wfShellExec( $cmd, $ret );
-
- // Report on errors.
- if ( $ret ) {
- $this->error( "ERROR: $ret" );
- }
- } else {
- $this->fatalError( "$definitionFile does not exist for group $groupId." );
- }
- $endTime = microtime( true );
- $langExportTimes['definitionFile'] += ( $endTime - $startTime );
- }
- }
- $langEndTime = microtime( true );
-
- wfDebugLog(
- self::EXPORT_LOG_FILE,
- "Done exporting languages for group - $groupId. " .
- 'Time taken - ' . ( $langEndTime - $langStartTime ) . ' secs.'
- );
-
- foreach ( $langExportTimes as $type => $time ) {
- wfDebugLog(
- self::EXPORT_LOG_FILE,
- "Time taken by '$type' for group $groupId - $time secs."
- );
- }
- }
-
- $exportEndTime = microtime( true );
- wfDebugLog(
- self::EXPORT_LOG_FILE, 'Finished export process for groups - ' .
- $this->getOption( 'group' ) .
- '. Time: ' . ( $exportEndTime - $exportStartTime ) . ' secs.'
- );
- }
-}
-
-$maintClass = CommandlineExport::class;
-require_once RUN_MAINTENANCE_IF_MAIN;
+$class = ExportTranslationsMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/exportTtmServerDump.php b/MLEB/Translate/scripts/exportTtmServerDump.php
new file mode 100644
index 00000000..0fc921ba
--- /dev/null
+++ b/MLEB/Translate/scripts/exportTtmServerDump.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\TtmServer\ExportTtmServerDumpMaintenanceScript;
+
+$class = ExportTtmServerDumpMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/fallbacks-graph.php b/MLEB/Translate/scripts/fallbacks-graph.php
index 769e30b8..e55c907e 100644
--- a/MLEB/Translate/scripts/fallbacks-graph.php
+++ b/MLEB/Translate/scripts/fallbacks-graph.php
@@ -45,8 +45,8 @@ XML;
$langs = Language::fetchLanguageNames( null, 'mw' );
$nodes = $edges = [];
foreach ( $langs as $code => $name ) {
- $fallbacks = Language::getFallbacksFor( $code );
- if ( $fallbacks === [ 'en' ] ) {
+ $fallbacks = Language::getFallbacksFor( $code, Language::STRICT_FALLBACKS );
+ if ( $fallbacks === [] ) {
continue;
}
@@ -71,10 +71,10 @@ XML;
. Xml::openElement( 'y:Shapenode' )
. Xml::element(
'y:Geometry',
- [ 'height' => 30, 'width' => max( 30, 10 * strlen( $code ) ) ],
+ [ 'height' => 40, 'width' => max( 40, 20 * strlen( $code ) ) ],
''
)
- . Xml::element( 'y:NodeLabel', [], $code )
+ . Xml::element( 'y:NodeLabel', [ 'fontSize' => '24' ], $code )
. Xml::element( 'y:BorderStyle', [ 'hasColor' => 'false' ], '' )
. Xml::element( 'y:Fill', [ 'hasColor' => 'false' ], '' )
. Xml::closeElement( 'y:Shapenode' )
diff --git a/MLEB/Translate/scripts/findUnsynchronizedDefinitions.php b/MLEB/Translate/scripts/findUnsynchronizedDefinitions.php
new file mode 100644
index 00000000..a82664d0
--- /dev/null
+++ b/MLEB/Translate/scripts/findUnsynchronizedDefinitions.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\Diagnostics\FindUnsynchronizedDefinitionsMaintenanceScript;
+
+$class = FindUnsynchronizedDefinitionsMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/fuzzy.php b/MLEB/Translate/scripts/fuzzy.php
index 549409bf..1244f2e2 100644
--- a/MLEB/Translate/scripts/fuzzy.php
+++ b/MLEB/Translate/scripts/fuzzy.php
@@ -10,7 +10,7 @@
*/
// Standard boilerplate to define $IP
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\SlotRecord;
use Wikimedia\Rdbms\IResultWrapper;
@@ -97,35 +97,20 @@ class Fuzzy extends Maintenance {
* Class for marking translation fuzzy.
*/
class FuzzyScript {
- /**
- * @var bool Check for configuration problems.
- */
- private $allclear = false;
-
+ /** @var bool Check for configuration problems. */
+ private $allclear = true;
/** @var callable Function to report progress updates */
protected $progressCallback;
-
- /**
- * @var bool Dont do anything unless confirmation is given
- */
+ /** @var bool Dont do anything unless confirmation is given */
public $dryrun = true;
-
- /**
- * @var string Edit summary.
- */
+ /** @var string Edit summary. */
public $comment;
-
- /**
- * @var array[]
- */
+ /** @var array[] */
public $pages;
- /**
- * @param array $pages
- */
+ /** @param array $pages */
public function __construct( $pages ) {
$this->pages = $pages;
- $this->allclear = true;
}
public function setProgressCallback( $callback ) {
@@ -163,10 +148,7 @@ class FuzzyScript {
private static function getMessageContentsFromRows( $rows ) {
$revStore = MediaWikiServices::getInstance()->getRevisionStore();
$messagesContents = [];
- $slots = [];
- if ( is_callable( [ $revStore, 'getContentBlobsForBatch' ] ) ) {
- $slots = $revStore->getContentBlobsForBatch( $rows, [ SlotRecord::MAIN ] )->getValue();
- }
+ $slots = $revStore->getContentBlobsForBatch( $rows, [ SlotRecord::MAIN ] )->getValue();
foreach ( $rows as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
if ( isset( $slots[$row->rev_id] ) ) {
diff --git a/MLEB/Translate/scripts/groupStatistics.php b/MLEB/Translate/scripts/groupStatistics.php
index d69e110e..34bf0489 100644
--- a/MLEB/Translate/scripts/groupStatistics.php
+++ b/MLEB/Translate/scripts/groupStatistics.php
@@ -88,7 +88,6 @@ class GroupStatistics extends Maintenance {
'ckb' => [ 50, 26, 'asia' ],
'ku-latn' => [ 50, 26, 'asia' ],
];
-
/**
* Variable with key-value pairs with a named index and an array of key-value
* pairs where the key is a MessageGroup ID and the value is a weight of the
@@ -116,7 +115,6 @@ class GroupStatistics extends Maintenance {
'ext-0-all' => 25
]
];
-
/**
* Code map to map localisation codes to Wikimedia project codes. Only
* exclusion and remapping is defined here. It is assumed that the first part
@@ -409,9 +407,7 @@ class GroupStatistics extends Maintenance {
);
}
- /**
- * @var MessageGroup $g
- */
+ /** @var MessageGroup $g */
foreach ( $groups as $g ) {
// Add unprocessed description of group as heading
if ( $reportScore ) {
diff --git a/MLEB/Translate/scripts/languageeditstats.php b/MLEB/Translate/scripts/languageeditstats.php
index 5aa11676..2cea8ed0 100644
--- a/MLEB/Translate/scripts/languageeditstats.php
+++ b/MLEB/Translate/scripts/languageeditstats.php
@@ -11,7 +11,7 @@
*/
// Standard boilerplate to define $IP
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
$IP = getenv( 'MW_INSTALL_PATH' );
diff --git a/MLEB/Translate/scripts/moveTranslatablePage.php b/MLEB/Translate/scripts/moveTranslatablePage.php
new file mode 100644
index 00000000..060eb7cb
--- /dev/null
+++ b/MLEB/Translate/scripts/moveTranslatablePage.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\PageTranslation\MoveTranslatablePageMaintenanceScript;
+
+$class = MoveTranslatablePageMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/poimport.php b/MLEB/Translate/scripts/poimport.php
index af7de0d5..4c411270 100644
--- a/MLEB/Translate/scripts/poimport.php
+++ b/MLEB/Translate/scripts/poimport.php
@@ -88,17 +88,14 @@ class Poimport extends Maintenance {
*/
class PoImporter {
/** @var callable Function to report progress updates */
- protected $progressCallback;
-
+ private $progressCallback;
/**
* Path to file to parse.
- * @var bool|string
+ * @var string
*/
- private $file = false;
+ private $file;
- /**
- * @param string $file File to import
- */
+ /** @param string $file File to import */
public function __construct( $file ) {
$this->file = $file;
}
@@ -219,22 +216,24 @@ class PoImporter {
* Import changes to wiki as given user
*/
class WikiWriter {
- /** @var callable Function to report progress updates */
- protected $progressCallback;
-
- protected $user;
-
- private $changes = [];
- private $dryrun = true;
- private $group = null;
+ /** @var callable|null Function to report progress updates */
+ private $progressCallback;
+ /** @var User */
+ private $user;
+ /** @var string[] */
+ private $changes;
+ /** @var bool */
+ private $dryrun;
+ /** @var MessageGroup|null */
+ private $group;
/**
- * @param array $changes Array of key/langcode => translation.
+ * @param string[] $changes Array of key/langcode => translation.
* @param string $groupId Group ID.
* @param string $user User who makes the edits in wiki.
* @param bool $dryrun Do not do anything that affects the database.
*/
- public function __construct( $changes, $groupId, $user, $dryrun = true ) {
+ public function __construct( array $changes, $groupId, $user, $dryrun = true ) {
$this->changes = $changes;
$this->group = MessageGroups::getGroup( $groupId );
$this->user = User::newFromName( $user );
diff --git a/MLEB/Translate/scripts/populateFuzzy.php b/MLEB/Translate/scripts/populateFuzzy.php
index 43c491d0..75451d27 100644
--- a/MLEB/Translate/scripts/populateFuzzy.php
+++ b/MLEB/Translate/scripts/populateFuzzy.php
@@ -74,10 +74,7 @@ class PopulateFuzzy extends Maintenance {
break;
}
- $slots = [];
- if ( is_callable( [ $revStore, 'getContentBlobsForBatch' ] ) ) {
- $slots = $revStore->getContentBlobsForBatch( $res, [ SlotRecord::MAIN ] )->getValue();
- }
+ $slots = $revStore->getContentBlobsForBatch( $res, [ SlotRecord::MAIN ] )->getValue();
foreach ( $res as $r ) {
if ( isset( $slots[$r->rev_id] ) ) {
$text = $slots[$r->rev_id][SlotRecord::MAIN]->blob_data;
diff --git a/MLEB/Translate/scripts/processMessageChanges.php b/MLEB/Translate/scripts/processMessageChanges.php
index 5be54c7c..78459cd4 100644
--- a/MLEB/Translate/scripts/processMessageChanges.php
+++ b/MLEB/Translate/scripts/processMessageChanges.php
@@ -18,8 +18,8 @@ if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
}
require_once "$IP/maintenance/Maintenance.php";
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
-use MediaWiki\Extensions\Translate\Utilities\StringComparators\SimpleStringComparator;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Utilities\StringComparators\SimpleStringComparator;
/**
* Script for processing message changes in file based message groups.
@@ -31,13 +31,6 @@ use MediaWiki\Extensions\Translate\Utilities\StringComparators\SimpleStringCompa
* @since 2012-04-23
*/
class ProcessMessageChanges extends Maintenance {
- protected $changes = [];
-
- /**
- * @var int
- */
- protected $counter;
-
public function __construct() {
parent::__construct();
$this->addDescription( 'Script for processing message changes in file based message groups' );
diff --git a/MLEB/Translate/scripts/queryGroupSyncCache.php b/MLEB/Translate/scripts/queryGroupSyncCache.php
new file mode 100644
index 00000000..f8b0fce0
--- /dev/null
+++ b/MLEB/Translate/scripts/queryGroupSyncCache.php
@@ -0,0 +1,6 @@
+<?php
+
+use MediaWiki\Extension\Translate\Synchronization\QueryGroupSyncCacheMaintenanceScript;
+
+$class = QueryGroupSyncCacheMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/scripts/sync-group.php b/MLEB/Translate/scripts/sync-group.php
index 4e43a86b..8ab81524 100644
--- a/MLEB/Translate/scripts/sync-group.php
+++ b/MLEB/Translate/scripts/sync-group.php
@@ -11,7 +11,7 @@
* @file
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Shell\Shell;
@@ -186,16 +186,12 @@ class SyncGroup extends Maintenance {
class ChangeSyncer {
/** @var callable Function to report progress updates */
protected $progressCallback;
-
- /** @var bool Don't list changes in recent changes table. */
+ /** @var bool Don't list changes in recent changes table. */
public $norc = false;
-
/** @var bool Whether the script can ask questions. */
public $interactive = true;
-
/** @var bool Disable color output. */
public $nocolor = false;
-
/** @var MessageGroup */
protected $group;
diff --git a/MLEB/Translate/scripts/translator-stats.php b/MLEB/Translate/scripts/translator-stats.php
index 77fe3c72..9a24e657 100644
--- a/MLEB/Translate/scripts/translator-stats.php
+++ b/MLEB/Translate/scripts/translator-stats.php
@@ -102,9 +102,8 @@ class TS extends Maintenance {
$method = 'sandbox';
break;
} elseif ( $log->log_action === 'rights' ) {
- Wikimedia\suppressWarnings();
- $data = unserialize( $log->log_params );
- Wikimedia\restoreWarnings();
+ // phpcs:disable Generic.PHP.NoSilencedErrors.Discouraged
+ $data = @unserialize( $log->log_params );
if ( $data === false ) {
$lines = explode( "\n", $log->log_params, 3 );
if ( strpos( $lines[1], 'translator' ) !== false ) {
diff --git a/MLEB/Translate/scripts/ttmserver-export.php b/MLEB/Translate/scripts/ttmserver-export.php
index 05c20298..7b331cc4 100644
--- a/MLEB/Translate/scripts/ttmserver-export.php
+++ b/MLEB/Translate/scripts/ttmserver-export.php
@@ -21,9 +21,7 @@ require_once "$IP/maintenance/Maintenance.php";
* @since 2012-01-26
*/
class TTMServerBootstrap extends Maintenance {
- /**
- * @var int
- */
+ /** @var int */
private $start;
public function __construct() {
@@ -48,7 +46,7 @@ class TTMServerBootstrap extends Maintenance {
);
$this->addOption(
'dry-run',
- 'Do not make any actualy changes in the index.'
+ 'Do not make any changes to the index.'
);
$this->addOption(
'verbose',
@@ -102,11 +100,12 @@ class TTMServerBootstrap extends Maintenance {
$status = 0;
pcntl_waitpid( $pid, $status );
// beginBootstrap probably failed, give up.
- if ( $status !== 0 ) {
- $this->fatalError( 'Boostrap failed.' );
+ if ( !$this->verifyChildStatus( $pid, $status ) ) {
+ $this->fatalError( 'Bootstrap failed.' );
}
}
+ $hasErrors = false;
$threads = $this->getOption( 'threads', 1 );
$pids = [];
@@ -137,6 +136,7 @@ class TTMServerBootstrap extends Maintenance {
if ( count( $pids ) >= $threads ) {
$status = 0;
$pid = pcntl_wait( $status );
+ $hasErrors = $hasErrors || !$this->verifyChildStatus( $pid, $status );
unset( $pids[$pid] );
}
}
@@ -146,10 +146,15 @@ class TTMServerBootstrap extends Maintenance {
foreach ( array_keys( $pids ) as $pid ) {
$status = 0;
pcntl_waitpid( $pid, $status );
+ $hasErrors = $hasErrors || !$this->verifyChildStatus( $pid, $status );
}
// It's okay to do this in the main thread as it is the last thing
$this->endBootstrap( $server );
+
+ if ( $hasErrors ) {
+ $this->fatalError( '!!! Some threads failed. Review the script output !!!' );
+ }
}
private function getServer( array $config ): WritableTTMServer {
@@ -283,6 +288,22 @@ class TTMServerBootstrap extends Maintenance {
// we can't use them in forked children.
MediaWiki\MediaWikiServices::resetChildProcessServices();
}
+
+ private function verifyChildStatus( int $pid, int $status ): bool {
+ if ( pcntl_wifexited( $status ) ) {
+ $code = pcntl_wexitstatus( $status );
+ if ( $code ) {
+ $this->output( "Pid $pid exited with status $code !!\n" );
+ return false;
+ }
+ } elseif ( pcntl_wifsignaled( $status ) ) {
+ $signum = pcntl_wtermsig( $status );
+ $this->output( "Pid $pid terminated by signal $signum !!\n" );
+ return false;
+ }
+
+ return true;
+ }
}
$maintClass = TTMServerBootstrap::class;
diff --git a/MLEB/Translate/scripts/updateTranslatorActivity.php b/MLEB/Translate/scripts/updateTranslatorActivity.php
index a4d7a852..30921ffa 100644
--- a/MLEB/Translate/scripts/updateTranslatorActivity.php
+++ b/MLEB/Translate/scripts/updateTranslatorActivity.php
@@ -1,10 +1,6 @@
<?php
-use MediaWiki\Extensions\Translate\Statistics\UpdateTranslatorActivityMaintenanceScript;
+use MediaWiki\Extension\Translate\Statistics\UpdateTranslatorActivityMaintenanceScript;
-$env = getenv( 'MW_INSTALL_PATH' );
-$IP = $env !== false ? $env : __DIR__ . '/../../..';
-require_once "$IP/maintenance/Maintenance.php";
-require_once __DIR__ . '/../src/Statistics/UpdateTranslatorActivityMaintenanceScript.php';
-$maintClass = UpdateTranslatorActivityMaintenanceScript::class;
-require_once RUN_MAINTENANCE_IF_MAIN;
+$class = UpdateTranslatorActivityMaintenanceScript::class;
+require_once '__bootstrap.php';
diff --git a/MLEB/Translate/sonar-project.properties b/MLEB/Translate/sonar-project.properties
index 763eb46c..9fdb9230 100644
--- a/MLEB/Translate/sonar-project.properties
+++ b/MLEB/Translate/sonar-project.properties
@@ -1,4 +1,4 @@
sonar.sources=.
-sonar.exclusions=data/**/*,sql/**/*,tests/**/*
+sonar.exclusions=data/**/*,sql/**/*,tests/**/*,resources/lib/**/*
sonar.tests=tests/phpunit,tests/qunit
sonar.test.exclusions=tests/phpunit/data
diff --git a/MLEB/Translate/specials/SpecialAggregateGroups.php b/MLEB/Translate/specials/SpecialAggregateGroups.php
index 197d2462..afc39032 100644
--- a/MLEB/Translate/specials/SpecialAggregateGroups.php
+++ b/MLEB/Translate/specials/SpecialAggregateGroups.php
@@ -26,7 +26,7 @@ class SpecialAggregateGroups extends SpecialPage {
$this->addHelpLink( 'Help:Extension:Translate/Page translation administration' );
$out = $this->getOutput();
- $out->addModuleStyles( 'ext.translate.special.aggregategroups.styles' );
+ $out->addModuleStyles( 'ext.translate.specialpages.styles' );
// Check permissions
if ( $this->getUser()->isAllowed( 'translate-manage' ) ) {
@@ -48,7 +48,7 @@ class SpecialAggregateGroups extends SpecialPage {
$pages[] = $group;
} elseif ( $group instanceof AggregateMessageGroup ) {
$subgroups = TranslateMetadata::getSubgroups( $group->getId() );
- if ( $subgroups !== false ) {
+ if ( $subgroups !== null ) {
$aggregates[] = $group;
}
}
@@ -168,9 +168,7 @@ class SpecialAggregateGroups extends SpecialPage {
return $out;
}
- /**
- * @param array $aggregates
- */
+ /** @param array $aggregates */
protected function showAggregateGroups( array $aggregates ) {
$out = $this->getOutput();
$out->addModules( 'ext.translate.special.aggregategroups' );
@@ -183,11 +181,8 @@ class SpecialAggregateGroups extends SpecialPage {
$out->addHTML( $nojs );
- /**
- * @var AggregateMessageGroup $group
- */
+ /** @var AggregateMessageGroup $group */
foreach ( $aggregates as $group ) {
- // @phan-suppress-next-line SecurityCheck-XSS
$out->addHTML( $this->showAggregateGroup( $group ) );
}
@@ -230,7 +225,7 @@ class SpecialAggregateGroups extends SpecialPage {
$out = Html::openElement( 'ol', [ 'id' => $id ] );
// Not calling $parent->getGroups() because it has done filtering already
- $subgroupIds = TranslateMetadata::getSubgroups( $parent->getId() );
+ $subgroupIds = TranslateMetadata::getSubgroups( $parent->getId() ) ?? [];
// Get the respective groups and sort them
$subgroups = MessageGroups::getGroupsById( $subgroupIds );
diff --git a/MLEB/Translate/specials/SpecialExportTranslations.php b/MLEB/Translate/specials/SpecialExportTranslations.php
index 2b23040d..2e39f3c0 100644
--- a/MLEB/Translate/specials/SpecialExportTranslations.php
+++ b/MLEB/Translate/specials/SpecialExportTranslations.php
@@ -1,4 +1,5 @@
<?php
+
/**
* @license GPL-2.0-or-later
* @ingroup SpecialPage TranslateSpecialPage
@@ -11,13 +12,10 @@ class SpecialExportTranslations extends SpecialPage {
/** @var string */
protected $language;
-
/** @var string */
protected $format;
-
/** @var string */
protected $groupId;
-
/** @var string[] */
public static $validFormats = [ 'export-as-po', 'export-to-file' ];
@@ -25,9 +23,7 @@ class SpecialExportTranslations extends SpecialPage {
parent::__construct( 'ExportTranslations' );
}
- /**
- * @param null|string $par
- */
+ /** @param null|string $par */
public function execute( $par ) {
$out = $this->getOutput();
$request = $this->getRequest();
@@ -84,8 +80,7 @@ class SpecialExportTranslations extends SpecialPage {
'default' => $this->format,
],
];
- $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
- $form
+ HTMLForm::factory( 'ooui', $fields, $this->getContext() )
->setMethod( 'get' )
->setWrapperLegendMsg( 'translate-page-settings-legend' )
->setSubmitTextMsg( 'translate-submit' )
@@ -93,9 +88,7 @@ class SpecialExportTranslations extends SpecialPage {
->displayForm( false );
}
- /**
- * @return array
- */
+ /** @return array */
protected function getGroupOptions() {
$selected = $this->groupId;
$groups = MessageGroups::getAllGroups();
@@ -115,9 +108,7 @@ class SpecialExportTranslations extends SpecialPage {
return $options;
}
- /**
- * @return array
- */
+ /** @return array */
protected function getLanguageOptions() {
$languages = TranslateUtils::getLanguageNames( 'en' );
$options = [];
@@ -128,9 +119,7 @@ class SpecialExportTranslations extends SpecialPage {
return $options;
}
- /**
- * @return array
- */
+ /** @return array */
protected function getFormatOptions() {
$options = [];
foreach ( self::$validFormats as $format ) {
@@ -140,9 +129,7 @@ class SpecialExportTranslations extends SpecialPage {
return $options;
}
- /**
- * @return Status
- */
+ /** @return Status */
protected function checkInput() {
$status = Status::newGood();
@@ -226,26 +213,30 @@ class SpecialExportTranslations extends SpecialPage {
default:
// @todo Add web viewing for groups other than WikiPageMessageGroup
- $pageTranslation = $this->getConfig()->get( 'EnablePageTranslation' );
- if ( $pageTranslation && $group instanceof WikiPageMessageGroup ) {
- $collection->loadTranslations();
- $page = TranslatablePage::newFromTitle( $group->getTitle() );
- $text = $page->getParse()->getTranslationPageText( $collection );
- $displayTitle = $page->getPageDisplayTitle( $this->language );
- if ( $displayTitle ) {
- $text = "{{DISPLAYTITLE:$displayTitle}}$text";
- }
- $box = Html::element(
- 'textarea',
- [ 'id' => 'wpTextbox', 'rows' => 40, ],
- $text
- );
- $out->addHTML( $box );
- return;
+ if ( !$group instanceof WikiPageMessageGroup ) {
+ // This should have been prevented at validation. See checkInput().
+ throw new LogicException( 'Unexpected export format.' );
+ }
+
+ $translatablePage = TranslatablePage::newFromTitle( $group->getTitle() );
+ $translationPage = $translatablePage->getTranslationPage( $collection->getLanguage() );
+
+ $translationPage->filterMessageCollection( $collection );
+ $messages = $translationPage->extractMessages( $collection );
+ $text = $translationPage->generateSourceFromTranslations( $messages );
+
+ $displayTitle = $translatablePage->getPageDisplayTitle( $this->language );
+ if ( $displayTitle ) {
+ $text = "{{DISPLAYTITLE:$displayTitle}}$text";
}
- // This should have been prevented at validation. See checkInput().
- throw new Exception( 'Unexpected export format.' );
+ $box = Html::element(
+ 'textarea',
+ [ 'id' => 'wpTextbox', 'rows' => 40, ],
+ $text
+ );
+ $out->addHTML( $box );
+
}
}
diff --git a/MLEB/Translate/specials/SpecialImportTranslations.php b/MLEB/Translate/specials/SpecialImportTranslations.php
index 7f6228e2..eea01221 100644
--- a/MLEB/Translate/specials/SpecialImportTranslations.php
+++ b/MLEB/Translate/specials/SpecialImportTranslations.php
@@ -201,7 +201,12 @@ class SpecialImportTranslations extends SpecialPage {
$ffs = new GettextFFS( $group );
- $parseOutput = $ffs->readFromVariable( $data );
+ try {
+ $parseOutput = $ffs->readFromVariable( $data );
+ } catch ( GettextParseException $e ) {
+ return [ 'no-headers' ];
+ }
+
// Special data added by GettextFFS
$metadata = $parseOutput['EXTRA']['METADATA'];
@@ -213,20 +218,27 @@ class SpecialImportTranslations extends SpecialPage {
return [ 'ok', $parseOutput ];
}
+ private function getCache() {
+ return ObjectCache::getInstance( CACHE_DB );
+ }
+
protected function setCachedData( $data ) {
- $key = wfMemcKey( 'translate', 'webimport', $this->getUser()->getId() );
- wfGetCache( CACHE_DB )->set( $key, $data, 60 * 30 );
+ $cache = self::getCache();
+ $key = $cache->makeKey( 'translate', 'webimport', $this->getUser()->getId() );
+ $cache->set( $key, $data, 60 * 30 );
}
protected function getCachedData() {
- $key = wfMemcKey( 'translate', 'webimport', $this->getUser()->getId() );
+ $cache = self::getCache();
+ $key = $cache->makeKey( 'translate', 'webimport', $this->getUser()->getId() );
- return wfGetCache( CACHE_DB )->get( $key );
+ return $cache->get( $key );
}
protected function deleteCachedData() {
- $key = wfMemcKey( 'translate', 'webimport', $this->getUser()->getId() );
+ $cache = self::getCache();
+ $key = $cache->makeKey( 'translate', 'webimport', $this->getUser()->getId() );
- return wfGetCache( CACHE_DB )->delete( $key );
+ return $cache->delete( $key );
}
}
diff --git a/MLEB/Translate/specials/SpecialLanguageStats.php b/MLEB/Translate/specials/SpecialLanguageStats.php
index 161b9683..62aa3f79 100644
--- a/MLEB/Translate/specials/SpecialLanguageStats.php
+++ b/MLEB/Translate/specials/SpecialLanguageStats.php
@@ -20,56 +20,43 @@
* @ingroup SpecialPage TranslateSpecialPage Stats
*/
class SpecialLanguageStats extends SpecialPage {
- /**
- * @var StatsTable
- */
+ /** @var StatsTable */
protected $table;
-
- /**
- * @var Array
- */
+ /** @var array */
protected $targetValueName = [ 'code', 'language' ];
-
/**
* Most of the displayed numbers added together at the bottom of the table.
*/
protected $totals;
-
/**
* Flag to set if nothing to show.
* @var bool
*/
protected $nothing = false;
-
/**
* Flag to set if not all numbers are available.
* @var bool
*/
protected $incomplete = false;
-
/**
* Whether to hide rows which are fully translated.
* @var bool
*/
protected $noComplete = true;
-
/**
* Whether to hide rows which are fully untranslated.
* @var bool
*/
protected $noEmpty = false;
-
/**
* The target of stats, language code or group id.
*/
protected $target;
-
/**
* Whether to regenerate stats. Activated by action=purge in query params.
* @var bool
*/
protected $purge;
-
/**
* Helper variable to avoid overcounting message groups that appear
* multiple times in the list with different parents. Aggregate message
@@ -78,10 +65,7 @@ class SpecialLanguageStats extends SpecialPage {
* @var array
*/
protected $statsCounted = [];
-
- /**
- * @var array
- */
+ /** @var array */
protected $states;
public function __construct() {
@@ -472,7 +456,7 @@ class SpecialLanguageStats extends SpecialPage {
/**
* Actually creates the table for single message group, unless it
- * is blacklisted or hidden by filters.
+ * is in the exclusion list or hidden by filters.
* @param MessageGroup $group
* @param array $cache
* @param MessageGroup|null $parent
@@ -483,7 +467,7 @@ class SpecialLanguageStats extends SpecialPage {
) {
$groupId = $group->getId();
- if ( $this->table->isBlacklisted( $groupId, $this->target ) !== null ) {
+ if ( $this->table->isExcluded( $groupId, $this->target ) !== null ) {
return '';
}
@@ -521,35 +505,40 @@ class SpecialLanguageStats extends SpecialPage {
$params[] = $this->getLanguage()->getCode();
$params[] = md5( $this->target );
$params[] = $parent ? $parent->getId() : '!';
- $cachekey = wfMemcKey( __METHOD__ . '-v3', implode( '-', $params ) );
- $cacheval = wfGetCache( CACHE_ANYTHING )->get( $cachekey );
- if ( is_string( $cacheval ) ) {
- return $cacheval;
- }
- // Any data variable read below should be part of the cache key above
- $extra = [];
- if ( $translated === $total ) {
- $extra = [ 'action' => 'proofread' ];
- }
-
- $rowParams = [];
- $rowParams['data-groupid'] = $groupId;
- $rowParams['class'] = get_class( $group );
- if ( $parent ) {
- $rowParams['data-parentgroup'] = $parent->getId();
- }
-
- $out = "\t" . Html::openElement( 'tr', $rowParams );
- $out .= "\n\t\t" . Html::rawElement( 'td', [],
- $this->table->makeGroupLink( $group, $this->target, $extra ) );
- $out .= $this->table->makeNumberColumns( $stats );
- $out .= $this->getWorkflowStateCell( $groupId, $state );
- $out .= "\n\t" . Html::closeElement( 'tr' ) . "\n";
-
- wfGetCache( CACHE_ANYTHING )->set( $cachekey, $out, 3600 * 24 );
-
- return $out;
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+
+ return $cache->getWithSetCallback(
+ $cache->makeKey( __METHOD__ . '-v3', implode( '-', $params ) ),
+ $cache::TTL_DAY,
+ function () use ( $translated, $total, $groupId, $group, $parent, $stats, $state ) {
+ // Any data variable read below should be part of the cache key above
+ $extra = [];
+ if ( $translated === $total ) {
+ $extra = [ 'action' => 'proofread' ];
+ }
+
+ $rowParams = [];
+ $rowParams['data-groupid'] = $groupId;
+ $rowParams['class'] = get_class( $group );
+ if ( $parent ) {
+ $rowParams['data-parentgroup'] = $parent->getId();
+ }
+
+ return "\t" .
+ Html::openElement( 'tr', $rowParams ) .
+ "\n\t\t" .
+ Html::rawElement(
+ 'td',
+ [],
+ $this->table->makeGroupLink( $group, $this->target, $extra )
+ ) . $this->table->makeNumberColumns( $stats ) .
+ $this->getWorkflowStateCell( $groupId, $state ) .
+ "\n\t" .
+ Html::closeElement( 'tr' ) .
+ "\n";
+ }
+ );
}
protected function getWorkflowStates( $field = 'tgr_group', $filter = 'tgr_lang' ) {
diff --git a/MLEB/Translate/specials/SpecialManageGroups.php b/MLEB/Translate/specials/SpecialManageGroups.php
index 71f28021..5db58fa2 100644
--- a/MLEB/Translate/specials/SpecialManageGroups.php
+++ b/MLEB/Translate/specials/SpecialManageGroups.php
@@ -1,17 +1,14 @@
<?php
-/**
- * Implements special page for group management, where file based message
- * groups are be managed.
- *
- * @file
- * @author Niklas Laxström
- * @author Siebrand Mazeland
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Synchronization\DisplayGroupSynchronizationInfo;
+use MediaWiki\Extension\Translate\Synchronization\GroupSynchronizationCache;
+use MediaWiki\Extension\Translate\Synchronization\MessageUpdateParameter;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionLookup;
use MediaWiki\Revision\SlotRecord;
+use OOUI\ButtonInputWidget;
/**
* Class for special page Special:ManageMessageGroups. On this special page
@@ -19,30 +16,44 @@ use MediaWiki\Revision\SlotRecord;
* allows updating of the file cache, import and fuzzy for source language
* messages, as well as import/update of messages in other languages.
*
+ * @author Niklas Laxström
+ * @author Siebrand Mazeland
* @ingroup SpecialPage TranslateSpecialPage
- * Rewritten in 2012-04-23
+ * @license GPL-2.0-or-later
*/
class SpecialManageGroups extends SpecialPage {
+ private const GROUP_SYNC_INFO_WRAPPER_CLASS = 'smg-group-sync-cache-info';
private const RIGHT = 'translate-manage';
-
- /**
- * @var DifferenceEngine
- */
+ /** @var DifferenceEngine */
protected $diff;
-
- /**
- * @var string Path to the change cdb file.
- */
+ /** @var string Path to the change cdb file. */
protected $cdb;
-
- /**
- * @var bool Has the necessary right specified by the RIGHT constant
- */
+ /** @var bool Has the necessary right specified by the RIGHT constant */
protected $hasRight = false;
-
- public function __construct() {
+ /** @var Language */
+ private $contLang;
+ /** @var NamespaceInfo */
+ private $nsInfo;
+ /** @var RevisionLookup */
+ private $revLookup;
+ /** @var GroupSynchronizationCache */
+ private $synchronizationCache;
+ /** @var DisplayGroupSynchronizationInfo */
+ private $displayGroupSyncInfo;
+
+ public function __construct(
+ Language $contLang,
+ NamespaceInfo $nsInfo,
+ RevisionLookup $revLookup,
+ GroupSynchronizationCache $synchronizationCache
+ ) {
// Anyone is allowed to see, but actions are restricted
parent::__construct( 'ManageMessageGroups' );
+ $this->contLang = $contLang;
+ $this->nsInfo = $nsInfo;
+ $this->revLookup = $revLookup;
+ $this->synchronizationCache = $synchronizationCache;
+ $this->displayGroupSyncInfo = new DisplayGroupSynchronizationInfo( $this, $this->getLinkRenderer() );
}
public function doesWrites() {
@@ -61,7 +72,7 @@ class SpecialManageGroups extends SpecialPage {
$this->setHeaders();
$out = $this->getOutput();
- $out->addModuleStyles( 'ext.translate.special.managegroups.styles' );
+ $out->addModuleStyles( 'ext.translate.specialpages.styles' );
$out->addModules( 'ext.translate.special.managegroups' );
$out->addHelpLink( 'Help:Extension:Translate/Group_management' );
@@ -69,6 +80,23 @@ class SpecialManageGroups extends SpecialPage {
$this->cdb = MessageChangeStorage::getCdbPath( $name );
if ( !MessageChangeStorage::isValidCdbName( $name ) || !file_exists( $this->cdb ) ) {
+ if ( $this->getConfig()->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $out->addHTML(
+ $this->displayGroupSyncInfo->getGroupsInSyncHtml(
+ $this->synchronizationCache->getGroupsInSync(),
+ self::GROUP_SYNC_INFO_WRAPPER_CLASS
+ )
+ );
+
+ $out->addHTML(
+ $this->displayGroupSyncInfo->getHtmlForGroupsWithError(
+ $this->synchronizationCache,
+ self::GROUP_SYNC_INFO_WRAPPER_CLASS,
+ $this->getLanguage()
+ )
+ );
+ }
+
// @todo Tell them when changes was last checked/process
// or how to initiate recheck.
$out->addWikiMsg( 'translate-smg-nochanges' );
@@ -98,7 +126,7 @@ class SpecialManageGroups extends SpecialPage {
* How many changes can be shown per page.
* @return int
*/
- protected function getLimit() {
+ protected function getLimit(): int {
$limits = [
1000, // Default max
ini_get( 'max_input_vars' ),
@@ -107,10 +135,10 @@ class SpecialManageGroups extends SpecialPage {
];
// Ignore things not set
$limits = array_filter( $limits );
- return min( $limits );
+ return (int)min( $limits );
}
- protected function getLegend() {
+ protected function getLegend(): string {
$text = $this->diff->addHeader(
'',
$this->msg( 'translate-smg-left' )->escaped(),
@@ -120,9 +148,7 @@ class SpecialManageGroups extends SpecialPage {
return Html::rawElement( 'div', [ 'class' => 'mw-translate-smg-header' ], $text );
}
- protected function showChanges( $limit ) {
- $contLang = MediaWikiServices::getInstance()->getContentLanguage();
-
+ protected function showChanges( int $limit ): void {
$diff = new DifferenceEngine( $this->getContext() );
$diff->showDiffStyle();
$diff->setReducedLineNumbers();
@@ -142,7 +168,24 @@ class SpecialManageGroups extends SpecialPage {
);
// The above count as three
- $limit = $limit - 3;
+ $limit -= 3;
+
+ if ( $this->getConfig()->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $out->addHTML(
+ $this->displayGroupSyncInfo->getGroupsInSyncHtml(
+ $this->synchronizationCache->getGroupsInSync(),
+ self::GROUP_SYNC_INFO_WRAPPER_CLASS
+ )
+ );
+
+ $out->addHTML(
+ $this->displayGroupSyncInfo->getHtmlForGroupsWithError(
+ $this->synchronizationCache,
+ self::GROUP_SYNC_INFO_WRAPPER_CLASS,
+ $this->getLanguage()
+ )
+ );
+ }
$reader = \Cdb\Reader::open( $this->cdb );
$groups = $this->getGroupsFromCdb( $reader );
@@ -155,7 +198,7 @@ class SpecialManageGroups extends SpecialPage {
// Reduce page existance queries to one per group
$lb = new LinkBatch();
$ns = $group->getNamespace();
- $isCap = MWNamespace::isCapitalized( $ns );
+ $isCap = $this->nsInfo->isCapitalized( $ns );
$languages = $sourceChanges->getLanguages();
foreach ( $languages as $language ) {
@@ -165,7 +208,7 @@ class SpecialManageGroups extends SpecialPage {
// Constructing title objects is way slower
$key = $params['key'];
if ( $isCap ) {
- $key = $contLang->ucfirst( $key );
+ $key = $this->contLang->ucfirst( $key );
}
$lb->add( $ns, "$key/$language" );
}
@@ -182,7 +225,7 @@ class SpecialManageGroups extends SpecialPage {
foreach ( $changes as $type => $messages ) {
foreach ( $messages as $params ) {
- $change = $this->formatChange( $group, $language, $type, $params, $limit );
+ $change = $this->formatChange( $group, $sourceChanges, $language, $type, $params, $limit );
$out->addHTML( $change );
if ( $limit <= 0 ) {
@@ -199,28 +242,31 @@ class SpecialManageGroups extends SpecialPage {
}
}
- $attribs = [ 'type' => 'submit', 'class' => 'mw-translate-smg-submit' ];
- if ( !$this->hasRight ) {
- $attribs['disabled'] = 'disabled';
- $attribs['title'] = $this->msg( 'translate-smg-notallowed' )->text();
- }
- $button = Html::element( 'button', $attribs, $this->msg( 'translate-smg-submit' )->text() );
+ $out->enableOOUI();
+ $button = new ButtonInputWidget( [
+ 'type' => 'submit',
+ 'label' => $this->msg( 'translate-smg-submit' )->plain(),
+ 'disabled' => !$this->hasRight ? 'disabled' : null,
+ 'classes' => [ 'mw-translate-smg-submit' ],
+ 'title' => !$this->hasRight ? $this->msg( 'translate-smg-notallowed' )->plain() : null,
+ 'flags' => [ 'primary', 'progressive' ],
+ ] );
$out->addHTML( $button );
$out->addHTML( Html::closeElement( 'form' ) );
}
- /**
- * @param MessageGroup $group
- * @param string $language
- * @param string $type
- * @param array $params
- * @param int &$limit
- * @return string HTML
- */
- protected function formatChange( MessageGroup $group, $language, $type, $params, &$limit ) {
+ protected function formatChange(
+ MessageGroup $group,
+ MessageSourceChange $changes,
+ string $language,
+ string $type,
+ array $params,
+ int &$limit
+ ): string {
$key = $params['key'];
$title = Title::makeTitleSafe( $group->getNamespace(), "$key/$language" );
$id = self::changeId( $group->getId(), $language, $type, $key );
+ $noticeHtml = '';
if ( $title && $type === 'addition' && $title->exists() ) {
// The message has for some reason dropped out from cache
@@ -231,6 +277,7 @@ class SpecialManageGroups extends SpecialPage {
// forever and will prevent rebuilding the cache, which
// leads to many other annoying problems.
$type = 'change';
+ $noticeHtml .= Html::warningBox( $this->msg( 'translate-manage-key-reused' )->text() );
} elseif ( $title && ( $type === 'deletion' || $type === 'change' ) && !$title->exists() ) {
// This happens if a message key has been renamed
// The change can be ignored.
@@ -242,30 +289,60 @@ class SpecialManageGroups extends SpecialPage {
if ( $type === 'deletion' ) {
$wiki = ContentHandler::getContentText(
- MediaWikiServices::getInstance()
- ->getRevisionLookup()
+ $this->revLookup
->getRevisionByTitle( $title )
->getContent( SlotRecord::MAIN )
);
+
+ if ( $wiki === '' ) {
+ $noticeHtml .= Html::warningBox(
+ $this->msg( 'translate-manage-empty-content' )->text()
+ );
+ }
+
$oldContent = ContentHandler::makeContent( $wiki, $title );
$newContent = ContentHandler::makeContent( '', $title );
-
$this->diff->setContent( $oldContent, $newContent );
-
- $text = $this->diff->getDiff( $titleLink, '' );
+ $text = $this->diff->getDiff( $titleLink, '', $noticeHtml );
} elseif ( $type === 'addition' ) {
+ $menu = '';
+ $sourceLanguage = $group->getSourceLanguage();
+ if ( $sourceLanguage === $language ) {
+ if ( $this->hasRight ) {
+ $menu = Html::rawElement(
+ 'button',
+ [
+ 'class' => 'smg-rename-actions',
+ 'type' => 'button',
+ 'data-group-id' => $group->getId(),
+ 'data-lang' => $language,
+ 'data-msgkey' => $key,
+ 'data-msgtitle' => $title->getFullText()
+ ],
+ ''
+ );
+ }
+ } elseif ( !self::isMessageDefinitionPresent( $group, $changes, $key ) ) {
+ $noticeHtml .= Html::warningBox(
+ $this->msg( 'translate-manage-source-message-not-found' )->text(),
+ 'mw-translate-smg-notice-important'
+ );
+
+ // Automatically ignore messages that don't have a definitions
+ $menu = Html::hidden( "msg/$id", 'ignore', [ 'id' => "i/$id" ] );
+ $limit--;
+ }
+
+ if ( $params['content'] === '' ) {
+ $noticeHtml .= Html::warningBox(
+ $this->msg( 'translate-manage-empty-content' )->text()
+ );
+ }
+
$oldContent = ContentHandler::makeContent( '', $title );
$newContent = ContentHandler::makeContent( $params['content'], $title );
-
$this->diff->setContent( $oldContent, $newContent );
- $menu = '';
- if ( $group->getSourceLanguage() === $language && $this->hasRight ) {
- $menu = Html::rawElement( 'button', [
- 'class' => 'smg-rename-actions', 'type' => 'button',
- 'data-group-id' => $group->getId(), 'data-lang' => $language, 'data-msgkey' => $key,
- 'data-msgtitle' => $title->getFullText() ], '' );
- }
- $text = $this->diff->getDiff( '', $titleLink . $menu );
+ $text = $this->diff->getDiff( '', $titleLink . $menu, $noticeHtml );
} elseif ( $type === 'change' ) {
$wiki = TranslateUtils::getContentForTitle( $title, true );
@@ -288,7 +365,7 @@ class SpecialManageGroups extends SpecialPage {
$newContent = ContentHandler::makeContent( $params['content'], $title );
$this->diff->setContent( $oldContent, $newContent );
- $text .= $this->diff->getDiff( $titleLink, $actions );
+ $text .= $this->diff->getDiff( $titleLink, $actions, $noticeHtml );
}
$hidden = Html::hidden( $id, 1 );
@@ -304,7 +381,7 @@ class SpecialManageGroups extends SpecialPage {
return Html::rawElement( 'div', [ 'class' => $classes ], $text );
}
- protected function processSubmit() {
+ protected function processSubmit(): void {
$req = $this->getRequest();
$out = $this->getOutput();
$errorGroups = [];
@@ -331,20 +408,33 @@ class SpecialManageGroups extends SpecialPage {
$languages = $sourceChanges->getLanguages();
foreach ( $languages as $language ) {
// Handle changes, additions, deletions
- $this->handleModificationsSubmit( $group, $sourceChanges, $req,
- $language, $postponed, $groupModificationJobs );
+ $this->handleModificationsSubmit(
+ $group,
+ $sourceChanges,
+ $req,
+ $language,
+ $postponed,
+ $groupModificationJobs
+ );
// Handle renames, this might also add modification jobs based on user selection.
- $this->handleRenameSubmit( $group, $sourceChanges, $req, $language,
- $postponed, $groupRenameJobData, $groupModificationJobs );
+ $this->handleRenameSubmit(
+ $group,
+ $sourceChanges,
+ $req,
+ $language,
+ $postponed,
+ $groupRenameJobData,
+ $groupModificationJobs
+ );
if ( !isset( $postponed[$groupId][$language] ) ) {
$group->getMessageGroupCache( $language )->create();
}
}
- $modificationJobs = array_merge( $modificationJobs, $groupModificationJobs );
- $renameJobData = array_merge( $renameJobData, $groupRenameJobData );
+ $modificationJobs[$groupId] = $groupModificationJobs;
+ $renameJobData[$groupId] = $groupRenameJobData;
} catch ( Exception $e ) {
error_log(
"SpecialManageGroups: Error in processSubmit. Group: $groupId\n" .
@@ -355,9 +445,8 @@ class SpecialManageGroups extends SpecialPage {
}
}
- JobQueueGroup::singleton()->push( MessageIndexRebuildJob::newJob() );
- JobQueueGroup::singleton()->push( $modificationJobs );
- JobQueueGroup::singleton()->push( $this->createRenameJobs( $renameJobData ) );
+ $renameJobs = $this->createRenameJobs( $renameJobData );
+ $this->startSync( $modificationJobs, $renameJobs );
$reader->close();
rename( $this->cdb, $this->cdb . '-' . wfTimestamp() );
@@ -384,7 +473,12 @@ class SpecialManageGroups extends SpecialPage {
}
}
- protected static function changeId( $groupId, $language, $type, $key ) {
+ protected static function changeId(
+ string $groupId,
+ string $language,
+ string $type,
+ string $key
+ ): string {
return 'smg/' . substr( sha1( "$groupId/$language/$type/$key" ), 0, 7 );
}
@@ -394,9 +488,8 @@ class SpecialManageGroups extends SpecialPage {
* @since 2012-05-14
* @param Skin $skin
* @param array &$tabs
- * @return true
*/
- public static function tabify( Skin $skin, array &$tabs ) {
+ public static function tabify( Skin $skin, array &$tabs ): void {
$title = $skin->getTitle();
$specialPageFactory = MediaWikiServices::getInstance()->getSpecialPageFactory();
[ $alias, ] = $specialPageFactory->resolveAlias( $title->getText() );
@@ -408,7 +501,7 @@ class SpecialManageGroups extends SpecialPage {
'TranslationStats' => 'views',
];
if ( !isset( $pagesInGroup[$alias] ) ) {
- return true;
+ return;
}
$skin->getOutput()->addModuleStyles( 'ext.translate.tabgroup' );
@@ -429,21 +522,40 @@ class SpecialManageGroups extends SpecialPage {
'class' => $alias === $spName ? 'selected' : '',
];
}
-
- return true;
}
/**
- * Displays renames
+ * Check if the message definition is present as an incoming addition
+ * OR exists already on the wiki
+ *
+ * @internal - For internal use only
* @param MessageGroup $group
- * @param MessageSourceChange $sourceChanges
- * @param OutputPage $out
- * @param string $language
- * @param int &$limit
+ * @param MessageSourceChange $changes
+ * @param string $msgKey
+ * @return bool
*/
- protected function showRenames(
- MessageGroup $group, MessageSourceChange $sourceChanges, OutputPage $out, $language, &$limit
- ) {
+ private static function isMessageDefinitionPresent(
+ MessageGroup $group,
+ MessageSourceChange $changes,
+ string $msgKey
+ ): bool {
+ $sourceLanguage = $group->getSourceLanguage();
+ if ( $changes->findMessage( $sourceLanguage, $msgKey, [ MessageSourceChange::ADDITION ] ) ) {
+ return true;
+ }
+
+ $namespace = $group->getNamespace();
+ $sourceHandle = new MessageHandle( Title::makeTitle( $namespace, $msgKey ) );
+ return $sourceHandle->isValid();
+ }
+
+ private function showRenames(
+ MessageGroup $group,
+ MessageSourceChange $sourceChanges,
+ OutputPage $out,
+ string $language,
+ int &$limit
+ ): void {
$changes = $sourceChanges->getRenames( $language );
foreach ( $changes as $key => $params ) {
if ( !isset( $changes[$key] ) ) {
@@ -462,9 +574,13 @@ class SpecialManageGroups extends SpecialPage {
$secondKey = $sourceChanges->getMatchedKey( $language, $key );
$secondMsg = $sourceChanges->getMatchedMessage( $language, $key );
- if ( $sourceChanges->isPreviousState(
- $language, $key, [ MessageSourceChange::ADDITION, MessageSourceChange::CHANGE ]
- ) ) {
+ if (
+ $sourceChanges->isPreviousState(
+ $language,
+ $key,
+ [ MessageSourceChange::ADDITION, MessageSourceChange::CHANGE ]
+ )
+ ) {
$addedMsg = $firstMsg;
$deletedMsg = $secondMsg;
} else {
@@ -494,18 +610,14 @@ class SpecialManageGroups extends SpecialPage {
}
}
- /**
- * @param MessageGroup $group
- * @param array $addedMsg
- * @param array $deletedMsg
- * @param string $language
- * @param bool $isEqual Are the renamed messages equal
- * @param int &$limit
- * @return string HTML
- */
- protected function formatRename(
- MessageGroup $group, $addedMsg, $deletedMsg, $language, $isEqual, &$limit
- ) {
+ private function formatRename(
+ MessageGroup $group,
+ array $addedMsg,
+ array $deletedMsg,
+ string $language,
+ bool $isEqual,
+ int &$limit
+ ): string {
$addedKey = $addedMsg['key'];
$deletedKey = $deletedMsg['key'];
$actions = '';
@@ -526,7 +638,7 @@ class SpecialManageGroups extends SpecialPage {
}
$label = $this->msg( 'translate-manage-action-rename' )->text();
- $actions .= Xml::radioLabel( $label, "msg/$id", "rename", "imp/$id", $renameSelected );
+ $actions .= Xml::radioLabel( $label, "msg/$id", "rename", "imp/$id", $renameSelected );
} else {
$label = $this->msg( 'translate-manage-action-import' )->text();
$actions .= Xml::radioLabel( $label, "msg/$id", "import", "imp/$id", true );
@@ -546,11 +658,16 @@ class SpecialManageGroups extends SpecialPage {
$menu = '';
if ( $group->getSourceLanguage() === $language && $this->hasRight ) {
// Only show rename and add as new option for source language.
- $menu = Html::rawElement( 'button', [
- 'class' => 'smg-rename-actions', 'type' => 'button',
- 'data-group-id' => $group->getId(), 'data-msgkey' => $addedKey,
- 'data-msgtitle' => $addedTitle->getFullText()
- ], '' );
+ $menu = Html::rawElement(
+ 'button',
+ [
+ 'class' => 'smg-rename-actions',
+ 'type' => 'button',
+ 'data-group-id' => $group->getId(),
+ 'data-msgkey' => $addedKey,
+ 'data-msgtitle' => $addedTitle->getFullText()
+ ], ''
+ );
}
$actions = Html::rawElement( 'div', [ 'class' => 'smg-change-import-options' ], $actions );
@@ -565,23 +682,21 @@ class SpecialManageGroups extends SpecialPage {
$limit--;
$text .= $hidden;
- return Html::rawElement( 'div',
- [ 'class' => 'mw-translate-smg-change smg-change-rename' ], $text );
+ return Html::rawElement(
+ 'div',
+ [ 'class' => 'mw-translate-smg-change smg-change-rename' ],
+ $text
+ );
}
- /**
- * @param array $currentMsg
- * @param MessageSourceChange $sourceChanges
- * @param string $languageCode
- * @param int $groupNamespace
- * @param string $selectedVal
- * @param bool $isSourceLang
- * @return ?array
- */
- protected function getRenameJobParams(
- $currentMsg, MessageSourceChange $sourceChanges, $languageCode,
- $groupNamespace, $selectedVal, $isSourceLang = true
- ) {
+ private function getRenameJobParams(
+ array $currentMsg,
+ MessageSourceChange $sourceChanges,
+ string $languageCode,
+ int $groupNamespace,
+ string $selectedVal,
+ bool $isSourceLang = true
+ ): ?array {
if ( $selectedVal === 'ignore' ) {
return null;
}
@@ -592,9 +707,13 @@ class SpecialManageGroups extends SpecialPage {
$matchedMsg = $sourceChanges->getMatchedMessage( $languageCode, $currentMsgKey );
$matchedMsgKey = $matchedMsg['key'];
- if ( $sourceChanges->isPreviousState( $languageCode, $currentMsgKey, [
- MessageSourceChange::ADDITION, MessageSourceChange::CHANGE
- ] ) ) {
+ if (
+ $sourceChanges->isPreviousState(
+ $languageCode,
+ $currentMsgKey,
+ [ MessageSourceChange::ADDITION, MessageSourceChange::CHANGE ]
+ )
+ ) {
$params['target'] = $matchedMsgKey;
$params['replacement'] = $currentMsgKey;
$replacementContent = $currentMsg['content'];
@@ -604,11 +723,7 @@ class SpecialManageGroups extends SpecialPage {
$replacementContent = $matchedMsg['content'];
}
- if ( $selectedVal === 'renamefuzzy' ) {
- $params['fuzzy'] = 'fuzzy';
- } else {
- $params['fuzzy'] = false;
- }
+ $params['fuzzy'] = $selectedVal === 'renamefuzzy';
$params['content'] = $replacementContent;
@@ -623,9 +738,15 @@ class SpecialManageGroups extends SpecialPage {
return $params;
}
- protected function handleRenameSubmit( MessageGroup $group, MessageSourceChange $sourceChanges,
- WebRequest $req, $language, &$postponed, &$jobData, &$modificationJobs
- ) {
+ private function handleRenameSubmit(
+ MessageGroup $group,
+ MessageSourceChange $sourceChanges,
+ WebRequest $req,
+ string $language,
+ array &$postponed,
+ array &$jobData,
+ array &$modificationJobs
+ ): void {
$groupId = $group->getId();
$renames = $sourceChanges->getRenames( $language );
$isSourceLang = $group->getSourceLanguage() === $language;
@@ -639,7 +760,13 @@ class SpecialManageGroups extends SpecialPage {
$id = self::changeId( $groupId, $language, MessageSourceChange::RENAME, $key );
[ $renameMissing, $isCurrentKeyPresent ] = $this->isRenameMissing(
- $req, $sourceChanges, $id, $key, $language, $groupId, $isSourceLang
+ $req,
+ $sourceChanges,
+ $id,
+ $key,
+ $language,
+ $groupId,
+ $isSourceLang
);
if ( $renameMissing ) {
@@ -656,7 +783,12 @@ class SpecialManageGroups extends SpecialPage {
$selectedVal = $req->getVal( "msg/$id" );
$jobParams = $this->getRenameJobParams(
- $params, $sourceChanges, $language, $groupNamespace, $selectedVal, $isSourceLang
+ $params,
+ $sourceChanges,
+ $language,
+ $groupNamespace,
+ $selectedVal,
+ $isSourceLang
);
if ( $jobParams === null ) {
@@ -687,10 +819,14 @@ class SpecialManageGroups extends SpecialPage {
}
}
- protected function handleModificationsSubmit(
- MessageGroup $group, MessageSourceChange $sourceChanges, WebRequest $req,
- $language, &$postponed, &$messageUpdateJob
- ) {
+ private function handleModificationsSubmit(
+ MessageGroup $group,
+ MessageSourceChange $sourceChanges,
+ WebRequest $req,
+ string $language,
+ array &$postponed,
+ array &$messageUpdateJob
+ ): void {
$groupId = $group->getId();
$subchanges = $sourceChanges->getModificationsForLanguage( $language );
@@ -719,20 +855,30 @@ class SpecialManageGroups extends SpecialPage {
continue;
}
- $fuzzy = $selectedVal === 'fuzzy' ? 'fuzzy' : false;
+ $fuzzy = $selectedVal === 'fuzzy';
$messageUpdateJob[] = MessageUpdateJob::newJob( $title, $params['content'], $fuzzy );
}
}
}
- protected function createRenameJobs( $jobParams ) {
+ /**
+ * @param array $jobParams
+ * @return MessageUpdateJob[][]
+ */
+ private function createRenameJobs( array $jobParams ): array {
$jobs = [];
- foreach ( $jobParams as $params ) {
- $jobs[] = MessageUpdateJob::newRenameJob(
- $params['targetTitle'], $params['target'],
- $params['replacement'], $params['fuzzy'], $params['content'],
- $params['others']
- );
+ foreach ( $jobParams as $groupId => $groupJobParams ) {
+ $jobs[$groupId] = $jobs[$groupId] ?? [];
+ foreach ( $groupJobParams as $params ) {
+ $jobs[$groupId][] = MessageUpdateJob::newRenameJob(
+ $params['targetTitle'],
+ $params['target'],
+ $params['replacement'],
+ $params['fuzzy'],
+ $params['content'],
+ $params['others']
+ );
+ }
}
return $jobs;
@@ -740,13 +886,14 @@ class SpecialManageGroups extends SpecialPage {
/**
* Checks if a title still exists and can be processed.
- *
* @param Title $title
* @param string $type
* @return bool
*/
- protected function isTitlePresent( Title $title, $type ) {
- if ( ( $type === MessageSourceChange::DELETION || $type === MessageSourceChange::CHANGE ) &&
+ private function isTitlePresent( Title $title, string $type ): bool {
+ // phpcs:ignore SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn
+ if (
+ ( $type === MessageSourceChange::DELETION || $type === MessageSourceChange::CHANGE ) &&
!$title->exists()
) {
// This means that this change was probably introduced due to a rename
@@ -774,10 +921,15 @@ class SpecialManageGroups extends SpecialPage {
* 1 => (bool) Was the current $id found?
* ]
*/
- protected function isRenameMissing(
- WebRequest $req, MessageSourceChange $sourceChanges, $id, $key,
- $language, $groupId, $isSourceLang
- ) {
+ private function isRenameMissing(
+ WebRequest $req,
+ MessageSourceChange $sourceChanges,
+ string $id,
+ string $key,
+ string $language,
+ string $groupId,
+ bool $isSourceLang
+ ): array {
if ( $req->getCheck( $id ) ) {
return [ false, true ];
}
@@ -800,9 +952,7 @@ class SpecialManageGroups extends SpecialPage {
return [ true, $isCurrentKeyPresent ];
}
- protected function getProcessingErrorMessage(
- array $errorGroups, int $totalGroupCount
- ): string {
+ private function getProcessingErrorMessage( array $errorGroups, int $totalGroupCount ): string {
// Number of error groups, are less than the total groups processed.
if ( count( $errorGroups ) < $totalGroupCount ) {
$errorMsg = $this->msg( 'translate-smg-submitted-with-failure' )
@@ -835,4 +985,63 @@ class SpecialManageGroups extends SpecialPage {
}
return array_filter( $groups );
}
+
+ /**
+ * Add jobs to the queue, updates the interim cache, and start sync process for the group.
+ * @param MessageUpdateJob[][] $modificationJobs
+ * @param MessageUpdateJob[][] $renameJobs
+ * @return void
+ */
+ private function startSync( array $modificationJobs, array $renameJobs ): void {
+ // We are adding an empty array for groups that have no jobs. This is mainly done to
+ // avoid adding unnecessary checks. Remove those using array_filter
+ $modificationGroupIds = array_keys( array_filter( $modificationJobs ) );
+ $renameGroupIds = array_keys( array_filter( $renameJobs ) );
+ $uniqueGroupIds = array_unique( array_merge( $modificationGroupIds, $renameGroupIds ) );
+ $messageIndexInstance = MessageIndex::singleton();
+ $jobQueueInstance = JobQueueGroup::singleton();
+
+ foreach ( $uniqueGroupIds as $groupId ) {
+ $messages = [];
+ $messageKeys = [];
+ $groupJobs = [];
+
+ $groupRenameJobs = $renameJobs[$groupId] ?? [];
+ /** @var MessageUpdateJob $job */
+ foreach ( $groupRenameJobs as $job ) {
+ $groupJobs[] = $job;
+ $messageUpdateParam = MessageUpdateParameter::createFromJob( $job );
+ $messages[] = $messageUpdateParam;
+
+ // Build the handle to add the message key in interim cache
+ $replacement = $messageUpdateParam->getReplacementValue();
+ $targetTitle = Title::makeTitle( $job->getTitle()->getNamespace(), $replacement );
+ $messageKeys[] = ( new MessageHandle( $targetTitle ) )->getKey();
+ }
+
+ $groupModificationJobs = $modificationJobs[$groupId] ?? [];
+ /** @var MessageUpdateJob $job */
+ foreach ( $groupModificationJobs as $job ) {
+ $groupJobs[] = $job;
+ $messageUpdateParam = MessageUpdateParameter::createFromJob( $job );
+ $messages[] = $messageUpdateParam;
+
+ $messageKeys[] = ( new MessageHandle( $job->getTitle() ) )->getKey();
+ }
+
+ // Store all message keys in the interim cache - we're particularly interested in new
+ // and renamed messages, but it's cleaner to just store everything.
+ $group = MessageGroups::getGroup( $groupId );
+ $messageIndexInstance->storeInterim( $group, $messageKeys );
+
+ if ( $this->getConfig()->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $this->synchronizationCache->addMessages( $groupId, ...$messages );
+ $this->synchronizationCache->markGroupForSync( $groupId );
+ }
+
+ $jobQueueInstance->push( $groupJobs );
+ }
+
+ $jobQueueInstance->push( MessageIndexRebuildJob::newJob() );
+ }
}
diff --git a/MLEB/Translate/specials/SpecialManageTranslatorSandbox.php b/MLEB/Translate/specials/SpecialManageTranslatorSandbox.php
deleted file mode 100644
index b619d975..00000000
--- a/MLEB/Translate/specials/SpecialManageTranslatorSandbox.php
+++ /dev/null
@@ -1,335 +0,0 @@
-<?php
-/**
- * Contains logic for Special:ManageTranslatorSandbox
- *
- * @file
- * @author Niklas Laxström
- * @author Amir E. Aharoni
- * @license GPL-2.0-or-later
- */
-
-/**
- * Special page for managing sandboxed users.
- *
- * @ingroup SpecialPage TranslateSpecialPage
- */
-class SpecialManageTranslatorSandbox extends SpecialPage {
- /** @var TranslationStashStorage */
- protected $stash;
-
- public function __construct() {
- global $wgTranslateUseSandbox;
- parent::__construct(
- 'ManageTranslatorSandbox',
- 'translate-sandboxmanage',
- $wgTranslateUseSandbox
- );
- }
-
- public function doesWrites() {
- return true;
- }
-
- protected function getGroupName() {
- return 'translation';
- }
-
- public function execute( $params ) {
- $this->setHeaders();
- $this->checkPermissions();
- $out = $this->getOutput();
- $out->addModuleStyles( [
- 'ext.translate.special.managetranslatorsandbox.styles',
- 'mediawiki.ui.button',
- 'jquery.uls.grid'
- ] );
- $out->addModules( 'ext.translate.special.managetranslatorsandbox' );
- $this->stash = new TranslationStashStorage( wfGetDB( DB_MASTER ) );
-
- $this->prepareForTests();
- $this->showPage();
- }
-
- /**
- * Deletes a user page if it exists.
- * This is needed especially when deleting sandbox users
- * that were created as part of the integration tests.
- * @param User $user
- */
- protected function deleteUserPage( $user ) {
- $userpage = WikiPage::factory( $user->getUserPage() );
- if ( $userpage->exists() ) {
- $reason = wfMessage( 'tsb-delete-userpage-summary' )->inContentLanguage()->text();
- if ( version_compare( MW_VERSION, '1.35', '<' ) ) {
- $dummyError = '';
- $userpage->doDeleteArticleReal(
- $reason,
- false,
- 0,
- true,
- $dummyError,
- $this->getUser()
- );
- } else {
- $userpage->doDeleteArticleReal( $reason, $this->getUser() );
- }
- }
- }
-
- /**
- * Add users to the sandbox or delete them to facilitate browsers tests.
- * Use with caution!
- */
- public function prepareForTests() {
- $request = $this->getRequest();
-
- if ( $request->getVal( 'integrationtesting' ) === 'populate' ) {
- // Empty all the users, even if they were created manually
- // to ensure the number of users is what the tests expect
- $this->emptySandbox();
-
- $textUsernamePrefixes = [ 'Pupu', 'Orava' ];
- $testLanguages = [ 'fi', 'uk', 'nl', 'he', 'bn' ];
- $testLanguagesCount = count( $testLanguages );
-
- foreach ( $textUsernamePrefixes as $prefix ) {
- for ( $i = 0; $i < $testLanguagesCount; $i++ ) {
- $name = "$prefix$i";
-
- // Get rid of users, even if promoted during tests
- $userToDelete = User::newFromName( $name, false );
- $this->deleteUserPage( $userToDelete );
- TranslateSandbox::deleteUser( $userToDelete, 'force' );
-
- $user = TranslateSandbox::addUser( $name, "$name@blackhole.io", 'porkkana' );
- $user->setOption(
- 'translate-sandbox',
- FormatJson::encode( [
- 'languages' => [ $testLanguages[$i] ],
- 'comment' => '',
- ] )
- );
-
- $reminders = [];
- // @phan-suppress-next-line PhanSuspiciousValueComparison
- for ( $reminderIndex = 0; $reminderIndex < $i; $reminderIndex++ ) {
- $reminders[] = wfTimestamp() - $reminderIndex * $i * 10000;
- }
-
- $user->setOption(
- 'translate-sandbox-reminders',
- implode( '|', $reminders )
- );
- $user->saveSettings();
-
- // @phan-suppress-next-line PhanSuspiciousValueComparison
- for ( $j = 0; $j < $i; $j++ ) {
- $title = Title::makeTitle(
- NS_MEDIAWIKI,
- wfRandomString( 24 ) . '/' . $testLanguages[$i]
- );
- $translation = 'plop';
- $stashedTranslation = new StashedTranslation( $user, $title, $translation );
- $this->stash->addTranslation( $stashedTranslation );
- }
- }
- }
-
- // Another account for testing a translator to multiple languages
- $oldPolyglotUser = User::newFromName( 'Kissa', false );
- $this->deleteUserPage( $oldPolyglotUser );
- TranslateSandbox::deleteUser( $oldPolyglotUser, 'force' );
-
- $polyglotUser = TranslateSandbox::addUser( 'Kissa', 'kissa@blackhole.io', 'porkkana' );
- $polyglotUser->setOption(
- 'translate-sandbox',
- FormatJson::encode( [
- 'languages' => $testLanguages,
- 'comment' => "I know some languages, and I'm a developer.",
- ] )
- );
- $polyglotUser->saveSettings();
- for ( $polyglotLang = 0; $polyglotLang < $testLanguagesCount; $polyglotLang++ ) {
- $title = Title::makeTitle(
- NS_MEDIAWIKI,
- wfRandomString( 24 ) . '/' . $testLanguages[$polyglotLang]
- );
- $translation = "plop in $testLanguages[$polyglotLang]";
- $stashedTranslation = new StashedTranslation( $polyglotUser, $title, $translation );
- $this->stash->addTranslation( $stashedTranslation );
- }
- } elseif ( $request->getVal( 'integrationtesting' ) === 'empty' ) {
- $this->emptySandbox();
- }
- }
-
- /**
- * Delete all the users in the sandbox.
- * Use with caution!
- * To facilitate browsers tests.
- */
- protected function emptySandbox() {
- $users = TranslateSandbox::getUsers();
- foreach ( $users as $user ) {
- TranslateSandbox::deleteUser( $user );
- }
- }
-
- /**
- * Generates the whole page html and appends it to output
- */
- protected function showPage() {
- $out = $this->getOutput();
-
- $nojs = Html::element(
- 'div',
- [ 'class' => 'tux-nojs errorbox' ],
- $this->msg( 'tux-nojs' )->plain()
- );
- $out->addHTML( $nojs );
-
- $out->addHTML( <<<HTML
-<div class="grid tsb-container">
- <div class="row">
- <div class="nine columns pane filter">{$this->makeFilter()}</div>
- <div class="three columns pane search">{$this->makeSearchBox()}</div>
- </div>
- <div class="row tsb-body">
- <div class="four columns pane requests">
- {$this->makeList()}
- <div class="request-footer">
- <span class="selected-counter">
- {$this->msg( 'tsb-selected-count' )->numParams( 0 )->escaped()}
- </span>
- &nbsp;
- <a href="#" class="older-requests-indicator"></a>
- </div>
- </div>
- <div class="eight columns pane details"></div>
- </div>
-</div>
-HTML
- );
- }
-
- protected function makeFilter() {
- return $this->msg( 'tsb-filter-pending' )->escaped();
- }
-
- protected function makeSearchBox() {
- return <<<HTML
-<input class="request-filter-box right"
- placeholder="{$this->msg( 'tsb-search-requests' )->escaped()}" type="search">
-</input>
-HTML;
- }
-
- protected function makeList() {
- $items = [];
- $requests = [];
- $users = TranslateSandbox::getUsers();
-
- /** @var User $user */
- foreach ( $users as $user ) {
- $reminders = $user->getOption( 'translate-sandbox-reminders' );
- $reminders = $reminders ? explode( '|', $reminders ) : [];
- $remindersCount = count( $reminders );
- if ( $remindersCount ) {
- $lastReminderTimestamp = new MWTimestamp( end( $reminders ) );
- $lastReminderAgo = htmlspecialchars(
- $lastReminderTimestamp->getHumanTimestamp()
- );
- } else {
- $lastReminderAgo = '';
- }
-
- $requests[] = [
- 'username' => $user->getName(),
- 'email' => $user->getEmail(),
- 'gender' => $user->getOption( 'gender' ),
- 'registrationdate' => $user->getRegistration(),
- 'translations' => count( $this->stash->getTranslations( $user ) ),
- 'languagepreferences' => FormatJson::decode( $user->getOption( 'translate-sandbox' ) ),
- 'userid' => $user->getId(),
- 'reminderscount' => $remindersCount,
- 'lastreminder' => $lastReminderAgo,
- ];
- }
-
- // Sort the requests based on translations and registration date
- usort( $requests, [ __CLASS__, 'translatorRequestSort' ] );
-
- foreach ( $requests as $request ) {
- // @phan-suppress-next-line SecurityCheck-DoubleEscaped
- $items[] = $this->makeRequestItem( $request );
- }
-
- $requestsList = implode( "\n", $items );
-
- return <<<HTML
-<div class="row request-header">
- <div class="four columns">
- <button class="language-selector unselected">
- {$this->msg( 'tsb-all-languages-button-label' )->escaped()}
- </button>
- </div>
- <div class="five columns request-count"></div>
- <div class="three columns center">
- <input class="request-selector-all" name="request" type="checkbox" />
- </div>
-</div>
-<div class="requests-list">
- {$requestsList}
-</div>
-HTML;
- }
-
- protected function makeRequestItem( $request ) {
- $requestdataEnc = htmlspecialchars( FormatJson::encode( $request ) );
- $nameEnc = htmlspecialchars( $request['username'] );
- $nameEncForId = htmlspecialchars( Sanitizer::escapeIdForAttribute( 'tsb-request-' . $request['username'] ) );
- $emailEnc = htmlspecialchars( $request['email'] );
- $countEnc = htmlspecialchars( $request['translations'] );
- $timestamp = new MWTimestamp( $request['registrationdate'] );
- $agoEnc = htmlspecialchars( $timestamp->getHumanTimestamp() );
-
- return <<<HTML
-<div class="row request" data-data="$requestdataEnc" id="$nameEncForId">
- <div class="two columns amount">
- <div class="translation-count">$countEnc</div>
- </div>
- <div class="seven columns request-info">
- <div class="row username">$nameEnc</div>
- <div class="row email" dir="ltr">$emailEnc</div>
- </div>
- <div class="three columns approval center">
- <input class="row request-selector" name="request" type="checkbox" />
- <div class="row signup-age">$agoEnc</div>
- </div>
-</div>
-HTML;
- }
-
- /**
- * Sorts groups by descending order of number of translations,
- * registration date and username
- *
- * @since 2013.12
- * @param array $a Translation request
- * @param array $b Translation request
- * @return int comparison result
- */
- public static function translatorRequestSort( $a, $b ) {
- $translationCountDiff = $b['translations'] - $a['translations'];
- if ( $translationCountDiff !== 0 ) {
- return $translationCountDiff;
- }
-
- $registrationDateDiff = $b['registrationdate'] - $a['registrationdate'];
- if ( $registrationDateDiff !== 0 ) {
- return $registrationDateDiff;
- }
-
- return strcmp( $a['username'], $b['username'] );
- }
-}
diff --git a/MLEB/Translate/specials/SpecialMessageGroupStats.php b/MLEB/Translate/specials/SpecialMessageGroupStats.php
index 443d271c..338f70c0 100644
--- a/MLEB/Translate/specials/SpecialMessageGroupStats.php
+++ b/MLEB/Translate/specials/SpecialMessageGroupStats.php
@@ -21,11 +21,8 @@ class SpecialMessageGroupStats extends SpecialLanguageStats {
protected $noComplete = false;
/// Overwritten from SpecialLanguageStats
protected $noEmpty = true;
-
protected $names;
-
protected $translate;
-
/** @var int */
private $numberOfShownLanguages;
@@ -149,7 +146,7 @@ class SpecialMessageGroupStats extends SpecialLanguageStats {
sort( $languages );
$this->filterPriorityLangs( $languages, $this->target, $stats );
foreach ( $languages as $code ) {
- if ( $table->isBlacklisted( $this->target, $code ) !== null ) {
+ if ( $table->isExcluded( $this->target, $code ) !== null ) {
continue;
}
$out .= $this->makeRow( $code, $stats );
diff --git a/MLEB/Translate/specials/SpecialSearchTranslations.php b/MLEB/Translate/specials/SpecialSearchTranslations.php
index 377d95d8..dd6fcd1d 100644
--- a/MLEB/Translate/specials/SpecialSearchTranslations.php
+++ b/MLEB/Translate/specials/SpecialSearchTranslations.php
@@ -15,7 +15,6 @@
class SpecialSearchTranslations extends SpecialPage {
/** @var FormOptions */
protected $opts;
-
/**
* Placeholders used for highlighting. Search backend can mark the beginning and
* end but we need to run htmlspecialchars on the result first and then
@@ -24,7 +23,6 @@ class SpecialSearchTranslations extends SpecialPage {
* @var array
*/
protected $hl = [];
-
/**
* How many search results to display per page
* @var int
@@ -51,7 +49,7 @@ class SpecialSearchTranslations extends SpecialPage {
$out = $this->getOutput();
$out->addModuleStyles( 'jquery.uls.grid' );
- $out->addModuleStyles( 'ext.translate.special.searchtranslations.styles' );
+ $out->addModuleStyles( 'ext.translate.specialpages.styles' );
$out->addModuleStyles( 'ext.translate.special.translate.styles' );
$out->addModuleStyles( [ 'mediawiki.ui.button', 'mediawiki.ui.input', 'mediawiki.ui.checkbox' ] );
$out->addModules( 'ext.translate.special.searchtranslations' );
@@ -536,9 +534,7 @@ HTML
$container .
Html::closeElement( 'li' );
- $output .= Html::closeElement( 'ul' );
- $output .= Html::closeElement( 'div' );
- $output .= Html::closeElement( 'div' );
+ $output .= Html::closeElement( 'ul' ) . Html::closeElement( 'div' ) . Html::closeElement( 'div' );
return $output;
}
diff --git a/MLEB/Translate/specials/SpecialTranslate.php b/MLEB/Translate/specials/SpecialTranslate.php
index d7e7d6bd..7294e6f0 100644
--- a/MLEB/Translate/specials/SpecialTranslate.php
+++ b/MLEB/Translate/specials/SpecialTranslate.php
@@ -19,7 +19,6 @@ use MediaWiki\MediaWikiServices;
class SpecialTranslate extends SpecialPage {
/** @var MessageGroup */
protected $group;
-
protected $defaults;
protected $nondefaults = [];
protected $options;
@@ -82,7 +81,7 @@ class SpecialTranslate extends SpecialPage {
$defaults = [
/* str */'language' => $this->getLanguage()->getCode(),
- /* str */'group' => '!additions',
+ /* str */'group' => '!additions',
];
// Dump everything here
@@ -122,7 +121,9 @@ class SpecialTranslate extends SpecialPage {
throw new MWException( '$r was not set' );
}
- wfAppendToArrayIfNotDefault( $v, $r, $defaults, $nondefaults );
+ if ( $defaults[$v] !== $r ) {
+ $nondefaults[$v] = $r;
+ }
}
$this->defaults = $defaults;
@@ -232,16 +233,17 @@ class SpecialTranslate extends SpecialPage {
$output .= Html::closeElement( 'ul' );
$output .= Html::closeElement( 'div' ); // close nine columns
$output .= Html::openElement( 'div', [ 'class' => 'three columns' ] );
- $output .= Html::openElement( 'div', [ 'class' => 'tux-message-filter-wrapper' ] );
- $output .= Html::element( 'input', [
- 'class' => 'tux-message-filter-box',
- 'type' => 'search',
- ] );
- $output .= Html::closeElement( 'div' ); // close tux-message-filter-wrapper
-
- $output .= Html::closeElement( 'div' ); // close three columns
+ $output .= Html::rawElement(
+ 'div',
+ [ 'class' => 'tux-message-filter-wrapper' ],
+ Html::element( 'input', [
+ 'class' => 'tux-message-filter-box',
+ 'type' => 'search',
+ ] )
+ );
- $output .= Html::closeElement( 'div' ); // close the row
+ // close three columns and the row
+ $output .= Html::closeElement( 'div' ) . Html::closeElement( 'div' );
return $output;
}
@@ -353,7 +355,7 @@ class SpecialTranslate extends SpecialPage {
list( $alias, $sub ) = MediaWikiServices::getInstance()
->getSpecialPageFactory()->resolveAlias( $title->getText() );
- $pagesInGroup = [ 'Translate', 'LanguageStats', 'MessageGroupStats' ];
+ $pagesInGroup = [ 'Translate', 'LanguageStats', 'MessageGroupStats', 'ExportTranslations' ];
if ( !in_array( $alias, $pagesInGroup, true ) ) {
return true;
}
diff --git a/MLEB/Translate/specials/SpecialTranslationStats.php b/MLEB/Translate/specials/SpecialTranslationStats.php
index 6bafaa02..abc7e085 100644
--- a/MLEB/Translate/specials/SpecialTranslationStats.php
+++ b/MLEB/Translate/specials/SpecialTranslationStats.php
@@ -8,7 +8,8 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\MediaWikiServices;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\Statistics\TranslationStatsGraphOptions;
/**
* @defgroup Stats Statistics
@@ -21,17 +22,17 @@ use MediaWiki\MediaWikiServices;
* @ingroup SpecialPage TranslateSpecialPage Stats
*/
class SpecialTranslationStats extends SpecialPage {
- /// @since 2012-03-05
- protected static $graphs = [
- 'edits' => 'TranslatePerLanguageStats',
- 'users' => 'TranslatePerLanguageStats',
- 'registrations' => 'TranslateRegistrationStats',
- 'reviews' => 'ReviewPerLanguageStats',
- 'reviewers' => 'ReviewPerLanguageStats',
- ];
+
+ /** @var \MediaWiki\Extension\Translate\Statistics\TranslationStatsDataProvider */
+ private $dataProvider;
+
+ private const GRAPH_CONTAINER_ID = 'translationStatsGraphContainer';
+
+ private const GRAPH_CONTAINER_CLASS = 'mw-translate-translationstats-container';
public function __construct() {
parent::__construct( 'TranslationStats' );
+ $this->dataProvider = Services::getInstance()->getTranslationStatsDataProvider();
}
public function isIncludable() {
@@ -42,102 +43,27 @@ class SpecialTranslationStats extends SpecialPage {
return 'translation';
}
- /**
- * @since 2012-03-05
- * @return array List of graph types
- */
- public function getGraphTypes() {
- return array_keys( self::$graphs );
- }
-
- /**
- * @since 2012-03-05
- * @param string $type
- * @return string
- */
- public function getGraphClass( $type ) {
- return self::$graphs[$type];
- }
-
public function execute( $par ) {
- $this->getOutput()->addModules( 'ext.translate.special.translationstats' );
-
- $opts = new FormOptions();
- $opts->add( 'graphit', false );
- $opts->add( 'preview', false );
- $opts->add( 'language', '' );
- $opts->add( 'count', 'edits' );
- $opts->add( 'scale', 'days' );
- $opts->add( 'days', 30 );
- $opts->add( 'width', 600 );
- $opts->add( 'height', 400 );
- $opts->add( 'group', '' );
- $opts->add( 'uselang', '' );
- $opts->add( 'start', '' );
- $opts->add( 'imagescale', 1.0 );
- $opts->fetchValuesFromRequest( $this->getRequest() );
+ $graphOpts = new TranslationStatsGraphOptions();
+ $graphOpts->bindArray( $this->getRequest()->getValues() );
$pars = explode( ';', $par );
-
foreach ( $pars as $item ) {
if ( strpos( $item, '=' ) === false ) {
continue;
}
list( $key, $value ) = array_map( 'trim', explode( '=', $item, 2 ) );
- if ( isset( $opts[$key] ) ) {
- $opts[$key] = $value;
+ if ( $graphOpts->hasValue( $key ) ) {
+ $graphOpts->setValue( $key, $value );
}
}
- $opts->validateIntBounds( 'days', 1, 10000 );
- $opts->validateIntBounds( 'width', 200, 1000 );
- $opts->validateIntBounds( 'height', 200, 1000 );
- $opts->validateBounds( 'imagescale', 1.0, 4.0 );
-
- if ( $opts['start'] !== '' ) {
- $opts['start'] = rtrim( wfTimestamp( TS_ISO_8601, $opts['start'] ), 'Z' );
- }
-
- $validScales = [ 'months', 'weeks', 'days', 'hours' ];
- if ( !in_array( $opts['scale'], $validScales ) ) {
- $opts['scale'] = 'days';
- }
-
- if ( $opts['scale'] === 'hours' ) {
- $opts->validateIntBounds( 'days', 1, 4 );
- }
-
- $validCounts = $this->getGraphTypes();
- if ( !in_array( $opts['count'], $validCounts ) ) {
- $opts['count'] = 'edits';
- }
-
- foreach ( [ 'group', 'language' ] as $t ) {
- $values = array_map( 'trim', explode( ',', $opts[$t] ) );
- $values = array_splice( $values, 0, 4 );
- if ( $t === 'group' ) {
- // BC for old syntax which replaced _ to | which was not allowed
- $values = preg_replace( '~^page_~', 'page-', $values );
- }
- $opts[$t] = implode( ',', $values );
- }
+ $graphOpts->normalize( $this->dataProvider->getGraphTypes() );
+ $opts = $graphOpts->getFormOptions();
if ( $this->including() ) {
- $this->getOutput()->addHTML( $this->image( $opts ) );
- } elseif ( $opts['graphit'] ) {
- if ( !class_exists( PHPlot::class ) ) {
- header( 'HTTP/1.0 500 Multi fail' );
- echo 'PHPlot not found';
- }
-
- if ( !$this->getRequest()->getBool( 'debug' ) ) {
- $this->getOutput()->disable();
- header( 'Content-Type: image/png' );
- header( 'Cache-Control: private, max-age=3600' );
- header( 'Expires: ' . wfTimestamp( TS_RFC2822, time() + 3600 ) );
- }
- $this->draw( $opts );
+ $this->getOutput()->addHTML( $this->embed( $opts ) );
} else {
$this->form( $opts );
}
@@ -150,22 +76,19 @@ class SpecialTranslationStats extends SpecialPage {
*/
protected function form( FormOptions $opts ) {
global $wgScript;
-
$this->setHeaders();
$out = $this->getOutput();
+ $out->addModules( 'ext.translate.special.translationstats' );
$out->addHelpLink( 'Help:Extension:Translate/Statistics_and_reporting' );
$out->addWikiMsg( 'translate-statsf-intro' );
-
$out->addHTML(
Xml::fieldset( $this->msg( 'translate-statsf-options' )->text() ) .
- Html::openElement( 'form', [ 'action' => $wgScript ] ) .
+ Html::openElement( 'form', [ 'action' => $wgScript, 'id' => 'translationStatsConfig' ] ) .
Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
Html::hidden( 'preview', 1 ) .
'<table>'
);
-
$submit = Xml::submitButton( $this->msg( 'translate-statsf-submit' )->text() );
-
$out->addHTML(
$this->eInput( 'width', $opts ) .
$this->eInput( 'height', $opts ) .
@@ -173,55 +96,63 @@ class SpecialTranslationStats extends SpecialPage {
$this->eInput( 'start', $opts, 24 ) .
$this->eInput( 'days', $opts ) .
$this->eRadio( 'scale', $opts, [ 'months', 'weeks', 'days', 'hours' ] ) .
- $this->eRadio( 'count', $opts, $this->getGraphTypes() ) .
+ $this->eRadio( 'count', $opts, $this->dataProvider->getGraphTypes() ) .
'<tr><td colspan="2"><hr /></td></tr>' .
$this->eLanguage( 'language', $opts ) .
$this->eGroup( 'group', $opts ) .
'<tr><td colspan="2"><hr /></td></tr>' .
'<tr><td colspan="2">' . $submit . '</td></tr>'
);
-
$out->addHTML(
'</table>' .
'</form>' .
'</fieldset>'
);
-
if ( !$opts['preview'] ) {
return;
}
-
$spiParams = '';
foreach ( $opts->getChangedValues() as $key => $v ) {
if ( $key === 'preview' ) {
continue;
}
-
if ( $spiParams !== '' ) {
$spiParams .= ';';
}
+ if ( is_array( $v ) ) {
+ $v = implode( ',', $v );
+ if ( !strlen( $v ) ) {
+ continue;
+ }
+ }
$spiParams .= wfEscapeWikiText( "$key=$v" );
}
-
if ( $spiParams !== '' ) {
$spiParams = '/' . $spiParams;
}
-
$titleText = $this->getPageTitle()->getPrefixedText();
-
$out->addHTML(
- Html::element( 'hr' ) .
- Html::element( 'pre', [], "{{{$titleText}{$spiParams}}}" )
+ Html::element( 'hr' )
+ );
+ // Element to render the graph
+ $out->addHTML(
+ Html::rawElement(
+ 'div',
+ [
+ 'id' => self::GRAPH_CONTAINER_ID ,
+ 'style' => 'margin: 2em auto; display: block',
+ 'class' => self::GRAPH_CONTAINER_CLASS
+ ]
+ )
);
$out->addHTML(
- Html::element( 'hr' ) .
- Html::rawElement(
- 'div',
- [ 'style' => 'margin: 1em auto; text-align: center;' ],
- $this->image( $opts )
- )
+ Html::element(
+ 'pre',
+ [ 'aria-label' => $this->msg( 'translate-statsf-embed' )->text() ],
+ "{{{$titleText}{$spiParams}}}"
+ )
);
}
@@ -234,7 +165,6 @@ class SpecialTranslationStats extends SpecialPage {
*/
protected function eInput( $name, FormOptions $opts, $width = 4 ) {
$value = $opts[$name];
-
return '<tr><td>' . $this->eLabel( $name ) . '</td><td>' .
Xml::input( $name, $width, $value, [ 'id' => $name ] ) .
'</td></tr>' . "\n";
@@ -252,7 +182,6 @@ class SpecialTranslationStats extends SpecialPage {
// translate-statsf-language, translate-statsf-group
$label = 'translate-statsf-' . $name;
$label = $this->msg( $label )->escaped();
-
return Xml::tags( 'label', [ 'for' => $name ], $label );
}
@@ -269,7 +198,6 @@ class SpecialTranslationStats extends SpecialPage {
$label = 'translate-statsf-' . $name;
$label = $this->msg( $label )->escaped();
$s = '<tr><td>' . $label . '</td><td>';
-
$options = [];
foreach ( $alts as $alt ) {
$id = "$name-$alt";
@@ -277,10 +205,8 @@ class SpecialTranslationStats extends SpecialPage {
[ 'id' => $id ] ) . ' ';
$options[] = $radio . ' ' . $this->eLabel( $id );
}
-
$s .= implode( ' ', $options );
$s .= '</td></tr>' . "\n";
-
return $s;
}
@@ -291,11 +217,10 @@ class SpecialTranslationStats extends SpecialPage {
* @return string Html.
*/
protected function eLanguage( $name, FormOptions $opts ) {
- $value = $opts[$name];
+ $value = implode( ',', $opts[$name] );
$select = $this->languageSelector();
$select->setTargetId( 'language' );
-
return '<tr><td>' . $this->eLabel( $name ) . '</td><td>' .
$select->getHtmlAndPrepareJS() . '<br />' .
Xml::input( $name, 20, $value, [ 'id' => $name ] ) .
@@ -308,16 +233,12 @@ class SpecialTranslationStats extends SpecialPage {
*/
protected function languageSelector() {
$languages = TranslateUtils::getLanguageNames( $this->getLanguage()->getCode() );
-
ksort( $languages );
-
$selector = new XmlSelect( 'mw-language-selector', 'mw-language-selector' );
foreach ( $languages as $code => $name ) {
$selector->addOption( "$code - $name", $code );
}
-
$jsSelect = new JsSelectToInput( $selector );
-
return $jsSelect;
}
@@ -328,11 +249,10 @@ class SpecialTranslationStats extends SpecialPage {
* @return string Html.
*/
protected function eGroup( $name, FormOptions $opts ) {
- $value = $opts[$name];
+ $value = implode( ',', $opts[$name] );
$select = $this->groupSelector();
$select->setTargetId( 'group' );
-
return '<tr><td>' . $this->eLabel( $name ) . '</td><td>' .
$select->getHtmlAndPrepareJS() . '<br />' .
Xml::input( $name, 20, $value, [ 'id' => $name ] ) .
@@ -345,801 +265,34 @@ class SpecialTranslationStats extends SpecialPage {
*/
protected function groupSelector() {
$groups = MessageGroups::singleton()->getGroups();
- /**
- * @var MessageGroup $group
- */
+ /** @var MessageGroup $group */
foreach ( $groups as $key => $group ) {
if ( !$group->exists() ) {
unset( $groups[$key] );
continue;
}
}
-
ksort( $groups );
-
$selector = new XmlSelect( 'mw-group-selector', 'mw-group-selector' );
- /**
- * @var MessageGroup $name
- */
+ /** @var MessageGroup $name */
foreach ( $groups as $code => $name ) {
$selector->addOption( $name->getLabel(), $code );
}
-
$jsSelect = new JsSelectToInput( $selector );
-
return $jsSelect;
}
- /**
- * Returns an \<img> tag for graph.
- * @param FormOptions $opts
- * @return string Html.
- */
- protected function image( FormOptions $opts ) {
- $title = $this->getPageTitle();
-
- $params = $opts->getChangedValues();
- $params[ 'graphit' ] = true;
- $src = $title->getLocalURL( $params );
-
- $srcsets = [];
- foreach ( [ 1.5, 2, 3 ] as $scale ) {
- $params[ 'imagescale' ] = $scale;
- $srcsets[] = "{$title->getLocalURL( $params )} {$scale}x";
- }
-
- return Xml::element( 'img',
+ protected function embed( FormOptions $opts ) {
+ $this->getOutput()->addModules( 'ext.translate.translationstats.embedded' );
+ return Html::rawElement(
+ 'div',
[
- 'src' => $src,
- 'srcset' => implode( ', ', $srcsets ),
- 'width' => $opts['width'],
- 'height' => $opts['height'],
- ]
+ 'class' => self::GRAPH_CONTAINER_CLASS
+ ],
+ Html::hidden(
+ 'translationStatsGraphOptions',
+ json_encode( $opts->getAllValues() )
+ )
);
}
-
- /**
- * Fetches and preprocesses graph data that can be fed to graph drawer.
- * @param FormOptions $opts
- * @return array ( string => array ) Data indexed by their date labels.
- */
- protected function getData( FormOptions $opts ) {
- $dbr = wfGetDB( DB_REPLICA );
-
- $class = $this->getGraphClass( $opts['count'] );
- $so = new $class( $opts );
-
- $fixedStart = $opts->getValue( 'start' ) !== '';
-
- $now = time();
- $period = 3600 * 24 * $opts->getValue( 'days' );
-
- if ( $fixedStart ) {
- $cutoff = wfTimestamp( TS_UNIX, $opts->getValue( 'start' ) );
- } else {
- $cutoff = $now - $period;
- }
- $cutoff = self::roundTimestampToCutoff( $opts['scale'], $cutoff, 'earlier' );
-
- $start = $cutoff;
-
- if ( $fixedStart ) {
- $end = self::roundTimestampToCutoff( $opts['scale'], $start + $period, 'later' ) - 1;
- } else {
- $end = null;
- }
-
- $tables = [];
- $fields = [];
- $conds = [];
- $type = __METHOD__;
- $options = [];
- $joins = [];
-
- $so->preQuery( $tables, $fields, $conds, $type, $options, $joins, $start, $end );
- $res = $dbr->select( $tables, $fields, $conds, $type, $options, $joins );
- wfDebug( __METHOD__ . "-queryend\n" );
-
- // Start processing the data
- $dateFormat = $so->getDateFormat();
- $increment = self::getIncrement( $opts['scale'] );
-
- $labels = $so->labels();
- $keys = array_keys( $labels );
- $values = array_pad( [], count( $labels ), 0 );
- $defaults = array_combine( $keys, $values );
-
- $data = [];
- // Allow 10 seconds in the future for processing time
- $lastValue = $end ?? $now + 10;
- $lang = $this->getLanguage();
- while ( $cutoff <= $lastValue ) {
- $date = $lang->sprintfDate( $dateFormat, wfTimestamp( TS_MW, $cutoff ) );
- $cutoff += $increment;
- $data[$date] = $defaults;
- }
-
- // Processing
- $labelToIndex = array_flip( $labels );
-
- foreach ( $res as $row ) {
- $indexLabels = $so->indexOf( $row );
- if ( $indexLabels === false ) {
- continue;
- }
-
- foreach ( (array)$indexLabels as $i ) {
- if ( !isset( $labelToIndex[$i] ) ) {
- continue;
- }
- $date = $lang->sprintfDate( $dateFormat, $so->getTimestamp( $row ) );
- // Ignore values outside range
- if ( !isset( $data[$date] ) ) {
- continue;
- }
-
- $data[$date][$labelToIndex[$i]]++;
- }
- }
-
- // Don't display dummy label
- if ( count( $labels ) === 1 && $labels[0] === 'all' ) {
- $labels = [];
- }
-
- foreach ( $labels as &$label ) {
- if ( strpos( $label, '@' ) === false ) {
- continue;
- }
- list( $groupId, $code ) = explode( '@', $label, 2 );
- if ( $code && $groupId ) {
- $code = TranslateUtils::getLanguageName( $code, $lang->getCode() ) . " ($code)";
- $group = MessageGroups::getGroup( $groupId );
- $group = $group ? $group->getLabel() : $groupId;
- $label = "$group @ $code";
- } elseif ( $code ) {
- $label = TranslateUtils::getLanguageName( $code, $lang->getCode() ) . " ($code)";
- } elseif ( $groupId ) {
- $group = MessageGroups::getGroup( $groupId );
- $label = $group ? $group->getLabel() : $groupId;
- }
- }
-
- if ( $end === null ) {
- $last = array_splice( $data, -1, 1 );
- // Indicator that the last value is not full
- $data[key( $last ) . '*'] = current( $last );
- }
-
- return [ $labels, $data ];
- }
-
- /**
- * Gets the closest earlieast timestamp that corresponds to start of a
- * period in given scale, like, midnight, monday or first day of the month.
- * @param string $scale One of hours, days, weeks, months
- * @param int $cutoff Timestamp in unix format.
- * @param string $direction One of earlier, later
- * @return int
- */
- protected static function roundTimestampToCutoff( $scale, $cutoff, $direction = 'earlier' ) {
- $dir = $direction === 'earlier' ? -1 : 1;
-
- /* Ensure that the first item in the graph has full data even
- * if it doesn't align with the given 'days' boundary */
- if ( $scale === 'hours' ) {
- $cutoff += self::roundingAddition( $cutoff, 3600, $dir );
- } elseif ( $scale === 'days' ) {
- $cutoff += self::roundingAddition( $cutoff, 86400, $dir );
- } elseif ( $scale === 'weeks' ) {
- /* Here we assume that week starts on monday, which does not
- * always hold true. Go Xwards day by day until we are on monday */
- while ( date( 'D', $cutoff ) !== 'Mon' ) {
- $cutoff += $dir * 86400;
- }
- // Round to nearest day
- $cutoff -= ( $cutoff % 86400 );
- } elseif ( $scale === 'months' ) {
- // Go Xwards/ day by day until we are on the first day of the month
- while ( date( 'j', $cutoff ) !== '1' ) {
- $cutoff += $dir * 86400;
- }
- // Round to nearest day
- $cutoff -= ( $cutoff % 86400 );
- }
-
- return $cutoff;
- }
-
- /**
- * @param int $ts
- * @param int $amount
- * @param int $dir
- * @return int
- */
- protected static function roundingAddition( $ts, $amount, $dir ) {
- if ( $dir === -1 ) {
- return -1 * ( $ts % $amount );
- } else {
- return $amount - ( $ts % $amount );
- }
- }
-
- /**
- * Adds raw image data of the graph to the output.
- * @param FormOptions $opts
- */
- public function draw( FormOptions $opts ) {
- global $wgTranslatePHPlotFont;
-
- $imageScale = $opts->getValue( 'imagescale' );
- $width = $opts->getValue( 'width' );
- $height = $opts->getValue( 'height' );
- // Define the object
- $plot = new PHPlot( $width * $imageScale, $height * $imageScale );
-
- list( $legend, $resData ) = $this->getData( $opts );
- $count = count( $resData );
- $skip = (int)( $count / ( $width / 60 ) - 1 );
- $i = $count;
- $data = [];
-
- foreach ( $resData as $date => $edits ) {
- if ( $skip > 0 &&
- ( $count - $i ) % $skip !== 0
- ) {
- $date = '';
- }
-
- if ( strpos( $date, ';' ) !== false ) {
- list( , $date ) = explode( ';', $date, 2 );
- }
-
- array_unshift( $edits, $date );
- $data[] = $edits;
- $i--;
- }
-
- $font = FCFontFinder::findFile( $this->getLanguage()->getCode() );
- if ( !$font ) {
- $font = $wgTranslatePHPlotFont;
- }
- $numberFont = FCFontFinder::findFile( 'en' );
- $plot->SetDefaultTTFont( $font );
- $plot->SetFontTTF( 'generic', $font, 12 * $imageScale );
- $plot->SetFontTTF( 'legend', $font, 12 * $imageScale );
- $plot->SetFontTTF( 'x_title', $font, 10 * $imageScale );
- $plot->SetFontTTF( 'y_title', $font, 10 * $imageScale );
- $plot->SetFontTTF( 'x_label', $numberFont, 8 * $imageScale );
- $plot->SetFontTTF( 'y_label', $numberFont, 8 * $imageScale );
-
- $plot->SetDataValues( $data );
-
- if ( $legend !== null ) {
- $plot->SetLegend( $legend );
- }
-
- // Give grep a chance to find the usages:
- // translate-stats-edits, translate-stats-users, translate-stats-registrations,
- // translate-stats-reviews, translate-stats-reviewers
- $yTitle = $this->msg( 'translate-stats-' . $opts['count'] )->escaped();
-
- // Turn off X axis ticks and labels because they get in the way:
- $plot->SetYTitle( $yTitle );
- $plot->SetXTickLabelPos( 'none' );
- $plot->SetXTickPos( 'none' );
- $plot->SetXLabelAngle( 45 );
-
- $max = max( array_map( 'max', $resData ) );
- $max = self::roundToSignificant( $max, 1 );
- $max = round( $max, (int)( -log( $max, 10 ) ) );
-
- $yTick = 10;
- while ( $max / $yTick > $height / 20 ) {
- $yTick *= 2;
- }
-
- // If we have very small case, ensure that there is at least one tick
- $yTick = min( $max, $yTick );
- $yTick = self::roundToSignificant( $yTick );
- $plot->SetYTickIncrement( $yTick );
- $plot->SetPlotAreaWorld( null, 0, null, max( $max, 10 ) );
-
- $plot->SetTransparentColor( 'white' );
- $plot->SetBackgroundColor( 'white' );
-
- // Draw it
- $plot->DrawGraph();
- }
-
- /**
- * Enhanced version of round that supports rounding up to a given scale
- * relative to the number itself. Examples:
- * - roundToSignificant( 1234, 0 ) = 10000
- * - roundToSignificant( 1234, 1 ) = 2000
- * - roundToSignificant( 1234, 2 ) = 1300
- * - roundToSignificant( 1234, 3 ) = 1240
- *
- * @param int $number Number to round.
- * @param int $significant How many signficant numbers to keep.
- * @return int Rounded number.
- */
- public static function roundToSignificant( $number, $significant = 1 ) {
- $log = (int)log( $number, 10 );
- $nonSignificant = max( 0, $log - $significant + 1 );
- $factor = pow( 10, $nonSignificant );
-
- return (int)( ceil( $number / $factor ) * $factor );
- }
-
- /**
- * Returns an increment in seconds for a given scale.
- * The increment must be small enough that we will hit every item in the
- * scale when using different multiples of the increment. It should be
- * large enough to avoid hitting the same item multiple times.
- * @param string $scale Either months, weeks, days or hours.
- * @return int Number of seconds in the increment.
- */
- public static function getIncrement( $scale ) {
- $increment = 3600 * 24;
- if ( $scale === 'months' ) {
- /* We use increment to fill up the values. Use number small enough
- * to ensure we hit each month */
- $increment = 3600 * 24 * 15;
- } elseif ( $scale === 'weeks' ) {
- $increment = 3600 * 24 * 7;
- } elseif ( $scale === 'hours' ) {
- $increment = 3600;
- }
-
- return $increment;
- }
-}
-
-/**
- * Interface for producing different kinds of graphs.
- * The graphs are based on data queried from the database.
- * @ingroup Stats
- */
-interface TranslationStatsInterface {
- /**
- * Constructor. The implementation can access the graph options, but not
- * define new ones.
- * @param FormOptions $opts
- */
- public function __construct( FormOptions $opts );
-
- /**
- * Query details that the graph must fill.
- * @param array &$tables Empty list. Append table names.
- * @param array &$fields Empty list. Append field names.
- * @param array &$conds Empty array. Append select conditions.
- * @param string &$type Append graph type (used to identify queries).
- * @param array &$options Empty array. Append extra query options.
- * @param array &$joins Empty array. Append extra join conditions.
- * @param string $start Precalculated start cutoff timestamp
- * @param string $end Precalculated end cutoff timestamp
- */
- public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end );
-
- /**
- * Return the indexes which this result contributes to.
- * Return 'all' if only one variable is measured. Return false if none.
- * @param stdClass $row Database Result Row
- * @return array|false
- */
- public function indexOf( $row );
-
- /**
- * Return the names of the variables being measured.
- * Return 'all' if only one variable is measured. Must match indexes
- * returned by indexOf() and contain them all.
- * @return string[]
- */
- public function labels();
-
- /**
- * Return the timestamp associated with this result row.
- * @param stdClass $row Database Result Row
- * @return string Timestamp.
- */
- public function getTimestamp( $row );
-
- /**
- * Return time formatting string.
- * @see Language::sprintfDate()
- * @return string
- */
- public function getDateFormat();
-}
-
-/**
- * Provides some hand default implementations for TranslationStatsInterface.
- * @ingroup Stats
- */
-abstract class TranslationStatsBase implements TranslationStatsInterface {
- /**
- * @var FormOptions Graph options.
- */
- protected $opts;
-
- public function __construct( FormOptions $opts ) {
- $this->opts = $opts;
- }
-
- public function indexOf( $row ) {
- return [ 'all' ];
- }
-
- public function labels() {
- return [ 'all' ];
- }
-
- public function getDateFormat() {
- $dateFormat = 'Y-m-d';
- if ( $this->opts['scale'] === 'months' ) {
- $dateFormat = 'Y-m';
- } elseif ( $this->opts['scale'] === 'weeks' ) {
- $dateFormat = 'Y-\WW';
- } elseif ( $this->opts['scale'] === 'hours' ) {
- $dateFormat .= ';H';
- }
-
- return $dateFormat;
- }
-
- protected static function makeTimeCondition( $field, $start, $end ) {
- $db = wfGetDB( DB_REPLICA );
-
- $conds = [];
- if ( $start !== null ) {
- $conds[] = "$field >= '{$db->timestamp( $start )}'";
- }
- if ( $end !== null ) {
- $conds[] = "$field <= '{$db->timestamp( $end )}'";
- }
-
- return $conds;
- }
-
- /**
- * @since 2012-03-05
- * @param array $groupIds
- * @return array
- */
- protected static function namespacesFromGroups( $groupIds ) {
- $namespaces = [];
- foreach ( $groupIds as $id ) {
- $group = MessageGroups::getGroup( $id );
- if ( $group ) {
- $namespace = $group->getNamespace();
- $namespaces[$namespace] = true;
- }
- }
-
- return array_keys( $namespaces );
- }
-}
-
-/**
- * Graph which provides statistics on active users and number of translations.
- * @ingroup Stats
- */
-class TranslatePerLanguageStats extends TranslationStatsBase {
- /** @var int[][] array( string => int ) Cache used to count active users only once per day. */
- protected $usercache;
-
- protected $codes, $groups;
-
- public function __construct( FormOptions $opts ) {
- parent::__construct( $opts );
- // This query is slow... ensure a lower limit.
- $opts->validateIntBounds( 'days', 1, 200 );
- }
-
- public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
- global $wgTranslateMessageNamespaces;
-
- $db = wfGetDB( DB_REPLICA );
-
- $tables = [ 'recentchanges' ];
- $fields = [ 'rc_timestamp' ];
- $joins = [];
-
- $conds = [
- 'rc_namespace' => $wgTranslateMessageNamespaces,
- 'rc_bot' => 0,
- 'rc_type != ' . RC_LOG,
- ];
-
- $timeConds = self::makeTimeCondition( 'rc_timestamp', $start, $end );
- $conds = array_merge( $conds, $timeConds );
-
- $options = [ 'ORDER BY' => 'rc_timestamp' ];
-
- $this->groups = array_filter( array_map( 'trim', explode( ',', $this->opts['group'] ) ) );
- $this->groups = array_map( 'MessageGroups::normalizeId', $this->groups );
- $this->codes = array_filter( array_map( 'trim', explode( ',', $this->opts['language'] ) ) );
-
- $namespaces = self::namespacesFromGroups( $this->groups );
- if ( count( $namespaces ) ) {
- $conds['rc_namespace'] = $namespaces;
- }
-
- $languages = [];
- foreach ( $this->codes as $code ) {
- $languages[] = 'rc_title ' . $db->buildLike( $db->anyString(), "/$code" );
- }
- if ( count( $languages ) ) {
- $conds[] = $db->makeList( $languages, LIST_OR );
- }
-
- $fields[] = 'rc_title';
-
- if ( $this->groups ) {
- $fields[] = 'rc_namespace';
- }
-
- if ( $this->opts['count'] === 'users' ) {
- if ( class_exists( ActorMigration::class ) ) {
- $actorQuery = ActorMigration::newMigration()->getJoin( 'rc_user' );
- $tables += $actorQuery['tables'];
- $fields['rc_user_text'] = $actorQuery['fields']['rc_user_text'];
- $joins += $actorQuery['joins'];
- } else {
- $fields[] = 'rc_user_text';
- }
- }
-
- $type .= '-perlang';
- }
-
- public function indexOf( $row ) {
- // We need to check that there is only one user per day.
- if ( $this->opts['count'] === 'users' ) {
- $date = $this->formatTimestamp( $row->rc_timestamp );
-
- if ( isset( $this->usercache[$date][$row->rc_user_text] ) ) {
- return false;
- } else {
- $this->usercache[$date][$row->rc_user_text] = 1;
- }
- }
-
- // Do not consider language-less pages.
- if ( strpos( $row->rc_title, '/' ) === false ) {
- return false;
- }
-
- // No filters, just one key to track.
- if ( !$this->groups && !$this->codes ) {
- return [ 'all' ];
- }
-
- // The key-building needs to be in sync with ::labels().
- list( $key, $code ) = TranslateUtils::figureMessage( $row->rc_title );
-
- $groups = [];
- $codes = [];
-
- if ( $this->groups ) {
- /*
- * Get list of keys that the message belongs to, and filter
- * out those which are not requested.
- */
- $groups = TranslateUtils::messageKeyToGroups( $row->rc_namespace, $key );
- $groups = array_intersect( $this->groups, $groups );
- }
-
- if ( $this->codes ) {
- $codes = [ $code ];
- }
-
- return $this->combineTwoArrays( $groups, $codes );
- }
-
- public function labels() {
- return $this->combineTwoArrays( $this->groups, $this->codes );
- }
-
- public function getTimestamp( $row ) {
- return $row->rc_timestamp;
- }
-
- /**
- * Makes a label for variable. If group or language code filters, or both
- * are used, combine those in a pretty way.
- * @param string $group Group name.
- * @param string $code Language code.
- * @return string Label.
- */
- protected function makeLabel( $group, $code ) {
- if ( $group || $code ) {
- return "$group@$code";
- } else {
- return 'all';
- }
- }
-
- /**
- * Cross-product of two lists with string results, where either
- * list can be empty.
- * @param string[] $groups Group names.
- * @param string[] $codes Language codes.
- * @return string[] Labels.
- */
- protected function combineTwoArrays( $groups, $codes ) {
- if ( !count( $groups ) ) {
- $groups[] = false;
- }
-
- if ( !count( $codes ) ) {
- $codes[] = false;
- }
-
- $items = [];
- foreach ( $groups as $group ) {
- foreach ( $codes as $code ) {
- $items[] = $this->makeLabel( $group, $code );
- }
- }
-
- return $items;
- }
-
- /**
- * Returns unique index for given item in the scale being used.
- * Called a lot, so performance intensive.
- * @param string $timestamp Timestamp in mediawiki format.
- * @return string
- */
- protected function formatTimestamp( $timestamp ) {
- switch ( $this->opts['scale'] ) {
- case 'hours' :
- $cut = 4;
- break;
- case 'days' :
- $cut = 6;
- break;
- case 'months':
- $cut = 8;
- break;
- default :
- return MediaWikiServices::getInstance()->getContentLanguage()
- ->sprintfDate( $this->getDateFormat(), $timestamp );
- }
-
- return substr( $timestamp, 0, -$cut );
- }
-}
-
-/**
- * Graph which provides statistics about amount of registered users in a given time.
- * @ingroup Stats
- */
-class TranslateRegistrationStats extends TranslationStatsBase {
- public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
- $tables = 'user';
- $fields = 'user_registration';
- $conds = self::makeTimeCondition( 'user_registration', $start, $end );
- $type .= '-registration';
- $options = [];
- $joins = [];
- }
-
- public function getTimestamp( $row ) {
- return $row->user_registration;
- }
-}
-
-/**
- * Graph which provides statistics on number of reviews and reviewers.
- * @since 2012-03-05
- * @ingroup Stats
- */
-class ReviewPerLanguageStats extends TranslatePerLanguageStats {
- public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
- global $wgTranslateMessageNamespaces;
-
- $db = wfGetDB( DB_REPLICA );
-
- $tables = [ 'logging' ];
- $fields = [ 'log_timestamp' ];
- $joins = [];
-
- $conds = [
- 'log_namespace' => $wgTranslateMessageNamespaces,
- 'log_action' => 'message',
- ];
-
- $timeConds = self::makeTimeCondition( 'log_timestamp', $start, $end );
- $conds = array_merge( $conds, $timeConds );
-
- $options = [ 'ORDER BY' => 'log_timestamp' ];
-
- $this->groups = array_filter( array_map( 'trim', explode( ',', $this->opts['group'] ) ) );
- $this->codes = array_filter( array_map( 'trim', explode( ',', $this->opts['language'] ) ) );
-
- $namespaces = self::namespacesFromGroups( $this->groups );
- if ( count( $namespaces ) ) {
- $conds['log_namespace'] = $namespaces;
- }
-
- $languages = [];
- foreach ( $this->codes as $code ) {
- $languages[] = 'log_title ' . $db->buildLike( $db->anyString(), "/$code" );
- }
- if ( count( $languages ) ) {
- $conds[] = $db->makeList( $languages, LIST_OR );
- }
-
- $fields[] = 'log_title';
-
- if ( $this->groups ) {
- $fields[] = 'log_namespace';
- }
-
- if ( $this->opts['count'] === 'reviewers' ) {
- if ( class_exists( ActorMigration::class ) ) {
- $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
- $tables += $actorQuery['tables'];
- $fields['log_user_text'] = $actorQuery['fields']['log_user_text'];
- $joins += $actorQuery['joins'];
- } else {
- $fields[] = 'log_user_text';
- }
- }
-
- $type .= '-reviews';
- }
-
- public function indexOf( $row ) {
- // We need to check that there is only one user per day.
- if ( $this->opts['count'] === 'reviewers' ) {
- $date = $this->formatTimestamp( $row->log_timestamp );
-
- if ( isset( $this->usercache[$date][$row->log_user_text] ) ) {
- return false;
- } else {
- $this->usercache[$date][$row->log_user_text] = 1;
- }
- }
-
- // Do not consider language-less pages.
- if ( strpos( $row->log_title, '/' ) === false ) {
- return false;
- }
-
- // No filters, just one key to track.
- if ( !$this->groups && !$this->codes ) {
- return [ 'all' ];
- }
-
- // The key-building needs to be in sync with ::labels().
- list( $key, $code ) = TranslateUtils::figureMessage( $row->log_title );
-
- $groups = [];
- $codes = [];
-
- if ( $this->groups ) {
- /* Get list of keys that the message belongs to, and filter
- * out those which are not requested. */
- $groups = TranslateUtils::messageKeyToGroups( $row->log_namespace, $key );
- $groups = array_intersect( $this->groups, $groups );
- }
-
- if ( $this->codes ) {
- $codes = [ $code ];
- }
-
- return $this->combineTwoArrays( $groups, $codes );
- }
-
- public function labels() {
- return $this->combineTwoArrays( $this->groups, $this->codes );
- }
-
- public function getTimestamp( $row ) {
- return $row->log_timestamp;
- }
}
diff --git a/MLEB/Translate/specials/SpecialTranslations.php b/MLEB/Translate/specials/SpecialTranslations.php
index ec795627..ebdf1787 100644
--- a/MLEB/Translate/specials/SpecialTranslations.php
+++ b/MLEB/Translate/specials/SpecialTranslations.php
@@ -18,7 +18,8 @@ use MediaWiki\MediaWikiServices;
*/
class SpecialTranslations extends SpecialAllPages {
public function __construct() {
- parent::__construct( 'Translations' );
+ parent::__construct();
+ $this->mName = 'Translations';
}
protected function getGroupName() {
@@ -115,8 +116,7 @@ class SpecialTranslations extends SpecialAllPages {
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $this->getPageTitle() ); // Remove subpage
- $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $context );
- $htmlForm
+ HTMLForm::factory( 'ooui', $formDescriptor, $context )
->setMethod( 'get' )
->setSubmitTextMsg( 'allpagessubmit' )
->setWrapperLegendMsg( 'translate-translations-fieldset-title' )
@@ -197,7 +197,7 @@ class SpecialTranslations extends SpecialAllPages {
$pageInfo = TranslateUtils::getContents( $titles, $namespace );
$tableheader = Xml::openElement( 'table', [
- 'class' => 'mw-sp-translate-table sortable'
+ 'class' => 'mw-sp-translate-table sortable wikitable'
] );
$tableheader .= Xml::openElement( 'tr' );
@@ -239,10 +239,9 @@ class SpecialTranslations extends SpecialAllPages {
[ 'action' => 'history' ]
);
+ $class = '';
if ( MessageHandle::hasFuzzyString( $pageInfo[$key][0] ) || $tHandle->isFuzzy() ) {
- $class = 'orig';
- } else {
- $class = 'def';
+ $class = 'mw-sp-translate-fuzzy';
}
$languageAttributes = [];
diff --git a/MLEB/Translate/sql/translate_cache.sql b/MLEB/Translate/sql/translate_cache.sql
new file mode 100644
index 00000000..b62f2c86
--- /dev/null
+++ b/MLEB/Translate/sql/translate_cache.sql
@@ -0,0 +1,13 @@
+-- Tranlate extension cache
+CREATE TABLE /*_*/translate_cache (
+ -- Cache key
+ tc_key varchar(255) binary PRIMARY KEY NOT NULL,
+ -- Cache value
+ tc_value mediumblob NULL,
+ -- Key expiry time
+ tc_exptime binary(14) NULL,
+ -- Tag and group cache keys
+ tc_tag varchar(255) binary NULL
+) /*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/tc_tag ON /*_*/translate_cache (tc_tag);
diff --git a/MLEB/Translate/src/Cache/PersistentCache.php b/MLEB/Translate/src/Cache/PersistentCache.php
new file mode 100644
index 00000000..723c19db
--- /dev/null
+++ b/MLEB/Translate/src/Cache/PersistentCache.php
@@ -0,0 +1,31 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Cache;
+
+/** Defines what method should be provided by a class implementing a persistent cache */
+interface PersistentCache {
+ /** @return PersistentCacheEntry[] */
+ public function get( string ...$keynames ): array;
+
+ public function getWithLock( string $keyname ): ?PersistentCacheEntry;
+
+ public function has( string $keyname ): bool;
+
+ public function hasEntryWithTag( string $tag ): bool;
+
+ public function hasExpiredEntry( string $keyname ): bool;
+
+ /** @return PersistentCacheEntry[] */
+ public function getByTag( string $tag ): array;
+
+ public function set( PersistentCacheEntry ...$cacheEntry ): void;
+
+ public function delete( string ...$keyname ): void;
+
+ public function deleteEntriesWithTag( string $tag ): void;
+
+ public function clear(): void;
+}
+
+class_alias( PersistentCache::class, '\MediaWiki\Extensions\Translate\PersistentCache' );
diff --git a/MLEB/Translate/src/Cache/PersistentCacheEntry.php b/MLEB/Translate/src/Cache/PersistentCacheEntry.php
new file mode 100644
index 00000000..8cecf8f0
--- /dev/null
+++ b/MLEB/Translate/src/Cache/PersistentCacheEntry.php
@@ -0,0 +1,78 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Cache;
+
+use DateTime;
+use InvalidArgumentException;
+
+/**
+ * Represents a single result from the persistent cache
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+class PersistentCacheEntry {
+ private const MAX_KEY_LENGTH = 255;
+ private const MAX_TAG_LENGTH = 255;
+
+ /** @var string */
+ private $key;
+ /** @var mixed */
+ private $value;
+ /** @var int|null */
+ private $exptime;
+ /** @var string|null */
+ private $tag;
+
+ public function __construct(
+ string $key,
+ $value = null,
+ int $exptime = null,
+ string $tag = null
+ ) {
+ if ( strlen( $key ) > self::MAX_KEY_LENGTH ) {
+ throw new InvalidArgumentException(
+ "The length of key: $key is greater than allowed " . self::MAX_KEY_LENGTH
+ );
+ }
+
+ if ( $tag && strlen( $tag ) > self::MAX_TAG_LENGTH ) {
+ throw new InvalidArgumentException(
+ "The length of tag: $tag is greater than allowed " . self::MAX_TAG_LENGTH
+ );
+ }
+
+ $this->key = $key;
+ $this->value = $value;
+ $this->exptime = $exptime;
+ $this->tag = $tag;
+ }
+
+ public function key(): string {
+ return $this->key;
+ }
+
+ /** @return mixed */
+ public function value() {
+ return $this->value;
+ }
+
+ public function exptime(): ?int {
+ return $this->exptime;
+ }
+
+ public function tag(): ?string {
+ return $this->tag;
+ }
+
+ public function hasExpired(): bool {
+ if ( $this->exptime ) {
+ return $this->exptime < ( new DateTime() )->getTimestamp();
+ }
+
+ return false;
+ }
+}
+
+class_alias( PersistentCacheEntry::class, '\MediaWiki\Extensions\Translate\PersistentCacheEntry' );
diff --git a/MLEB/Translate/src/Cache/PersistentDatabaseCache.php b/MLEB/Translate/src/Cache/PersistentDatabaseCache.php
new file mode 100644
index 00000000..6585d89b
--- /dev/null
+++ b/MLEB/Translate/src/Cache/PersistentDatabaseCache.php
@@ -0,0 +1,186 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Cache;
+
+use ArrayIterator;
+use Iterator;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonCodec;
+use Wikimedia\Rdbms\ILoadBalancer;
+
+/**
+ * A persistent cache implementation using the database.
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+class PersistentDatabaseCache implements PersistentCache {
+ private const TABLE_NAME = 'translate_cache';
+
+ /** @var ILoadBalancer */
+ private $loadBalancer;
+ /** @var JsonCodec */
+ private $jsonCodec;
+
+ public function __construct( ILoadBalancer $loadBalancer, JsonCodec $jsonCodec ) {
+ $this->loadBalancer = $loadBalancer;
+ $this->jsonCodec = $jsonCodec;
+ }
+
+ /** @return PersistentCacheEntry[] */
+ public function get( string ...$keynames ): array {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+ $rows = $dbr->select(
+ self::TABLE_NAME,
+ [ 'tc_key', 'tc_value', 'tc_exptime', 'tc_tag' ],
+ [ 'tc_key ' => $keynames ],
+ __METHOD__
+ );
+
+ return $this->buildEntries( $rows );
+ }
+
+ public function getWithLock( string $keyname ): ?PersistentCacheEntry {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_MASTER );
+
+ $conds = [ 'tc_key' => $keyname ];
+
+ $rows = $dbr->select(
+ self::TABLE_NAME,
+ [ 'tc_key', 'tc_value', 'tc_exptime', 'tc_tag' ],
+ $conds,
+ __METHOD__,
+ [ 'FOR UPDATE' ]
+ );
+
+ $entries = $this->buildEntries( $rows );
+ return count( $entries ) ? $entries[0] : null;
+ }
+
+ /** @return PersistentCacheEntry[] */
+ public function getByTag( string $tag ): array {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+ $rows = $dbr->select(
+ self::TABLE_NAME,
+ [ 'tc_key', 'tc_value', 'tc_exptime', 'tc_tag' ],
+ [ 'tc_tag' => $tag ],
+ __METHOD__
+ );
+
+ return $this->buildEntries( $rows );
+ }
+
+ public function has( string $keyname ): bool {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+ $hasRow = $dbr->selectRow(
+ self::TABLE_NAME,
+ 'tc_key',
+ [ 'tc_key' => $keyname ],
+ __METHOD__
+ );
+
+ return (bool)$hasRow;
+ }
+
+ public function hasEntryWithTag( string $tag ): bool {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+ $hasRow = $dbr->selectRow(
+ self::TABLE_NAME,
+ 'tc_key',
+ [ 'tc_tag' => $tag ],
+ __METHOD__
+ );
+
+ return (bool)$hasRow;
+ }
+
+ public function hasExpiredEntry( string $keyname ): bool {
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
+ $row = $dbr->selectRow(
+ self::TABLE_NAME,
+ 'tc_expired',
+ [ 'tc_key' => $keyname ],
+ __METHOD__
+ );
+
+ if ( $row === false ) {
+ return false;
+ }
+
+ $rows = new ArrayIterator( [ $row ] );
+ $entry = $this->buildEntries( $rows )[0];
+ return $entry->hasExpired();
+ }
+
+ public function set( PersistentCacheEntry ...$entries ): void {
+ $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER );
+
+ foreach ( $entries as $entry ) {
+ $value = $this->jsonCodec->serialize( $entry->value() );
+ $rowsToInsert = [
+ 'tc_key' => $entry->key(),
+ 'tc_value' => $value,
+ 'tc_exptime' => $entry->exptime(),
+ 'tc_tag' => $entry->tag()
+ ];
+
+ $rowsToUpdate = [
+ 'tc_value' => $value,
+ 'tc_exptime' => $entry->exptime(),
+ 'tc_tag' => $entry->tag()
+ ];
+
+ $dbw->upsert(
+ self::TABLE_NAME,
+ $rowsToInsert,
+ 'tc_key',
+ $rowsToUpdate,
+ __METHOD__
+ );
+ }
+ }
+
+ public function delete( string ...$keynames ): void {
+ $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER );
+ $dbw->delete(
+ self::TABLE_NAME,
+ [ 'tc_key' => $keynames ],
+ __METHOD__
+ );
+ }
+
+ public function deleteEntriesWithTag( string $tag ): void {
+ $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER );
+ $dbw->delete(
+ self::TABLE_NAME,
+ [ 'tc_tag' => $tag ],
+ __METHOD__
+ );
+ }
+
+ public function clear(): void {
+ $dbw = $this->loadBalancer->getConnectionRef( DB_MASTER );
+ $dbw->delete(
+ self::TABLE_NAME,
+ '*',
+ __METHOD__
+ );
+ }
+
+ /** @return PersistentCacheEntry[] */
+ private function buildEntries( Iterator $rows ): array {
+ $entries = [];
+ foreach ( $rows as $row ) {
+ $entries[] = new PersistentCacheEntry(
+ $row->tc_key,
+ $this->jsonCodec->unserialize( $row->tc_value ),
+ $row->tc_exptime ? (int)$row->tc_exptime : null,
+ $row->tc_tag
+ );
+ }
+
+ return $entries;
+ }
+}
+
+class_alias( PersistentDatabaseCache::class, '\MediaWiki\Extensions\Translate\PersistentDatabaseCache' );
diff --git a/MLEB/Translate/src/Diagnostics/DeleteEqualTranslationsMaintenanceScript.php b/MLEB/Translate/src/Diagnostics/DeleteEqualTranslationsMaintenanceScript.php
new file mode 100644
index 00000000..771a86b6
--- /dev/null
+++ b/MLEB/Translate/src/Diagnostics/DeleteEqualTranslationsMaintenanceScript.php
@@ -0,0 +1,154 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Diagnostics;
+
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MessageCollection;
+use MessageGroups;
+use SplObjectStorage;
+use Title;
+use TitleValue;
+use TMessage;
+use WikiPage;
+use const SORT_NUMERIC;
+
+/**
+ * @since 2021.01
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class DeleteEqualTranslationsMaintenanceScript extends BaseMaintenanceScript {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Delete translations that are equal to the definition' );
+
+ $this->addOption(
+ 'group',
+ 'Which group to scan',
+ self::REQUIRED,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'language',
+ 'Which language to scan',
+ self::REQUIRED,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'really',
+ 'Delete the listed pages instead of just listing them'
+ );
+ $this->addOption(
+ 'comment',
+ 'Comment for the deletions'
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ /** @inheritDoc */
+ public function execute() {
+ $groupId = $this->getOption( 'group' );
+ $language = $this->getOption( 'language' );
+ $group = MessageGroups::getGroup( $groupId );
+ if ( !$group ) {
+ $this->fatalError( "Message group '$groupId' does not exist" );
+ }
+
+ $collection = $group->initCollection( $language );
+ $equalMessages = $this->getEqualMessages( $collection );
+ $equalMessageCount = count( $equalMessages );
+ if ( $equalMessageCount === 0 ) {
+ $this->output( "No translations equal to definition found\n" );
+ return true;
+ }
+
+ $stats = $this->getUserStats( $equalMessages );
+ $this->printUserStats( $stats, $equalMessageCount );
+ $this->output( "\n" );
+ $this->printMessages( $equalMessages );
+
+ if ( $this->hasOption( 'really' ) ) {
+ $comment = $this->getOption( 'comment' ) ?? '';
+ $this->deleteMessages( $equalMessages, $comment );
+ } else {
+ $this->output( "This is a dry-run. Run again with --really to delete these messages\n" );
+ }
+ }
+
+ private function getEqualMessages( MessageCollection $collection ): SplObjectStorage {
+ $collection->filter( 'translated', false );
+ $collection->loadTranslations();
+
+ $messages = new SplObjectStorage();
+ foreach ( $collection->keys() as $key => $titleValue ) {
+ /** @var TMessage $message */
+ $message = $collection[$key];
+
+ if ( $message->definition() === $message->translation() ) {
+ $messages->attach( $titleValue, $message );
+ }
+ }
+
+ return $messages;
+ }
+
+ private function getUserStats( SplObjectStorage $messages ): array {
+ $stats = [];
+ foreach ( $messages as $key ) {
+ /** @var TMessage $message */
+ $message = $messages[$key];
+ $index = $message->getProperty( 'last-translator-text' );
+ $stats[$index] = ( $stats[$index] ?? 0 ) + 1;
+ }
+
+ return $stats;
+ }
+
+ private function printUserStats( array $stats, int $equalMessageCount ): void {
+ $this->output( "Found $equalMessageCount message(s) created by these user(s):\n" );
+ arsort( $stats, SORT_NUMERIC );
+ foreach ( $stats as $userName => $count ) {
+ $this->output( sprintf( "%6d | %s\n", $count, $userName ) );
+ }
+ }
+
+ private function printMessages( SplObjectStorage $messages ): void {
+ /** @var TitleValue $key */
+ foreach ( $messages as $key ) {
+ /** @var TMessage $message */
+ $message = $messages[$key];
+ $title = Title::newFromLinkTarget( $key );
+ $this->output(
+ sprintf( "== %s ==\n%s\n\n", $title->getPrefixedText(), $message->translation() )
+ );
+ }
+ }
+
+ private function deleteMessages( SplObjectStorage $messages, string $reason ): void {
+ $user = FuzzyBot::getUser();
+
+ /** @var TitleValue $key */
+ foreach ( $messages as $key ) {
+ $title = Title::newFromLinkTarget( $key );
+ $page = WikiPage::factory( $title );
+ $status = $page->doDeleteArticleReal(
+ $reason,
+ $user
+ );
+ if ( $status->isOK() ) {
+ $this->output( ".", 'deletions' );
+ } else {
+ $pageName = $title->getPrefixedText();
+ $this->output( "FAILED to delete page $pageName\n" );
+ }
+ }
+ }
+}
+
+class_alias(
+ DeleteEqualTranslationsMaintenanceScript::class,
+ '\MediaWiki\Extensions\Translate\DeleteEqualTranslationsMaintenanceScript'
+);
diff --git a/MLEB/Translate/src/Diagnostics/FindUnsynchronizedDefinitionsMaintenanceScript.php b/MLEB/Translate/src/Diagnostics/FindUnsynchronizedDefinitionsMaintenanceScript.php
new file mode 100644
index 00000000..cc95475f
--- /dev/null
+++ b/MLEB/Translate/src/Diagnostics/FindUnsynchronizedDefinitionsMaintenanceScript.php
@@ -0,0 +1,116 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Diagnostics;
+
+use FileBasedMessageGroup;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MessageGroups;
+use Title;
+
+/**
+ * @since 2021.01
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class FindUnsynchronizedDefinitionsMaintenanceScript extends BaseMaintenanceScript {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription(
+ 'This scripts finds definition pages in the wiki that do not have the expected ' .
+ 'content with regards to the message group definition cache for file based message ' .
+ 'groups. This causes the definition diff to appear for translations when it should ' .
+ 'not. See https://phabricator.wikimedia.org/T270844'
+ );
+
+ $this->addArg(
+ 'group-pattern',
+ 'For example page-*,main',
+ self::REQUIRED
+ );
+ $this->addOption(
+ 'ignore-trailing-whitespace',
+ 'Ignore trailing whitespace',
+ self::OPTIONAL,
+ self::NO_ARG,
+ 'w'
+ );
+ $this->addOption(
+ 'fix',
+ 'Try to fix the issues by triggering reprocessing'
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ /** @inheritDoc */
+ public function execute() {
+ $spec = $this->getArg( 0 );
+ $ignoreTrailingWhitespace = $this->getOption( 'ignore-trailing-whitespace' );
+ $patterns = explode( ',', trim( $spec ) );
+ $groupIds = MessageGroups::expandWildcards( $patterns );
+ $groups = MessageGroups::getGroupsById( $groupIds );
+
+ foreach ( $groups as $index => $group ) {
+ if ( !$group instanceof FileBasedMessageGroup ) {
+ unset( $groups[ $index ] );
+ }
+ }
+
+ $matched = count( $groups );
+ $this->output( "Pattern matched $matched file based message group(s).\n" );
+ $this->output( "Left side is the expected value. Right side is the actual value in wiki.\n" );
+
+ $groupsWithIssues = [];
+ foreach ( $groups as $group ) {
+ $sourceLanguage = $group->getSourceLanguage();
+ $collection = $group->initCollection( $sourceLanguage );
+ $collection->loadTranslations();
+
+ foreach ( $collection->keys() as $mkey => $title ) {
+ $message = $collection[$mkey];
+ $definition = $message->definition() ?? '';
+ $translation = $message->translation() ?? '';
+
+ $differs = $ignoreTrailingWhitespace
+ ? rtrim( $definition ) !== $translation
+ : $definition !== $translation;
+
+ if ( $differs ) {
+ $groupsWithIssues[$group->getId()] = $group;
+ echo Title::newFromLinkTarget( $title )->getPrefixedText() . "\n";
+ echo $this->getSideBySide( "'$definition'", "'$translation'", 80 ) . "\n";
+ }
+ }
+ }
+
+ if ( $this->hasOption( 'fix' ) && $groupsWithIssues ) {
+ foreach ( $groupsWithIssues as $group ) {
+ '@phan-var FileBasedMessageGroup $group';
+ $cache = $group->getMessageGroupCache( $group->getSourceLanguage() );
+ $cache->invalidate();
+ }
+ $script = realpath( __DIR__ . '/../../scripts/processMessageChanges.php' );
+ $groupPattern = implode( ',', array_keys( $groupsWithIssues ) );
+ $command = "php '$script' --group='$groupPattern'";
+ echo "Now run the following command and finish the sync in the wiki:\n$command\n";
+ }
+ }
+
+ private function getSideBySide( string $a, string $b, int $width ): string {
+ $wrapWidth = (int)floor( ( $width - 3 ) / 2 );
+ $aArray = explode( "\n", wordwrap( $a, $wrapWidth, "\n", true ) );
+ $bArray = explode( "\n", wordwrap( $b, $wrapWidth, "\n", true ) );
+ $lines = max( count( $aArray ), count( $bArray ) );
+
+ $out = '';
+ for ( $i = 0; $i < $lines; $i++ ) {
+ $out .= sprintf(
+ "%-{$wrapWidth}s | %-{$wrapWidth}s\n",
+ $aArray[$i] ?? '',
+ $bArray[$i] ?? ''
+ );
+ }
+ return $out;
+ }
+}
diff --git a/MLEB/Translate/src/Jobs/GenericTranslateJob.php b/MLEB/Translate/src/Jobs/GenericTranslateJob.php
index a74677a7..91d1b294 100644
--- a/MLEB/Translate/src/Jobs/GenericTranslateJob.php
+++ b/MLEB/Translate/src/Jobs/GenericTranslateJob.php
@@ -7,8 +7,9 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Jobs;
+namespace MediaWiki\Extension\Translate\Jobs;
+use Job;
use MediaWiki\Logger\LoggerFactory;
use Psr\Log\LoggerInterface;
@@ -16,7 +17,7 @@ use Psr\Log\LoggerInterface;
* Generic Job class extended by other jobs. Provides logging functionality.
* @since 2019.08
*/
-abstract class GenericTranslateJob extends \Job {
+abstract class GenericTranslateJob extends Job {
/**
* A logger instance
* @var LoggerInterface
@@ -43,9 +44,15 @@ abstract class GenericTranslateJob extends \Job {
return $this->logger;
}
- protected function getLogPrefix() {
- return '[Job: ' . $this->getType() . '][Request ID: ' . $this->getRequestId() .
- '][Title: ' . $this->title->getPrefixedText() . '] ';
+ protected function getLogPrefix(): string {
+ $prefix = $this->getType();
+ if ( isset( $this->title ) ) {
+ $prefix .= ' [' . $this->title->getPrefixedText() . ']';
+ }
+
+ // Add a separator at the end.
+ $prefix .= ': ';
+ return $prefix;
}
protected function logInfo( $msg, $context = [] ) {
@@ -64,3 +71,5 @@ abstract class GenericTranslateJob extends \Job {
$this->getLogger()->warning( $this->getLogPrefix() . $msg, $context );
}
}
+
+class_alias( GenericTranslateJob::class, '\MediaWiki\Extensions\Translate\GenericTranslateJob' );
diff --git a/MLEB/Translate/src/MessageSync/MessageSourceChange.php b/MLEB/Translate/src/MessageSync/MessageSourceChange.php
index b9f51caf..c5b69784 100644
--- a/MLEB/Translate/src/MessageSync/MessageSourceChange.php
+++ b/MLEB/Translate/src/MessageSync/MessageSourceChange.php
@@ -6,7 +6,7 @@
* @file
*/
-namespace MediaWiki\Extensions\Translate\MessageSync;
+namespace MediaWiki\Extension\Translate\MessageSync;
use InvalidArgumentException;
@@ -19,12 +19,10 @@ use InvalidArgumentException;
class MessageSourceChange {
/**
* @var array[][][]
- * @codingStandardsIgnoreStart
+ * @phpcs:ignore Generic.Files.LineLength
* @phan-var array<string,array<string,array<string|int,array{key:string,content:string,similarity?:float,matched_to?:string,previous_state?:string}>>>
- * @codingStandardsIgnoreEnd
*/
protected $changes = [];
-
public const ADDITION = 'addition';
public const CHANGE = 'change';
public const DELETION = 'deletion';
@@ -34,20 +32,17 @@ class MessageSourceChange {
private const SIMILARITY_THRESHOLD = 0.9;
/**
- * Contains a mapping of mesasge type, and the corresponding addition function
+ * Contains a mapping of message type, and the corresponding addition function
* @var callable[]
*/
protected $addFunctionMap;
-
/**
* Contains a mapping of message type, and the corresponding removal function
* @var callable[]
*/
protected $removeFunctionMap;
- /**
- * @param array[][][] $changes
- */
+ /** @param array[][][] $changes */
public function __construct( $changes = [] ) {
$this->changes = $changes;
$this->addFunctionMap = [
@@ -223,7 +218,7 @@ class MessageSourceChange {
}
/**
- * Break reanmes, and put messages back into their previous state.
+ * Break renames, and put messages back into their previous state.
* @param string $languageCode
* @param string $msgKey
* @return string|null previous state of the message
@@ -379,10 +374,7 @@ class MessageSourceChange {
$this->changes[$language][$type] = array_filter(
$this->changes[$language][$type],
function ( $change ) use ( $keysToRemove ) {
- if ( in_array( $change['key'], $keysToRemove, true ) ) {
- return false;
- }
- return true;
+ return !in_array( $change['key'], $keysToRemove, true );
}
);
}
@@ -559,3 +551,5 @@ class MessageSourceChange {
return $similarity === 1;
}
}
+
+class_alias( MessageSourceChange::class, '\MediaWiki\Extensions\Translate\MessageSourceChange' );
diff --git a/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php b/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php
new file mode 100644
index 00000000..1314e0e4
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php
@@ -0,0 +1,265 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use Closure;
+use MalformedTitleException;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MediaWiki\MediaWikiServices;
+use Message;
+use SplObjectStorage;
+use Status;
+use Title;
+use TitleParser;
+use TranslatablePage;
+use TranslateUtils;
+
+class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript {
+ /** @var TranslatablePageMover */
+ private $pageMover;
+ /** @var TitleParser */
+ private $titleParser;
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Review and move translatable pages including their subpages' );
+
+ $this->addArg(
+ 'current-page',
+ 'Current page name',
+ self::REQUIRED
+ );
+
+ $this->addArg(
+ 'new-page',
+ 'New page name',
+ self::REQUIRED
+ );
+
+ $this->addArg(
+ 'user',
+ 'User performing the move',
+ self::REQUIRED
+ );
+
+ $this->addOption(
+ 'reason',
+ 'Reason for moving the page',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+
+ $this->addOption(
+ 'move-subpages',
+ 'Move subpages under the current page'
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ /** @inheritDoc */
+ public function execute() {
+ $this->pageMover = Services::getInstance()->getTranslatablePageMover();
+
+ $mwService = MediaWikiServices::getInstance();
+ $this->titleParser = $mwService->getTitleParser();
+
+ $currentPagename = $this->getArg( 0 );
+ $newPagename = $this->getArg( 1 );
+ $username = $this->getArg( 2 );
+ $reason = $this->getOption( 'reason', '' );
+ $moveSubpages = $this->hasOption( 'move-subpages' );
+
+ if ( is_callable( [ $mwService, 'getUserFactory' ] ) ) {
+ // MW 1.35+
+ $userFactory = $mwService->getUserFactory();
+ $user = $userFactory->newFromName( $username );
+ } else {
+ $user = \User::newFromName( $username );
+ // Set to null if $user is false
+ $user = $user ?: null;
+ }
+
+ if ( $user === null || !$user->isRegistered() ) {
+ $this->fatalError( "User $username does not exist." );
+ }
+
+ $outputMsg = "Check if '$currentPagename' can be moved to '$newPagename'";
+ $subpageMsg = '(excluding subpages)';
+ if ( $moveSubpages ) {
+ $subpageMsg = '(including subpages)';
+ }
+
+ $this->output( "$outputMsg $subpageMsg\n" );
+
+ try {
+ $currentTitle = $this->getTitleFromInput( $currentPagename ?? '' );
+ $newTitle = $this->getTitleFromInput( $newPagename ?? '' );
+ } catch ( MalformedTitleException $e ) {
+ $this->error( 'Invalid title: current-page or new-page' );
+ $this->fatalError( $e->getMessageObject()->text() );
+ }
+
+ // When moving translatable pages from script, remove all limits on the number of
+ // pages that can be moved
+ $this->pageMover->disablePageMoveLimit();
+ $blockers = $this->pageMover->checkMoveBlockers(
+ $currentTitle,
+ $newTitle,
+ $user,
+ $reason,
+ $moveSubpages
+ );
+
+ if ( count( $blockers ) ) {
+ $fatalErrorMsg = $this->parseErrorMessage( $blockers );
+ $this->fatalError( $fatalErrorMsg );
+ }
+
+ $groupedPagesToMove = $this->getGroupedPagesToMove( $currentTitle );
+ $this->displayPagesToMove( $currentTitle, $newTitle, $groupedPagesToMove );
+
+ $haveConfirmation = $this->getConfirmation();
+ if ( !$haveConfirmation ) {
+ $this->output( "Exiting...\n" );
+ return;
+ }
+
+ $this->output( "Starting page move\n" );
+
+ $pagesToMove = $this->pageMover->getPagesToMove( $currentTitle, $newTitle, $moveSubpages );
+
+ $this->pageMover->moveSynchronously(
+ $currentTitle,
+ $newTitle,
+ $pagesToMove,
+ $user,
+ $reason,
+ Closure::fromCallable( [ $this, 'progressCallback' ] )
+ );
+
+ $this->logSeparator();
+ $this->output( "Finished moving '$currentPagename' to '$newPagename' $subpageMsg\n" );
+ }
+
+ private function parseErrorMessage( SplObjectStorage $errors ): string {
+ $errorMsg = wfMessage( 'pt-movepage-blockers', count( $errors ) )->text() . "\n";
+ foreach ( $errors as $title ) {
+ $titleText = $title->getPrefixedText();
+ $errorMsg .= "$titleText\n";
+ $errorMsg .= $errors[ $title ]->getWikiText( false, 'pt-movepage-error-placeholder', 'en' );
+ $errorMsg .= "\n";
+ }
+
+ return $errorMsg;
+ }
+
+ private function progressCallback( Title $previous, Title $new, Status $status, int $total, int $processed ): void {
+ $previousTitleText = $previous->getPrefixedText();
+ $newTitleText = $new->getPrefixedText();
+ $paddedProcessed = str_pad( (string)$processed, strlen( (string)$total ), ' ', STR_PAD_LEFT );
+ $progressCounter = "($paddedProcessed/$total)";
+
+ if ( $status->isOK() ) {
+ $this->output( "$progressCounter $previousTitleText --> $newTitleText\n" );
+ } else {
+ $this->output( "$progressCounter Failed to move $previousTitleText to $newTitleText\n" );
+ $this->output( "\tReason:" . $status->getWikiText() . "\n" );
+ }
+ }
+
+ /** @return Title[][] */
+ private function getGroupedPagesToMove( Title $source ): array {
+ $page = TranslatablePage::newFromTitle( $source );
+
+ $types = [
+ 'pt-movepage-list-pages' => [ $source ],
+ 'pt-movepage-list-translation' => $page->getTranslationPages(),
+ 'pt-movepage-list-section' => $page->getTranslationUnitPages( 'all' ),
+ 'pt-movepage-list-translatable' => $this->pageMover->getTranslatableSubpages( $page )
+ ];
+
+ if ( TranslateUtils::allowsSubpages( $source ) ) {
+ $types[ 'pt-movepage-list-other'] = $this->pageMover->getNormalSubpages( $page );
+ }
+
+ return $types;
+ }
+
+ private function displayPagesToMove( Title $currentTitle, Title $newTitle, array $pagesToMove ): void {
+ $infoMessage = "\nThe following pages will be moved:\n";
+ $count = 0;
+ $subpagesCount = 0;
+ $base = $currentTitle->getPrefixedText();
+
+ foreach ( $pagesToMove as $type => $pages ) {
+ $infoMessage .= $this->getSeparator();
+ $pageCount = count( $pages );
+ $infoMessage .= $this->message( $type )->numParams( $pageCount )->text() . "\n\n";
+ if ( !$pageCount ) {
+ $infoMessage .= $this->message( 'pt-movepage-list-no-pages' )->text() . "\n";
+ continue;
+ }
+
+ if ( $type === 'pt-movepage-list-translatable' ) {
+ $infoMessage .= $this->message( 'pt-movepage-list-translatable-note' )->text() . "\n";
+ }
+
+ $canBeMoved = $type !== 'pt-movepage-list-translatable';
+ $lines = [];
+ foreach ( $pages as $currentPage ) {
+ if ( $canBeMoved ) {
+ $count++;
+ }
+
+ if ( $type === 'pt-movepage-list-other' ) {
+ $subpagesCount++;
+ }
+
+ if ( $canBeMoved ) {
+ $to = $this->pageMover->newPageTitle( $base, $currentPage, $newTitle );
+ $lines[] = '* ' . $currentPage->getPrefixedText() . ' → ' . $to;
+ } else {
+ $lines[] = '* ' . $currentPage->getPrefixedText();
+ }
+ }
+
+ $infoMessage .= implode( "\n", $lines ) . "\n";
+ }
+
+ $this->output( $infoMessage );
+
+ $this->logSeparator();
+ $this->output(
+ $this->message( 'pt-movepage-list-count' )
+ ->numParams( $count, $subpagesCount )
+ ->text() . "\n"
+ );
+ $this->logSeparator();
+ $this->output( "\n" );
+ }
+
+ private function getConfirmation(): bool {
+ $line = self::readconsole( 'Type "MOVE" to begin the move operation: ' );
+ return strtolower( $line ) === 'move';
+ }
+
+ private function getSeparator( int $width = 15 ): string {
+ return str_repeat( '-', $width ) . "\n";
+ }
+
+ private function logSeparator( int $width = 15 ): void {
+ $this->output( $this->getSeparator( $width ) );
+ }
+
+ private function message( string $key ): Message {
+ return ( new Message( $key ) )->inLanguage( 'en' );
+ }
+
+ private function getTitleFromInput( string $pageName ): Title {
+ $titleValue = $this->titleParser->parseTitle( $pageName );
+ return Title::newFromLinkTarget( $titleValue );
+ }
+}
diff --git a/MLEB/Translate/src/PageTranslation/ParserOutput.php b/MLEB/Translate/src/PageTranslation/ParserOutput.php
new file mode 100644
index 00000000..b9624509
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/ParserOutput.php
@@ -0,0 +1,100 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use InvalidArgumentException;
+use Language;
+
+/**
+ * Represents a parsing output produced by TranslatablePageParser.
+ *
+ * It is required generate translatable and translation page sources or just get the list of
+ * translations units.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class ParserOutput {
+ /** @var string */
+ private $template;
+ /** @var Section[] */
+ private $sectionMap;
+ /** @var TranslationUnit[] */
+ private $unitMap;
+
+ public function __construct( string $template, array $sectionMap, array $unitMap ) {
+ $this->assertContainsOnlyInstancesOf( Section::class, '$sectionMap', $sectionMap );
+ $this->assertContainsOnlyInstancesOf( TranslationUnit::class, '$unitMap', $unitMap );
+
+ $this->template = $template;
+ $this->sectionMap = $sectionMap;
+ $this->unitMap = $unitMap;
+ }
+
+ /** Returns template that contains <translate> tags */
+ public function sourcePageTemplate(): string {
+ $replacements = [];
+ foreach ( $this->sectionMap as $ph => $section ) {
+ $replacements[$ph] = $section->wrappedContents();
+ }
+
+ return strtr( $this->template, $replacements );
+ }
+
+ /** Returns template that does not contain <translate> tags */
+ public function translationPageTemplate(): string {
+ $replacements = [];
+ foreach ( $this->sectionMap as $ph => $section ) {
+ $replacements[$ph] = $section->contents();
+ }
+
+ return strtr( $this->template, $replacements );
+ }
+
+ /** @return TranslationUnit[] */
+ public function units(): array {
+ return $this->unitMap;
+ }
+
+ /** Returns the source page wikitext used for rendering the page. */
+ public function sourcePageTextForRendering( Language $sourceLanguage ) {
+ $text = $this->translationPageTemplate();
+
+ foreach ( $this->unitMap as $ph => $s ) {
+ $t = $s->getTextForRendering( null, $sourceLanguage, $sourceLanguage, false );
+ $text = str_replace( $ph, $t, $text );
+ }
+
+ return $text;
+ }
+
+ /** Returns the source page with translation unit markers. */
+ public function sourcePageTextForSaving() {
+ $text = $this->sourcePageTemplate();
+
+ foreach ( $this->unitMap as $ph => $s ) {
+ $text = str_replace( $ph, $s->getMarkedText(), $text );
+ }
+
+ return $text;
+ }
+
+ private function assertContainsOnlyInstancesOf(
+ string $expected,
+ string $name,
+ array $x
+ ): void {
+ foreach ( $x as $item ) {
+ if ( !$item instanceof $expected ) {
+ $actual = gettype( $item );
+ throw new InvalidArgumentException(
+ "Parameter $name must only contain instances of class $expected. Got $actual."
+ );
+ }
+ }
+ }
+}
+
+class_alias( ParserOutput::class, '\MediaWiki\Extensions\Translate\ParserOutput' );
diff --git a/MLEB/Translate/src/PageTranslation/ParsingFailure.php b/MLEB/Translate/src/PageTranslation/ParsingFailure.php
new file mode 100644
index 00000000..a3012c7b
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/ParsingFailure.php
@@ -0,0 +1,31 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use RuntimeException;
+
+/**
+ * Represents any kind of failure to parse a translatable page source code.
+ *
+ * This is an internal exception that includes information to produce translated error messages, but
+ * actually displaying them to users is handlded by TPException and MediaWiki core.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class ParsingFailure extends RuntimeException {
+ private $messageSpec;
+
+ public function __construct( string $message, array $messageSpec ) {
+ parent::__construct( $message );
+ $this->messageSpec = $messageSpec;
+ }
+
+ public function getMessageSpecification(): array {
+ return $this->messageSpec;
+ }
+}
+
+class_alias( ParsingFailure::class, '\MediaWiki\Extensions\Translate\ParsingFailure' );
diff --git a/MLEB/Translate/src/PageTranslation/Section.php b/MLEB/Translate/src/PageTranslation/Section.php
new file mode 100644
index 00000000..b4e30469
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/Section.php
@@ -0,0 +1,36 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+/**
+ * Section is one pair of <translate>...</translate> tags.
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class Section {
+ /** @var string */
+ private $open;
+ /** @var string */
+ private $contents;
+ /** @var string */
+ private $close;
+
+ public function __construct( string $open, string $contents, string $close ) {
+ $this->open = $open;
+ $this->contents = $contents;
+ $this->close = $close;
+ }
+
+ public function contents(): string {
+ // If <translate> tags are on their own line, avoid build-up of newlines
+ return preg_replace( '/\A\n|\n\z/', '', $this->contents );
+ }
+
+ public function wrappedContents(): string {
+ return $this->open . $this->contents . $this->close;
+ }
+}
+
+class_alias( Section::class, '\MediaWiki\Extensions\Translate\Section' );
diff --git a/MLEB/Translate/src/PageTranslation/TestingParsingPlaceholderFactory.php b/MLEB/Translate/src/PageTranslation/TestingParsingPlaceholderFactory.php
new file mode 100644
index 00000000..9c914d18
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TestingParsingPlaceholderFactory.php
@@ -0,0 +1,24 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class TestingParsingPlaceholderFactory extends ParsingPlaceholderFactory {
+ private $i = 0;
+
+ public function make(): string {
+ return '<' . $this->i++ . '>';
+ }
+}
+
+class_alias(
+ TestingParsingPlaceholderFactory::class,
+ '\MediaWiki\Extensions\Translate\TestingParsingPlaceholderFactory'
+);
diff --git a/MLEB/Translate/insertables/TranslatablePageInsertablesSuggester.php b/MLEB/Translate/src/PageTranslation/TranslatablePageInsertablesSuggester.php
index 61582606..516a31bd 100644
--- a/MLEB/Translate/insertables/TranslatablePageInsertablesSuggester.php
+++ b/MLEB/Translate/src/PageTranslation/TranslatablePageInsertablesSuggester.php
@@ -1,16 +1,19 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\Insertable;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\MediaWikiInsertablesSuggester;
/**
* Special insertables for translatable pages.
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @since 2013.11
*/
class TranslatablePageInsertablesSuggester extends MediaWikiInsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
$insertables = parent::getInsertables( $text );
// Translatable pages allow naming the variables. Basically anything is
@@ -34,3 +37,8 @@ class TranslatablePageInsertablesSuggester extends MediaWikiInsertablesSuggester
return $insertables;
}
}
+
+class_alias(
+ TranslatablePageInsertablesSuggester::class,
+ '\MediaWiki\Extensions\Translate\TranslatablePageInsertablesSuggester'
+);
diff --git a/MLEB/Translate/src/PageTranslation/TranslatablePageMover.php b/MLEB/Translate/src/PageTranslation/TranslatablePageMover.php
new file mode 100644
index 00000000..2729e4f0
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TranslatablePageMover.php
@@ -0,0 +1,447 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use AggregateMessageGroup;
+use JobQueueGroup;
+use LinkBatch;
+use ManualLogEntry;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Page\MovePageFactory;
+use Message;
+use MessageGroups;
+use MessageIndex;
+use ObjectCache;
+use PageTranslationHooks;
+use SplObjectStorage;
+use Status;
+use Title;
+use TranslatablePage;
+use TranslatablePageMoveJob;
+use TranslateMetadata;
+use TranslationsUpdateJob;
+use Traversable;
+use User;
+
+/**
+ * Contains the core logic to validate and move translatable pages
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2021.03
+ */
+class TranslatablePageMover {
+ private const LOCK_TIMEOUT = 3600 * 2;
+ /** @var MovePageFactory */
+ private $movePageFactory;
+ /** @var int|null */
+ private $pageMoveLimit;
+ /** @var JobQueueGroup */
+ private $jobQueue;
+ /** @var bool */
+ private $pageMoveLimitEnabled = true;
+
+ public function __construct( MovePageFactory $movePageFactory, JobQueueGroup $jobQueue, ?int $pageMoveLimit ) {
+ $this->movePageFactory = $movePageFactory;
+ $this->jobQueue = $jobQueue;
+ $this->pageMoveLimit = $pageMoveLimit;
+ }
+
+ /** Makes old title into a new title by replacing $base part of old title with $target. */
+ public function newPageTitle( string $base, Title $old, Title $target ): Title {
+ $search = preg_quote( $base, '~' );
+
+ if ( $old->inNamespace( NS_TRANSLATIONS ) ) {
+ $new = $old->getText();
+ $new = preg_replace( "~^$search~", $target->getPrefixedText(), $new, 1 );
+
+ return Title::makeTitleSafe( NS_TRANSLATIONS, $new );
+ } else {
+ $new = $old->getPrefixedText();
+ $new = preg_replace( "~^$search~", $target->getPrefixedText(), $new, 1 );
+
+ return Title::newFromText( $new );
+ }
+ }
+
+ /** @return SplObjectStorage Title => Status */
+ public function checkMoveBlockers(
+ Title $source,
+ ?Title $target,
+ User $user,
+ string $reason,
+ bool $moveSubPages
+ ): SplObjectStorage {
+ $blockers = new SplObjectStorage();
+
+ $page = TranslatablePage::newFromTitle( $source );
+
+ if ( !$target ) {
+ $blockers[$source] = Status::newFatal( 'pt-movepage-block-base-invalid' );
+ return $blockers;
+ }
+
+ if ( $target->inNamespaces( NS_MEDIAWIKI, NS_TRANSLATIONS ) ) {
+ $blockers[$source] = Status::newFatal( 'immobile-target-namespace', $target->getNsText() );
+ return $blockers;
+ }
+
+ if ( $target->exists() ) {
+ $blockers[$source] = Status::newFatal(
+ 'pt-movepage-block-base-exists', $target->getPrefixedText()
+ );
+ } else {
+ $movePage = $this->movePageFactory->newMovePage( $source, $target );
+ $status = $movePage->isValidMove();
+ $status->merge( $movePage->checkPermissions( $user, $reason ) );
+ if ( !$status->isOK() ) {
+ $blockers[$source] = $status;
+ }
+ }
+
+ // Don't spam the same errors for all pages if base page fails
+ if ( count( $blockers ) ) {
+ return $blockers;
+ }
+
+ // Collect all the old and new titles for checks
+ $titles = [];
+ $base = $source->getPrefixedText();
+ $pages = $page->getTranslationPages();
+ foreach ( $pages as $old ) {
+ $titles['tp'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
+ }
+
+ $subpages = $moveSubPages ? $this->getNormalSubpages( $page ) : [];
+ foreach ( $subpages as $old ) {
+ $titles['subpage'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
+ }
+
+ $pages = $page->getTranslationUnitPages( 'all' );
+ foreach ( $pages as $old ) {
+ $titles['section'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
+ }
+
+ // Check that all new titles are valid and count them. Add 1 for source page.
+ $moveCount = 1;
+ $lb = new LinkBatch();
+ foreach ( $titles as $type => $list ) {
+ $moveCount += count( $list );
+ // Give grep a chance to find the usages:
+ // pt-movepage-block-tp-invalid, pt-movepage-block-section-invalid,
+ // pt-movepage-block-subpage-invalid
+ foreach ( $list as $pair ) {
+ [ $old, $new ] = $pair;
+ if ( $new === null ) {
+ $blockers[$old] = Status::newFatal(
+ "pt-movepage-block-$type-invalid",
+ $old->getPrefixedText()
+ );
+ continue;
+ }
+ $lb->addObj( $old );
+ $lb->addObj( $new );
+ }
+ }
+
+ if ( $this->pageMoveLimitEnabled ) {
+ if ( $this->pageMoveLimit !== null && $moveCount > $this->pageMoveLimit ) {
+ $blockers[$source] = Status::newFatal(
+ 'pt-movepage-page-count-limit',
+ Message::numParam( $this->pageMoveLimit )
+ );
+ }
+ }
+
+ if ( count( $blockers ) ) {
+ return $blockers;
+ }
+
+ // Check that there are no move blockers
+ $lb->execute();
+ foreach ( $titles as $type => $list ) {
+ // Give grep a chance to find the usages:
+ // pt-movepage-block-tp-exists, pt-movepage-block-section-exists,
+ // pt-movepage-block-subpage-exists
+ foreach ( $list as $pair ) {
+ list( $old, $new ) = $pair;
+ if ( $new->exists() ) {
+ $blockers[$old] = Status::newFatal(
+ "pt-movepage-block-$type-exists",
+ $old->getPrefixedText(),
+ $new->getPrefixedText()
+ );
+ } else {
+ /* This method has terrible performance:
+ * - 2 queries by core
+ * - 3 queries by lqt
+ * - and no obvious way to preload the data! */
+ $movePage = $this->movePageFactory->newMovePage( $old, $target );
+ $status = $movePage->isValidMove();
+ // Do not check for permissions here, as these pages are not editable/movable
+ // in regular use
+ if ( !$status->isOK() ) {
+ $blockers[$old] = $status;
+ }
+
+ /* Because of the poor performance, check only one of the possibly thousands
+ * of section pages and assume rest are fine. This assumes section pages are
+ * listed last in the array. */
+ if ( $type === 'section' ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return $blockers;
+ }
+
+ public function moveAsynchronously(
+ Title $source,
+ Title $target,
+ bool $moveSubPages,
+ User $user,
+ string $summary
+ ): void {
+ $pageMoves = $this->getPagesToMove( $source, $target, $moveSubPages );
+
+ $job = TranslatablePageMoveJob::newJob( $source, $target, $pageMoves, $summary, $user );
+ $this->lock( array_keys( $pageMoves ) );
+ $this->lock( array_values( $pageMoves ) );
+
+ $this->jobQueue->push( $job );
+ }
+
+ /**
+ * @param Title $source
+ * @param Title $target
+ * @param string[] $pagesToMove
+ * @param User $performer
+ * @param string $summary
+ * @return void
+ */
+ public function moveSynchronously(
+ Title $source,
+ Title $target,
+ array $pagesToMove,
+ User $performer,
+ string $summary,
+ callable $progressCallback = null
+ ): void {
+ $this->move( $source, $performer, $pagesToMove, $summary, $progressCallback );
+
+ $sourcePage = TranslatablePage::newFromTitle( $source );
+ $targetPage = TranslatablePage::newFromTitle( $target );
+
+ $entry = new ManualLogEntry( 'pagetranslation', 'moveok' );
+ $entry->setPerformer( $performer );
+ $entry->setTarget( $source );
+ $entry->setParameters( [ 'target' => $target->getPrefixedText() ] );
+ $logid = $entry->insert();
+ $entry->publish( $logid );
+
+ $this->moveMetadata( $sourcePage->getMessageGroupId(), $targetPage->getMessageGroupId() );
+
+ // Re-render the pages to get everything in sync
+ MessageGroups::singleton()->recache();
+ // Update message index now so that, when after this job the MoveTranslationUnits hook
+ // runs in deferred updates, it will not run MessageIndexRebuildJob (T175834).
+ MessageIndex::singleton()->rebuild();
+
+ $job = TranslationsUpdateJob::newFromPage( $targetPage );
+ $this->jobQueue->push( $job );
+ }
+
+ /** @return Title[] */
+ public function getNormalSubpages( TranslatablePage $page ): array {
+ return array_filter(
+ $this->getSubpages( $page ),
+ function ( $page ) {
+ return !(
+ TranslatablePage::isTranslationPage( $page ) ||
+ TranslatablePage::isSourcePage( $page )
+ );
+ }
+ );
+ }
+
+ /** @return Title[] */
+ public function getTranslatableSubpages( TranslatablePage $page ): array {
+ return array_filter(
+ $this->getSubpages( $page ),
+ function ( $page ) {
+ return TranslatablePage::isSourcePage( $page );
+ }
+ );
+ }
+
+ /** @return string[] */
+ public function getPagesToMove( Title $source, Title $target, bool $moveSubPages ): array {
+ $page = TranslatablePage::newFromTitle( $source );
+ $base = $source->getPrefixedText();
+
+ $moves = [];
+ $moves[$base] = $target->getPrefixedText();
+
+ foreach ( $page->getTranslationPages() as $from ) {
+ $to = $this->newPageTitle( $base, $from, $target );
+ $moves[$from->getPrefixedText()] = $to->getPrefixedText();
+ }
+
+ foreach ( $page->getTranslationUnitPages( 'all' ) as $from ) {
+ $to = $this->newPageTitle( $base, $from, $target );
+ $moves[$from->getPrefixedText()] = $to->getPrefixedText();
+ }
+
+ if ( $moveSubPages ) {
+ $subpages = $this->getNormalSubpages( $page );
+ foreach ( $subpages as $from ) {
+ $to = $this->newPageTitle( $base, $from, $target );
+ $moves[$from->getPrefixedText()] = $to->getPrefixedText();
+ }
+ }
+
+ return $moves;
+ }
+
+ public function disablePageMoveLimit(): void {
+ $this->pageMoveLimitEnabled = false;
+ }
+
+ public function enablePageMoveLimit(): void {
+ $this->pageMoveLimitEnabled = true;
+ }
+
+ /**
+ * Returns all subpages, if the namespace has them enabled.
+ * @return Title[]
+ */
+ private function getSubpages( TranslatablePage $page ): array {
+ $pages = $page->getTitle()->getSubpages();
+ if ( $pages instanceof Traversable ) {
+ $pages = iterator_to_array( $pages );
+ }
+
+ return $pages;
+ }
+
+ /** @param string[] $titles */
+ private function lock( array $titles ): void {
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ $data = [];
+ foreach ( $titles as $title ) {
+ $data[$cache->makeKey( 'pt-lock', sha1( $title ) )] = 'locked';
+ }
+
+ // Do not lock pages indefinitely during translatable page moves since
+ // they can fail. Add a timeout so that the locks expire by themselves.
+ // Timeout value has been chosen by a gut feeling
+ $cache->setMulti( $data, self::LOCK_TIMEOUT );
+ }
+
+ /** @param string[] $titles */
+ private function unlock( array $titles ): void {
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ foreach ( $titles as $title ) {
+ $cache->delete( $cache->makeKey( 'pt-lock', sha1( $title ) ) );
+ }
+ }
+
+ /**
+ * @param Title $baseSource
+ * @param User $performer
+ * @param string[] $pagesToMove
+ * @param string $summary
+ * @param callable|null $progressCallback
+ * @return void
+ */
+ private function move(
+ Title $baseSource,
+ User $performer,
+ array $pagesToMove,
+ string $summary,
+ callable $progressCallback = null
+ ): void {
+ $fuzzybot = FuzzyBot::getUser();
+
+ PageTranslationHooks::$allowTargetEdit = true;
+
+ $processed = 0;
+ foreach ( $pagesToMove as $source => $target ) {
+ $sourceTitle = Title::newFromText( $source );
+ $targetTitle = Title::newFromText( $target );
+
+ if ( $source === $baseSource->getPrefixedText() ) {
+ $user = $performer;
+ } else {
+ $user = $fuzzybot;
+ }
+
+ $mover = $this->movePageFactory->newMovePage( $sourceTitle, $targetTitle );
+ $status = $mover->move( $user, $summary, false );
+ $processed++;
+
+ if ( $progressCallback ) {
+ $progressCallback(
+ $sourceTitle,
+ $targetTitle,
+ $status,
+ count( $pagesToMove ),
+ $processed
+ );
+ }
+
+ if ( !$status->isOK() ) {
+ $entry = new ManualLogEntry( 'pagetranslation', 'movenok' );
+ $entry->setPerformer( $performer );
+ $entry->setTarget( $sourceTitle );
+ $entry->setParameters( [
+ 'target' => $target,
+ 'error' => $status->getErrorsArray(),
+ ] );
+ $logid = $entry->insert();
+ $entry->publish( $logid );
+ }
+
+ $this->unlock( [ $source, $target ] );
+ }
+
+ PageTranslationHooks::$allowTargetEdit = false;
+ }
+
+ private function moveMetadata( string $oldGroupId, string $newGroupId ): void {
+ TranslateMetadata::preloadGroups( [ $oldGroupId, $newGroupId ] );
+ foreach ( TranslatablePage::METADATA_KEYS as $type ) {
+ $value = TranslateMetadata::get( $oldGroupId, $type );
+ if ( $value !== false ) {
+ TranslateMetadata::set( $oldGroupId, $type, false );
+ TranslateMetadata::set( $newGroupId, $type, $value );
+ }
+ }
+
+ // Make the changes in aggregate groups metadata, if present in any of them.
+ $aggregateGroups = MessageGroups::getGroupsByType( AggregateMessageGroup::class );
+ TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ) );
+
+ foreach ( $aggregateGroups as $id => $group ) {
+ $subgroups = TranslateMetadata::get( $id, 'subgroups' );
+ if ( $subgroups === false ) {
+ continue;
+ }
+
+ $subgroups = explode( ',', $subgroups );
+ $subgroups = array_flip( $subgroups );
+ if ( isset( $subgroups[$oldGroupId] ) ) {
+ $subgroups[$newGroupId] = $subgroups[$oldGroupId];
+ unset( $subgroups[$oldGroupId] );
+ $subgroups = array_flip( $subgroups );
+ TranslateMetadata::set(
+ $group->getId(),
+ 'subgroups',
+ implode( ',', $subgroups )
+ );
+ }
+ }
+ }
+}
diff --git a/MLEB/Translate/src/PageTranslation/TranslatablePageParser.php b/MLEB/Translate/src/PageTranslation/TranslatablePageParser.php
new file mode 100644
index 00000000..78ffb4ae
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TranslatablePageParser.php
@@ -0,0 +1,225 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
+
+/**
+ * Generates ParserOutput from text or removes all tags from a text.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class TranslatablePageParser {
+ private $placeholderFactory;
+
+ public function __construct( ParsingPlaceholderFactory $placeholderFactory ) {
+ $this->placeholderFactory = $placeholderFactory;
+ }
+
+ public function containsMarkup( string $text ): bool {
+ $nowiki = [];
+ $text = $this->armourNowiki( $nowiki, $text );
+ return preg_match( '~</?translate[ >]~', $text ) !== 0;
+ }
+
+ /**
+ * Remove all opening and closing translate tags following the same whitespace rules as the
+ * regular parsing. This doesn't try to parse the page, so it can handle unbalanced tags.
+ */
+ public function cleanupTags( string $text ): string {
+ $nowiki = [];
+ $text = $this->armourNowiki( $nowiki, $text );
+ $text = preg_replace( '~<translate( nowrap)?>\n?~s', '', $text );
+ $text = preg_replace( '~\n?</translate>~s', '', $text );
+ // Markers: headers and the rest
+ $ic = preg_quote( TranslationUnit::UNIT_MARKER_INVALID_CHARS, '~' );
+ $text = preg_replace( "~(^=.*=) <!--T:[^$ic]+-->$~um", '\1', $text );
+ $text = preg_replace( "~<!--T:[^$ic]+-->[\n ]?~um", '', $text );
+ // Remove variables
+ $unit = new TranslationUnit();
+ $unit->id = 'XXX';
+ $unit->text = $text;
+ $text = $unit->getTextForTrans();
+
+ $text = $this->unarmourNowiki( $nowiki, $text );
+ return $text;
+ }
+
+ /** @throws ParsingFailure */
+ public function parse( string $text ): ParserOutput {
+ $nowiki = [];
+ $text = $this->armourNowiki( $nowiki, $text );
+
+ $sections = [];
+ $tagPlaceHolders = [];
+
+ while ( true ) {
+ $re = '~(<translate(?: nowrap)?>)(.*?)</translate>~s';
+ $matches = [];
+ $ok = preg_match( $re, $text, $matches, PREG_OFFSET_CAPTURE );
+
+ if ( $ok === 0 || $ok === false ) {
+ break; // No match or failure
+ }
+
+ $contentWithTags = $matches[0][0];
+ $contentWithoutTags = $matches[2][0];
+ // These are offsets to the content inside the tags in $text
+ $offsetStart = $matches[0][1];
+ $offsetEnd = $offsetStart + strlen( $contentWithTags );
+
+ // Replace the whole match with a placeholder
+ $ph = $this->placeholderFactory->make();
+ $text = substr( $text, 0, $offsetStart ) . $ph . substr( $text, $offsetEnd );
+
+ if ( preg_match( '~<translate( nowrap)?>~', $contentWithoutTags ) !== 0 ) {
+ throw new ParsingFailure(
+ 'Nested tags',
+ [ 'pt-parse-nested', $contentWithoutTags ]
+ );
+ }
+
+ $openTag = $matches[1][0];
+ $canWrap = $openTag !== '<translate nowrap>';
+
+ // Parse the content inside the tags
+ $contentWithoutTags = $this->unarmourNowiki( $nowiki, $contentWithoutTags );
+ $parse = $this->parseSection( $contentWithoutTags, $canWrap );
+
+ // Update list of sections and the template with the results
+ $sections += $parse['sections'];
+ $tagPlaceHolders[$ph] = new Section( $openTag, $parse['template'], '</translate>' );
+ }
+
+ $prettyTemplate = $text;
+ foreach ( $tagPlaceHolders as $ph => $value ) {
+ $prettyTemplate = str_replace( $ph, '[...]', $prettyTemplate );
+ }
+
+ if ( preg_match( '~<translate( nowrap)?>~', $text ) !== 0 ) {
+ throw new ParsingFailure(
+ 'Unmatched opening tag',
+ [ 'pt-parse-open', $prettyTemplate ]
+ );
+ } elseif ( strpos( $text, '</translate>' ) !== false ) {
+ throw new ParsingFailure(
+ "Unmatched closing tag",
+ [ 'pt-parse-close', $prettyTemplate ]
+ );
+ }
+
+ $text = $this->unarmourNowiki( $nowiki, $text );
+
+ return new ParserOutput( $text, $tagPlaceHolders, $sections );
+ }
+
+ /**
+ * Splits the content marked with \<translate> tags into translation units, which are
+ * separated with two or more newlines. Extra whitespace is captured in the template and
+ * is not included in the translation units.
+ * @internal
+ */
+ public function parseSection( string $text, bool $canWrap ): array {
+ $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;
+ $parts = preg_split( '~(^\s*|\s*\n\n\s*|\s*$)~', $text, -1, $flags );
+
+ $inline = preg_match( '~\n~', $text ) === 0;
+
+ $template = '';
+ $sections = [];
+
+ foreach ( $parts as $_ ) {
+ if ( trim( $_ ) === '' ) {
+ $template .= $_;
+ } else {
+ $ph = $this->placeholderFactory->make();
+ $tpsection = $this->parseUnit( $_ );
+ $tpsection->setIsInline( $inline );
+ $tpsection->setCanWrap( $canWrap );
+ $sections[$ph] = $tpsection;
+ $template .= $ph;
+ }
+ }
+
+ return [
+ 'template' => $template,
+ 'sections' => $sections,
+ ];
+ }
+
+ /**
+ * Checks if this unit already contains a section marker. If there
+ * is not, a new one will be created. Marker will have the value of
+ * -1, which will later be replaced with a real value.
+ * @internal
+ */
+ public function parseUnit( string $content ): TranslationUnit {
+ $re = '~<!--T:(.*?)-->~';
+ $matches = [];
+ $count = preg_match_all( $re, $content, $matches, PREG_SET_ORDER );
+
+ if ( $count > 1 ) {
+ throw new ParsingFailure(
+ 'Multiple translation unit markers',
+ [ 'pt-shake-multiple', $content ]
+ );
+ }
+
+ $section = new TranslationUnit();
+ if ( $count === 1 ) {
+ foreach ( $matches as $match ) {
+ [ /*full*/, $id ] = $match;
+ $section->id = $id;
+
+ // Currently handle only these two standard places.
+ // Is this too strict?
+ $rer1 = '~^<!--T:(.*?)-->( |\n)~'; // Normal sections
+ $rer2 = '~\s*<!--T:(.*?)-->$~m'; // Sections with title
+ $content = preg_replace( $rer1, '', $content );
+ $content = preg_replace( $rer2, '', $content );
+
+ if ( preg_match( $re, $content ) === 1 ) {
+ throw new ParsingFailure(
+ 'Translation unit marker is in unsupported position',
+ [ 'pt-shake-position', $content ]
+ );
+ } elseif ( trim( $content ) === '' ) {
+ throw new ParsingFailure(
+ 'Translation unit has no content besides marker',
+ [ 'pt-shake-empty', $id ]
+ );
+ }
+ }
+ } else {
+ // New section
+ $section->id = -1;
+ }
+
+ $section->text = $content;
+
+ return $section;
+ }
+
+ /** @internal */
+ public function armourNowiki( array &$holders, string $text ): string {
+ $re = '~(<nowiki>)(.*?)(</nowiki>)~s';
+
+ while ( preg_match( $re, $text, $matches ) ) {
+ $ph = $this->placeholderFactory->make();
+ $text = str_replace( $matches[0], $ph, $text );
+ $holders[$ph] = $matches[0];
+ }
+
+ return $text;
+ }
+
+ /** @internal */
+ public function unarmourNowiki( array $holders, string $text ): string {
+ return strtr( $text, $holders );
+ }
+}
+
+class_alias( TranslatablePageParser::class, '\MediaWiki\Extensions\Translate\TranslatablePageParser' );
diff --git a/MLEB/Translate/src/PageTranslation/TranslationPage.php b/MLEB/Translate/src/PageTranslation/TranslationPage.php
new file mode 100644
index 00000000..5efb7a47
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TranslationPage.php
@@ -0,0 +1,104 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use Language;
+use MessageCollection;
+use TMessage;
+use WikiPageMessageGroup;
+
+/**
+ * Generates wikitext source code for translation pages.
+ *
+ * Also handles loading of translations, but that can be skipped and translations given directly.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.08
+ */
+class TranslationPage {
+ /** @var ParserOutput */
+ private $output;
+ /** @var WikiPageMessageGroup */
+ private $group;
+ /** @var Language */
+ private $targetLanguage;
+ /** @var Language */
+ private $sourceLanguage;
+ /** @var bool */
+ private $showOutdated;
+ /** @var bool */
+ private $wrapUntranslated;
+ /** @var string */
+ private $prefix;
+
+ public function __construct(
+ ParserOutput $output,
+ WikiPageMessageGroup $group,
+ Language $targetLanguage,
+ Language $sourceLanguage,
+ bool $showOutdated,
+ bool $wrapUntranslated,
+ string $prefix
+ ) {
+ $this->output = $output;
+ $this->group = $group;
+ $this->targetLanguage = $targetLanguage;
+ $this->sourceLanguage = $sourceLanguage;
+ $this->showOutdated = $showOutdated;
+ $this->wrapUntranslated = $wrapUntranslated;
+ $this->prefix = $prefix;
+ }
+
+ /** Generate translation page source using default options. */
+ public function generateSource(): string {
+ $collection = $this->getMessageCollection();
+ $this->filterMessageCollection( $collection );
+ $messages = $this->extractMessages( $collection );
+ return $this->generateSourceFromTranslations( $messages );
+ }
+
+ public function getMessageCollection(): MessageCollection {
+ return $this->group->initCollection( $this->targetLanguage->getCode() );
+ }
+
+ public function filterMessageCollection( MessageCollection $collection ): void {
+ $collection->loadTranslations();
+ if ( $this->showOutdated ) {
+ $collection->filter( 'hastranslation', false );
+ } else {
+ $collection->filter( 'translated', false );
+ }
+ }
+
+ /** @return TMessage[] */
+ public function extractMessages( MessageCollection $collection ): array {
+ $messages = [];
+ foreach ( $this->output->units() as $unit ) {
+ $messages[$unit->id] = $collection[$this->prefix . $unit->id] ?? null;
+ }
+
+ return $messages;
+ }
+
+ /** @param TMessage[] $messages */
+ public function generateSourceFromTranslations( array $messages ): string {
+ $replacements = [];
+ foreach ( $this->output->units() as $placeholder => $unit ) {
+ /** @var TMessage $msg */
+ $msg = $messages[$unit->id] ?? null;
+ $replacements[$placeholder] = $unit->getTextForRendering(
+ $msg,
+ $this->sourceLanguage,
+ $this->targetLanguage,
+ $this->wrapUntranslated
+ );
+ }
+
+ $template = $this->output->translationPageTemplate();
+ return strtr( $template, $replacements );
+ }
+}
+
+class_alias( TranslationPage::class, '\MediaWiki\Extensions\Translate\TranslationPage' );
diff --git a/MLEB/Translate/src/PageTranslation/TranslationUnit.php b/MLEB/Translate/src/PageTranslation/TranslationUnit.php
new file mode 100644
index 00000000..4006f458
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TranslationUnit.php
@@ -0,0 +1,212 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use Html;
+use Language;
+use TMessage;
+use const PREG_SET_ORDER;
+
+/**
+ * This class represents one translation unit in a translatable page.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @ingroup PageTranslation
+ */
+class TranslationUnit {
+ public const UNIT_MARKER_INVALID_CHARS = "_/\n<>";
+ /** @var string Unit name */
+ public $id;
+ /** @var ?string New name of the unit, that will be saved to database. */
+ public $name = null;
+ /** @var string Unit text. */
+ public $text;
+ /** @var string Is this new, existing, changed or deleted unit. */
+ public $type;
+ /** @var string|null Text of previous version of this unit. */
+ public $oldText = null;
+ /**
+ * @var bool Whether this unit is inline unit.
+ * E.g. "Something <translate>foo</translate> bar".
+ */
+ protected $inline = false;
+ /** @var bool Whether wrapping the unit is allowed */
+ private $canWrap = true;
+ /** @var int Version number for the serialization. */
+ private $version = 1;
+ /** @var string[] List of properties to serialize. */
+ private static $properties = [ 'version', 'id', 'name', 'text', 'type', 'oldText', 'inline' ];
+
+ public function setIsInline( bool $value ): void {
+ $this->inline = $value;
+ }
+
+ public function isInline(): bool {
+ return $this->inline;
+ }
+
+ public function setCanWrap( bool $value ): void {
+ $this->canWrap = $value;
+ }
+
+ public function canWrap(): bool {
+ return $this->canWrap;
+ }
+
+ /** Returns unit text unmodified */
+ public function getText(): string {
+ return $this->text;
+ }
+
+ /** Returns the text with tvars replaces with placeholders */
+ public function getTextWithVariables(): string {
+ $variableReplacements = [];
+ foreach ( $this->getVariables() as $variable ) {
+ $variableReplacements[$variable->getDefinition()] = $variable->getName();
+ }
+
+ return strtr( $this->text, $variableReplacements );
+ }
+
+ /** Returns unit text with variables replaced. */
+ public function getTextForTrans(): string {
+ $variableReplacements = [];
+ foreach ( $this->getVariables() as $variable ) {
+ $variableReplacements[$variable->getDefinition()] = $variable->getValue();
+ }
+
+ return strtr( $this->text, $variableReplacements );
+ }
+
+ /** Returns the unit text with updated or added unit marker */
+ public function getMarkedText(): string {
+ $id = $this->name ?? $this->id;
+ $header = "<!--T:{$id}-->";
+ $re = '~^(=+.*?=+\s*?$)~m';
+ $rep = "\\1 $header";
+ $count = 0;
+
+ $text = preg_replace( $re, $rep, $this->text, 1, $count );
+
+ if ( $count === 0 ) {
+ if ( $this->inline ) {
+ $text = $header . ' ' . $this->text;
+ } else {
+ $text = $header . "\n" . $this->text;
+ }
+ }
+
+ return $text;
+ }
+
+ /** Returns oldtext, or current text if not available */
+ public function getOldText(): string {
+ return $this->oldText ?? $this->text;
+ }
+
+ /** @return TranslationVariable[] */
+ public function getVariables(): array {
+ $vars = [];
+
+ // Deprecated syntax. Example: <tvar|1>...</>
+ $re = '~<tvar\|([^>]+)>(.*?)</>~us';
+ $matches = [];
+ preg_match_all( $re, $this->text, $matches, PREG_SET_ORDER );
+ foreach ( $matches as $m ) {
+ $vars[] = new TranslationVariable( $m[0], '$' . $m[1], $m[2] );
+ }
+
+ // Current syntax. Example: <tvar name=1>...</tvar>
+ $re = <<<'REGEXP'
+~
+<tvar \s+ name \s* = \s*
+( ( ' (?<key1> [^']* ) ' ) | ( " (?<key2> [^"]* ) " ) | (?<key3> [^"'\s>]* ) )
+\s* > (?<value>.*?) </tvar \s* >
+~xusi
+REGEXP;
+ $matches = [];
+ preg_match_all( $re, $this->text, $matches, PREG_SET_ORDER );
+ foreach ( $matches as $m ) {
+ $vars[] = new TranslationVariable(
+ $m[0],
+ // Maximum of one of these is non-empty string
+ '$' . ( $m['key1'] . $m['key2'] . $m['key3'] ),
+ $m['value']
+ );
+ }
+
+ return $vars;
+ }
+
+ /** Serialize this object to a PHP array */
+ public function serializeToArray(): array {
+ $data = [];
+ foreach ( self::$properties as $index => $property ) {
+ // Because this is used for the JobQueue, use a list
+ // instead of an array to save space.
+ $data[$index] = $this->$property;
+ }
+
+ return $data;
+ }
+
+ public static function unserializeFromArray( array $data ): self {
+ $unit = new self();
+ foreach ( self::$properties as $index => $property ) {
+ $unit->$property = $data[$index];
+ }
+
+ return $unit;
+ }
+
+ public function getTextForRendering(
+ ?TMessage $msg,
+ Language $sourceLanguage,
+ Language $targetLanguage,
+ bool $wrapUntranslated
+ ): string {
+ $attributes = [];
+
+ if ( $msg && $msg->translation() !== null ) {
+ $content = $msg->translation();
+ if ( $msg->hasTag( 'fuzzy' ) ) {
+ // We do not ever want to show explicit fuzzy marks in the rendered pages
+ $content = str_replace( TRANSLATE_FUZZY, '', $content );
+ $attributes['class'] = 'mw-translate-fuzzy';
+ }
+ $translationLanguage = $targetLanguage->getCode();
+ } else {
+ $content = $this->getTextWithVariables();
+ if ( $wrapUntranslated ) {
+ $attributes['lang'] = $sourceLanguage->getHtmlCode();
+ $attributes['dir'] = $sourceLanguage->getDir();
+ $attributes['class'] = 'mw-content-' . $sourceLanguage->getDir();
+ }
+ $translationLanguage = $sourceLanguage->getCode();
+ }
+
+ if ( $this->canWrap() && $attributes ) {
+ $tag = $this->isInline() ? 'span' : 'div';
+ $content = $this->isInline() ? $content : "\n$content\n";
+ $content = Html::rawElement( $tag, $attributes, $content );
+ }
+
+ $variableReplacements = [];
+ foreach ( $this->getVariables() as $variable ) {
+ $variableReplacements[$variable->getName()] = $variable->getValue();
+ }
+
+ $content = strtr( $content, $variableReplacements );
+
+ // Allow wrapping this inside variables
+ $content = preg_replace(
+ '/{{\s*TRANSLATIONLANGUAGE\s*}}/',
+ $translationLanguage,
+ $content
+ );
+
+ return $content;
+ }
+}
diff --git a/MLEB/Translate/src/PageTranslation/TranslationVariable.php b/MLEB/Translate/src/PageTranslation/TranslationVariable.php
new file mode 100644
index 00000000..c5958af6
--- /dev/null
+++ b/MLEB/Translate/src/PageTranslation/TranslationVariable.php
@@ -0,0 +1,38 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+/**
+ * This class represents one translation variable in a translation unit.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2021.03
+ */
+class TranslationVariable {
+ /** @var string */
+ private $definition;
+ /** @var string */
+ private $name;
+ /** @var string */
+ private $value;
+
+ public function __construct( string $definition, string $name, string $value ) {
+ $this->definition = $definition;
+ $this->name = $name;
+ $this->value = $value;
+ }
+
+ public function getDefinition(): string {
+ return $this->definition;
+ }
+
+ public function getName(): string {
+ return $this->name;
+ }
+
+ public function getValue(): string {
+ return $this->value;
+ }
+}
diff --git a/MLEB/Translate/src/ServiceWiring.php b/MLEB/Translate/src/ServiceWiring.php
index 2e0f807b..a38ed81c 100644
--- a/MLEB/Translate/src/ServiceWiring.php
+++ b/MLEB/Translate/src/ServiceWiring.php
@@ -7,37 +7,102 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Statistics\TranslatorActivity;
-use MediaWiki\Extensions\Translate\Statistics\TranslatorActivityQuery;
-use MediaWiki\Extensions\Translate\Synchronization\GroupSynchronizationCache;
-use MediaWiki\Extensions\Translate\Utilities\ParsingPlaceholderFactory;
+use MediaWiki\Config\ServiceOptions;
+use MediaWiki\Extension\Translate\Cache\PersistentCache;
+use MediaWiki\Extension\Translate\Cache\PersistentDatabaseCache;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageMover;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageParser;
+use MediaWiki\Extension\Translate\Statistics\TranslationStatsDataProvider;
+use MediaWiki\Extension\Translate\Statistics\TranslatorActivity;
+use MediaWiki\Extension\Translate\Statistics\TranslatorActivityQuery;
+use MediaWiki\Extension\Translate\Synchronization\GroupSynchronizationCache;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashReader;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashStorage;
+use MediaWiki\Extension\Translate\TtmServer\TtmServerFactory;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonCodec;
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
use MediaWiki\MediaWikiServices;
+/** @phpcs-require-sorted-array */
return [
- 'Translate:GroupSynchronizationCache' => function (): GroupSynchronizationCache {
- return new GroupSynchronizationCache( ObjectCache::getInstance( CACHE_DB ) );
+ 'Translate:GroupSynchronizationCache' => function (
+ MediaWikiServices $services
+ ): GroupSynchronizationCache {
+ return new GroupSynchronizationCache( $services->get( 'Translate:PersistentCache' ) );
+ },
+
+ 'Translate:JsonCodec' => function (): JsonCodec {
+ return new JsonCodec();
},
'Translate:ParsingPlaceholderFactory' => function (): ParsingPlaceholderFactory {
return new ParsingPlaceholderFactory();
},
+ 'Translate:PersistentCache' => function ( MediaWikiServices $services ): PersistentCache {
+ return new PersistentDatabaseCache(
+ $services->getDBLoadBalancer(),
+ // TODO: Since we have a similar interface, see if we can load the JsonCodec
+ // from the core here if available
+ $services->get( 'Translate:JsonCodec' )
+ );
+ },
+
+ 'Translate:TranslatablePageMover' => function ( MediaWikiServices $services ): TranslatablePageMover
+ {
+ return new TranslatablePageMover(
+ $services->getMovePageFactory(),
+ JobQueueGroup::singleton(),
+ $services->getMainConfig()->get( 'TranslatePageMoveLimit' )
+ );
+ },
+
+ 'Translate:TranslatablePageParser' => function ( MediaWikiServices $services ): TranslatablePageParser
+ {
+ return new TranslatablePageParser(
+ $services->get( 'Translate:ParsingPlaceholderFactory' )
+ );
+ },
+
+ 'Translate:TranslationStashReader' => function ( MediaWikiServices $services ): TranslationStashReader
+ {
+ $db = $services->getDBLoadBalancer()->getConnectionRef( DB_REPLICA );
+ return new TranslationStashStorage( $db );
+ },
+
+ 'Translate:TranslationStatsDataProvider' => function ( MediaWikiServices $services ): TranslationStatsDataProvider
+ {
+ return new TranslationStatsDataProvider(
+ new ServiceOptions(
+ TranslationStatsDataProvider::CONSTRUCTOR_OPTIONS,
+ $services->getMainConfig()
+ ),
+ $services->getObjectFactory()
+ );
+ },
+
'Translate:TranslatorActivity' => function ( MediaWikiServices $services ): TranslatorActivity {
$query = new TranslatorActivityQuery(
$services->getMainConfig(),
$services->getDBLoadBalancer()
);
- $languageValidator = function ( string $language ): bool {
- return Language::isKnownLanguageTag( $language );
- };
-
return new TranslatorActivity(
$services->getMainObjectStash(),
$query,
JobQueueGroup::singleton(),
- $languageValidator
+ $services->getLanguageNameUtils()
);
},
+ 'Translate:TtmServerFactory' => function ( MediaWikiServices $services ): TtmServerFactory {
+ $config = $services->getMainConfig();
+
+ $default = $config->get( 'TranslateTranslationDefaultService' );
+ if ( $default === false ) {
+ $default = null;
+ }
+
+ return new TtmServerFactory( $config->get( 'TranslateTranslationServices' ), $default );
+ }
];
diff --git a/MLEB/Translate/src/Services.php b/MLEB/Translate/src/Services.php
index 731715fd..2c843239 100644
--- a/MLEB/Translate/src/Services.php
+++ b/MLEB/Translate/src/Services.php
@@ -4,11 +4,18 @@
* @author Niklas Laxström
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate;
+namespace MediaWiki\Extension\Translate;
-use MediaWiki\Extensions\Translate\Statistics\TranslatorActivity;
-use MediaWiki\Extensions\Translate\Synchronization\GroupSynchronizationCache;
-use MediaWiki\Extensions\Translate\Utilities\ParsingPlaceholderFactory;
+use MediaWiki\Extension\Translate\Cache\PersistentCache;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageMover;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageParser;
+use MediaWiki\Extension\Translate\Statistics\TranslationStatsDataProvider;
+use MediaWiki\Extension\Translate\Statistics\TranslatorActivity;
+use MediaWiki\Extension\Translate\Synchronization\GroupSynchronizationCache;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashReader;
+use MediaWiki\Extension\Translate\TtmServer\TtmServerFactory;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonCodec;
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
use MediaWiki\MediaWikiServices;
use Psr\Container\ContainerInterface;
@@ -22,11 +29,10 @@ use Psr\Container\ContainerInterface;
class Services implements ContainerInterface {
/** @var self */
private static $instance;
-
- /** @var MediaWikiServices */
+ /** @var ContainerInterface */
private $container;
- private function __construct( MediaWikiServices $container ) {
+ private function __construct( ContainerInterface $container ) {
$this->container = $container;
}
@@ -37,27 +43,60 @@ class Services implements ContainerInterface {
/** @inheritDoc */
public function get( $id ) {
- // Can be changed to using ::get once we drop support for MW 1.33
- return $this->container->getService( $id );
+ return $this->container->get( $id );
}
/** @inheritDoc */
public function has( $id ) {
- // Can be changed to using ::has once we drop support for MW 1.33
- return $this->container->hasService( $id );
+ return $this->container->has( $id );
}
public function getGroupSynchronizationCache(): GroupSynchronizationCache {
- return $this->container->getService( 'Translate:GroupSynchronizationCache' );
+ return $this->get( 'Translate:GroupSynchronizationCache' );
+ }
+
+ /** @since 2020.12 */
+ public function getJsonCodec(): JsonCodec {
+ return $this->get( 'Translate:JsonCodec' );
}
/** @since 2020.07 */
public function getParsingPlaceholderFactory(): ParsingPlaceholderFactory {
- return $this->container->getService( 'Translate:ParsingPlaceholderFactory' );
+ return $this->get( 'Translate:ParsingPlaceholderFactory' );
+ }
+
+ /** @since 2020.12 */
+ public function getPersistentCache(): PersistentCache {
+ return $this->get( 'Translate:PersistentCache' );
+ }
+
+ /** @since 2021.03 */
+ public function getTranslatablePageMover(): TranslatablePageMover {
+ return $this->get( 'Translate:TranslatablePageMover' );
+ }
+
+ public function getTranslatablePageParser(): TranslatablePageParser {
+ return $this->get( 'Translate:TranslatablePageParser' );
+ }
+
+ /** @since 2020.11 */
+ public function getTranslationStashReader(): TranslationStashReader {
+ return $this->get( 'Translate:TranslationStashReader' );
+ }
+
+ /** @since 2020.09 */
+ public function getTranslationStatsDataProvider(): TranslationStatsDataProvider {
+ return $this->get( 'Translate:TranslationStatsDataProvider' );
}
public function getTranslatorActivity(): TranslatorActivity {
- return $this->container->getService( 'Translate:TranslatorActivity' );
+ return $this->get( 'Translate:TranslatorActivity' );
}
+ /** @since 2021.01 */
+ public function getTtmServerFactory(): TtmServerFactory {
+ return $this->get( 'Translate:TtmServerFactory' );
+ }
}
+
+class_alias( Services::class, '\MediaWiki\Extensions\Translate\Services' );
diff --git a/MLEB/Translate/specials/SpecialSupportedLanguages.php b/MLEB/Translate/src/Statistics/ActiveLanguagesSpecialPage.php
index 07113217..00b25f7f 100644
--- a/MLEB/Translate/specials/SpecialSupportedLanguages.php
+++ b/MLEB/Translate/src/Statistics/ActiveLanguagesSpecialPage.php
@@ -1,45 +1,57 @@
<?php
-/**
- * Contains logic for special page Special:SupportedLanguages
- *
- * @file
- * @author Niklas Laxström
- * @author Siebrand Mazeland
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
-use MediaWiki\Extensions\Translate\Services;
-use MediaWiki\Extensions\Translate\Statistics\StatisticsUnavailable;
-use MediaWiki\Extensions\Translate\Statistics\TranslatorActivity;
-use MediaWiki\Extensions\Translate\Statistics\TranslatorActivityQuery;
+use Config;
+use Html;
+use HtmlArmor;
+use LinkBatch;
+use MediaWiki\Config\ServiceOptions;
+use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\MediaWikiServices;
+use ObjectCache;
+use SpecialPage;
+use StatsTable;
+use Title;
+use Wikimedia\Rdbms\ILoadBalancer;
/**
- * Implements special page Special:SupportedLanguages. The wiki administrator
- * must define NS_PORTAL, otherwise this page does not work. This page displays
- * a list of language portals for all portals corresponding with a language
- * code defined for MediaWiki and a subpage called "translators". The subpage
- * "translators" must contain the template [[:{{ns:template}}:User|User]],
- * taking a user name as parameter.
+ * This special page shows active languages and active translators per language.
*
+ * @author Niklas Laxström
+ * @author Siebrand Mazeland
+ * @license GPL-2.0-or-later
* @ingroup SpecialPage TranslateSpecialPage Stats
*/
-class SpecialSupportedLanguages extends SpecialPage {
+class ActiveLanguagesSpecialPage extends SpecialPage {
+ /** @var ServiceOptions */
private $options;
-
/** @var TranslatorActivity */
private $translatorActivity;
-
- /// Cutoff time for inactivity in days
- protected $period = 180;
-
- public function __construct() {
+ /** @var LanguageNameUtils */
+ private $langNameUtils;
+ /** @var ILoadBalancer */
+ private $loadBalancer;
+ /** @var int Cutoff time for inactivity in days */
+ private $period = 180;
+
+ public const CONSTRUCTOR_OPTIONS = [
+ 'TranslateAuthorBlacklist',
+ 'TranslateMessageNamespaces',
+ ];
+
+ public function __construct(
+ Config $config,
+ TranslatorActivity $translatorActivity,
+ LanguageNameUtils $langNameUtils,
+ ILoadBalancer $loadBalancer
+ ) {
parent::__construct( 'SupportedLanguages' );
- // TODO: Use construction injection when 1.33 is no longer supported
- // TODO: Only inject the needed configuration options when 1.33 is no longer supported
- $this->options = MediaWikiServices::getInstance()->getMainConfig();
- $this->translatorActivity = Services::getInstance()->getTranslatorActivity();
+ $this->options = new ServiceOptions( self::CONSTRUCTOR_OPTIONS, $config );
+ $this->translatorActivity = $translatorActivity;
+ $this->langNameUtils = $langNameUtils;
+ $this->loadBalancer = $loadBalancer;
}
protected function getGroupName() {
@@ -55,15 +67,14 @@ class SpecialSupportedLanguages extends SpecialPage {
$lang = $this->getLanguage();
$this->setHeaders();
- $out->addModules( 'ext.translate.special.supportedlanguages' );
- $out->addModuleStyles( 'ext.translate.special.supportedlanguages' );
+ $out->addModuleStyles( 'ext.translate.specialpages.styles' );
$out->addHelpLink(
'Help:Extension:Translate/Statistics_and_reporting#List_of_languages_and_translators'
);
$this->outputHeader( 'supportedlanguages-summary' );
- $dbr = wfGetDB( DB_REPLICA );
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
if ( $dbr->getType() === 'sqlite' ) {
$out->wrapWikiMsg(
'<div class="errorbox">$1</div>',
@@ -74,7 +85,7 @@ class SpecialSupportedLanguages extends SpecialPage {
$out->addWikiMsg( 'supportedlanguages-localsummary' );
- $names = Language::fetchLanguageNames( null, 'all' );
+ $names = $this->langNameUtils->getLanguageNames( null, 'all' );
$languages = $this->languageCloud();
// There might be all sorts of subpages which are not languages
$languages = array_intersect_key( $languages, $names );
@@ -82,7 +93,7 @@ class SpecialSupportedLanguages extends SpecialPage {
$this->outputLanguageCloud( $languages, $names );
$out->addWikiMsg( 'supportedlanguages-count', $lang->formatNum( count( $languages ) ) );
- if ( !$par || !Language::isKnownLanguageTag( $par ) ) {
+ if ( !$par || !$this->langNameUtils->isKnownLanguageTag( $par ) ) {
return;
}
@@ -98,10 +109,10 @@ class SpecialSupportedLanguages extends SpecialPage {
$users = $data['users'];
$users = $this->filterUsers( $users, $language );
$this->preQueryUsers( $users );
- $this->showLanguage( $language, $users, $data['asOfTime'] );
+ $this->showLanguage( $language, $users, (int)$data['asOfTime'] );
}
- protected function showLanguage( string $code, array $users, int $cachedAt ): void {
+ private function showLanguage( string $code, array $users, int $cachedAt ): void {
$out = $this->getOutput();
$lang = $this->getLanguage();
@@ -112,8 +123,8 @@ class SpecialSupportedLanguages extends SpecialPage {
$linkInfo['stats']['title'] = SpecialPage::getTitleFor( 'LanguageStats' );
$linkInfo['stats']['msg'] = $this->msg( 'languagestats' )->text();
- $local = Language::fetchLanguageName( $code, $lang->getCode(), 'all' );
- $native = Language::fetchLanguageName( $code, null, 'all' );
+ $local = $this->langNameUtils->getLanguageName( $code, $lang->getCode(), 'all' );
+ $native = $this->langNameUtils->getLanguageName( $code, null, 'all' );
if ( $local !== $native ) {
$headerText = $this->msg( 'supportedlanguages-portallink' )
@@ -159,16 +170,17 @@ class SpecialSupportedLanguages extends SpecialPage {
$out->addWikiMsg( 'translate-supportedlanguages-cached', $ageString );
}
- protected function languageCloud() {
- $cache = wfGetCache( CACHE_ANYTHING );
- $cachekey = wfMemcKey( 'translate-supportedlanguages-language-cloud' );
+ private function languageCloud(): array {
+ // TODO: Inject a factory when such a thing is available in MediaWiki core
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ $cachekey = $cache->makeKey( 'translate-supportedlanguages-language-cloud', 'v2' );
$data = $cache->get( $cachekey );
if ( is_array( $data ) ) {
return $data;
}
- $dbr = wfGetDB( DB_REPLICA );
+ $dbr = $this->loadBalancer->getConnectionRef( DB_REPLICA );
$tables = [ 'recentchanges' ];
$fields = [ 'substring_index(rc_title, \'/\', -1) as lang', 'count(*) as count' ];
$timestamp = $dbr->timestamp( wfTimestamp( TS_UNIX ) - 60 * 60 * 24 * $this->period );
@@ -184,7 +196,7 @@ class SpecialSupportedLanguages extends SpecialPage {
$data = [];
foreach ( $res as $row ) {
- $data[$row->lang] = $row->count;
+ $data[$row->lang] = (int)$row->count;
}
$cache->set( $cachekey, $data, 3600 );
@@ -193,28 +205,29 @@ class SpecialSupportedLanguages extends SpecialPage {
}
protected function filterUsers( array $users, string $code ): array {
- $blacklist = $this->options->get( 'TranslateAuthorBlacklist' );
+ $exclusionList = $this->options->get( 'TranslateAuthorBlacklist' );
- foreach ( array_keys( $users ) as $username ) {
+ foreach ( $users as $index => $user ) {
+ $username = $user[TranslatorActivityQuery::USER_NAME];
# We do not know the group
$hash = "#;$code;$username";
- $blacklisted = false;
- foreach ( $blacklist as $rule ) {
+ $excluded = false;
+ foreach ( $exclusionList as $rule ) {
[ $type, $regex ] = $rule;
if ( preg_match( $regex, $hash ) ) {
if ( $type === 'white' ) {
- $blacklisted = false;
+ $excluded = false;
break;
} else {
- $blacklisted = true;
+ $excluded = true;
}
}
}
- if ( $blacklisted ) {
- unset( $users[$username] );
+ if ( $excluded ) {
+ unset( $users[$index] );
}
}
@@ -243,7 +256,7 @@ class SpecialSupportedLanguages extends SpecialPage {
$out->addHTML( '</div>' );
}
- protected function makeUserList( array $userStats ): void {
+ private function makeUserList( array $userStats ): void {
$day = 60 * 60 * 24;
// Scale of the activity colors, anything
@@ -254,7 +267,7 @@ class SpecialSupportedLanguages extends SpecialPage {
$statsTable = new StatsTable();
// List users in descending order by number of translations in this language
- uasort( $userStats, function ( $a, $b ) {
+ usort( $userStats, function ( $a, $b ) {
return -(
$a[TranslatorActivityQuery::USER_TRANSLATIONS]
<=>
@@ -262,7 +275,8 @@ class SpecialSupportedLanguages extends SpecialPage {
);
} );
- foreach ( $userStats as $username => $stats ) {
+ foreach ( $userStats as $stats ) {
+ $username = $stats[TranslatorActivityQuery::USER_NAME];
$title = Title::makeTitleSafe( NS_USER, $username );
if ( !$title ) {
LoggerFactory::getInstance( 'Translate' )->warning(
@@ -283,24 +297,27 @@ class SpecialSupportedLanguages extends SpecialPage {
$last = wfTimestamp( TS_UNIX ) - wfTimestamp( TS_UNIX, $lastTranslationTimestamp );
$last = round( $last / $day );
- $attribs['title'] = $this->msg( 'supportedlanguages-activity', $username )
- ->numParams( $count, $last )->text();
+ $attribs['title'] =
+ $this->msg( 'supportedlanguages-activity', $username )
+ ->numParams( $count, $last )
+ ->text();
$last = max( 1, min( $period, $last ) );
- $styles['border-bottom'] = '3px solid #' .
- $statsTable->getBackgroundColor( ( $period - $last ) / $period );
+ $styles['border-bottom'] =
+ '3px solid #' . $statsTable->getBackgroundColor( ( $period - $last ) / $period );
$stylestr = $this->formatStyle( $styles );
if ( $stylestr ) {
$attribs['style'] = $stylestr;
}
- $links[] = $this->getLinkRenderer()->makeLink( $title, new HtmlArmor( $enc ), $attribs );
+ $links[] =
+ $this->getLinkRenderer()->makeLink( $title, new HtmlArmor( $enc ), $attribs );
}
// for GENDER support
$usernameForGender = '';
if ( count( $userStats ) === 1 ) {
- $usernameForGender = array_key_first( $userStats );
+ $usernameForGender = $userStats[0][TranslatorActivityQuery::USER_NAME];
}
$linkList = $this->getLanguage()->listToText( $links );
@@ -324,9 +341,10 @@ class SpecialSupportedLanguages extends SpecialPage {
}
protected function preQueryUsers( array $users ): void {
- $lb = new LinkBatch;
- foreach ( $users as $user => $data ) {
- $user = Title::capitalize( $user, NS_USER );
+ $lb = new LinkBatch();
+ foreach ( $users as $data ) {
+ $username = $data[TranslatorActivityQuery::USER_NAME];
+ $user = Title::capitalize( $username, NS_USER );
$lb->add( NS_USER, $user );
$lb->add( NS_USER_TALK, $user );
}
diff --git a/MLEB/Translate/src/Statistics/CleanupTranslationProgressStatsMaintenanceScript.php b/MLEB/Translate/src/Statistics/CleanupTranslationProgressStatsMaintenanceScript.php
new file mode 100644
index 00000000..764af9e5
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/CleanupTranslationProgressStatsMaintenanceScript.php
@@ -0,0 +1,84 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use Maintenance;
+use MediaWiki\MediaWikiServices;
+use MessageGroups;
+use RawMessage;
+use TranslateUtils;
+use const DB_MASTER;
+
+/**
+ * @since 2021.03
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class CleanupTranslationProgressStatsMaintenanceScript extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Remove obsolete entries from translate_groupstats table' );
+ $this->requireExtension( 'Translate' );
+ }
+
+ public function execute() {
+ $services = MediaWikiServices::getInstance();
+ $db = $services->getDBLoadBalancer()->getConnectionRef( DB_MASTER );
+
+ $dbGroupIds = $db->selectFieldValues(
+ 'translate_groupstats',
+ 'DISTINCT(tgs_group)',
+ '*',
+ __METHOD__
+ );
+ $knownGroupIds = array_map(
+ 'MessageGroupStats::getDatabaseIdForGroupId',
+ array_keys( MessageGroups::singleton()->getGroups() )
+ );
+ $unknownGroupIds = array_diff( $dbGroupIds, $knownGroupIds );
+
+ if ( $unknownGroupIds !== [] ) {
+ $msg = ( new RawMessage( "Removing rows for $1 unknown group{{PLURAL:$1||s}}:\n" ) )
+ ->numParams( count( $unknownGroupIds ) )
+ ->inLanguage( 'en' )
+ ->text();
+ $this->output( $msg );
+ foreach ( $unknownGroupIds as $id ) {
+ $this->output( "* $id\n" );
+ }
+ $db->delete(
+ 'translate_groupstats',
+ [ 'tgs_group' => $unknownGroupIds ],
+ __METHOD__
+ );
+ }
+
+ $dbLanguages = $db->selectFieldValues(
+ 'translate_groupstats',
+ 'DISTINCT(tgs_lang)',
+ '*',
+ __METHOD__
+ );
+ $knownLanguages = array_keys( TranslateUtils::getLanguageNames( 'en' ) );
+ $unknownLanguages = array_diff( $dbLanguages, $knownLanguages );
+
+ if ( $unknownLanguages !== [] ) {
+ $msg = ( new RawMessage( "Removing rows for $1 unknown language{{PLURAL:$1||s}}:\n" ) )
+ ->numParams( count( $unknownLanguages ) )
+ ->inLanguage( 'en' )
+ ->text();
+ $this->output( $msg );
+ foreach ( $unknownLanguages as $languageCode ) {
+ $this->output( "* $languageCode\n" );
+ }
+ $db->delete(
+ 'translate_groupstats',
+ [ 'tgs_lang' => $unknownLanguages ],
+ __METHOD__
+ );
+ }
+
+ $this->output( "Done.\n" );
+ }
+}
diff --git a/MLEB/Translate/src/Statistics/QueryTranslationStatsActionApi.php b/MLEB/Translate/src/Statistics/QueryTranslationStatsActionApi.php
new file mode 100644
index 00000000..f6278297
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/QueryTranslationStatsActionApi.php
@@ -0,0 +1,84 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use ApiBase;
+use ApiMain;
+use MediaWiki\Extension\Translate\Services;
+
+/**
+ * Api module for querying translation statistics
+ * @ingroup API TranslateAPI
+ * @since 2020.09
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ */
+class QueryTranslationStatsActionApi extends ApiBase {
+ /** @var TranslationStatsDataProvider */
+ private $dataProvider;
+
+ public function __construct( ApiMain $mainModule, $moduleName ) {
+ parent::__construct( $mainModule, $moduleName );
+ $this->dataProvider = Services::getInstance()->getTranslationStatsDataProvider();
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $graphOpts = new TranslationStatsGraphOptions();
+ $graphOpts->bindArray( $params );
+
+ $language = $this->getLanguage();
+
+ [ $labels, $data ] = $this->dataProvider->getGraphData( $graphOpts, $language );
+ $output = [
+ 'labels' => $labels,
+ 'data' => $data
+ ];
+
+ $this->getResult()->addValue( null, $this->getModuleName(), $output );
+ }
+
+ protected function getAllowedParams() {
+ return [
+ 'count' => [
+ ApiBase::PARAM_TYPE => $this->dataProvider->getGraphTypes(),
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'days' => [
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_REQUIRED => true,
+ ApiBase::PARAM_DFLT => 30,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => 1000,
+ ApiBase::PARAM_RANGE_ENFORCE => true
+ ],
+ 'group' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_ISMULTI => true
+ ],
+ 'language' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_ISMULTI => true
+ ],
+ 'scale' => [
+ ApiBase::PARAM_TYPE => TranslationStatsGraphOptions::VALID_SCALES,
+ ApiBase::PARAM_DFLT => 'days'
+ ],
+ 'start' => [
+ ApiBase::PARAM_TYPE => 'timestamp'
+ ]
+ ];
+ }
+
+ protected function getExamplesMessages() {
+ return [
+ 'action=translationstats&count=edits&days=30'
+ => 'apihelp-translationstats-example-1',
+ 'action=translationstats&count=edits&days=30&language=en|fr'
+ => 'apihelp-translationstats-example-2'
+ ];
+ }
+}
+
+class_alias( QueryTranslationStatsActionApi::class, '\MediaWiki\Extensions\Translate\QueryTranslationStatsActionApi' );
diff --git a/MLEB/Translate/src/Statistics/ReviewPerLanguageStats.php b/MLEB/Translate/src/Statistics/ReviewPerLanguageStats.php
new file mode 100644
index 00000000..7b3a2862
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/ReviewPerLanguageStats.php
@@ -0,0 +1,115 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use TranslateUtils;
+
+/**
+ * Graph which provides statistics on number of reviews and reviewers.
+ * @ingroup Stats
+ * @license GPL-2.0-or-later
+ * @since 2012.03
+ */
+class ReviewPerLanguageStats extends TranslatePerLanguageStats {
+ public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
+ global $wgTranslateMessageNamespaces;
+
+ $db = wfGetDB( DB_REPLICA );
+
+ $tables = [ 'logging' ];
+ $fields = [ 'log_timestamp' ];
+ $joins = [];
+
+ $conds = [
+ 'log_namespace' => $wgTranslateMessageNamespaces,
+ 'log_action' => 'message',
+ ];
+
+ $timeConds = self::makeTimeCondition( 'log_timestamp', $start, $end );
+ $conds = array_merge( $conds, $timeConds );
+
+ $options = [ 'ORDER BY' => 'log_timestamp' ];
+
+ $this->groups = $this->opts->getGroups();
+
+ $namespaces = self::namespacesFromGroups( $this->groups );
+ if ( count( $namespaces ) ) {
+ $conds['log_namespace'] = $namespaces;
+ }
+
+ $languages = [];
+ foreach ( $this->opts->getLanguages() as $code ) {
+ $languages[] = 'log_title ' . $db->buildLike( $db->anyString(), "/$code" );
+ }
+ if ( count( $languages ) ) {
+ $conds[] = $db->makeList( $languages, LIST_OR );
+ }
+
+ $fields[] = 'log_title';
+
+ if ( $this->groups ) {
+ $fields[] = 'log_namespace';
+ }
+
+ if ( $this->opts->getValue( 'count' ) === 'reviewers' ) {
+ $tables[] = 'actor';
+ $joins['actor'] = [ 'JOIN', 'actor_id=log_actor' ];
+ $fields['log_user_text'] = 'actor_name';
+ }
+
+ $type .= '-reviews';
+ }
+
+ public function indexOf( $row ) {
+ // We need to check that there is only one user per day.
+ if ( $this->opts->getValue( 'count' ) === 'reviewers' ) {
+ $date = $this->formatTimestamp( $row->log_timestamp );
+
+ if ( isset( $this->usercache[$date][$row->log_user_text] ) ) {
+ return false;
+ } else {
+ $this->usercache[$date][$row->log_user_text] = 1;
+ }
+ }
+
+ // Do not consider language-less pages.
+ if ( strpos( $row->log_title, '/' ) === false ) {
+ return false;
+ }
+
+ // No filters, just one key to track.
+ if ( !$this->groups && !$this->opts->getLanguages() ) {
+ return [ 'all' ];
+ }
+
+ // The key-building needs to be in sync with ::labels().
+ list( $key, $code ) = TranslateUtils::figureMessage( $row->log_title );
+
+ $groups = [];
+ $codes = [];
+
+ if ( $this->groups ) {
+ /* Get list of keys that the message belongs to, and filter
+ * out those which are not requested. */
+ $groups = TranslateUtils::messageKeyToGroups( $row->log_namespace, $key );
+ $groups = array_intersect( $this->groups, $groups );
+ }
+
+ if ( $this->opts->getLanguages() ) {
+ $codes = [ $code ];
+ }
+
+ return $this->combineTwoArrays( $groups, $codes );
+ }
+
+ public function labels() {
+ return $this->combineTwoArrays( $this->groups, $this->opts->getLanguages() );
+ }
+
+ public function getTimestamp( $row ) {
+ return $row->log_timestamp;
+ }
+}
+
+class_alias( ReviewPerLanguageStats::class, '\MediaWiki\Extensions\Translate\ReviewPerLanguageStats' );
diff --git a/MLEB/Translate/src/Statistics/StatisticsUnavailable.php b/MLEB/Translate/src/Statistics/StatisticsUnavailable.php
index e92a62fe..6321b47d 100644
--- a/MLEB/Translate/src/Statistics/StatisticsUnavailable.php
+++ b/MLEB/Translate/src/Statistics/StatisticsUnavailable.php
@@ -5,12 +5,12 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use RuntimeException;
-/**
- * @since 2020.04
- */
+/** @since 2020.04 */
class StatisticsUnavailable extends RuntimeException {
}
+
+class_alias( StatisticsUnavailable::class, '\MediaWiki\Extensions\Translate\StatisticsUnavailable' );
diff --git a/MLEB/Translate/src/Statistics/TranslatePerLanguageStats.php b/MLEB/Translate/src/Statistics/TranslatePerLanguageStats.php
new file mode 100644
index 00000000..2461be89
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslatePerLanguageStats.php
@@ -0,0 +1,195 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use MediaWiki\MediaWikiServices;
+use TranslateUtils;
+
+/**
+ * Graph which provides statistics on active users and number of translations.
+ * @ingroup Stats
+ * @license GPL-2.0-or-later
+ * @since 2010.07
+ */
+class TranslatePerLanguageStats extends TranslationStatsBase {
+ /** @var int[][] array( string => int ) Cache used to count active users only once per day. */
+ protected $usercache;
+ protected $groups;
+
+ public function __construct( TranslationStatsGraphOptions $opts ) {
+ parent::__construct( $opts );
+ // This query is slow... ensure a lower limit.
+ $opts->boundValue( 'days', 1, 200 );
+ }
+
+ public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
+ global $wgTranslateMessageNamespaces;
+
+ $db = wfGetDB( DB_REPLICA );
+
+ $tables = [ 'recentchanges' ];
+ $fields = [ 'rc_timestamp' ];
+ $joins = [];
+
+ $conds = [
+ 'rc_namespace' => $wgTranslateMessageNamespaces,
+ 'rc_bot' => 0,
+ 'rc_type != ' . RC_LOG,
+ ];
+
+ $timeConds = self::makeTimeCondition( 'rc_timestamp', $start, $end );
+ $conds = array_merge( $conds, $timeConds );
+
+ $options = [ 'ORDER BY' => 'rc_timestamp' ];
+
+ $this->groups = array_map( 'MessageGroups::normalizeId', $this->opts->getGroups() );
+
+ $namespaces = self::namespacesFromGroups( $this->groups );
+ if ( count( $namespaces ) ) {
+ $conds['rc_namespace'] = $namespaces;
+ }
+
+ $languages = [];
+ foreach ( $this->opts->getLanguages() as $code ) {
+ $languages[] = 'rc_title ' . $db->buildLike( $db->anyString(), "/$code" );
+ }
+ if ( count( $languages ) ) {
+ $conds[] = $db->makeList( $languages, LIST_OR );
+ }
+
+ $fields[] = 'rc_title';
+
+ if ( $this->groups ) {
+ $fields[] = 'rc_namespace';
+ }
+
+ if ( $this->opts->getValue( 'count' ) === 'users' ) {
+ $tables[] = 'actor';
+ $joins['actor'] = [ 'JOIN', 'actor_id=rc_actor' ];
+ $fields['rc_user_text'] = 'actor_name';
+ }
+
+ $type .= '-perlang';
+ }
+
+ public function indexOf( $row ) {
+ // We need to check that there is only one user per day.
+ if ( $this->opts->getValue( 'count' ) === 'users' ) {
+ $date = $this->formatTimestamp( $row->rc_timestamp );
+
+ if ( isset( $this->usercache[$date][$row->rc_user_text] ) ) {
+ return false;
+ } else {
+ $this->usercache[$date][$row->rc_user_text] = 1;
+ }
+ }
+
+ // Do not consider language-less pages.
+ if ( strpos( $row->rc_title, '/' ) === false ) {
+ return false;
+ }
+
+ // No filters, just one key to track.
+ if ( !$this->groups && !$this->opts->getLanguages() ) {
+ return [ 'all' ];
+ }
+
+ // The key-building needs to be in sync with ::labels().
+ list( $key, $code ) = TranslateUtils::figureMessage( $row->rc_title );
+
+ $groups = [];
+ $codes = [];
+
+ if ( $this->groups ) {
+ /*
+ * Get list of keys that the message belongs to, and filter
+ * out those which are not requested.
+ */
+ $groups = TranslateUtils::messageKeyToGroups( $row->rc_namespace, $key );
+ $groups = array_intersect( $this->groups, $groups );
+ }
+
+ if ( $this->opts->getLanguages() ) {
+ $codes = [ $code ];
+ }
+
+ return $this->combineTwoArrays( $groups, $codes );
+ }
+
+ public function labels() {
+ return $this->combineTwoArrays( $this->groups, $this->opts->getLanguages() );
+ }
+
+ public function getTimestamp( $row ) {
+ return $row->rc_timestamp;
+ }
+
+ /**
+ * Makes a label for variable. If group or language code filters, or both
+ * are used, combine those in a pretty way.
+ * @param string $group Group name.
+ * @param string $code Language code.
+ * @return string Label.
+ */
+ protected function makeLabel( $group, $code ) {
+ if ( $group || $code ) {
+ return "$group@$code";
+ } else {
+ return 'all';
+ }
+ }
+
+ /**
+ * Cross-product of two lists with string results, where either
+ * list can be empty.
+ * @param string[] $groups Group names.
+ * @param string[] $codes Language codes.
+ * @return string[] Labels.
+ */
+ protected function combineTwoArrays( $groups, $codes ) {
+ if ( !count( $groups ) ) {
+ $groups[] = false;
+ }
+
+ if ( !count( $codes ) ) {
+ $codes[] = false;
+ }
+
+ $items = [];
+ foreach ( $groups as $group ) {
+ foreach ( $codes as $code ) {
+ $items[] = $this->makeLabel( $group, $code );
+ }
+ }
+
+ return $items;
+ }
+
+ /**
+ * Returns unique index for given item in the scale being used.
+ * Called a lot, so performance intensive.
+ * @param string $timestamp Timestamp in mediawiki format.
+ * @return string
+ */
+ protected function formatTimestamp( $timestamp ) {
+ switch ( $this->opts->getValue( 'scale' ) ) {
+ case 'hours':
+ $cut = 4;
+ break;
+ case 'days':
+ $cut = 6;
+ break;
+ case 'months':
+ $cut = 8;
+ break;
+ default:
+ return MediaWikiServices::getInstance()->getContentLanguage()
+ ->sprintfDate( $this->getDateFormat(), $timestamp );
+ }
+
+ return substr( $timestamp, 0, -$cut );
+ }
+}
+
+class_alias( TranslatePerLanguageStats::class, '\MediaWiki\Extensions\Translate\TranslatePerLanguageStats' );
diff --git a/MLEB/Translate/src/Statistics/TranslateRegistrationStats.php b/MLEB/Translate/src/Statistics/TranslateRegistrationStats.php
new file mode 100644
index 00000000..aca7506b
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslateRegistrationStats.php
@@ -0,0 +1,27 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+/**
+ * Graph which provides statistics about amount of registered users in a given time.
+ * @ingroup Stats
+ * @license GPL-2.0-or-later
+ * @since 2010.07
+ */
+class TranslateRegistrationStats extends TranslationStatsBase {
+ public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end ) {
+ $tables = 'user';
+ $fields = 'user_registration';
+ $conds = self::makeTimeCondition( 'user_registration', $start, $end );
+ $type .= '-registration';
+ $options = [];
+ $joins = [];
+ }
+
+ public function getTimestamp( $row ) {
+ return $row->user_registration;
+ }
+}
+
+class_alias( TranslateRegistrationStats::class, '\MediaWiki\Extensions\Translate\TranslateRegistrationStats' );
diff --git a/MLEB/Translate/src/Statistics/TranslationStatsBase.php b/MLEB/Translate/src/Statistics/TranslationStatsBase.php
new file mode 100644
index 00000000..3960231d
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslationStatsBase.php
@@ -0,0 +1,77 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use MessageGroups;
+
+/**
+ * Provides some hand default implementations for TranslationStatsInterface.
+ * @ingroup Stats
+ * @license GPL-2.0-or-later
+ * @since 2010.07
+ */
+abstract class TranslationStatsBase implements TranslationStatsInterface {
+ /** @var TranslationStatsGraphOptions */
+ protected $opts;
+
+ public function __construct( TranslationStatsGraphOptions $opts ) {
+ $this->opts = $opts;
+ }
+
+ public function indexOf( $row ) {
+ return [ 'all' ];
+ }
+
+ public function labels() {
+ return [ 'all' ];
+ }
+
+ public function getDateFormat() {
+ $dateFormat = 'Y-m-d';
+ $scale = $this->opts->getValue( 'scale' );
+ if ( $scale === 'months' ) {
+ $dateFormat = 'Y-m';
+ } elseif ( $scale === 'weeks' ) {
+ $dateFormat = 'Y-\WW';
+ } elseif ( $scale === 'hours' ) {
+ $dateFormat .= ';H';
+ }
+
+ return $dateFormat;
+ }
+
+ protected static function makeTimeCondition( $field, $start, $end ) {
+ $db = wfGetDB( DB_REPLICA );
+
+ $conds = [];
+ if ( $start !== null ) {
+ $conds[] = "$field >= '{$db->timestamp( $start )}'";
+ }
+ if ( $end !== null ) {
+ $conds[] = "$field <= '{$db->timestamp( $end )}'";
+ }
+
+ return $conds;
+ }
+
+ /**
+ * @since 2012-03-05
+ * @param array $groupIds
+ * @return array
+ */
+ protected static function namespacesFromGroups( $groupIds ) {
+ $namespaces = [];
+ foreach ( $groupIds as $id ) {
+ $group = MessageGroups::getGroup( $id );
+ if ( $group ) {
+ $namespace = $group->getNamespace();
+ $namespaces[$namespace] = true;
+ }
+ }
+
+ return array_keys( $namespaces );
+ }
+}
+
+class_alias( TranslationStatsBase::class, '\MediaWiki\Extensions\Translate\TranslationStatsBase' );
diff --git a/MLEB/Translate/src/Statistics/TranslationStatsDataProvider.php b/MLEB/Translate/src/Statistics/TranslationStatsDataProvider.php
new file mode 100644
index 00000000..20118822
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslationStatsDataProvider.php
@@ -0,0 +1,233 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use Language;
+use MediaWiki\Config\ServiceOptions;
+use MessageGroups;
+use TranslateUtils;
+use Wikimedia\ObjectFactory;
+
+/**
+ * Provides translation stats data
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.09
+ */
+class TranslationStatsDataProvider {
+ public const CONSTRUCTOR_OPTIONS = [
+ 'TranslateStatsProviders'
+ ];
+
+ /** @var ObjectFactory */
+ private $objectFactory;
+ /** @var ServiceOptions */
+ private $options;
+
+ public function __construct( ServiceOptions $options, ObjectFactory $objectFactory ) {
+ $this->options = $options;
+ $this->objectFactory = $objectFactory;
+ }
+
+ private function getGraphSpecifications(): array {
+ return array_filter( $this->options->get( 'TranslateStatsProviders' ) );
+ }
+
+ public function getGraphTypes(): array {
+ return array_keys( $this->getGraphSpecifications() );
+ }
+
+ /**
+ * Fetches and preprocesses graph data that can be fed to graph drawer.
+ * @param TranslationStatsGraphOptions $opts
+ * @param Language $language
+ * @return array ( string => array ) Data indexed by their date labels.
+ */
+ public function getGraphData( TranslationStatsGraphOptions $opts, Language $language ) {
+ $dbr = wfGetDB( DB_REPLICA );
+
+ $so = $this->getStatsProvider( $opts->getValue( 'count' ), $opts );
+
+ $fixedStart = $opts->getValue( 'start' ) !== '';
+
+ $now = time();
+ $period = 3600 * 24 * $opts->getValue( 'days' );
+
+ if ( $fixedStart ) {
+ $cutoff = (int)wfTimestamp( TS_UNIX, $opts->getValue( 'start' ) );
+ } else {
+ $cutoff = $now - $period;
+ }
+ $cutoff = self::roundTimestampToCutoff( $opts->getValue( 'scale' ), $cutoff, 'earlier' );
+
+ $start = $cutoff;
+
+ if ( $fixedStart ) {
+ $end = self::roundTimestampToCutoff( $opts->getValue( 'scale' ), $start + $period, 'later' ) - 1;
+ } else {
+ $end = null;
+ }
+
+ $tables = [];
+ $fields = [];
+ $conds = [];
+ $type = __METHOD__;
+ $options = [];
+ $joins = [];
+
+ $so->preQuery( $tables, $fields, $conds, $type, $options, $joins, $start, $end );
+ $res = $dbr->select( $tables, $fields, $conds, $type, $options, $joins );
+ wfDebug( __METHOD__ . "-queryend\n" );
+
+ // Start processing the data
+ $dateFormat = $so->getDateFormat();
+ $increment = self::getIncrement( $opts->getValue( 'scale' ) );
+
+ $labels = $so->labels();
+ $keys = array_keys( $labels );
+ $values = array_pad( [], count( $labels ), 0 );
+ $defaults = array_combine( $keys, $values );
+
+ $data = [];
+ // Allow 10 seconds in the future for processing time
+ $lastValue = $end ?? $now + 10;
+ while ( $cutoff <= $lastValue ) {
+ $date = $language->sprintfDate( $dateFormat, wfTimestamp( TS_MW, $cutoff ) );
+ $cutoff += $increment;
+ $data[$date] = $defaults;
+ }
+
+ // Processing
+ $labelToIndex = array_flip( $labels );
+
+ foreach ( $res as $row ) {
+ $indexLabels = $so->indexOf( $row );
+ if ( $indexLabels === false ) {
+ continue;
+ }
+
+ foreach ( (array)$indexLabels as $i ) {
+ if ( !isset( $labelToIndex[$i] ) ) {
+ continue;
+ }
+ $date = $language->sprintfDate( $dateFormat, $so->getTimestamp( $row ) );
+ // Ignore values outside range
+ if ( !isset( $data[$date] ) ) {
+ continue;
+ }
+
+ $data[$date][$labelToIndex[$i]]++;
+ }
+ }
+
+ // Don't display dummy label
+ if ( count( $labels ) === 1 && $labels[0] === 'all' ) {
+ $labels = [];
+ }
+
+ foreach ( $labels as &$label ) {
+ if ( strpos( $label, '@' ) === false ) {
+ continue;
+ }
+ [ $groupId, $code ] = explode( '@', $label, 2 );
+ if ( $code && $groupId ) {
+ $code = TranslateUtils::getLanguageName( $code, $language->getCode() ) . " ($code)";
+ $group = MessageGroups::getGroup( $groupId );
+ $group = $group ? $group->getLabel() : $groupId;
+ $label = "$group @ $code";
+ } elseif ( $code ) {
+ $label = TranslateUtils::getLanguageName( $code, $language->getCode() ) . " ($code)";
+ } elseif ( $groupId ) {
+ $group = MessageGroups::getGroup( $groupId );
+ $label = $group ? $group->getLabel() : $groupId;
+ }
+ }
+
+ if ( $end === null ) {
+ $last = array_splice( $data, -1, 1 );
+ // Indicator that the last value is not full
+ $data[key( $last ) . '*'] = current( $last );
+ }
+
+ return [ $labels, $data ];
+ }
+
+ /** @noinspection PhpIncompatibleReturnTypeInspection */
+ private function getStatsProvider( string $type, TranslationStatsGraphOptions $opts ): TranslationStatsInterface {
+ $specs = $this->getGraphSpecifications();
+ return $this->objectFactory->createObject(
+ $specs[$type],
+ [
+ 'allowClassName' => true,
+ 'extraArgs' => [ $opts ],
+ ]
+ );
+ }
+
+ /**
+ * Gets the closest earliest timestamp that corresponds to start of a
+ * period in given scale, like, midnight, monday or first day of the month.
+ */
+ private static function roundTimestampToCutoff(
+ string $scale, int $cutoff, string $direction = 'earlier'
+ ): int {
+ $dir = $direction === 'earlier' ? -1 : 1;
+
+ /* Ensure that the first item in the graph has full data even
+ * if it doesn't align with the given 'days' boundary */
+ if ( $scale === 'hours' ) {
+ $cutoff += self::roundingAddition( $cutoff, 3600, $dir );
+ } elseif ( $scale === 'days' ) {
+ $cutoff += self::roundingAddition( $cutoff, 86400, $dir );
+ } elseif ( $scale === 'weeks' ) {
+ /* Here we assume that week starts on monday, which does not
+ * always hold true. Go Xwards day by day until we are on monday */
+ while ( date( 'D', $cutoff ) !== 'Mon' ) {
+ $cutoff += $dir * 86400;
+ }
+ // Round to nearest day
+ $cutoff -= ( $cutoff % 86400 );
+ } elseif ( $scale === 'months' ) {
+ // Go Xwards/ day by day until we are on the first day of the month
+ while ( date( 'j', $cutoff ) !== '1' ) {
+ $cutoff += $dir * 86400;
+ }
+ // Round to nearest day
+ $cutoff -= ( $cutoff % 86400 );
+ }
+
+ return $cutoff;
+ }
+
+ private static function roundingAddition( int $ts, int $amount, int $dir ): int {
+ if ( $dir === -1 ) {
+ return -1 * ( $ts % $amount );
+ } else {
+ return $amount - ( $ts % $amount );
+ }
+ }
+
+ /**
+ * Returns an increment in seconds for a given scale.
+ * The increment must be small enough that we will hit every item in the
+ * scale when using different multiples of the increment. It should be
+ * large enough to avoid hitting the same item multiple times.
+ */
+ private static function getIncrement( string $scale ): int {
+ $increment = 3600 * 24;
+ if ( $scale === 'months' ) {
+ /* We use increment to fill up the values. Use number small enough
+ * to ensure we hit each month */
+ $increment = 3600 * 24 * 15;
+ } elseif ( $scale === 'weeks' ) {
+ $increment = 3600 * 24 * 7;
+ } elseif ( $scale === 'hours' ) {
+ $increment = 3600;
+ }
+
+ return $increment;
+ }
+}
+
+class_alias( TranslationStatsDataProvider::class, '\MediaWiki\Extensions\Translate\TranslationStatsDataProvider' );
diff --git a/MLEB/Translate/src/Statistics/TranslationStatsGraphOptions.php b/MLEB/Translate/src/Statistics/TranslationStatsGraphOptions.php
new file mode 100644
index 00000000..250c664c
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslationStatsGraphOptions.php
@@ -0,0 +1,112 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use FormOptions;
+
+/**
+ * Encapsulates graph options
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.09
+ */
+class TranslationStatsGraphOptions {
+ /** @var FormOptions */
+ private $formOptions;
+ /** @var string[] */
+ public const VALID_SCALES = [ 'months', 'weeks', 'days', 'hours' ];
+
+ public function __construct() {
+ $this->formOptions = new FormOptions();
+ $this->formOptions->add( 'preview', false );
+ $this->formOptions->add( 'language', [] );
+ $this->formOptions->add( 'count', 'edits' );
+ $this->formOptions->add( 'scale', 'days' );
+ $this->formOptions->add( 'days', 30 );
+ $this->formOptions->add( 'width', 800 );
+ $this->formOptions->add( 'height', 600 );
+ $this->formOptions->add( 'group', [] );
+ $this->formOptions->add( 'uselang', '' );
+ $this->formOptions->add( 'start', '' );
+ }
+
+ public function bindArray( array $inputs ): void {
+ foreach ( $inputs as $key => $value ) {
+ if ( $this->formOptions->validateName( $key ) ) {
+ $this->formOptions[$key] = $value;
+ }
+ }
+ }
+
+ public function hasValue( string $key ): bool {
+ return isset( $this->formOptions[$key] );
+ }
+
+ public function setValue( string $key, $value ): void {
+ $this->formOptions[$key] = $value;
+ }
+
+ public function getValue( string $key ) {
+ return $this->formOptions[$key];
+ }
+
+ public function normalize( array $validCounts ): void {
+ $this->formOptions->validateIntBounds( 'days', 1, 10000 );
+ $this->formOptions->validateIntBounds( 'width', 200, 1000 );
+ $this->formOptions->validateIntBounds( 'height', 200, 1000 );
+
+ if ( $this->formOptions['start'] !== '' ) {
+ $timestamp = wfTimestamp( TS_ISO_8601, $this->formOptions['start'] );
+ if ( $timestamp ) {
+ $this->formOptions['start'] = rtrim( $timestamp, 'Z' );
+ } else {
+ $this->formOptions['start'] = '';
+ }
+ }
+
+ if ( !in_array( $this->formOptions['scale'], self::VALID_SCALES ) ) {
+ $this->formOptions['scale'] = 'days';
+ }
+
+ if ( $this->formOptions['scale'] === 'hours' ) {
+ $this->formOptions->validateIntBounds( 'days', 1, 4 );
+ }
+
+ if ( !in_array( $this->formOptions['count'], $validCounts ) ) {
+ $this->formOptions['count'] = 'edits';
+ }
+
+ foreach ( [ 'group', 'language' ] as $t ) {
+ if ( is_string( $this->formOptions[$t] ) ) {
+ $this->formOptions[$t] = explode( ',', $this->formOptions[$t] );
+ }
+
+ $values = array_map( 'trim', $this->formOptions[$t] );
+ $values = array_splice( $values, 0, 4 );
+ if ( $t === 'group' ) {
+ // BC for old syntax which replaced _ to | which was not allowed
+ $values = preg_replace( '~^page_~', 'page-', $values );
+ }
+ $this->formOptions[$t] = $values;
+ }
+ }
+
+ public function getGroups(): array {
+ return $this->formOptions['group'];
+ }
+
+ public function getLanguages(): array {
+ return $this->formOptions['language'];
+ }
+
+ public function getFormOptions(): FormOptions {
+ return $this->formOptions;
+ }
+
+ public function boundValue( string $key, int $min, int $max ): void {
+ $this->formOptions->validateIntBounds( $key, $min, $max );
+ }
+}
+
+class_alias( TranslationStatsGraphOptions::class, '\MediaWiki\Extensions\Translate\TranslationStatsGraphOptions' );
diff --git a/MLEB/Translate/src/Statistics/TranslationStatsInterface.php b/MLEB/Translate/src/Statistics/TranslationStatsInterface.php
new file mode 100644
index 00000000..e6f503a2
--- /dev/null
+++ b/MLEB/Translate/src/Statistics/TranslationStatsInterface.php
@@ -0,0 +1,68 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Statistics;
+
+use stdClass;
+
+/**
+ * Interface for producing different kinds of graphs.
+ * The graphs are based on data queried from the database.
+ *
+ * @ingroup Stats
+ * @license GPL-2.0-or-later
+ * @since 2010.07
+ */
+interface TranslationStatsInterface {
+ /**
+ * Constructor. The implementation can access the graph options, but not
+ * define new ones.
+ * @param TranslationStatsGraphOptions $opts
+ */
+ public function __construct( TranslationStatsGraphOptions $opts );
+
+ /**
+ * Query details that the graph must fill.
+ * @param array &$tables Empty list. Append table names.
+ * @param array &$fields Empty list. Append field names.
+ * @param array &$conds Empty array. Append select conditions.
+ * @param string &$type Append graph type (used to identify queries).
+ * @param array &$options Empty array. Append extra query options.
+ * @param array &$joins Empty array. Append extra join conditions.
+ * @param string $start Precalculated start cutoff timestamp
+ * @param string $end Precalculated end cutoff timestamp
+ */
+ public function preQuery( &$tables, &$fields, &$conds, &$type, &$options, &$joins, $start, $end );
+
+ /**
+ * Return the indexes which this result contributes to.
+ * Return 'all' if only one variable is measured. Return false if none.
+ * @param stdClass $row Database Result Row
+ * @return array|false
+ */
+ public function indexOf( $row );
+
+ /**
+ * Return the names of the variables being measured.
+ * Return 'all' if only one variable is measured. Must match indexes
+ * returned by indexOf() and contain them all.
+ * @return string[]
+ */
+ public function labels();
+
+ /**
+ * Return the timestamp associated with this result row.
+ * @param stdClass $row Database Result Row
+ * @return string Timestamp.
+ */
+ public function getTimestamp( $row );
+
+ /**
+ * Return time formatting string.
+ * @see Language::sprintfDate()
+ * @return string
+ */
+ public function getDateFormat();
+}
+
+class_alias( TranslationStatsInterface::class, '\MediaWiki\Extensions\Translate\TranslationStatsInterface' );
diff --git a/MLEB/Translate/src/Statistics/TranslatorActivity.php b/MLEB/Translate/src/Statistics/TranslatorActivity.php
index b8ee3b3f..754821bd 100644
--- a/MLEB/Translate/src/Statistics/TranslatorActivity.php
+++ b/MLEB/Translate/src/Statistics/TranslatorActivity.php
@@ -1,22 +1,20 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use BagOStuff;
use InvalidArgumentException;
use JobQueueGroup;
-use Language;
+use MediaWiki\Languages\LanguageNameUtils;
use PoolCounterWorkViaCallback;
use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* Handles caching of translator activity.
*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @since 2020.04
*/
class TranslatorActivity {
@@ -26,19 +24,18 @@ class TranslatorActivity {
private $cache;
private $query;
private $jobQueue;
- private $languageValidator;
+ private $languageNameUtils;
public function __construct(
BagOStuff $cache,
TranslatorActivityQuery $query,
JobQueueGroup $jobQueue,
- callable $languageValidator
+ LanguageNameUtils $languageNameUtils
) {
$this->cache = $cache;
$this->query = $query;
$this->jobQueue = $jobQueue;
- // FIXME: use LanguageNameUtils once 1.33 is no longer supported
- $this->languageValidator = $languageValidator;
+ $this->languageNameUtils = $languageNameUtils;
}
/**
@@ -77,11 +74,11 @@ class TranslatorActivity {
}
private function getCacheKey( string $language ): string {
- return $this->cache->makeKey( 'translate-translator-activity-v1', $language );
+ return $this->cache->makeKey( 'translate-translator-activity-v4', $language );
}
private function isStale( array $value ): bool {
- $age = ConvertibleTimestamp::now( TS_UNIX ) - $value['asOfTime'];
+ $age = intval( ConvertibleTimestamp::now( TS_UNIX ) ) - $value['asOfTime'];
return $age >= self::CACHE_STALE;
}
@@ -91,7 +88,7 @@ class TranslatorActivity {
}
private function doQueryAndCache( string $language ) {
- $now = ConvertibleTimestamp::now( TS_UNIX );
+ $now = (int)ConvertibleTimestamp::now( TS_UNIX );
$work = new PoolCounterWorkViaCallback(
'TranslateFetchTranslators', "TranslateFetchTranslators-$language", [
@@ -117,13 +114,11 @@ class TranslatorActivity {
$this->cache->set( $cacheKey, $value, self::CACHE_TIME );
}
- /**
- * Update cache for all languages, even if not stale.
- */
+ /** Update cache for all languages, even if not stale. */
public function updateAllLanguages(): void {
- $now = ConvertibleTimestamp::now( TS_UNIX );
+ $now = (int)ConvertibleTimestamp::now( TS_UNIX );
foreach ( $this->query->inAllLanguages() as $language => $users ) {
- if ( !Language::isKnownLanguageTag( $language ) ) {
+ if ( !$this->isValidLanguage( $language ) ) {
continue;
}
@@ -145,11 +140,13 @@ class TranslatorActivity {
$queriedValue = $this->doQueryAndCache( $language );
if ( !$queriedValue ) {
- throw new StatisticsUnavailable( "Unable to load stats" );
+ throw new StatisticsUnavailable( 'Unable to load stats' );
}
}
private function isValidLanguage( string $language ): bool {
- return call_user_func( $this->languageValidator, $language );
+ return $this->languageNameUtils->isKnownLanguageTag( $language );
}
}
+
+class_alias( TranslatorActivity::class, '\MediaWiki\Extensions\Translate\TranslatorActivity' );
diff --git a/MLEB/Translate/src/Statistics/TranslatorActivityQuery.php b/MLEB/Translate/src/Statistics/TranslatorActivityQuery.php
index d941a273..9b2ad8ad 100644
--- a/MLEB/Translate/src/Statistics/TranslatorActivityQuery.php
+++ b/MLEB/Translate/src/Statistics/TranslatorActivityQuery.php
@@ -1,11 +1,7 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use ActorMigration;
use Config;
@@ -15,18 +11,19 @@ use Wikimedia\Rdbms\ILoadBalancer;
/**
* Gathers translator activity from the database.
*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @since 2020.04
*/
class TranslatorActivityQuery {
- public const USER_TRANSLATIONS = 0;
- public const USER_LAST_ACTIVITY = 1;
+ public const USER_NAME = 0;
+ public const USER_TRANSLATIONS = 1;
+ public const USER_LAST_ACTIVITY = 2;
+ /** @var Config|ServiceOptions */
private $options;
+ /** @var ILoadBalancer */
private $loadBalancer;
- /**
- * @param Config|ServiceOptions $options
- * @param ILoadBalancer $loadBalancer
- */
public function __construct( $options, ILoadBalancer $loadBalancer ) {
$this->options = $options;
$this->loadBalancer = $loadBalancer;
@@ -36,7 +33,7 @@ class TranslatorActivityQuery {
* Fetch the translators for a language
*
* @param string $code Language tag
- * @return array<string,array<int|string>> Map of user name to translation stats
+ * @return array<int,array<string|int|string>> Translation stats per user
*/
public function inLanguage( string $code ): array {
$dbr = $this->loadBalancer->getConnection( DB_REPLICA, 'vslow' );
@@ -65,8 +62,10 @@ class TranslatorActivityQuery {
$data = [];
foreach ( $res as $row ) {
- $data[$row->rev_user_text] = [
- self::USER_TRANSLATIONS => $row->count,
+ // Warning: user names may be numbers that get casted to ints in array keys
+ $data[] = [
+ self::USER_NAME => $row->rev_user_text,
+ self::USER_TRANSLATIONS => (int)$row->count,
self::USER_LAST_ACTIVITY => $row->lastedit,
];
}
@@ -79,8 +78,8 @@ class TranslatorActivityQuery {
*
* This is faster than doing each language separately.
*
- * @return array<string,array<string,array<int|string>>> Map of language tags to user name to
- * translation stats
+ * @return array<string,array<int,array<string|int|string>>> Map of language tags to
+ * translation stats per user
*/
public function inAllLanguages(): array {
$dbr = $this->loadBalancer->getConnection( DB_REPLICA, 'vslow' );
@@ -111,8 +110,10 @@ class TranslatorActivityQuery {
$data = [];
foreach ( $res as $row ) {
- $data[$row->lang][$row->rev_user_text] = [
- self::USER_TRANSLATIONS => $row->count,
+ // Warning: user names may be numbers that get casted to ints in array keys
+ $data[$row->lang][] = [
+ self::USER_NAME => $row->rev_user_text,
+ self::USER_TRANSLATIONS => (int)$row->count,
self::USER_LAST_ACTIVITY => $row->lastedit,
];
}
@@ -120,3 +121,5 @@ class TranslatorActivityQuery {
return $data;
}
}
+
+class_alias( TranslatorActivityQuery::class, '\MediaWiki\Extensions\Translate\TranslatorActivityQuery' );
diff --git a/MLEB/Translate/src/Statistics/UpdateTranslatorActivityJob.php b/MLEB/Translate/src/Statistics/UpdateTranslatorActivityJob.php
index c07c25fe..06ec60f4 100644
--- a/MLEB/Translate/src/Statistics/UpdateTranslatorActivityJob.php
+++ b/MLEB/Translate/src/Statistics/UpdateTranslatorActivityJob.php
@@ -5,15 +5,13 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use GenericParameterJob;
-use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
-use MediaWiki\Extensions\Translate\Services;
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\Services;
-/**
- * @since 2020.04
- */
+/** @since 2020.04 */
class UpdateTranslatorActivityJob extends GenericTranslateJob implements GenericParameterJob {
public function __construct( array $params ) {
parent::__construct( 'UpdateTranslatorActivity', $params );
@@ -38,3 +36,5 @@ class UpdateTranslatorActivityJob extends GenericTranslateJob implements Generic
return true;
}
}
+
+class_alias( UpdateTranslatorActivityJob::class, '\MediaWiki\Extensions\Translate\UpdateTranslatorActivityJob' );
diff --git a/MLEB/Translate/src/Statistics/UpdateTranslatorActivityMaintenanceScript.php b/MLEB/Translate/src/Statistics/UpdateTranslatorActivityMaintenanceScript.php
index 89eaa8b9..7f92692d 100644
--- a/MLEB/Translate/src/Statistics/UpdateTranslatorActivityMaintenanceScript.php
+++ b/MLEB/Translate/src/Statistics/UpdateTranslatorActivityMaintenanceScript.php
@@ -5,14 +5,12 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use Maintenance;
-use MediaWiki\Extensions\Translate\Services;
+use MediaWiki\Extension\Translate\Services;
-/**
- * @since 2020.04
- */
+/** @since 2020.04 */
class UpdateTranslatorActivityMaintenanceScript extends Maintenance {
public function __construct() {
parent::__construct();
@@ -25,3 +23,8 @@ class UpdateTranslatorActivityMaintenanceScript extends Maintenance {
$this->output( "Done.\n" );
}
}
+
+class_alias(
+ UpdateTranslatorActivityMaintenanceScript::class,
+ '\MediaWiki\Extensions\Translate\UpdateTranslatorActivityMaintenanceScript'
+);
diff --git a/MLEB/Translate/src/Synchronization/ClearGroupSyncCacheMaintenanceScript.php b/MLEB/Translate/src/Synchronization/ClearGroupSyncCacheMaintenanceScript.php
new file mode 100644
index 00000000..d5cf1568
--- /dev/null
+++ b/MLEB/Translate/src/Synchronization/ClearGroupSyncCacheMaintenanceScript.php
@@ -0,0 +1,83 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Clear the contents of the group synchronization cache
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2021.01
+ */
+class ClearGroupSyncCacheMaintenanceScript extends BaseMaintenanceScript {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Clear the contents of the group synchronization cache for a single or all groups' );
+
+ $this->addOption(
+ 'group',
+ '(optional) Group Id being cleared',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'all',
+ '(optional) Clear all groups'
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ public function execute() {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+
+ if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $this->fatalError( 'GroupSynchronizationCache is not enabled' );
+ }
+
+ $this->validateParamsAndArgs();
+ $groupId = $this->getOption( 'group' );
+ $all = $this->hasOption( 'all' );
+ $groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
+
+ if ( $groupId ) {
+ $this->clearGroupFromSync( $groupSyncCache, $groupId );
+ $this->output( "Ended synchronization for group: $groupId\n" );
+ } elseif ( $all ) {
+ // Remove all groups
+ $groupsInSync = $groupSyncCache->getGroupsInSync();
+ $this->output( 'Found ' . count( $groupsInSync ) . " groups in sync.\n" );
+ foreach ( $groupsInSync as $groupId ) {
+ $this->clearGroupFromSync( $groupSyncCache, $groupId );
+ $this->output( "Ended synchronization for group: $groupId\n" );
+ }
+ }
+ }
+
+ public function validateParamsAndArgs() {
+ parent::validateParamsAndArgs();
+
+ $group = $this->getOption( 'group' );
+ $all = $this->hasOption( 'all' );
+
+ if ( $all && $group !== null ) {
+ $this->fatalError( 'The "all" and "group" options cannot be used together.' );
+ }
+
+ if ( !$all && $group === null ) {
+ $this->fatalError( 'One of "all" OR "group" options must be specified.' );
+ }
+ }
+
+ private function clearGroupFromSync( GroupSynchronizationCache $groupSyncCache, string $groupId ): void {
+ if ( !$groupSyncCache->isGroupBeingProcessed( $groupId ) ) {
+ $this->fatalError( "$groupId is currently not being processed" );
+ }
+
+ $groupSyncCache->forceEndSync( $groupId );
+ }
+}
diff --git a/MLEB/Translate/src/Synchronization/CompleteExternalTranslationMaintenanceScript.php b/MLEB/Translate/src/Synchronization/CompleteExternalTranslationMaintenanceScript.php
index 0c4d5aec..eb8ce627 100644
--- a/MLEB/Translate/src/Synchronization/CompleteExternalTranslationMaintenanceScript.php
+++ b/MLEB/Translate/src/Synchronization/CompleteExternalTranslationMaintenanceScript.php
@@ -2,12 +2,12 @@
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Synchronization;
+namespace MediaWiki\Extension\Translate\Synchronization;
use Maintenance;
-use MediaWiki\Extensions\Translate\Services;
+use MediaWiki\Extension\Translate\Services;
use MediaWiki\Logger\LoggerFactory;
-use MessageIndex;
+use MediaWiki\MediaWikiServices;
/**
* @author Abijeet Patro
@@ -25,6 +25,12 @@ class CompleteExternalTranslationMaintenanceScript extends Maintenance {
}
public function execute() {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+
+ if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $this->fatalError( 'GroupSynchronizationCache is not enabled' );
+ }
+
$logger = LoggerFactory::getInstance( 'Translate.GroupSynchronization' );
$groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
$groupsInSync = $groupSyncCache->getGroupsInSync();
@@ -47,20 +53,24 @@ class CompleteExternalTranslationMaintenanceScript extends Maintenance {
}
if ( $groupResponse->hasTimedOut() ) {
- $remainingMessageKeys = $groupResponse->getRemainingMessages();
+ $remainingMessages = $groupResponse->getRemainingMessages();
$logger->warning(
'MessageUpdateJobs timed out for group - {groupId}; ' .
'Messages - {messages}; ' .
'Jobs remaining - {jobRemaining}',
[
'groupId' => $groupId ,
- 'jobRemaining' => count( $remainingMessageKeys ),
- 'messages' => implode( ', ', $remainingMessageKeys )
+ 'jobRemaining' => count( $remainingMessages ),
+ 'messages' => implode( ', ', array_keys( $remainingMessages ) )
]
);
- wfLogWarning( 'MessageUpdateJob timed out for group - ' . $groupId );
- $groupSyncCache->endSync( $groupId );
+ $count = count( $remainingMessages );
+ wfLogWarning( "MessageUpdateJob timed out for group $groupId with $count message(s) remaining" );
+ $groupSyncCache->forceEndSync( $groupId );
+
+ $groupSyncCache->addGroupErrors( $groupResponse );
+
} else {
$groupsInProgress[] = $groupId;
}
@@ -68,8 +78,7 @@ class CompleteExternalTranslationMaintenanceScript extends Maintenance {
if ( !$groupsInProgress ) {
// No groups in progress.
- $logger->info( 'All message groups are now in sync. Starting MessageIndex rebuild' );
- MessageIndex::singleton()->rebuild();
+ $logger->info( 'All message groups are now in sync.' );
}
$logger->info(
@@ -81,3 +90,8 @@ class CompleteExternalTranslationMaintenanceScript extends Maintenance {
);
}
}
+
+class_alias(
+ CompleteExternalTranslationMaintenanceScript::class,
+ '\MediaWiki\Extensions\Translate\CompleteExternalTranslationMaintenanceScript'
+);
diff --git a/MLEB/Translate/src/Synchronization/DisplayGroupSynchronizationInfo.php b/MLEB/Translate/src/Synchronization/DisplayGroupSynchronizationInfo.php
new file mode 100644
index 00000000..3eea143e
--- /dev/null
+++ b/MLEB/Translate/src/Synchronization/DisplayGroupSynchronizationInfo.php
@@ -0,0 +1,261 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use Html;
+use Language;
+use MediaWiki\Linker\LinkRenderer;
+use MessageLocalizer;
+use Title;
+
+/**
+ * Display Group synchronization related information
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2021.02
+ */
+class DisplayGroupSynchronizationInfo {
+ /** @var MessageLocalizer */
+ private $localizer;
+ /** @var LinkRenderer */
+ private $linkRenderer;
+
+ public function __construct( MessageLocalizer $localizer, LinkRenderer $linkRenderer ) {
+ $this->localizer = $localizer;
+ $this->linkRenderer = $linkRenderer;
+ }
+
+ /** @param string[] $groupsInSync */
+ public function getGroupsInSyncHtml( array $groupsInSync, string $wrapperClass ): string {
+ sort( $groupsInSync );
+
+ if ( !$groupsInSync ) {
+ return Html::rawElement(
+ 'p',
+ [ 'class' => $wrapperClass ],
+ $this->localizer->msg( 'translate-smg-no-groups-in-sync' )->escaped()
+ . $this->addGroupSyncHelp( $wrapperClass )
+ );
+ }
+
+ $htmlGroupItems = [];
+ foreach ( $groupsInSync as $groupId ) {
+ $htmlGroupItems[] = Html::element( 'li', [], $groupId );
+ }
+
+ return $this->getGroupSyncInfoHtml(
+ $wrapperClass,
+ 'translate-smg-groups-in-sync',
+ 'translate-smg-groups-in-sync-list',
+ Html::rawElement( 'ul', [], implode( '', $htmlGroupItems ) ),
+ $this->addGroupSyncHelp( $wrapperClass )
+ );
+ }
+
+ public function getHtmlForGroupsWithError(
+ GroupSynchronizationCache $groupSynchronizationCache,
+ string $wrapperClass,
+ Language $currentLang
+ ): string {
+ $groupsWithErrors = $groupSynchronizationCache->getGroupsWithErrors();
+ if ( !$groupsWithErrors ) {
+ return '';
+ }
+
+ $htmlGroupItems = [];
+ foreach ( $groupsWithErrors as $groupId ) {
+ $groupErrorResponse = $groupSynchronizationCache->getGroupErrorInfo( $groupId );
+ $htmlGroupItems[] = $this->getHtmlForGroupErrors( $groupErrorResponse, $currentLang, $wrapperClass );
+ }
+
+ return $this->getGroupSyncInfoHtml(
+ $wrapperClass . ' js-group-sync-groups-with-error',
+ 'translate-smg-groups-with-error-title',
+ 'translate-smg-groups-with-error-desc',
+ implode( '', $htmlGroupItems )
+ );
+ }
+
+ private function addGroupSyncHelp( string $wrapperClass ): string {
+ return Html::element(
+ 'a',
+ [
+ 'href' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Translate/' .
+ 'Group_management#Strong_synchronization',
+ 'target' => '_blank',
+ 'class' => "{$wrapperClass}__help",
+ ],
+ '[' . $this->localizer->msg( 'translate-smg-strong-sync-help' )->text() . ']'
+ );
+ }
+
+ private function getGroupSyncInfoHtml(
+ string $className,
+ string $summaryMsgKey,
+ string $descriptionMsgKey,
+ string $htmlContent,
+ string $preHtmlContent = null
+ ): string {
+ $output = Html::openElement( 'div', [ 'class' => $className ] );
+ if ( $preHtmlContent ) {
+ $output .= $preHtmlContent;
+ }
+
+ $output .= Html::openElement( 'details' );
+ $output .= Html::element( 'summary', [], $this->localizer->msg( $summaryMsgKey )->text() );
+ $output .= Html::element( 'p', [], $this->localizer->msg( $descriptionMsgKey )->text() );
+ $output .= $htmlContent;
+ $output .= Html::closeElement( 'details' );
+ $output .= Html::closeElement( 'div' );
+
+ return $output;
+ }
+
+ private function getHtmlForGroupErrors(
+ GroupSynchronizationResponse $groupErrorResponse,
+ Language $language,
+ string $wrapperClass
+ ): string {
+ $groupId = $groupErrorResponse->getGroupId();
+ $output = Html::openElement(
+ 'details',
+ [ 'class' => "{$wrapperClass}__group_errors js-group-sync-group-errors" ]
+ );
+
+ $groupResolveAction = Html::linkButton(
+ $this->localizer->msg( 'translate-smg-group-action-resolve' )->text(),
+ [
+ 'class' => "{$wrapperClass}__resolve-action js-group-sync-group-resolve",
+ 'href' => '#',
+ 'data-group-id' => $groupId,
+ ]
+ );
+
+ $output .= Html::rawElement(
+ 'summary',
+ [],
+ $groupId . ' ' .
+ Html::rawElement(
+ 'span',
+ [ 'class' => "{$wrapperClass}__sync-actions" ],
+ $this->localizer->msg( 'parentheses' )
+ ->params( $groupResolveAction )->text()
+
+ )
+ );
+
+ $errorMessages = $groupErrorResponse->getRemainingMessages();
+
+ $output .= Html::openElement( 'ol' );
+ foreach ( $errorMessages as $message ) {
+ $output .= Html::rawElement(
+ 'li',
+ [ 'class' => "{$wrapperClass}__message-error js-group-sync-message-error" ],
+ $this->getErrorMessageHtml( $groupId, $message, $language, $wrapperClass )
+ );
+ }
+ $output .= Html::closeElement( 'ol' );
+
+ $output .= Html::closeElement( 'details' );
+
+ return $output;
+ }
+
+ private function getErrorMessageHtml(
+ string $groupId,
+ MessageUpdateParameter $message,
+ Language $language,
+ string $wrapperClass
+ ): string {
+ $messageTitle = Title::newFromText( $message->getPageName() );
+ $actions = [];
+ if ( $messageTitle->exists() ) {
+ $output = $this->linkRenderer->makeLink( $messageTitle, $message->getPageName() );
+ $actions[] = $this->linkRenderer->makeLink(
+ $messageTitle,
+ $this->localizer->msg( 'translate-smg-group-message-action-history' )->text(),
+ [],
+ [ 'action' => 'history' ]
+ );
+ } else {
+ $output = $this->linkRenderer->makeBrokenLink( $messageTitle, $message->getPageName() );
+ }
+
+ $actions[] = Html::linkButton(
+ $this->localizer->msg( 'translate-smg-group-action-resolve' )->text(),
+ [
+ 'class' => "{$wrapperClass}__resolve-action js-group-sync-message-resolve",
+ 'href' => '#',
+ 'data-group-id' => $groupId,
+ 'data-msg-title' => $message->getPageName(),
+ ]
+ );
+
+ $output .= ' ' . Html::rawElement(
+ 'span',
+ [ 'class' => "{$wrapperClass}__sync-actions" ],
+ $this->localizer->msg( 'parentheses' )
+ ->params( $language->pipeList( $actions ) )->text()
+ );
+
+ $output .= $this->getMessageInfoHtml( $message, $language );
+
+ return $output;
+ }
+
+ private function getMessageInfoHtml( MessageUpdateParameter $message, Language $language ): string {
+ $output = Html::openElement( 'dl' );
+
+ $tags = [];
+ if ( $message->isFuzzy() ) {
+ $tags[] = $this->localizer->msg( 'translate-smg-group-message-tag-outdated' )->text();
+ }
+
+ if ( $message->isRename() ) {
+ $tags[] = $this->localizer->msg( 'translate-smg-group-message-tag-rename' )->text();
+ }
+
+ if ( $tags ) {
+ $output .= $this->getMessagePropHtml(
+ $this->localizer->msg( 'translate-smg-group-message-tag-label' )
+ ->numParams( count( $tags ) )->text(),
+ implode( $this->localizer->msg( 'pipe-separator' )->text(), $tags )
+ );
+ }
+
+ $output .= $this->getMessagePropHtml(
+ $this->localizer->msg( 'translate-smg-group-message-message-content' )->text(),
+ $message->getContent()
+ );
+
+ if ( $message->isRename() ) {
+ $output .= $this->getMessagePropHtml(
+ $this->localizer->msg( 'translate-smg-group-message-message-target' )->text(),
+ $message->getTargetValue()
+ );
+
+ $output .= $this->getMessagePropHtml(
+ $this->localizer->msg( 'translate-smg-group-message-message-replacement' )->text(),
+ $message->getReplacementValue()
+ );
+
+ if ( $message->getOtherLangs() ) {
+ $output .= $this->getMessagePropHtml(
+ $this->localizer->msg( 'translate-smg-group-message-message-other-langs' )->text(),
+ implode(
+ $this->localizer->msg( 'comma-separator' )->text(),
+ $message->getOtherLangs()
+ )
+ );
+ }
+ }
+
+ $output .= Html::closeElement( 'dl' );
+ return $output;
+ }
+
+ private function getMessagePropHtml( string $label, string $value ): string {
+ return Html::element( 'dt', [], $label ) . Html::element( 'dd', [], $value );
+ }
+}
diff --git a/MLEB/Translate/src/Synchronization/ExportTranslationsMaintenanceScript.php b/MLEB/Translate/src/Synchronization/ExportTranslationsMaintenanceScript.php
new file mode 100644
index 00000000..39f7e1e8
--- /dev/null
+++ b/MLEB/Translate/src/Synchronization/ExportTranslationsMaintenanceScript.php
@@ -0,0 +1,391 @@
+<?php
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use FileBasedMessageGroup;
+use GettextFFS;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MediaWiki\Logger\LoggerFactory;
+use MessageGroup;
+use MessageGroups;
+use MessageGroupStats;
+use MessageHandle;
+use Title;
+use TranslateUtils;
+
+/**
+ * Script to export translations of message groups to files.
+ *
+ * @author Niklas Laxström
+ * @author Siebrand Mazeland
+ * @copyright Copyright © 2008-2013, Niklas Laxström, Siebrand Mazeland
+ * @license GPL-2.0-or-later
+ */
+class ExportTranslationsMaintenanceScript extends BaseMaintenanceScript {
+ /// The translation file should be deleted if it exists
+ private const ACTION_DELETE = 'delete';
+ /// The translation file should be created or updated
+ private const ACTION_CREATE = 'create';
+ /// The translation file should be updated if exists, but not created as a new
+ private const ACTION_UPDATE = 'update';
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Export translations to files.' );
+
+ $this->addOption(
+ 'group',
+ 'Comma separated list of message group IDs (supports * wildcard) to export',
+ self::REQUIRED,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'lang',
+ 'Comma separated list of language codes or *',
+ self::REQUIRED,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'target',
+ 'Target directory for exported files',
+ self::REQUIRED,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'skip',
+ '(optional) Languages to skip, comma separated list',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'skipgroup',
+ '(optional) Comma separated list of message group IDs (supports * wildcard) to not export',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'threshold',
+ '(optional) Threshold for translation completion percentage that must be exceeded for initial export',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'removal-threshold',
+ '(optional) Threshold for translation completion percentage that must be exceeded to keep the file',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'hours',
+ '(optional) Only export languages with changes in the last given number of hours',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+ $this->addOption(
+ 'no-fuzzy',
+ '(optional) Do not include any messages marked as fuzzy/outdated'
+ );
+ $this->addOption(
+ 'offline-gettext-format',
+ '(optional) Export languages in offline Gettext format. Give a file pattern with '
+ . '%GROUPID% and %CODE%. Empty pattern defaults to %GROUPID%/%CODE%.po.',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ public function execute() {
+ $logger = LoggerFactory::getInstance( 'Translate.GroupSynchronization' );
+ $groupPattern = $this->getOption( 'group' ) ?? '';
+ $groupSkipPattern = $this->getOption( 'skipgroup' ) ?? '';
+
+ $logger->info(
+ 'Starting exports for groups {groups}',
+ [ 'groups' => $groupPattern ]
+ );
+ $exportStartTime = microtime( true );
+
+ $target = $this->getOption( 'target' );
+ if ( !is_writable( $target ) ) {
+ $this->fatalError( "Target directory is not writable ($target)." );
+ }
+
+ $exportThreshold = $this->getOption( 'threshold' );
+ $removalThreshold = $this->getOption( 'removal-threshold' );
+ $noFuzzy = $this->hasOption( 'no-fuzzy' );
+
+ $reqLangs = TranslateUtils::parseLanguageCodes( $this->getOption( 'lang' ) );
+ if ( $this->hasOption( 'skip' ) ) {
+ $skipLangs = array_map( 'trim', explode( ',', $this->getOption( 'skip' ) ) );
+ $reqLangs = array_diff( $reqLangs, $skipLangs );
+ }
+
+ $forOffline = $this->hasOption( 'offline-gettext-format' );
+ $offlineTargetPattern = $this->getOption( 'offline-gettext-format' ) ?: "%GROUPID%/%CODE%.po";
+
+ $groups = $this->getMessageGroups( $groupPattern, $groupSkipPattern, $forOffline );
+ if ( $groups === [] ) {
+ $this->fatalError( 'EE1: No valid message groups identified.' );
+ }
+
+ $changeFilter = null;
+ if ( $this->hasOption( 'hours' ) ) {
+ $changeFilter = $this->getRecentlyChangedItems(
+ (int)$this->getOption( 'hours' ),
+ $this->getNamespacesForGroups( $groups )
+ );
+ }
+
+ foreach ( $groups as $groupId => $group ) {
+ // No changes to this group at all
+ if ( is_array( $changeFilter ) && !isset( $changeFilter[$groupId] ) ) {
+ $this->output( "No recent changes to $groupId.\n" );
+ continue;
+ }
+
+ if ( $exportThreshold || $removalThreshold ) {
+ $logger->info( 'Calculating stats for group {groupId}', [ 'groupId' => $groupId ] );
+ $tStartTime = microtime( true );
+
+ $languageExportActions = $this->getLanguageExportActions(
+ $groupId,
+ $reqLangs,
+ (int)$exportThreshold,
+ (int)$removalThreshold
+ );
+
+ $tEndTime = microtime( true );
+ $logger->info(
+ 'Finished calculating stats for group {groupId}. Time: {duration} secs',
+ [
+ 'groupId' => $groupId,
+ 'duration' => round( $tEndTime - $tStartTime, 3 ),
+ ]
+ );
+ } else {
+ // Convert list to an associate array
+ $languageExportActions = array_fill_keys( $reqLangs, self::ACTION_CREATE );
+ }
+
+ if ( $languageExportActions === [] ) {
+ continue;
+ }
+
+ $this->output( "Exporting group $groupId\n" );
+ $logger->info( 'Exporting group {groupId}', [ 'groupId' => $groupId ] );
+
+ /** @var FileBasedMessageGroup $fileBasedGroup */
+ if ( $forOffline ) {
+ $fileBasedGroup = FileBasedMessageGroup::newFromMessageGroup( $group, $offlineTargetPattern );
+ $ffs = new GettextFFS( $fileBasedGroup );
+ $ffs->setOfflineMode( true );
+ } else {
+ $fileBasedGroup = $group;
+ $ffs = $group->getFFS();
+ }
+
+ $ffs->setWritePath( $target );
+ $sourceLanguage = $group->getSourceLanguage();
+ $collection = $group->initCollection( $sourceLanguage );
+
+ $inclusionList = $group->getTranslatableLanguages();
+
+ $langExportTimes = [
+ 'collection' => 0,
+ 'ffs' => 0,
+ ];
+
+ $languagesExportedCount = 0;
+
+ $langStartTime = microtime( true );
+ foreach ( $languageExportActions as $lang => $action ) {
+ // Do not export languages that are excluded (or not included).
+ // Also check that inclusion list is not null, which means that all
+ // languages are allowed for translation and export.
+ if ( is_array( $inclusionList ) && !isset( $inclusionList[$lang] ) ) {
+ continue;
+ }
+
+ // Skip languages not present in recent changes
+ if ( is_array( $changeFilter ) && !isset( $changeFilter[$groupId][$lang] ) ) {
+ continue;
+ }
+
+ $targetFilePath = $target . '/' . $fileBasedGroup->getTargetFilename( $lang );
+ if ( $action === self::ACTION_DELETE ) {
+ // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
+ @$ok = unlink( $targetFilePath );
+ if ( $ok ) {
+ $logger->info( "Removed $targetFilePath due to removal threshold" );
+ }
+ continue;
+ } elseif ( $action === self::ACTION_UPDATE && !file_exists( $targetFilePath ) ) {
+ // Language is under export threshold, do not export yet
+ $logger->info( "Not creating $targetFilePath due to export threshold" );
+ continue;
+ }
+
+ $startTime = microtime( true );
+ $collection->resetForNewLanguage( $lang );
+ $collection->loadTranslations();
+ // Don't export ignored, unless it is the source language
+ // or message documentation
+ global $wgTranslateDocumentationLanguageCode;
+ if ( $lang !== $wgTranslateDocumentationLanguageCode
+ && $lang !== $sourceLanguage
+ ) {
+ $collection->filter( 'ignored' );
+ }
+
+ if ( $noFuzzy ) {
+ $collection->filter( 'fuzzy' );
+ }
+
+ $languagesExportedCount++;
+
+ $endTime = microtime( true );
+ $langExportTimes['collection'] += ( $endTime - $startTime );
+
+ $startTime = microtime( true );
+ $ffs->write( $collection );
+ $endTime = microtime( true );
+ $langExportTimes['ffs'] += ( $endTime - $startTime );
+ }
+ $langEndTime = microtime( true );
+
+ $logger->info(
+ 'Done exporting {count} languages for group {groupId}. Time taken {duration} secs.',
+ [
+ 'count' => $languagesExportedCount,
+ 'groupId' => $groupId,
+ 'duration' => round( $langEndTime - $langStartTime, 3 ),
+ ]
+ );
+
+ foreach ( $langExportTimes as $type => $time ) {
+ $logger->info(
+ 'Time taken by "{type}" for group {groupId} – {duration} secs.',
+ [
+ 'groupId' => $groupId,
+ 'type' => $type,
+ 'duration' => round( $time, 3 ),
+ ]
+ );
+ }
+ }
+
+ $exportEndTime = microtime( true );
+ $logger->info(
+ 'Finished export process for groups {groups}. Time: {duration} secs.',
+ [
+ 'groups' => $groupPattern,
+ 'duration' => round( $exportEndTime - $exportStartTime, 3 ),
+ ]
+ );
+ }
+
+ /** @return MessageGroup[] */
+ private function getMessageGroups(
+ string $groupPattern,
+ string $excludePattern,
+ bool $forOffline
+ ): array {
+ $groupIds = MessageGroups::expandWildcards( explode( ',', trim( $groupPattern ) ) );
+ $groups = MessageGroups::getGroupsById( $groupIds );
+
+ foreach ( $groups as $groupId => $group ) {
+ if ( $group->isMeta() ) {
+ $this->output( "Skipping meta message group $groupId.\n" );
+ unset( $groups[$groupId] );
+ continue;
+ }
+
+ if ( !$forOffline && !$group instanceof FileBasedMessageGroup ) {
+ $this->output( "EE2: Unexportable message group $groupId.\n" );
+ unset( $groups[$groupId] );
+ }
+ }
+
+ $skipIds = MessageGroups::expandWildcards( explode( ',', trim( $excludePattern ) ) );
+ foreach ( $skipIds as $groupId ) {
+ if ( isset( $groups[$groupId] ) ) {
+ unset( $groups[$groupId] );
+ $this->output( "Group $groupId is in skipgroup.\n" );
+ }
+ }
+
+ return $groups;
+ }
+
+ /**
+ * @param int $hours
+ * @param int[] $namespaces
+ * @return array[]
+ */
+ private function getRecentlyChangedItems( int $hours, array $namespaces ): array {
+ $bots = true;
+ $changeFilter = [];
+ $rows = TranslateUtils::translationChanges( $hours, $bots, $namespaces );
+ foreach ( $rows as $row ) {
+ $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+ $handle = new MessageHandle( $title );
+ $code = $handle->getCode();
+ if ( !$code ) {
+ continue;
+ }
+ $groupIds = $handle->getGroupIds();
+ foreach ( $groupIds as $groupId ) {
+ $changeFilter[$groupId][$code] = true;
+ }
+ }
+
+ return $changeFilter;
+ }
+
+ /**
+ * @param MessageGroup[] $groups
+ * @return int[]
+ */
+ private function getNamespacesForGroups( array $groups ): array {
+ $namespaces = [];
+ foreach ( $groups as $group ) {
+ $namespaces[$group->getNamespace()] = true;
+ }
+
+ return array_keys( $namespaces );
+ }
+
+ private function getLanguageExportActions(
+ string $groupId,
+ array $requestedLanguages,
+ int $exportThreshold = 0,
+ int $removalThreshold = 0
+ ): array {
+ $stats = MessageGroupStats::forGroup( $groupId );
+
+ $languages = [];
+
+ foreach ( $requestedLanguages as $code ) {
+ // Statistics unavailable. This should only happen if unknown language code requested.
+ if ( !isset( $stats[$code] ) ) {
+ continue;
+ }
+
+ $total = $stats[$code][MessageGroupStats::TOTAL];
+ $translated = $stats[$code][MessageGroupStats::TRANSLATED];
+ $percentage = $total === 0 ? 0 : $translated / $total * 100;
+
+ if ( $percentage === 0 || $percentage < $removalThreshold ) {
+ $languages[$code] = self::ACTION_DELETE;
+ } elseif ( $percentage > $exportThreshold ) {
+ $languages[$code] = self::ACTION_CREATE;
+ } else {
+ $languages[$code] = self::ACTION_UPDATE;
+ }
+ }
+
+ return $languages;
+ }
+}
diff --git a/MLEB/Translate/src/Synchronization/GroupSynchronizationCache.php b/MLEB/Translate/src/Synchronization/GroupSynchronizationCache.php
index 34b0c3f4..64ea5ad0 100644
--- a/MLEB/Translate/src/Synchronization/GroupSynchronizationCache.php
+++ b/MLEB/Translate/src/Synchronization/GroupSynchronizationCache.php
@@ -1,34 +1,52 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Synchronization;
+namespace MediaWiki\Extension\Translate\Synchronization;
-use BagOStuff;
use DateTime;
+use InvalidArgumentException;
+use LogicException;
+use MediaWiki\Extension\Translate\Cache\PersistentCache;
+use MediaWiki\Extension\Translate\Cache\PersistentCacheEntry;
+use RuntimeException;
/**
* Message group synchronization cache. Handles storage of data in the cache
- * to track which groups are currently being synchronized
+ * to track which groups are currently being synchronized.
+ * Stores:
+ *
+ * 1. Groups in sync:
+ * - Key: {hash($groupId)}_$groupId
+ * - Value: $groupId
+ * - Tag: See GroupSynchronizationCache::getGroupsTag()
+ * - Exptime: Set when startSyncTimer is called
+ *
+ * 2. Message under each group being modified:
+ * - Key: {hash($groupId_$messageKey)}_$messageKey
+ * - Value: MessageUpdateParameter
+ * - Tag: gsc_$groupId
+ * - Exptime: none
+ *
* @author Abijeet Patro
* @license GPL-2.0-or-later
* @since 2020.06
*/
class GroupSynchronizationCache {
- private const CACHE_PREFIX = 'translate-msg-group-sync';
-
- private const OP_ADD = 'add';
-
- private const OP_DEL = 'remove';
-
- /** @var BagOStuff */
+ /** @var PersistentCache */
private $cache;
-
/** @var int */
- private $timeout;
+ private $timeoutSeconds;
+
+ /** @var string Cache tag used for groups */
+ private const GROUP_LIST_TAG = 'gsc_%group_in_sync%';
+ /** @var string Cache tag used for tracking groups that have errors */
+ private const GROUP_ERROR_TAG = 'gsc_%group_with_error%';
- public function __construct( BagOStuff $cache, int $timeout = 600 ) {
+ // TODO: Decide timeout based on monitoring. Also check if it needs to be configurable
+ // based on the number of messages in the group.
+ public function __construct( PersistentCache $cache, int $timeoutSeconds = 2400 ) {
$this->cache = $cache;
- $this->timeout = $timeout;
+ $this->timeoutSeconds = $timeoutSeconds;
}
/**
@@ -36,118 +54,130 @@ class GroupSynchronizationCache {
* @return string[]
*/
public function getGroupsInSync(): array {
- $groupsCacheKey = $this->getGroupsKey();
- $groupsInSync = $this->cache->get( $groupsCacheKey );
+ $groupsInSyncEntries = $this->cache->getByTag( self::GROUP_LIST_TAG );
+ /** @var string[] */
+ $groups = [];
+ foreach ( $groupsInSyncEntries as $entry ) {
+ $groups[] = $entry->value();
+ }
- return $groupsInSync === false ? [] : $groupsInSync;
+ return $groups;
}
- /** Start the synchronization process for a group with the given groupId */
- public function startSync( string $groupId ): void {
- $this->cache->set( $this->getSyncTimeKey( $groupId ), ( new DateTime() )->getTimestamp() );
- $this->cache->set( $this->getGroupKey( $groupId ), [] );
-
- $this->modifyGroupsInSync( $groupId, self::OP_ADD );
+ /** Start synchronization process for a group and starts the expiry time */
+ public function markGroupForSync( string $groupId ): void {
+ $expTime = $this->getExpireTime();
+ $this->cache->set(
+ new PersistentCacheEntry(
+ $this->getGroupKey( $groupId ),
+ $groupId,
+ $expTime,
+ self::GROUP_LIST_TAG
+ )
+ );
}
- public function getSyncStartTime( string $groupId ): ?int {
- $timestamp = $this->cache->get( $this->getSyncTimeKey( $groupId ) );
- if ( $timestamp === false ) {
- return null;
- }
-
- return (int)$timestamp;
+ public function getSyncEndTime( string $groupId ): ?int {
+ $cacheEntry = $this->cache->get( $this->getGroupKey( $groupId ) );
+ return $cacheEntry ? $cacheEntry[0]->exptime() : null;
}
- /**
- * End synchronization for a group. Removes the sync time, deletes the group key, and
- * removes the groupId from groups in sync list
- */
+ /** End synchronization for a group. Deletes the group key */
public function endSync( string $groupId ): void {
- // Remove all the messages for the group
- $groupKey = $this->getGroupKey( $groupId );
- $groupMessageKeys = $this->cache->get( $groupKey );
- $this->removeMessages( ...$groupMessageKeys );
+ if ( $this->cache->hasEntryWithTag( $this->getGroupTag( $groupId ) ) ) {
+ throw new InvalidArgumentException(
+ 'Cannot end synchronization for a group that still has messages to be processed.'
+ );
+ }
- // Remove the group message list
+ $groupKey = $this->getGroupKey( $groupId );
$this->cache->delete( $groupKey );
+ }
- // Delete the group sync start time
- $this->cache->delete( $this->getSyncTimeKey( $groupId ) );
-
- // Remove the group from groups in sync list
- $this->modifyGroupsInSync( $groupId, self::OP_DEL );
+ /** End synchronization for a group. Deletes the group key and messages */
+ public function forceEndSync( string $groupId ): void {
+ $this->cache->deleteEntriesWithTag( $this->getGroupTag( $groupId ) );
+ $this->endSync( $groupId );
}
- /** Add multiple messages from a group to the cache */
+ /** Add messages for a group to the cache */
public function addMessages( string $groupId, MessageUpdateParameter ...$messageParams ): void {
$messagesToAdd = [];
+ $groupTag = $this->getGroupTag( $groupId );
foreach ( $messageParams as $messageParam ) {
- $messagesToAdd[ $this->getMessageTitleKey( $messageParam->getPageName() ) ] =
- $messageParam;
+ $titleKey = $this->getMessageKeys( $groupId, $messageParam->getPageName() )[0];
+ $messagesToAdd[] = new PersistentCacheEntry(
+ $titleKey,
+ $messageParam,
+ null,
+ $groupTag
+ );
}
- $this->cache->setMulti( $messagesToAdd );
- $this->modifyGroupMessagesInSync( $groupId, $messageParams, self::OP_ADD );
+ $this->cache->set( ...$messagesToAdd );
}
/** Check if the group is in synchronization */
public function isGroupBeingProcessed( string $groupId ): bool {
- $groupMessages = $this->cache->get( $this->getGroupKey( $groupId ) );
- return $groupMessages !== false;
+ $groupEntry = $this->cache->get( $this->getGroupKey( $groupId ) );
+ return $groupEntry !== [];
}
/**
- * Return messages keys belonging to group Id currently in synchronization.
+ * Return all messages in a group
* @param string $groupId
- * @return string[]
- */
- public function getGroupMessageKeys( string $groupId ): array {
- $groupMessages = $this->cache->get( $this->getGroupKey( $groupId ) );
- if ( $groupMessages === false ) {
- return [];
- }
-
- return $groupMessages;
- }
-
- /**
- * Return values for multiple messages from the cache.
- * @param string ...$messageKeys
* @return MessageUpdateParameter[] Returns a key value pair, with the key being the
- * messageKey and value being MessageUpdateParameter or null if the key is not available
- * in the cache.
+ * messageKey and value being MessageUpdateParameter
*/
- public function getMessages( string ...$messageKeys ): array {
- $messageCacheKeys = [];
- foreach ( $messageKeys as $messageKey ) {
- $messageCacheKeys[] = $this->getMessageTitleKey( $messageKey );
- }
-
- $messageParams = $this->cache->getMulti( $messageCacheKeys );
+ public function getGroupMessages( string $groupId ): array {
+ $messageEntries = $this->cache->getByTag( $this->getGroupTag( $groupId ) );
$allMessageParams = [];
- foreach ( $messageCacheKeys as $index => $messageCacheKey ) {
- $allMessageParams[$messageKeys[$index]] = $messageParams[$messageCacheKey] ?? null;
+ foreach ( $messageEntries as $entry ) {
+ $message = $entry->value();
+ if ( $message instanceof MessageUpdateParameter ) {
+ $allMessageParams[$message->getPageName()] = $message;
+ } else {
+ // Should not happen, but handle primarily to keep phan happy.
+ throw $this->invalidArgument( $message, MessageUpdateParameter::class );
+ }
}
return $allMessageParams;
}
- /**
- * Update the group cache with the latest information with the status of message
- * update jobs, then check if the group has timed out and returns the latest information
- */
+ /** Check if a message is being processed */
+ public function isMessageBeingProcessed( string $groupId, string $messageKey ): bool {
+ $messageCacheKey = $this->getMessageKeys( $groupId, $messageKey );
+ return $this->cache->has( $messageCacheKey[0] );
+ }
+
+ /** Get the current synchronization status of the group. Does not perform any updates. */
public function getSynchronizationStatus( string $groupId ): GroupSynchronizationResponse {
- $this->syncGroup( $groupId );
- $syncStartTime = $this->getSyncStartTime( $groupId );
- if ( !$syncStartTime ) {
- // Processing is done
+ if ( !$this->isGroupBeingProcessed( $groupId ) ) {
+ // Group is currently not being processed.
+ throw new LogicException(
+ 'Sync requested for a group currently not being processed. Check if ' .
+ 'group is being processed by calling isGroupBeingProcessed() first'
+ );
+ }
+
+ $remainingMessages = $this->getGroupMessages( $groupId );
+
+ // No messages are present
+ if ( !$remainingMessages ) {
return new GroupSynchronizationResponse( $groupId, [], false );
}
- $hasTimedOut = $this->hasGroupTimedOut( $syncStartTime );
- $remainingMessages = $this->getGroupMessageKeys( $groupId );
+ $syncExpTime = $this->getSyncEndTime( $groupId );
+ if ( $syncExpTime === null ) {
+ // This should not happen
+ throw new RuntimeException(
+ "Unexpected condition. Group: $groupId; Messages present, but group key not found."
+ );
+ }
+
+ $hasTimedOut = $this->hasGroupTimedOut( $syncExpTime );
return new GroupSynchronizationResponse(
$groupId,
@@ -156,125 +186,224 @@ class GroupSynchronizationCache {
);
}
- /**
- * Remove messages from the cache. Removes the message keys, but DOES NOT the update group
- * message key list.
- */
- public function removeMessages( string ...$messageKeys ): void {
- $messageCacheKeys = [];
- foreach ( $messageKeys as $key ) {
- $messageCacheKeys[] = $this->getMessageTitleKey( $key );
- }
+ /** Remove messages from the cache. */
+ public function removeMessages( string $groupId, string ...$messageKeys ): void {
+ $messageCacheKeys = $this->getMessageKeys( $groupId, ...$messageKeys );
- $this->cache->deleteMulti( $messageCacheKeys );
+ $this->cache->delete( ...$messageCacheKeys );
}
- /**
- * Check messages keys that are still present in the cache and update the list of keys
- * in the message group.
- */
- private function syncGroup( string $groupId ): void {
- $groupCacheKey = $this->getGroupKey( $groupId );
- $groupMessages = $this->cache->get( $groupCacheKey );
- if ( $groupMessages === false ) {
- return;
+ public function addGroupErrors( GroupSynchronizationResponse $response ): void {
+ $groupId = $response->getGroupId();
+ $remainingMessages = $response->getRemainingMessages();
+
+ if ( !$remainingMessages ) {
+ throw new LogicException( 'Cannot add a group without any remaining messages to the errors list' );
}
- $messageCacheKeys = [];
- foreach ( $groupMessages as $messageKey ) {
- $messageCacheKeys[] = $this->getMessageTitleKey( $messageKey );
+ $groupMessageErrorTag = $this->getGroupMessageErrorTag( $groupId );
+
+ $entriesToSave = [];
+ foreach ( $remainingMessages as $messageParam ) {
+ $titleErrorKey = $this->getMessageErrorKey( $groupId, $messageParam->getPageName() )[0];
+ $entriesToSave[] = new PersistentCacheEntry(
+ $titleErrorKey,
+ $messageParam,
+ null,
+ $groupMessageErrorTag
+ );
}
- $messageParams = $this->cache->getMulti( $messageCacheKeys );
+ $this->cache->set( ...$entriesToSave );
+
+ $groupErrorKey = $this->getGroupErrorKey( $groupId );
- // No keys are present, delete the message and mark the group as synced
- if ( !$messageParams ) {
- $this->endSync( $groupId );
+ // Check if the group already has errors
+ $groupInfo = $this->cache->get( $groupErrorKey );
+ if ( $groupInfo ) {
return;
}
- // Make a list of remaining jobs that are running.
- $remainingJobTitle = [];
- foreach ( $messageCacheKeys as $index => $messageCacheKey ) {
- if ( isset( $messageParams[$messageCacheKey] ) ) {
- $groupMessageTitle = $groupMessages[$index];
- $remainingJobTitle[] = $groupMessageTitle;
+ // Group did not have an error previously, add it now. When adding,
+ // remove the remaining messages from the GroupSynchronizationResponse to
+ // avoid the value in the cache becoming too big. The remaining messages
+ // are stored as separate items in the cache.
+ $trimmedGroupSyncResponse = new GroupSynchronizationResponse(
+ $groupId,
+ [],
+ $response->hasTimedOut()
+ );
+
+ $entriesToSave[] = new PersistentCacheEntry(
+ $groupErrorKey,
+ $trimmedGroupSyncResponse,
+ null,
+ self::GROUP_ERROR_TAG
+ );
+
+ $this->cache->set( ...$entriesToSave );
+ }
+
+ /**
+ * Return the groups that have errors
+ * @return string[]
+ */
+ public function getGroupsWithErrors(): array {
+ $groupsInSyncEntries = $this->cache->getByTag( self::GROUP_ERROR_TAG );
+ /** @var string[] */
+ $groupIds = [];
+ foreach ( $groupsInSyncEntries as $entry ) {
+ $groupResponse = $entry->value();
+ if ( $groupResponse instanceof GroupSynchronizationResponse ) {
+ $groupIds[] = $groupResponse->getGroupId();
+ } else {
+ // Should not happen, but handle primarily to keep phan happy.
+ throw $this->invalidArgument( $groupResponse, GroupSynchronizationResponse::class );
}
}
- // Set the group cache with the remaining job title.
- $this->cache->set( $groupCacheKey, $remainingJobTitle );
+ return $groupIds;
}
- private function hasGroupTimedOut( int $syncStartTime ): bool {
- $secondsSinceSyncStart = ( new DateTime() )->getTimestamp() - $syncStartTime;
- return $secondsSinceSyncStart > $this->timeout;
+ /** Fetch information about a particular group that has errors including messages that failed */
+ public function getGroupErrorInfo( string $groupId ): GroupSynchronizationResponse {
+ $groupMessageErrorTag = $this->getGroupMessageErrorTag( $groupId );
+ $groupMessageEntries = $this->cache->getByTag( $groupMessageErrorTag );
+
+ $groupErrorKey = $this->getGroupErrorKey( $groupId );
+ $groupResponseEntry = $this->cache->get( $groupErrorKey );
+ $groupResponse = $groupResponseEntry[0] ? $groupResponseEntry[0]->value() : null;
+ if ( $groupResponse ) {
+ if ( !$groupResponse instanceof GroupSynchronizationResponse ) {
+ // Should not happen, but handle primarily to keep phan happy.
+ throw $this->invalidArgument( $groupResponse, GroupSynchronizationResponse::class );
+ }
+ } else {
+ throw new LogicException( 'Requested to fetch errors for a group that has no errors.' );
+ }
+
+ $messageParams = [];
+ foreach ( $groupMessageEntries as $messageEntries ) {
+ $messageParam = $messageEntries->value();
+ if ( $messageParam instanceof MessageUpdateParameter ) {
+ $messageParams[] = $messageParam;
+ } else {
+ // Should not happen, but handle primarily to keep phan happy.
+ throw $this->invalidArgument( $messageParam, MessageUpdateParameter::class );
+ }
+ }
+
+ return new GroupSynchronizationResponse(
+ $groupId,
+ $messageParams,
+ $groupResponse->hasTimedOut()
+ );
}
- private function modifyGroupsInSync( string $groupId, string $op ): void {
- $groupsCacheKey = $this->getGroupsKey();
- $this->cache->lock( $groupsCacheKey );
+ /** Marks all messages in a group and the group itself as resolved */
+ public function markGroupAsResolved( string $groupId ): GroupSynchronizationResponse {
+ $groupSyncResponse = $this->getGroupErrorInfo( $groupId );
+ $errorMessages = $groupSyncResponse->getRemainingMessages();
- $groupsInSync = $this->getGroupsInSync();
- if ( $groupsInSync === [] && $op === self::OP_DEL ) {
- return;
+ $errorMessageKeys = [];
+ foreach ( $errorMessages as $message ) {
+ $errorMessageKeys[] = $this->getMessageErrorKey( $groupId, $message->getPageName() )[0];
}
- $this->modifyArray( $groupsInSync, $groupId, $op );
-
- $this->cache->set( $groupsCacheKey, $groupsInSync );
- $this->cache->unlock( $groupsCacheKey );
+ $this->cache->delete( ...$errorMessageKeys );
+ return $this->syncGroupErrors( $groupId );
}
- private function modifyGroupMessagesInSync(
- string $groupId, array $messageParams, string $op
- ): void {
- $groupCacheKey = $this->getGroupKey( $groupId );
+ /** Marks errors for a message as resolved */
+ public function markMessageAsResolved( string $groupId, string $messagePageName ): void {
+ $messageErrorKey = $this->getMessageErrorKey( $groupId, $messagePageName )[0];
+ $messageInCache = $this->cache->get( $messageErrorKey );
+ if ( !$messageInCache ) {
+ throw new InvalidArgumentException(
+ 'Message does not appear to have synchronization errors'
+ );
+ }
- $this->cache->lock( $groupCacheKey );
+ $this->cache->delete( $messageErrorKey );
+ }
- $groupMessages = $this->getGroupMessageKeys( $groupId );
- if ( $groupMessages === [] && $op === self::OP_DEL ) {
- return;
+ /** Checks if group has unresolved error messages. If not clears the group from error list */
+ public function syncGroupErrors( string $groupId ): GroupSynchronizationResponse {
+ $groupSyncResponse = $this->getGroupErrorInfo( $groupId );
+ if ( $groupSyncResponse->getRemainingMessages() ) {
+ return $groupSyncResponse;
}
- /** @var MessageUpdateParameter $messageParam */
- foreach ( $messageParams as $messageParam ) {
- $messageTitle = $messageParam->getPageName();
- $this->modifyArray( $groupMessages, $messageTitle, $op );
- }
+ // No remaining messages left, remove group from errors list.
+ $groupErrorKey = $this->getGroupErrorKey( $groupId );
+ $this->cache->delete( $groupErrorKey );
- $this->cache->set( $groupCacheKey, $groupMessages );
- $this->cache->unlock( $groupCacheKey );
+ return $groupSyncResponse;
}
- private function modifyArray(
- array &$toModify, string $needle, string $op
- ): void {
- $needleIndex = array_search( $needle, $toModify );
- if ( $op === self::OP_ADD && $needleIndex === false ) {
- $toModify[] = $needle;
- } elseif ( $op === self::OP_DEL && $needleIndex !== false ) {
- array_splice( $toModify, $needleIndex, 1 );
- }
+ private function hasGroupTimedOut( int $syncExpTime ): bool {
+ return ( new DateTime() )->getTimestamp() > $syncExpTime;
}
- // Cache keys related functions start here.
+ private function getExpireTime(): int {
+ $currentTime = ( new DateTime() )->getTimestamp();
+ $expTime = ( new DateTime() )
+ ->setTimestamp( $currentTime + $this->timeoutSeconds )
+ ->getTimestamp();
- private function getGroupsKey(): string {
- return $this->cache->makeKey( self::CACHE_PREFIX );
+ return $expTime;
}
- private function getSyncTimeKey( string $groupId ): string {
- return $this->cache->makeKey( self::CACHE_PREFIX, $groupId, 'time' );
+ private function invalidArgument( $value, string $expectedType ): RuntimeException {
+ $valueType = $value ? get_class( $value ) : gettype( $value );
+ return new RuntimeException( "Expected $expectedType, got $valueType" );
+ }
+
+ // Cache keys / tag related functions start here.
+
+ private function getGroupTag( string $groupId ): string {
+ return 'gsc_' . $groupId;
}
private function getGroupKey( string $groupId ): string {
- return $this->cache->makeKey( self::CACHE_PREFIX, 'group', $groupId );
+ $hash = substr( hash( 'sha256', $groupId ), 0, 40 );
+ return substr( "{$hash}_$groupId", 0, 255 );
}
- private function getMessageTitleKey( string $title ): string {
- return $this->cache->makeKey( self::CACHE_PREFIX, 'msg-title', $title );
+ /** @return string[] */
+ private function getMessageKeys( string $groupId, string ...$messages ): array {
+ $messageKeys = [];
+ foreach ( $messages as $message ) {
+ $key = $groupId . '_' . $message;
+ $hash = substr( hash( 'sha256', $key ), 0, 40 );
+ $finalKey = substr( $hash . '_' . $key, 0, 255 );
+ $messageKeys[] = $finalKey;
+ }
+
+ return $messageKeys;
+ }
+
+ private function getGroupErrorKey( string $groupId ): string {
+ $hash = substr( hash( 'sha256', $groupId ), 0, 40 );
+ return substr( "{$hash}_gsc_error_$groupId", 0, 255 );
+ }
+
+ /** @return string[] */
+ private function getMessageErrorKey( string $groupId, string ...$messages ): array {
+ $messageKeys = [];
+ foreach ( $messages as $message ) {
+ $key = $groupId . '_' . $message;
+ $hash = substr( hash( 'sha256', $key ), 0, 40 );
+ $finalKey = substr( $hash . '_gsc_error_' . $key, 0, 255 );
+ $messageKeys[] = $finalKey;
+ }
+
+ return $messageKeys;
}
+ private function getGroupMessageErrorTag( string $groupId ): string {
+ return "gsc_%error%_$groupId";
+ }
}
+
+class_alias( GroupSynchronizationCache::class, '\MediaWiki\Extensions\Translate\GroupSynchronizationCache' );
diff --git a/MLEB/Translate/src/Synchronization/GroupSynchronizationResponse.php b/MLEB/Translate/src/Synchronization/GroupSynchronizationResponse.php
index 83a58ef6..069be720 100644
--- a/MLEB/Translate/src/Synchronization/GroupSynchronizationResponse.php
+++ b/MLEB/Translate/src/Synchronization/GroupSynchronizationResponse.php
@@ -2,7 +2,11 @@
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Synchronization;
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use JsonSerializable;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializable;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializableTrait;
/**
* Class encapsulating the response returned by the GroupSynchronizationCache
@@ -11,30 +15,31 @@ namespace MediaWiki\Extensions\Translate\Synchronization;
* @license GPL-2.0-or-later
* @since 2020.06
*/
-class GroupSynchronizationResponse {
- /** @var array */
- private $remainingMessageKeys;
+class GroupSynchronizationResponse implements JsonSerializable, JsonUnserializable {
+ use JsonUnserializableTrait;
+ /** @var MessageUpdateParameter[] */
+ private $remainingMessages;
/** @var string */
private $groupId;
-
/** @var bool */
private $timeout;
public function __construct(
- string $groupId, array $remainingMessageKeys, bool $hasTimedOut
+ string $groupId, array $remainingMessages, bool $hasTimedOut
) {
$this->groupId = $groupId;
- $this->remainingMessageKeys = $remainingMessageKeys;
+ $this->remainingMessages = $remainingMessages;
$this->timeout = $hasTimedOut;
}
public function isDone(): bool {
- return $this->remainingMessageKeys === [];
+ return $this->remainingMessages === [];
}
+ /** @return MessageUpdateParameter[] */
public function getRemainingMessages(): array {
- return $this->remainingMessageKeys;
+ return $this->remainingMessages;
}
public function getGroupId(): string {
@@ -44,4 +49,19 @@ class GroupSynchronizationResponse {
public function hasTimedOut(): bool {
return $this->timeout;
}
+
+ /** @return mixed[] */
+ protected function toJsonArray(): array {
+ return get_object_vars( $this );
+ }
+
+ public static function newFromJsonArray( array $params ) {
+ return new self(
+ $params['groupId'],
+ $params['remainingMessages'],
+ $params['timeout']
+ );
+ }
}
+
+class_alias( GroupSynchronizationResponse::class, '\MediaWiki\Extensions\Translate\GroupSynchronizationResponse' );
diff --git a/MLEB/Translate/src/Synchronization/ManageGroupSynchronizationCacheActionApi.php b/MLEB/Translate/src/Synchronization/ManageGroupSynchronizationCacheActionApi.php
new file mode 100644
index 00000000..9c6127bf
--- /dev/null
+++ b/MLEB/Translate/src/Synchronization/ManageGroupSynchronizationCacheActionApi.php
@@ -0,0 +1,114 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use ApiBase;
+use ApiMain;
+use Exception;
+use FormatJson;
+use MediaWiki\Logger\LoggerFactory;
+use MessageGroups;
+
+/**
+ * Api module for managing group synchronization cache
+ * @ingroup API TranslateAPI
+ * @since 2021.03
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ */
+class ManageGroupSynchronizationCacheActionApi extends ApiBase {
+ private const RIGHT = 'translate-manage';
+ private const VALID_OPS = [ 'resolveMessage', 'resolveGroup' ];
+ /** @var GroupSynchronizationCache */
+ private $groupSyncCache;
+
+ public function __construct( ApiMain $mainModule, $moduleName, GroupSynchronizationCache $groupSyncCache ) {
+ parent::__construct( $mainModule, $moduleName );
+ $this->groupSyncCache = $groupSyncCache;
+ }
+
+ public function execute() {
+ $this->checkUserRightsAny( self::RIGHT );
+
+ $params = $this->extractRequestParams();
+ $operation = $params['operation'];
+ $groupId = $params['group'];
+ $titleStr = $params['title'] ?? null;
+
+ $group = MessageGroups::getGroup( $groupId );
+ if ( $group === null ) {
+ return $this->dieWithError( 'apierror-translate-invalidgroup', 'invalidgroup' );
+ }
+
+ try {
+ if ( $operation === 'resolveMessage' ) {
+ if ( $titleStr === null ) {
+ return $this->dieWithError( [ 'apierror-missingparam', 'title' ] );
+ }
+ $this->markAsResolved( $groupId, $titleStr );
+ } elseif ( $operation === 'resolveGroup' ) {
+ $this->markAsResolved( $groupId );
+ }
+ } catch ( Exception $e ) {
+ $data = [
+ 'requestParams' => $params,
+ 'exceptionMessage' => $e->getMessage()
+ ];
+
+ LoggerFactory::getInstance( 'Translate.GroupSynchronization' )->error(
+ "Error while running: ManageGroupSynchronizationCacheActionApi::execute. Details: \n" .
+ FormatJson::encode( $data, true )
+ );
+
+ $this->dieWithError(
+ [
+ 'apierror-translate-operation-error',
+ wfEscapeWikiText( $e->getMessage() )
+ ]
+ );
+ }
+ }
+
+ private function markAsResolved( string $groupId, ?string $messageTitle = null ): void {
+ if ( $messageTitle === null ) {
+ $currentGroupStatus = $this->groupSyncCache->markGroupAsResolved( $groupId );
+ } else {
+ $this->groupSyncCache->markMessageAsResolved( $groupId, $messageTitle );
+ $currentGroupStatus = $this->groupSyncCache->syncGroupErrors( $groupId );
+ }
+
+ $this->getResult()->addValue( null, $this->getModuleName(), [
+ 'success' => 1,
+ 'data' => [
+ 'groupRemainingMessageCount' => count( $currentGroupStatus->getRemainingMessages() )
+ ]
+ ] );
+ }
+
+ protected function getAllowedParams() {
+ return [
+ 'operation' => [
+ ApiBase::PARAM_TYPE => self::VALID_OPS,
+ ApiBase::PARAM_ISMULTI => false,
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'title' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => false
+ ],
+ 'group' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ]
+ ];
+ }
+
+ public function isInternal() {
+ return true;
+ }
+
+ public function needsToken() {
+ return 'csrf';
+ }
+}
diff --git a/MLEB/Translate/src/Synchronization/MessageUpdateParameter.php b/MLEB/Translate/src/Synchronization/MessageUpdateParameter.php
index 21109c85..6874caef 100644
--- a/MLEB/Translate/src/Synchronization/MessageUpdateParameter.php
+++ b/MLEB/Translate/src/Synchronization/MessageUpdateParameter.php
@@ -1,11 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Synchronization;
+namespace MediaWiki\Extension\Translate\Synchronization;
-use FormatJson;
+use JsonSerializable;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializable;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializableTrait;
use MessageUpdateJob;
-use Serializable;
/**
* Store params for MessageUpdateJob.
@@ -13,26 +14,22 @@ use Serializable;
* @license GPL-2.0-or-later
* @since 2020.06
*/
-class MessageUpdateParameter implements Serializable {
+class MessageUpdateParameter implements JsonSerializable, JsonUnserializable {
+ use JsonUnserializableTrait;
+
/** @var string */
private $pageName;
-
/** @var bool */
private $rename;
-
/** @var bool */
private $fuzzy;
-
/** @var string */
private $content;
-
/** @var string */
private $target;
-
/** @var string */
private $replacement;
-
- /** @var array */
+ /** @var array|null */
private $otherLangs;
public function __construct( array $params ) {
@@ -63,18 +60,17 @@ class MessageUpdateParameter implements Serializable {
return $this->fuzzy;
}
- public function getOtherLangs(): array {
+ public function getOtherLangs(): ?array {
return $this->otherLangs;
}
- public function serialize(): string {
- $return = FormatJson::encode( get_object_vars( $this ), false, FormatJson::ALL_OK );
- return $return;
+ public static function newFromJsonArray( array $params ) {
+ return new self( $params );
}
- public function unserialize( $deserialized ) {
- $params = FormatJson::decode( $deserialized, true );
- $this->assignPropsFromArray( $params );
+ /** @return mixed[] */
+ protected function toJsonArray(): array {
+ return get_object_vars( $this );
}
private function assignPropsFromArray( array $params ) {
@@ -100,3 +96,5 @@ class MessageUpdateParameter implements Serializable {
return new self( $jobParams );
}
}
+
+class_alias( MessageUpdateParameter::class, '\MediaWiki\Extensions\Translate\MessageUpdateParameter' );
diff --git a/MLEB/Translate/src/Synchronization/QueryGroupSyncCacheMaintenanceScript.php b/MLEB/Translate/src/Synchronization/QueryGroupSyncCacheMaintenanceScript.php
new file mode 100644
index 00000000..101ecab7
--- /dev/null
+++ b/MLEB/Translate/src/Synchronization/QueryGroupSyncCacheMaintenanceScript.php
@@ -0,0 +1,97 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Query information in the group synchronization cache.
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2021.01
+ */
+class QueryGroupSyncCacheMaintenanceScript extends BaseMaintenanceScript {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Query the contents of the group synchronization cache' );
+
+ $this->addOption(
+ 'group',
+ '(optional) Group Id being queried',
+ self::OPTIONAL,
+ self::HAS_ARG
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ public function execute() {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+
+ if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
+ $this->fatalError( 'GroupSynchronizationCache is not enabled' );
+ }
+
+ $groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
+
+ $groupId = $this->getOption( 'group' );
+ if ( $groupId ) {
+ $groupMessages = $groupSyncCache->getGroupMessages( $groupId );
+ $this->displayGroupMessages( $groupId, $groupMessages );
+ } else {
+ $groups = $groupSyncCache->getGroupsInSync();
+ $this->displayGroups( $groups );
+ }
+ }
+
+ private function displayGroups( array $groupIds ): void {
+ if ( !$groupIds ) {
+ $this->output( "No groups found in synchronization\n" );
+ return;
+ }
+
+ $this->output( "Groups found in sync:\n" );
+ foreach ( $groupIds as $groupId ) {
+ $this->output( "\t- $groupId\n" );
+ }
+ }
+
+ /**
+ * @param string $groupId
+ * @param MessageUpdateParameter[] $groupMessages
+ */
+ private function displayGroupMessages( string $groupId, array $groupMessages ): void {
+ if ( !$groupMessages ) {
+ $this->output( "No messages found for group $groupId\n" );
+ return;
+ }
+
+ $this->output( "Messages in group $groupId:\n" );
+ foreach ( $groupMessages as $message ) {
+ $this->displayMessageDetails( $message );
+ }
+ }
+
+ private function displayMessageDetails( MessageUpdateParameter $messageParam ): void {
+ $tags = [];
+ if ( $messageParam->isRename() ) {
+ $tags[] = 'rename';
+ }
+
+ if ( $messageParam->isFuzzy() ) {
+ $tags[] = 'fuzzy';
+ }
+
+ $otherLangs = $messageParam->getOtherLangs() ?: [ 'N/A' ];
+ $this->output( "\t- Title: " . $messageParam->getPageName() . "\n" );
+ $this->output( "\t Tags: " . ( $tags ? implode( ', ', $tags ) : 'N/A' ) . "\n" );
+ if ( $messageParam->isRename() ) {
+ $this->output( "\t Target: " . $messageParam->getTargetValue() . "\n" );
+ $this->output( "\t Replacement: " . $messageParam->getReplacementValue() . "\n" );
+ $this->output( "\t Other languages: " . ( implode( ', ', $otherLangs ) ) . "\n" );
+ }
+ }
+}
diff --git a/MLEB/Translate/src/SystemUsers/FuzzyBot.php b/MLEB/Translate/src/SystemUsers/FuzzyBot.php
index 4e654ade..dee12f35 100644
--- a/MLEB/Translate/src/SystemUsers/FuzzyBot.php
+++ b/MLEB/Translate/src/SystemUsers/FuzzyBot.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\SystemUsers;
+namespace MediaWiki\Extension\Translate\SystemUsers;
use User;
@@ -23,3 +23,5 @@ class FuzzyBot {
return $wgTranslateFuzzyBotName;
}
}
+
+class_alias( FuzzyBot::class, '\MediaWiki\Extensions\Translate\FuzzyBot' );
diff --git a/MLEB/Translate/src/SystemUsers/TranslateUserManager.php b/MLEB/Translate/src/SystemUsers/TranslateUserManager.php
index d008567a..8aea6775 100644
--- a/MLEB/Translate/src/SystemUsers/TranslateUserManager.php
+++ b/MLEB/Translate/src/SystemUsers/TranslateUserManager.php
@@ -7,14 +7,14 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\SystemUsers;
+namespace MediaWiki\Extension\Translate\SystemUsers;
-/**
- * @since 2019.08
- */
+use User;
+
+/** @since 2019.08 */
class TranslateUserManager {
public static function getUser() {
- return \User::newSystemUser( self::getName(), [ 'steal' => true ] );
+ return User::newSystemUser( self::getName(), [ 'steal' => true ] );
}
public static function getName() {
@@ -23,3 +23,5 @@ class TranslateUserManager {
return $wgTranslateUserManagerName;
}
}
+
+class_alias( TranslateUserManager::class, '\MediaWiki\Extensions\Translate\TranslateUserManager' );
diff --git a/MLEB/Translate/src/TranslatorInterface/Insertable/CombinedInsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/CombinedInsertablesSuggester.php
new file mode 100644
index 00000000..4f42d033
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/CombinedInsertablesSuggester.php
@@ -0,0 +1,33 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+/**
+ * A class to combine multiple insertables suggesters.
+ * @author Geoffrey Mon
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+class CombinedInsertablesSuggester implements InsertablesSuggester {
+
+ /** @var InsertablesSuggester[] */
+ protected $suggesters = [];
+
+ /** @param InsertablesSuggester[] $suggesters Array of InsertablesSuggester objects to combine. */
+ public function __construct( array $suggesters = [] ) {
+ $this->suggesters = $suggesters;
+ }
+
+ public function getInsertables( string $text ): array {
+ $insertables = [];
+ foreach ( $this->suggesters as $suggester ) {
+ $new = $suggester->getInsertables( $text );
+ $insertables = array_merge( $insertables, $new );
+ }
+
+ return array_unique( $insertables, SORT_REGULAR );
+ }
+}
+
+class_alias( CombinedInsertablesSuggester::class, '\MediaWiki\Extensions\Translate\CombinedInsertablesSuggester' );
diff --git a/MLEB/Translate/insertables/HtmlTagInsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/HtmlTagInsertablesSuggester.php
index 03a35265..6852d9f8 100644
--- a/MLEB/Translate/insertables/HtmlTagInsertablesSuggester.php
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/HtmlTagInsertablesSuggester.php
@@ -1,17 +1,17 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
/**
* Suggester for HTML tags
- * @since 2020.03
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.12
*/
class HtmlTagInsertablesSuggester implements InsertablesSuggester {
/** @var InsertablesSuggester */
- private $suggester = null;
+ private $suggester;
public function __construct() {
$this->suggester = new RegexInsertablesSuggester( [
@@ -22,7 +22,9 @@ class HtmlTagInsertablesSuggester implements InsertablesSuggester {
] );
}
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return $this->suggester->getInsertables( $text );
}
}
+
+class_alias( HtmlTagInsertablesSuggester::class, '\MediaWiki\Extensions\Translate\HtmlTagInsertablesSuggester' );
diff --git a/MLEB/Translate/insertables/Insertable.php b/MLEB/Translate/src/TranslatorInterface/Insertable/Insertable.php
index bab7adff..1a2bd1c1 100644
--- a/MLEB/Translate/insertables/Insertable.php
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/Insertable.php
@@ -1,16 +1,14 @@
<?php
-/**
- * Value object for insertables.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
/**
* Insertable is a string that usually does not need translation and is
* difficult to type manually.
- * @since 2013.09
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.12
*/
class Insertable {
/** @var string What to show to the user */
@@ -25,21 +23,23 @@ class Insertable {
* @param string $pre What to insert before selection
* @param string $post What to insert after selection
*/
- public function __construct( $display, $pre = '', $post = '' ) {
+ public function __construct( string $display, string $pre = '', string $post = '' ) {
$this->display = $display;
$this->pre = $pre;
$this->post = $post;
}
- public function getPreText() {
+ public function getPreText(): string {
return $this->pre;
}
- public function getPostText() {
+ public function getPostText(): string {
return $this->post;
}
- public function getDisplayText() {
+ public function getDisplayText(): string {
return $this->display;
}
}
+
+class_alias( Insertable::class, '\MediaWiki\Extensions\Translate\Insertable' );
diff --git a/MLEB/Translate/src/TranslatorInterface/Insertable/InsertableFactory.php b/MLEB/Translate/src/TranslatorInterface/Insertable/InsertableFactory.php
new file mode 100644
index 00000000..aa869ce8
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/InsertableFactory.php
@@ -0,0 +1,50 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use InvalidArgumentException;
+
+/**
+ * A factory class used to instantiate instances of Insertables
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+class InsertableFactory {
+ /**
+ * Takes a InsertableSuggester class name, and returns an instance of that class.
+ * @param string $class
+ * @param array|string|null $params
+ * @throws InvalidArgumentException
+ */
+ public static function make( string $class, $params = null ): InsertablesSuggester {
+ // FIXME: We should look at using "id / class" similar to what we do with the ValidatorFactory
+ $checkedClasses = [];
+
+ // This check is done for custom insertables that might be added for certain groups.
+ if ( !class_exists( $class ) ) {
+ $checkedClasses[] = $class;
+ // Custom class not found, so lets try to load pre-provided Insertables.
+ $class = __NAMESPACE__ . '\\' . $class;
+ }
+
+ if ( !class_exists( $class ) ) {
+ $checkedClasses[] = $class;
+ throw new InvalidArgumentException(
+ 'Could not find InsertableSuggester with class: ' . implode( ', ', $checkedClasses )
+ );
+ }
+
+ $suggester = new $class( $params );
+ if ( !$suggester instanceof InsertablesSuggester ) {
+ throw new InvalidArgumentException(
+ "$class does not implement the InsertableSuggester interface"
+ );
+ }
+
+ return $suggester;
+ }
+}
+
+class_alias( InsertableFactory::class, '\MediaWiki\Extensions\Translate\InsertableFactory' );
diff --git a/MLEB/Translate/src/TranslatorInterface/Insertable/InsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/InsertablesSuggester.php
new file mode 100644
index 00000000..a327fb6b
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/InsertablesSuggester.php
@@ -0,0 +1,21 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+/**
+ * Interface for InsertablesSuggesters. Insertable is a string that usually does
+ * not need translation and is difficult to type manually.
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+interface InsertablesSuggester {
+ /**
+ * Returns the insertables in the message text.
+ * @return Insertable[]
+ */
+ public function getInsertables( string $text ): array;
+}
+
+class_alias( InsertablesSuggester::class, '\MediaWiki\Extensions\Translate\InsertablesSuggester' );
diff --git a/MLEB/Translate/insertables/MediaWikiInsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/MediaWikiInsertablesSuggester.php
index b244d5cc..5454e72f 100644
--- a/MLEB/Translate/insertables/MediaWikiInsertablesSuggester.php
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/MediaWikiInsertablesSuggester.php
@@ -1,16 +1,16 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
/**
* InsertablesSuggester implementation for MediaWiki message translations.
- * @since 2013.09
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.12
*/
class MediaWikiInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
$insertables = [];
$matches = [];
@@ -44,3 +44,5 @@ class MediaWikiInsertablesSuggester implements InsertablesSuggester {
return $insertables;
}
}
+
+class_alias( MediaWikiInsertablesSuggester::class, '\MediaWiki\Extensions\Translate\MediaWikiInsertablesSuggester' );
diff --git a/MLEB/Translate/insertables/NumericalParameterInsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggester.php
index 13ffd4af..1d327354 100644
--- a/MLEB/Translate/insertables/NumericalParameterInsertablesSuggester.php
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggester.php
@@ -1,14 +1,16 @@
<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
/**
* Insertables suggester for numerical parameters such as $1, $2, $3
- *
- * @file
* @author Geoffrey Mon
* @license GPL-2.0-or-later
+ * @since 2020.12
*/
-
class NumericalParameterInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
$insertables = [];
// $1, $2, $3 etc.
@@ -27,3 +29,8 @@ class NumericalParameterInsertablesSuggester implements InsertablesSuggester {
return $insertables;
}
}
+
+class_alias(
+ NumericalParameterInsertablesSuggester::class,
+ '\MediaWiki\Extensions\Translate\NumericalParameterInsertablesSuggester'
+);
diff --git a/MLEB/Translate/insertables/RegexInsertablesSuggester.php b/MLEB/Translate/src/TranslatorInterface/Insertable/RegexInsertablesSuggester.php
index f054f4e0..b95efd6a 100644
--- a/MLEB/Translate/insertables/RegexInsertablesSuggester.php
+++ b/MLEB/Translate/src/TranslatorInterface/Insertable/RegexInsertablesSuggester.php
@@ -1,14 +1,16 @@
<?php
-/**
- * @file
- * @author Abijeet Patro
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use InvalidArgumentException;
/**
* Regex InsertablesSuggester implementation that can be extended or used
* for insertables in message groups
- * @since 2019.06
+ * @author Abijeet Patro
+ * @license GPL-2.0-or-later
+ * @since 2020.12
*/
class RegexInsertablesSuggester implements InsertablesSuggester {
/**
@@ -16,20 +18,17 @@ class RegexInsertablesSuggester implements InsertablesSuggester {
* @var string
*/
protected $regex = null;
-
/**
* The named parameter from the regex that should be used for
* insertable display.
* @var string
*/
protected $display = null;
-
/**
* The named parameter from the regex that should be used as pre
* @var string
*/
protected $pre = null;
-
/**
* The named paramater from the regex that should be used as post
* @var string
@@ -37,9 +36,9 @@ class RegexInsertablesSuggester implements InsertablesSuggester {
protected $post = null;
/**
- * Constructur function
+ * Constructor function
* @param array|string $params If params is specified as a string, it is used as the regex.
- * Eg: "/\$[a-z0-9]+/". In this case `display` is the first value from the regex match.
+ * Eg: "/\$[a-z0-9]+/". In this case `display` is the first value from the regex match.
* `pre` is also the first value from the regex match, `post` is left empty.
*
* If params is specified as a collection / array, see below for further details.
@@ -92,15 +91,11 @@ class RegexInsertablesSuggester implements InsertablesSuggester {
}
}
- public function getInsertables( $text ) {
- $insertables = [];
-
+ public function getInsertables( string $text ): array {
$matches = [];
preg_match_all( $this->regex, $text, $matches, PREG_SET_ORDER );
- $insertables = array_map( [ $this, 'mapInsertables' ], $matches );
-
- return $insertables;
+ return array_map( [ $this, 'mapInsertables' ], $matches );
}
protected function mapInsertables( array $match ) {
@@ -127,3 +122,5 @@ class RegexInsertablesSuggester implements InsertablesSuggester {
return new Insertable( $displayVal, $preVal, $postVal );
}
}
+
+class_alias( RegexInsertablesSuggester::class, '\MediaWiki\Extensions\Translate\RegexInsertablesSuggester' );
diff --git a/MLEB/Translate/src/TranslatorSandbox/ManageTranslatorSandboxSpecialPage.php b/MLEB/Translate/src/TranslatorSandbox/ManageTranslatorSandboxSpecialPage.php
new file mode 100644
index 00000000..d17a4602
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorSandbox/ManageTranslatorSandboxSpecialPage.php
@@ -0,0 +1,224 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use FormatJson;
+use Html;
+use MediaWiki\Config\ServiceOptions;
+use MWTimestamp;
+use Sanitizer;
+use SpecialPage;
+use TranslateSandbox;
+use User;
+
+/**
+ * Special page for managing sandboxed users.
+ *
+ * @author Niklas Laxström
+ * @author Amir E. Aharoni
+ * @license GPL-2.0-or-later
+ * @ingroup SpecialPage TranslateSpecialPage
+ */
+class ManageTranslatorSandboxSpecialPage extends SpecialPage {
+ /** @var TranslationStashReader */
+ private $stash;
+
+ public const CONSTRUCTOR_OPTIONS = [
+ 'TranslateUseSandbox',
+ ];
+
+ public function __construct(
+ TranslationStashReader $stash,
+ ServiceOptions $options
+ ) {
+ $this->stash = $stash;
+
+ parent::__construct(
+ 'ManageTranslatorSandbox',
+ 'translate-sandboxmanage',
+ $options->get( 'TranslateUseSandbox' )
+ );
+ }
+
+ public function doesWrites() {
+ return true;
+ }
+
+ protected function getGroupName() {
+ return 'translation';
+ }
+
+ public function execute( $params ) {
+ $this->setHeaders();
+ $this->checkPermissions();
+ $out = $this->getOutput();
+ $out->addModuleStyles(
+ [
+ 'ext.translate.special.managetranslatorsandbox.styles',
+ 'mediawiki.ui.button',
+ 'jquery.uls.grid',
+ ]
+ );
+ $out->addModules( 'ext.translate.special.managetranslatorsandbox' );
+
+ $this->showPage();
+ }
+
+ /** Generates the whole page html and appends it to output */
+ private function showPage(): void {
+ $out = $this->getOutput();
+
+ $nojs = Html::element(
+ 'div',
+ [ 'class' => 'tux-nojs errorbox' ],
+ $this->msg( 'tux-nojs' )->plain()
+ );
+ $out->addHTML( $nojs );
+
+ $out->addHTML(
+ <<<HTML
+<div class="grid tsb-container">
+ <div class="row">
+ <div class="nine columns pane filter">{$this->makeFilter()}</div>
+ <div class="three columns pane search">{$this->makeSearchBox()}</div>
+ </div>
+ <div class="row tsb-body">
+ <div class="four columns pane requests">
+ {$this->makeList()}
+ <div class="request-footer">
+ <span class="selected-counter">
+ {$this->msg( 'tsb-selected-count' )->numParams( 0 )->escaped()}
+ </span>
+ &nbsp;
+ <a href="#" class="older-requests-indicator"></a>
+ </div>
+ </div>
+ <div class="eight columns pane details"></div>
+ </div>
+</div>
+HTML
+ );
+ }
+
+ private function makeFilter(): string {
+ return $this->msg( 'tsb-filter-pending' )->escaped();
+ }
+
+ private function makeSearchBox(): string {
+ return <<<HTML
+<input class="request-filter-box right"
+ placeholder="{$this->msg( 'tsb-search-requests' )->escaped()}" type="search" />
+HTML;
+ }
+
+ private function makeList(): string {
+ $items = [];
+ $requests = [];
+ $users = TranslateSandbox::getUsers();
+
+ /** @var User $user */
+ foreach ( $users as $user ) {
+ $reminders = $user->getOption( 'translate-sandbox-reminders' );
+ $reminders = $reminders ? explode( '|', $reminders ) : [];
+ $remindersCount = count( $reminders );
+ if ( $remindersCount ) {
+ $lastReminderTimestamp = new MWTimestamp( end( $reminders ) );
+ $lastReminderAgo = htmlspecialchars(
+ $this->getHumanTimestamp( $lastReminderTimestamp )
+ );
+ } else {
+ $lastReminderAgo = '';
+ }
+
+ $requests[] = [
+ 'username' => $user->getName(),
+ 'email' => $user->getEmail(),
+ 'gender' => $user->getOption( 'gender' ),
+ 'registrationdate' => $user->getRegistration(),
+ 'translations' => count( $this->stash->getTranslations( $user ) ),
+ 'languagepreferences' => FormatJson::decode(
+ $user->getOption( 'translate-sandbox' )
+ ),
+ 'userid' => $user->getId(),
+ 'reminderscount' => $remindersCount,
+ 'lastreminder' => $lastReminderAgo,
+ ];
+ }
+
+ // Sort the requests based on translations and registration date
+ usort( $requests, [ $this, 'translatorRequestSort' ] );
+
+ foreach ( $requests as $request ) {
+ // @phan-suppress-next-line SecurityCheck-DoubleEscaped
+ $items[] = $this->makeRequestItem( $request );
+ }
+
+ $requestsList = implode( "\n", $items );
+
+ return <<<HTML
+<div class="row request-header">
+ <div class="four columns">
+ <button class="language-selector unselected">
+ {$this->msg( 'tsb-all-languages-button-label' )->escaped()}
+ </button>
+ </div>
+ <div class="five columns request-count"></div>
+ <div class="three columns center">
+ <input class="request-selector-all" name="request" type="checkbox" />
+ </div>
+</div>
+<div class="requests-list">
+ {$requestsList}
+</div>
+HTML;
+ }
+
+ private function makeRequestItem( array $request ): string {
+ $requestdataEnc = htmlspecialchars( FormatJson::encode( $request ) );
+ $nameEnc = htmlspecialchars( $request['username'] );
+ $nameEncForId =
+ htmlspecialchars(
+ Sanitizer::escapeIdForAttribute( 'tsb-request-' . $request['username'] )
+ );
+ $emailEnc = htmlspecialchars( $request['email'] );
+ $countEnc = htmlspecialchars( (string)$request['translations'] );
+ $timestamp = new MWTimestamp( $request['registrationdate'] );
+ $agoEnc = htmlspecialchars( $this->getHumanTimestamp( $timestamp ) );
+
+ return <<<HTML
+<div class="row request" data-data="$requestdataEnc" id="$nameEncForId">
+ <div class="two columns amount">
+ <div class="translation-count">$countEnc</div>
+ </div>
+ <div class="seven columns request-info">
+ <div class="row username">$nameEnc</div>
+ <div class="row email" dir="ltr">$emailEnc</div>
+ </div>
+ <div class="three columns approval center">
+ <input class="row request-selector" name="request" type="checkbox" />
+ <div class="row signup-age">$agoEnc</div>
+ </div>
+</div>
+HTML;
+ }
+
+ private function getHumanTimestamp( MWTimestamp $ts ): string {
+ return $this->getLanguage()->getHumanTimestamp( $ts, null, $this->getUser() );
+ }
+
+ /**
+ * Sorts groups by descending order of number of translations,
+ * registration date and username
+ */
+ private function translatorRequestSort( array $a, array $b ): int {
+ return $b['translations'] <=> $a['translations']
+ ?: $b['registrationdate'] <=> $a['registrationdate']
+ ?: strnatcasecmp( $a['username'], $b['username'] );
+ }
+}
+
+class_alias(
+ ManageTranslatorSandboxSpecialPage::class,
+ '\MediaWiki\Extensions\Translate\ManageTranslatorSandboxSpecialPage'
+);
diff --git a/MLEB/Translate/stash/StashedTranslation.php b/MLEB/Translate/src/TranslatorSandbox/StashedTranslation.php
index 3eaf1f3b..251c6d60 100644
--- a/MLEB/Translate/stash/StashedTranslation.php
+++ b/MLEB/Translate/src/TranslatorSandbox/StashedTranslation.php
@@ -1,67 +1,50 @@
<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use Title;
+use User;
+
/**
- * Value object for stashed translation.
+ * Value object for stashed translation which you can construct.
*
- * @file
* @author Niklas Laxström
* @license GPL-2.0-or-later
- */
-
-/**
- * Value object for stashed translation which you can construct.
- * @since 2013.06
+ * @since 2013.06 (namespaced in 2020.11)
*/
class StashedTranslation {
/** @var User */
protected $user;
-
/** @var Title */
protected $title;
-
/** @var string */
protected $value;
-
/** @var array|null */
protected $metadata;
- /**
- * @param User $user
- * @param Title $title
- * @param string $value
- * @param array|null $metadata
- */
- public function __construct( User $user, Title $title, $value, array $metadata = null ) {
+ public function __construct( User $user, Title $title, string $value, array $metadata = null ) {
$this->user = $user;
$this->title = $title;
$this->value = $value;
$this->metadata = $metadata;
}
- /**
- * @return User
- */
- public function getUser() {
+ public function getUser(): User {
return $this->user;
}
- /**
- * @return Title
- */
- public function getTitle() {
+ public function getTitle(): Title {
return $this->title;
}
- /**
- * @return string
- */
- public function getValue() {
+ public function getValue(): string {
return $this->value;
}
- /**
- * @return array|null
- */
- public function getMetadata() {
+ public function getMetadata(): ?array {
return $this->metadata;
}
}
+
+class_alias( StashedTranslation::class, '\MediaWiki\Extensions\Translate\StashedTranslation' );
diff --git a/MLEB/Translate/src/TranslatorSandbox/TranslationStashReader.php b/MLEB/Translate/src/TranslatorSandbox/TranslationStashReader.php
new file mode 100644
index 00000000..e9e041e0
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorSandbox/TranslationStashReader.php
@@ -0,0 +1,22 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use User;
+
+/*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.11
+ */
+interface TranslationStashReader {
+ /**
+ * Gets all stashed translations for the given user.
+ *
+ * @return StashedTranslation[]
+ */
+ public function getTranslations( User $user ): array;
+}
+
+class_alias( TranslationStashReader::class, '\MediaWiki\Extensions\Translate\TranslationStashReader' );
diff --git a/MLEB/Translate/specials/SpecialTranslationStash.php b/MLEB/Translate/src/TranslatorSandbox/TranslationStashSpecialPage.php
index 50a309ed..1915a0d5 100644
--- a/MLEB/Translate/specials/SpecialTranslationStash.php
+++ b/MLEB/Translate/src/TranslatorSandbox/TranslationStashSpecialPage.php
@@ -1,22 +1,46 @@
<?php
-/**
- * TranslationStash - Translator screening page
- *
- * @file
- * @author Santhosh Thottingal
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use FormatJson;
+use Html;
+use Language;
+use MediaWiki\Config\ServiceOptions;
+use MediaWiki\Languages\LanguageNameUtils;
+use SpecialPage;
+use Title;
+use TranslateSandbox;
+use TranslateUtils;
/**
* Special page for new users to translate example messages.
*
+ * @author Santhosh Thottingal
+ * @license GPL-2.0-or-later
* @ingroup SpecialPage TranslateSpecialPage
*/
-class SpecialTranslationStash extends SpecialPage {
- /** @var TranslationStashStorage */
- protected $stash;
-
- public function __construct() {
+class TranslationStashSpecialPage extends SpecialPage {
+ /** @var TranslationStashReader */
+ private $stash;
+ /** @var ServiceOptions */
+ private $options;
+ /** @var LanguageNameUtils */
+ private $languageNameUtils;
+
+ public const CONSTRUCTOR_OPTIONS = [
+ 'TranslateSandboxLimit',
+ 'TranslateSecondaryPermissionUrl'
+ ];
+
+ public function __construct(
+ LanguageNameUtils $languageNameUtils,
+ TranslationStashReader $stash,
+ ServiceOptions $options
+ ) {
+ $this->languageNameUtils = $languageNameUtils;
+ $this->stash = $stash;
+ $this->options = $options;
parent::__construct( 'TranslationStash' );
}
@@ -29,7 +53,8 @@ class SpecialTranslationStash extends SpecialPage {
}
public function execute( $params ) {
- global $wgTranslateSandboxLimit, $wgTranslateSecondaryPermissionUrl;
+ $limit = $this->options->get( 'TranslateSandboxLimit' );
+ $secondaryPermissionUrl = $this->options->get( 'TranslateSecondaryPermissionUrl' );
$this->setHeaders();
$out = $this->getOutput();
@@ -37,9 +62,9 @@ class SpecialTranslationStash extends SpecialPage {
$this->stash = new TranslationStashStorage( wfGetDB( DB_MASTER ) );
if ( !$this->hasPermissionToUse() ) {
- if ( $wgTranslateSecondaryPermissionUrl && $this->getUser()->isLoggedIn() ) {
+ if ( $secondaryPermissionUrl && $this->getUser()->isRegistered() ) {
$out->redirect(
- Title::newFromText( $wgTranslateSecondaryPermissionUrl )->getLocalURL()
+ Title::newFromText( $secondaryPermissionUrl )->getLocalURL()
);
return;
@@ -50,32 +75,19 @@ class SpecialTranslationStash extends SpecialPage {
return;
}
- $out->addJsConfigVars( 'wgTranslateSandboxLimit', $wgTranslateSandboxLimit );
+ $out->addJsConfigVars( 'wgTranslateSandboxLimit', $limit );
$out->addModules( 'ext.translate.special.translationstash' );
$out->addModuleStyles( 'mediawiki.ui.button' );
$this->showPage();
}
- /**
- * Checks that the user is in the sandbox. Also handles special overrides
- * mainly used for integration testing.
- *
- * @return bool
- */
- protected function hasPermissionToUse() {
- $user = $this->getUser();
-
- if ( !TranslateSandbox::isSandboxed( $user ) ) {
- return false;
- }
-
- return true;
+ /** Checks that the user is in the sandbox. */
+ private function hasPermissionToUse(): bool {
+ return TranslateSandbox::isSandboxed( $this->getUser() );
}
- /**
- * Generates the whole page html and appends it to output
- */
- protected function showPage() {
+ /** Generates the whole page html and appends it to output */
+ private function showPage(): void {
$out = $this->getOutput();
$user = $this->getUser();
@@ -84,10 +96,12 @@ class SpecialTranslationStash extends SpecialPage {
$progress = $this->msg( 'translate-translationstash-initialtranslation' )->parse();
} else {
$progress = $this->msg( 'translate-translationstash-translations' )
- ->numParams( $count )->parse();
+ ->numParams( $count )
+ ->parse();
}
- $out->addHTML( <<<HTML
+ $out->addHTML(
+ <<<HTML
<div class="grid">
<div class="row translate-welcome-header">
<h1>
@@ -112,26 +126,27 @@ HTML
);
}
- protected function getMessageTable() {
+ private function getMessageTable(): string {
$sourceLang = $this->getSourceLanguage();
$targetLang = $this->getTargetLanguage();
- $list = Html::element( 'div', [
- 'class' => 'row tux-messagelist',
- 'data-sourcelangcode' => $sourceLang->getCode(),
- 'data-sourcelangdir' => $sourceLang->getDir(),
- 'data-targetlangcode' => $targetLang->getCode(),
- 'data-targetlangdir' => $targetLang->getDir(),
- ] );
-
- return $list;
+ return Html::element(
+ 'div',
+ [
+ 'class' => 'row tux-messagelist',
+ 'data-sourcelangcode' => $sourceLang->getCode(),
+ 'data-sourcelangdir' => $sourceLang->getDir(),
+ 'data-targetlangcode' => $targetLang->getCode(),
+ 'data-targetlangdir' => $targetLang->getDir(),
+ ]
+ );
}
- protected function tuxLanguageSelector() {
+ private function tuxLanguageSelector(): string {
// The name will be displayed in the UI language,
// so use for lang and dir
$language = $this->getTargetLanguage();
- $targetLangName = Language::fetchLanguageName( $language->getCode() );
+ $targetLangName = $this->languageNameUtils->getLanguageName( $language->getCode() );
$label = Html::element(
'span',
@@ -154,20 +169,14 @@ HTML
return "$label&#160;$trigger";
}
- /**
- * Returns the source language for messages.
- * @return Language
- */
- protected function getSourceLanguage() {
+ /** Returns the source language for messages. */
+ protected function getSourceLanguage(): Language {
// Bad
return Language::factory( 'en' );
}
- /**
- * Returns the default target language for messages.
- * @return Language
- */
- protected function getTargetLanguage() {
+ /** Returns the default target language for messages. */
+ private function getTargetLanguage(): Language {
$ui = $this->getLanguage();
$source = $this->getSourceLanguage();
if ( !$ui->equals( $source ) ) {
@@ -177,7 +186,7 @@ HTML
$options = FormatJson::decode( $this->getUser()->getOption( 'translate-sandbox' ), true );
$supported = TranslateUtils::getLanguageNames( 'en' );
- if ( isset( $options['languages' ] ) ) {
+ if ( isset( $options['languages'] ) ) {
foreach ( $options['languages'] as $code ) {
if ( !isset( $supported[$code] ) ) {
continue;
@@ -193,3 +202,5 @@ HTML
return Language::factory( $source->getCode() );
}
}
+
+class_alias( TranslationStashSpecialPage::class, '\MediaWiki\Extensions\Translate\TranslationStashSpecialPage' );
diff --git a/MLEB/Translate/stash/TranslationStashStorage.php b/MLEB/Translate/src/TranslatorSandbox/TranslationStashStorage.php
index fb67449f..db30852a 100644
--- a/MLEB/Translate/stash/TranslationStashStorage.php
+++ b/MLEB/Translate/src/TranslatorSandbox/TranslationStashStorage.php
@@ -1,62 +1,31 @@
<?php
-/**
- * Storage class for stashed translations.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use Title;
+use User;
use Wikimedia\Rdbms\IDatabase;
/**
* Storage class for stashed translations. This one uses sql tables as storage.
- * @since 2013.06
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2013.06 (namespaced in 2020.11)
*/
-class TranslationStashStorage {
+class TranslationStashStorage implements TranslationStashReader, TranslationStashWriter {
/** @var IDatabase */
protected $db;
-
/** @var string */
protected $dbTable;
- /**
- * @param IDatabase $db
- * @param string $table
- */
- public function __construct( IDatabase $db, $table = 'translate_stash' ) {
+ public function __construct( IDatabase $db, string $table = 'translate_stash' ) {
$this->db = $db;
$this->dbTable = $table;
}
- /**
- * Adds a new translation to the stash. If the same key already exists, the
- * previous translation and metadata will be replaced with the new one.
- *
- * @param StashedTranslation $item
- */
- public function addTranslation( StashedTranslation $item ) {
- $row = [
- 'ts_user' => $item->getUser()->getId(),
- 'ts_title' => $item->getTitle()->getDBkey(),
- 'ts_namespace' => $item->getTitle()->getNamespace(),
- 'ts_value' => $item->getValue(),
- 'ts_metadata' => serialize( $item->getMetadata() ),
- ];
-
- $indexes = [
- [ 'ts_user', 'ts_namespace', 'ts_title' ]
- ];
-
- $this->db->replace( $this->dbTable, $indexes, $row, __METHOD__ );
- }
-
- /**
- * Gets all stashed translations for the given user.
- * @param User $user
- * @return StashedTranslation[]
- */
- public function getTranslations( User $user ) {
+ public function getTranslations( User $user ): array {
$conds = [ 'ts_user' => $user->getId() ];
$fields = [ 'ts_namespace', 'ts_title', 'ts_value', 'ts_metadata' ];
@@ -75,13 +44,26 @@ class TranslationStashStorage {
return $objects;
}
- /**
- * Delete all stashed translations for the given user.
- * @param User $user
- * @since 2013.10
- */
- public function deleteTranslations( User $user ) {
+ public function addTranslation( StashedTranslation $item ): void {
+ $row = [
+ 'ts_user' => $item->getUser()->getId(),
+ 'ts_title' => $item->getTitle()->getDBkey(),
+ 'ts_namespace' => $item->getTitle()->getNamespace(),
+ 'ts_value' => $item->getValue(),
+ 'ts_metadata' => serialize( $item->getMetadata() ),
+ ];
+
+ $indexes = [
+ [ 'ts_user', 'ts_namespace', 'ts_title' ],
+ ];
+
+ $this->db->replace( $this->dbTable, $indexes, $row, __METHOD__ );
+ }
+
+ public function deleteTranslations( User $user ): void {
$conds = [ 'ts_user' => $user->getId() ];
$this->db->delete( $this->dbTable, $conds, __METHOD__ );
}
}
+
+class_alias( TranslationStashStorage::class, '\MediaWiki\Extensions\Translate\TranslationStashStorage' );
diff --git a/MLEB/Translate/src/TranslatorSandbox/TranslationStashWriter.php b/MLEB/Translate/src/TranslatorSandbox/TranslationStashWriter.php
new file mode 100644
index 00000000..aca19268
--- /dev/null
+++ b/MLEB/Translate/src/TranslatorSandbox/TranslationStashWriter.php
@@ -0,0 +1,19 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use User;
+
+interface TranslationStashWriter {
+ /**
+ * Adds a new translation to the stash. If the same key already exists, the
+ * previous translation and metadata will be replaced with the new one.
+ */
+ public function addTranslation( StashedTranslation $item ): void;
+
+ /** Delete all stashed translations for the given user. */
+ public function deleteTranslations( User $user ): void;
+}
+
+class_alias( TranslationStashWriter::class, '\MediaWiki\Extensions\Translate\TranslationStashWriter' );
diff --git a/MLEB/Translate/src/TtmServer/ExportTtmServerDumpMaintenanceScript.php b/MLEB/Translate/src/TtmServer/ExportTtmServerDumpMaintenanceScript.php
new file mode 100644
index 00000000..f2f70b4e
--- /dev/null
+++ b/MLEB/Translate/src/TtmServer/ExportTtmServerDumpMaintenanceScript.php
@@ -0,0 +1,198 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TtmServer;
+
+use FormatJson;
+use Language;
+use MediaWiki\Extension\Translate\Utilities\BaseMaintenanceScript;
+use MediaWiki\Extension\Translate\Utilities\ParallelExecutor;
+use MediaWiki\MediaWikiServices;
+use MessageGroup;
+use MessageGroups;
+use MessageGroupStats;
+use MessageHandle;
+use TMessage;
+use WikiMap;
+
+/**
+ * @since 2020.11
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class ExportTtmServerDumpMaintenanceScript extends BaseMaintenanceScript {
+ /** @var Language */
+ private $contentLanguage;
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Creates a dump file that can be imported to a TTMServer' );
+
+ $this->addOption(
+ 'output-directory',
+ 'Which directory to output files to',
+ self::REQUIRED,
+ self::HAS_ARG,
+ 'o'
+ );
+ $this->addOption(
+ 'threads',
+ 'How many threads to use',
+ self::OPTIONAL,
+ self::HAS_ARG,
+ 'n'
+ );
+
+ $availableMethods = array_keys( $this->getAvailableCompressionWrappers() );
+ $values = count( $availableMethods ) ? implode( ', ', $availableMethods ) : 'NONE';
+ $this->addOption(
+ 'compress',
+ "Use a compression filter. Possible values: $values",
+ self::OPTIONAL,
+ self::HAS_ARG,
+ 'c'
+ );
+
+ $this->requireExtension( 'Translate' );
+ }
+
+ /** @return string[] */
+ private function getAvailableCompressionWrappers(): array {
+ $out = [];
+ $filters = stream_get_filters();
+ foreach ( $filters as $f ) {
+ if ( preg_match( '/^compress\..+$/', $f ) ) {
+ $out[$f] = $f . '://';
+ }
+ }
+ return $out;
+ }
+
+ public function execute() {
+ $this->contentLanguage = MediaWikiServices::getInstance()->getContentLanguage();
+
+ $threads = (int)$this->getOption( 'threads', 1 );
+ $outputDir = $this->getOption( 'output-directory' );
+ $requestedWrapper = $this->getOption( 'compress' );
+ $availableWrappers = $this->getAvailableCompressionWrappers();
+ if ( $requestedWrapper && !isset( $availableWrappers[$requestedWrapper] ) ) {
+ $this->fatalError(
+ "Compression wrapper '$requestedWrapper' is not supported"
+ );
+ }
+ $wrapper = $availableWrappers[$requestedWrapper] ?? '';
+ $suffix = $requestedWrapper ? ".$requestedWrapper" : '';
+
+ $executor = new ParallelExecutor( $threads );
+
+ $groups = $this->getGroupsInPerformanceOrder();
+ foreach ( $groups as $groupId => $group ) {
+ $path = $wrapper . rtrim( $outputDir, '/' ) . '/' . $groupId . '.json' . $suffix;
+
+ $executor->runInParallel(
+ function ( int $pid ) use ( $groupId ) {
+ $this->output( "Forked process $pid to process $groupId\n" );
+ },
+ function () use ( $group, $path ) {
+ $output = FormatJson::encode(
+ $this->getOutput( $group ),
+ true,
+ FormatJson::ALL_OK
+ );
+ file_put_contents( $path, $output );
+ }
+ );
+ }
+
+ $this->output( "Done.\n" );
+ }
+
+ /**
+ * Return groups sorted by number of messages.
+ *
+ * For parallel processing, it makes sense to process large groups first so that smaller
+ * ones can execute in parallel threads, rather than waiting for large group(s) to process
+ * while other threads have nothing to do. Do not spend time on gathering statistics in case
+ * they are not present.
+ *
+ * @return MessageGroup[]
+ */
+ private function getGroupsInPerformanceOrder(): array {
+ $groupStats = MessageGroupStats::forLanguage(
+ $this->contentLanguage->getCode(),
+ MessageGroupStats::FLAG_CACHE_ONLY
+ );
+
+ uasort(
+ $groupStats,
+ function ( array $a, array $b ): int {
+ return -1 * $this->sortGroupsBySize( $a, $b );
+ }
+ );
+
+ $groups = [];
+ foreach ( array_keys( $groupStats ) as $groupId ) {
+ $group = MessageGroups::getGroup( $groupId );
+ if ( $group->isMeta() ) {
+ continue;
+ }
+
+ $groups[$group->getId()] = $group;
+ }
+
+ return $groups;
+ }
+
+ private function sortGroupsBySize( array $a, array $b ): int {
+ return $a[MessageGroupStats::TOTAL] <=> $b[MessageGroupStats::TOTAL];
+ }
+
+ private function getOutput( MessageGroup $group ): array {
+ $out = [];
+
+ $groupId = $group->getId();
+ $sourceLanguage = $group->getSourceLanguage();
+
+ $stats = MessageGroupStats::forGroup( $groupId );
+ $collection = $group->initCollection( $sourceLanguage );
+ foreach ( $stats as $language => $numbers ) {
+ if ( $numbers[MessageGroupStats::TRANSLATED] === 0 ) {
+ continue;
+ }
+
+ $collection->resetForNewLanguage( $language );
+ $collection->filter( 'ignored' );
+ $collection->filter( 'translated', false );
+ $collection->loadTranslations();
+
+ foreach ( $collection->keys() as $mkey => $titleValue ) {
+ $handle = new MessageHandle( $titleValue );
+ /** @var TMessage $message */
+ $message = $collection[$mkey];
+
+ if ( !isset( $out[$mkey] ) ) {
+ $out[$mkey] = [
+ 'wikiId' => WikiMap::getCurrentWikiId(),
+ 'title' => $handle->getTitleForBase()->getPrefixedText(),
+ 'sourceLanguage' => $sourceLanguage,
+ 'primaryGroup' => $groupId,
+ 'values' => [],
+ ];
+ }
+
+ $out[$mkey]['values'][] = [
+ 'language' => $language,
+ 'value' => $message->translation(),
+ 'revision' => $message->getProperty( 'revision' ),
+ ];
+ }
+ }
+
+ return array_values( $out );
+ }
+}
+
+class_alias(
+ ExportTtmServerDumpMaintenanceScript::class,
+ '\MediaWiki\Extensions\Translate\ExportTtmServerDumpMaintenanceScript'
+);
diff --git a/MLEB/Translate/src/TtmServer/ServiceCreationFailure.php b/MLEB/Translate/src/TtmServer/ServiceCreationFailure.php
new file mode 100644
index 00000000..62959edb
--- /dev/null
+++ b/MLEB/Translate/src/TtmServer/ServiceCreationFailure.php
@@ -0,0 +1,14 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TtmServer;
+
+use RuntimeException;
+
+/**
+ * @since 2021.01
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class ServiceCreationFailure extends RuntimeException {
+}
diff --git a/MLEB/Translate/src/TtmServer/TtmServerFactory.php b/MLEB/Translate/src/TtmServer/TtmServerFactory.php
new file mode 100644
index 00000000..eafc5894
--- /dev/null
+++ b/MLEB/Translate/src/TtmServer/TtmServerFactory.php
@@ -0,0 +1,83 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TtmServer;
+
+use DatabaseTTMServer;
+use FakeTTMServer;
+use RemoteTTMServer;
+use TTMServer;
+use WritableTTMServer;
+
+/**
+ * @since 2021.01
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class TtmServerFactory {
+ /** @var array */
+ private $configs;
+ /** @var ?string */
+ private $default;
+
+ /** @see https://www.mediawiki.org/wiki/Help:Extension:Translate/Translation_memories#Configuration */
+ public function __construct( array $configs, ?string $default = null ) {
+ $this->configs = $configs;
+ $this->default = $default;
+ }
+
+ /** @return string[] */
+ public function getNames(): array {
+ return array_keys( $this->configs );
+ }
+
+ public function has( string $name ): bool {
+ return isset( $this->configs[$name] );
+ }
+
+ public function create( string $name ): TTMServer {
+ if ( !$this->has( $name ) ) {
+ throw new ServiceCreationFailure( "No configuration for name '$name'" );
+ }
+
+ $config = $this->configs[$name];
+ if ( !is_array( $config ) ) {
+ throw new ServiceCreationFailure( "Invalid configuration for name '$name'" );
+ }
+
+ if ( isset( $config['class'] ) ) {
+ $class = $config['class'];
+ return new $class( $config );
+ } elseif ( isset( $config['type'] ) ) {
+ $type = $config['type'];
+ switch ( $type ) {
+ case 'ttmserver':
+ return new DatabaseTTMServer( $config );
+ case 'remote-ttmserver':
+ return new RemoteTTMServer( $config );
+ default:
+ throw new ServiceCreationFailure( "Unknown type for name '$name': $type" );
+ }
+ }
+
+ throw new ServiceCreationFailure( "Invalid configuration for name '$name': neither class nor type specified" );
+ }
+
+ /** Return the primary service or a no-op fallback if primary cannot be constructed. */
+ public function getDefault(): WritableTTMServer {
+ $service = null;
+
+ try {
+ if ( $this->default !== null ) {
+ $service = $this->create( $this->default );
+ }
+ } catch ( ServiceCreationFailure $e ) {
+ }
+
+ if ( $service instanceof WritableTTMServer ) {
+ return $service;
+ }
+
+ return new FakeTTMServer();
+ }
+}
diff --git a/MLEB/Translate/src/Utilities/BaseMaintenanceScript.php b/MLEB/Translate/src/Utilities/BaseMaintenanceScript.php
new file mode 100644
index 00000000..a47cf5e5
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/BaseMaintenanceScript.php
@@ -0,0 +1,21 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities;
+
+use Maintenance;
+
+/**
+ * Constants for making code for maintenance scripts more readable.
+ *
+ * Hopefully temporary until https://phabricator.wikimedia.org/T271787 is fixed.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ */
+abstract class BaseMaintenanceScript extends Maintenance {
+ protected const OPTIONAL = false;
+ protected const REQUIRED = true;
+ protected const HAS_ARG = true;
+ protected const NO_ARG = false;
+}
diff --git a/MLEB/Translate/src/Utilities/GettextPlural.php b/MLEB/Translate/src/Utilities/GettextPlural.php
index e1ead9e0..1f2dd517 100644
--- a/MLEB/Translate/src/Utilities/GettextPlural.php
+++ b/MLEB/Translate/src/Utilities/GettextPlural.php
@@ -4,15 +4,13 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Utilities;
+namespace MediaWiki\Extension\Translate\Utilities;
use GettextPluralException;
use InvalidArgumentException;
use TranslateUtils;
-/**
- * @since 2019.09
- */
+/** @since 2019.09 */
class GettextPlural {
private const PRE = '{{PLURAL:GETTEXT|';
private const POST = '}}';
@@ -201,3 +199,5 @@ class GettextPlural {
return $formArray;
}
}
+
+class_alias( GettextPlural::class, '\MediaWiki\Extensions\Translate\GettextPlural' );
diff --git a/MLEB/Translate/src/Utilities/Json/JsonCodec.php b/MLEB/Translate/src/Utilities/Json/JsonCodec.php
new file mode 100644
index 00000000..2d1bb693
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/Json/JsonCodec.php
@@ -0,0 +1,89 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities\Json;
+
+use FormatJson;
+use InvalidArgumentException;
+use JsonSerializable;
+use Wikimedia\Assert\Assert;
+
+/**
+ * Helper class to serialize/unserialize things to/from JSON.
+ * This class, and related classes can be removed once Translate needs to support only
+ * MW >= 1.36. We can then use the JsonCodec class present in core.
+ *
+ * Differences between JsonCodec in the core:
+ * - unserialize only supports strings
+ * - does not detect non serializable data
+ *
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+class JsonCodec {
+ public const TYPE_ANNOTATION = '_type_';
+
+ public function unserialize( ?string $json, string $expectedClass = null ) {
+ Assert::precondition(
+ !$expectedClass || is_subclass_of( $expectedClass, JsonUnserializable::class ),
+ '$expectedClass parameter must be subclass of JsonUnserializable, got ' . $expectedClass
+ );
+
+ $jsonStatus = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
+ if ( !$jsonStatus->isGood() ) {
+ // TODO: in PHP 7.3, we can use JsonException
+ throw new InvalidArgumentException( "Bad JSON: {$jsonStatus}" );
+ }
+ $json = $jsonStatus->getValue();
+
+ if ( !$this->canMakeNewFromValue( $json ) ) {
+ if ( $expectedClass ) {
+ throw new InvalidArgumentException( 'JSON did not have ' . self::TYPE_ANNOTATION );
+ }
+ return $json;
+ }
+
+ $class = $json[self::TYPE_ANNOTATION];
+ if ( !class_exists( $class ) || !is_subclass_of( $class, JsonUnserializable::class ) ) {
+ throw new InvalidArgumentException( "Invalid target class {$class}" );
+ }
+
+ $obj = $class::newFromJsonArray( $json );
+ if ( $expectedClass && !$obj instanceof $expectedClass ) {
+ $actualClass = get_class( $obj );
+ throw new InvalidArgumentException( "Expected {$expectedClass}, got {$actualClass}" );
+ }
+ return $obj;
+ }
+
+ public function serialize( $value ): string {
+ if ( $value instanceof JsonSerializable ) {
+ $json = $value->jsonSerialize();
+ } else {
+ $json = FormatJson::encode( $value, false, FormatJson::ALL_OK );
+ }
+
+ if ( !$json ) {
+ throw new InvalidArgumentException(
+ 'Failed to encode JSON. Error ' . json_last_error_msg()
+ );
+ }
+
+ return $json;
+ }
+
+ /** Is it likely possible to make a new instance from $json serialization? */
+ private function canMakeNewFromValue( $json ): bool {
+ $classAnnotation = self::TYPE_ANNOTATION;
+ if ( is_array( $json ) ) {
+ return array_key_exists( $classAnnotation, $json );
+ }
+ if ( is_object( $json ) ) {
+ return $json->$classAnnotation;
+ }
+ return false;
+ }
+}
+
+class_alias( JsonCodec::class, '\MediaWiki\Extensions\Translate\JsonCodec' );
diff --git a/MLEB/Translate/src/Utilities/Json/JsonUnserializable.php b/MLEB/Translate/src/Utilities/Json/JsonUnserializable.php
new file mode 100644
index 00000000..2a6c0cd0
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/Json/JsonUnserializable.php
@@ -0,0 +1,19 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities\Json;
+
+/**
+ * Identify classes that can unserialize themselves from an array
+ * Remove once we need to support only MW >= 1.36
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ *
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+interface JsonUnserializable {
+ /** Restore an array to an instance of the current class */
+ public static function newFromJsonArray( array $json );
+}
+
+class_alias( JsonUnserializable::class, '\MediaWiki\Extensions\Translate\JsonUnserializable' );
diff --git a/MLEB/Translate/src/Utilities/Json/JsonUnserializableTrait.php b/MLEB/Translate/src/Utilities/Json/JsonUnserializableTrait.php
new file mode 100644
index 00000000..2db96ca1
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/Json/JsonUnserializableTrait.php
@@ -0,0 +1,37 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities\Json;
+
+use FormatJson;
+
+/**
+ * Can be used by classes that want to serialize / deserialize
+ * Remove once we need to support only MW >= 1.36
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ *
+ * @license GPL-2.0-or-later
+ * @since 2020.12
+ */
+trait JsonUnserializableTrait {
+ public function jsonSerialize() {
+ return $this->annotateJsonForDeserialization(
+ $this->toJsonArray()
+ );
+ }
+
+ /** Annotate the $json array with class metadata. */
+ private function annotateJsonForDeserialization( array $json ): string {
+ $json[JsonCodec::TYPE_ANNOTATION] = get_class( $this );
+ return FormatJson::encode( $json, false, FormatJson::ALL_OK );
+ }
+
+ /**
+ * Prepare this object for JSON serialization.
+ * The returned array will be passed to self::newFromJsonArray
+ * upon JSON deserialization.
+ */
+ abstract protected function toJsonArray(): array;
+}
+
+class_alias( JsonUnserializableTrait::class, '\MediaWiki\Extensions\Translate\JsonUnserializableTrait' );
diff --git a/MLEB/Translate/src/Utilities/LanguagesMultiselectWidget.php b/MLEB/Translate/src/Utilities/LanguagesMultiselectWidget.php
new file mode 100644
index 00000000..ea9c8a38
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/LanguagesMultiselectWidget.php
@@ -0,0 +1,35 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities;
+
+use MediaWiki\Widget\TagMultiselectWidget;
+
+/**
+ * Widget to select multiple languages.
+ *
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @since 2020.07
+ */
+class LanguagesMultiselectWidget extends TagMultiselectWidget {
+ /** @var array */
+ private $languages;
+
+ public function __construct( array $config = [] ) {
+ parent::__construct( $config );
+ $this->languages = $config['languages'];
+ }
+
+ protected function getJavaScriptClassName() {
+ return 'LanguagesMultiselectWidget';
+ }
+
+ public function getConfig( &$config ) {
+ $config['languages'] = $this->languages;
+
+ return parent::getConfig( $config );
+ }
+}
+
+class_alias( LanguagesMultiselectWidget::class, '\MediaWiki\Extensions\Translate\LanguagesMultiselectWidget' );
diff --git a/MLEB/Translate/src/Utilities/ParallelExecutor.php b/MLEB/Translate/src/Utilities/ParallelExecutor.php
new file mode 100644
index 00000000..7b6e7186
--- /dev/null
+++ b/MLEB/Translate/src/Utilities/ParallelExecutor.php
@@ -0,0 +1,56 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities;
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Helper class for maintenance scripts to run things in parallel.
+ *
+ * See also ForkContoller and https://phabricator.wikimedia.org/T201970.
+ *
+ * @since 2020.11
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ */
+class ParallelExecutor {
+ /** @var int[] */
+ private $pids = [];
+ /** @var int */
+ private $threads;
+
+ public function __construct( int $threads = 1 ) {
+ $this->threads = $threads;
+ }
+
+ public function runInParallel( callable $mainThread, callable $forkThread ): void {
+ // Fork to increase speed with parallelism. Also helps with memory usage if there are leaks.
+ $pid = -1;
+ if ( function_exists( 'pcntl_fork' ) ) {
+ $pid = pcntl_fork();
+ }
+
+ if ( $pid === 0 ) {
+ MediaWikiServices::resetChildProcessServices();
+ $forkThread();
+ exit();
+ } elseif ( $pid === -1 ) {
+ // Fork failed do it serialized
+ $forkThread();
+ } else {
+ // Main thread
+ $mainThread( $pid );
+ $this->pids[$pid] = true;
+
+ // If we hit the thread limit, wait for any child to finish.
+ if ( count( $this->pids ) >= $this->threads ) {
+ $status = 0;
+ $pid = pcntl_wait( $status );
+ unset( $this->pids[$pid] );
+ }
+ }
+ }
+}
+
+class_alias( ParallelExecutor::class, '\MediaWiki\Extensions\Translate\ParallelExecutor' );
diff --git a/MLEB/Translate/src/Utilities/ParsingPlaceholderFactory.php b/MLEB/Translate/src/Utilities/ParsingPlaceholderFactory.php
index f4b523a9..fc6c19c4 100644
--- a/MLEB/Translate/src/Utilities/ParsingPlaceholderFactory.php
+++ b/MLEB/Translate/src/Utilities/ParsingPlaceholderFactory.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Utilities;
+namespace MediaWiki\Extension\Translate\Utilities;
/**
* Create unique placeholders that can be used when parsing (wiki)text.
@@ -21,3 +21,5 @@ class ParsingPlaceholderFactory {
$this->i++;
}
}
+
+class_alias( ParsingPlaceholderFactory::class, '\MediaWiki\Extensions\Translate\ParsingPlaceholderFactory' );
diff --git a/MLEB/Translate/src/Utilities/SmartFormatPlural.php b/MLEB/Translate/src/Utilities/SmartFormatPlural.php
index 3ba8c350..49936444 100644
--- a/MLEB/Translate/src/Utilities/SmartFormatPlural.php
+++ b/MLEB/Translate/src/Utilities/SmartFormatPlural.php
@@ -4,7 +4,7 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Utilities;
+namespace MediaWiki\Extension\Translate\Utilities;
/**
* Implements partial support for SmartFormat plural syntax parsing.
@@ -38,7 +38,7 @@ class SmartFormatPlural {
* @param string $text
* @return array
*/
- public static function getPluralInstances( string $text ) : array {
+ public static function getPluralInstances( string $text ): array {
// ldns = Large Deeply-Nested Structure
$ldns = [];
@@ -62,3 +62,5 @@ class SmartFormatPlural {
return $ldns;
}
}
+
+class_alias( SmartFormatPlural::class, '\MediaWiki\Extensions\Translate\SmartFormatPlural' );
diff --git a/MLEB/Translate/src/Utilities/StringComparators/SimpleStringComparator.php b/MLEB/Translate/src/Utilities/StringComparators/SimpleStringComparator.php
index 1c24d2c8..740eea32 100644
--- a/MLEB/Translate/src/Utilities/StringComparators/SimpleStringComparator.php
+++ b/MLEB/Translate/src/Utilities/StringComparators/SimpleStringComparator.php
@@ -4,16 +4,14 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Utilities\StringComparators;
+namespace MediaWiki\Extension\Translate\Utilities\StringComparators;
/**
* A simple string comparator, that compares two strings and determines if they are an exact match.
* @since 2019.10
*/
class SimpleStringComparator implements StringComparator {
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function getSimilarity( $addedMessage, $deletedMessage ) {
if ( $addedMessage === $deletedMessage ) {
return 1;
@@ -27,3 +25,5 @@ class SimpleStringComparator implements StringComparator {
return 0;
}
}
+
+class_alias( SimpleStringComparator::class, '\MediaWiki\Extensions\Translate\SimpleStringComparator' );
diff --git a/MLEB/Translate/src/Utilities/StringComparators/StringComparator.php b/MLEB/Translate/src/Utilities/StringComparators/StringComparator.php
index bbf9e96b..d92b3e76 100644
--- a/MLEB/Translate/src/Utilities/StringComparators/StringComparator.php
+++ b/MLEB/Translate/src/Utilities/StringComparators/StringComparator.php
@@ -1,6 +1,6 @@
<?php
-namespace MediaWiki\Extensions\Translate\Utilities\StringComparators;
+namespace MediaWiki\Extension\Translate\Utilities\StringComparators;
/**
* An interface to be implemented by comparators that will compare percentage
@@ -16,3 +16,5 @@ interface StringComparator {
*/
public function getSimilarity( $a, $b );
}
+
+class_alias( StringComparator::class, '\MediaWiki\Extensions\Translate\StringComparator' );
diff --git a/MLEB/Translate/src/Utilities/TranslateReplaceTitle.php b/MLEB/Translate/src/Utilities/TranslateReplaceTitle.php
index a498d7a9..136b251d 100644
--- a/MLEB/Translate/src/Utilities/TranslateReplaceTitle.php
+++ b/MLEB/Translate/src/Utilities/TranslateReplaceTitle.php
@@ -4,10 +4,13 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Utilities;
+namespace MediaWiki\Extension\Translate\Utilities;
use MessageHandle;
use Title;
+use TitleArray;
+use TitleArrayFromResult;
+use TranslateUtils;
/**
* Helper class that cotains utility methods to help with identifying and replace titles.
@@ -18,10 +21,10 @@ class TranslateReplaceTitle {
/**
* Returns two lists: a set of message handles that would be moved/renamed by
* the current text replacement, and the set of message handles that would ordinarily
- * be moved but are not moveable, due to permissions or any other reason.
+ * be moved but are not movable, due to permissions or any other reason.
* @param MessageHandle $sourceMessageHandle
* @param string $replacement
- * @return array
+ * @return Title[][]
*/
public static function getTitlesForMove(
MessageHandle $sourceMessageHandle, $replacement
@@ -41,7 +44,7 @@ class TranslateReplaceTitle {
}
$targetTitle = Title::makeTitle(
$namespace,
- \TranslateUtils::title( $replacement, $handle->getCode(), $namespace )
+ TranslateUtils::title( $replacement, $handle->getCode(), $namespace )
);
$titlesForMove[] = [ $title, $targetTitle ];
}
@@ -51,7 +54,7 @@ class TranslateReplaceTitle {
/**
* @param MessageHandle $handle
- * @return \TitleArrayFromResult
+ * @return TitleArrayFromResult
*/
private static function getMatchingTitles( MessageHandle $handle ) {
$dbr = wfGetDB( DB_MASTER );
@@ -70,6 +73,8 @@ class TranslateReplaceTitle {
$result = $dbr->select( $tables, $vars, $conds, __METHOD__ );
- return \TitleArray::newFromResult( $result );
+ return TitleArray::newFromResult( $result );
}
}
+
+class_alias( TranslateReplaceTitle::class, '\MediaWiki\Extensions\Translate\TranslateReplaceTitle' );
diff --git a/MLEB/Translate/src/Utilities/UnicodePlural.php b/MLEB/Translate/src/Utilities/UnicodePlural.php
index a01c82af..6ebbd556 100644
--- a/MLEB/Translate/src/Utilities/UnicodePlural.php
+++ b/MLEB/Translate/src/Utilities/UnicodePlural.php
@@ -4,14 +4,12 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Utilities;
+namespace MediaWiki\Extension\Translate\Utilities;
use RuntimeException;
use TranslateUtils;
-/**
- * @since 2019.09
- */
+/** @since 2019.09 */
class UnicodePlural {
private const PRE = '{{PLURAL|';
private const POST = '}}';
@@ -191,3 +189,5 @@ class UnicodePlural {
return $sortedFormMap;
}
}
+
+class_alias( UnicodePlural::class, '\MediaWiki\Extensions\Translate\UnicodePlural' );
diff --git a/MLEB/Translate/src/Validation/LegacyValidatorAdapter.php b/MLEB/Translate/src/Validation/LegacyValidatorAdapter.php
index a63699d5..1b194334 100644
--- a/MLEB/Translate/src/Validation/LegacyValidatorAdapter.php
+++ b/MLEB/Translate/src/Validation/LegacyValidatorAdapter.php
@@ -7,10 +7,9 @@
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Validation;
+namespace MediaWiki\Extension\Translate\Validation;
-use InsertablesSuggester;
-use MediaWiki\Extensions\Translate\MessageValidator\Validator;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertablesSuggester;
use TMessage;
/**
@@ -52,7 +51,7 @@ class LegacyValidatorAdapter implements MessageValidator, InsertablesSuggester {
}
/** @inheritDoc */
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
if ( $this->validator instanceof InsertablesSuggester ) {
return $this->validator->getInsertables( $text );
}
@@ -60,3 +59,5 @@ class LegacyValidatorAdapter implements MessageValidator, InsertablesSuggester {
return [];
}
}
+
+class_alias( LegacyValidatorAdapter::class, '\MediaWiki\Extensions\Translate\LegacyValidatorAdapter' );
diff --git a/MLEB/Translate/src/Validation/MessageValidator.php b/MLEB/Translate/src/Validation/MessageValidator.php
index a488a021..4946d0a9 100644
--- a/MLEB/Translate/src/Validation/MessageValidator.php
+++ b/MLEB/Translate/src/Validation/MessageValidator.php
@@ -7,7 +7,7 @@
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Validation;
+namespace MediaWiki\Extension\Translate\Validation;
use TMessage;
@@ -22,3 +22,5 @@ use TMessage;
interface MessageValidator {
public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues;
}
+
+class_alias( MessageValidator::class, '\MediaWiki\Extensions\Translate\MessageValidator' );
diff --git a/MLEB/Translate/src/Validation/ValidationIssue.php b/MLEB/Translate/src/Validation/ValidationIssue.php
index f47d7000..822aeb1c 100644
--- a/MLEB/Translate/src/Validation/ValidationIssue.php
+++ b/MLEB/Translate/src/Validation/ValidationIssue.php
@@ -5,7 +5,7 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Validation;
+namespace MediaWiki\Extension\Translate\Validation;
/**
* Value object.
@@ -52,3 +52,5 @@ class ValidationIssue {
return $this->messageParams;
}
}
+
+class_alias( ValidationIssue::class, '\MediaWiki\Extensions\Translate\ValidationIssue' );
diff --git a/MLEB/Translate/src/Validation/ValidationIssues.php b/MLEB/Translate/src/Validation/ValidationIssues.php
index 5ca17cc4..f9278995 100644
--- a/MLEB/Translate/src/Validation/ValidationIssues.php
+++ b/MLEB/Translate/src/Validation/ValidationIssues.php
@@ -5,7 +5,7 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\Validation;
+namespace MediaWiki\Extension\Translate\Validation;
use ArrayIterator;
use Countable;
@@ -51,3 +51,5 @@ class ValidationIssues implements Countable, IteratorAggregate {
return count( $this->issues );
}
}
+
+class_alias( ValidationIssues::class, '\MediaWiki\Extensions\Translate\ValidationIssues' );
diff --git a/MLEB/Translate/src/MessageValidator/ValidationResult.php b/MLEB/Translate/src/Validation/ValidationResult.php
index 173da0ec..2b5a62d7 100644
--- a/MLEB/Translate/src/MessageValidator/ValidationResult.php
+++ b/MLEB/Translate/src/Validation/ValidationResult.php
@@ -1,12 +1,10 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator;
+namespace MediaWiki\Extension\Translate\Validation;
use IContextSource;
use InvalidArgumentException;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
/**
* Container for validation issues returned by MessageValidator.
@@ -19,7 +17,6 @@ use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
class ValidationResult {
/** @var ValidationIssues */
protected $errors;
-
/** @var ValidationIssues */
protected $warnings;
@@ -103,3 +100,5 @@ class ValidationResult {
return $out;
}
}
+
+class_alias( ValidationResult::class, '\MediaWiki\Extensions\Translate\ValidationResult' );
diff --git a/MLEB/Translate/MessageValidator.php b/MLEB/Translate/src/Validation/ValidationRunner.php
index e3711321..b5b345bc 100644
--- a/MLEB/Translate/MessageValidator.php
+++ b/MLEB/Translate/src/Validation/ValidationRunner.php
@@ -9,11 +9,15 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageValidator\ValidationResult;
-use MediaWiki\Extensions\Translate\MessageValidator\ValidatorFactory;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator as MessageValidatorInterface;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+namespace MediaWiki\Extension\Translate\Validation;
+
+use Exception;
+use FormatJson;
+use InvalidArgumentException;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertablesSuggester;
+use PHPVariableLoader;
+use RuntimeException;
+use TMessage;
/**
* Message validator is used to run validators to find common mistakes so that
@@ -21,11 +25,7 @@ use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
* Checker framework because it allows maintainers to enforce a validation so
* that translations that do not pass validation are not saved.
*
- * To create your own validator, implement the following interface,
- * @see MediaWiki\Extensions\Translate\Validation\MessageValidator
- *
- * In addition you can use the following Trait to reuse some pre-existing methods,
- * @see MediaWiki\Extensions\Translate\MessageValidator\ValidatorHelper
+ * To create your own validator, implement the MessageValidator interface.
*
* There are two types of notices - error and warning.
*
@@ -35,13 +35,11 @@ use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
* @ingroup MessageValidator
* @since 2019.06
*/
-class MessageValidator {
+class ValidationRunner {
/** @var array List of validator data */
protected $validators = [];
-
/** @var string Message group id */
protected $groupId;
-
/** @var string[][] */
private static $ignorePatterns;
@@ -64,8 +62,8 @@ class MessageValidator {
*
* Removes the existing validators.
*
- * @see addValidator()
* @param array $validatorConfigs List of Validator configurations
+ * @see addValidator()
*/
public function setValidators( array $validatorConfigs ): void {
$this->validators = [];
@@ -85,8 +83,10 @@ class MessageValidator {
$validatorConfig['params'] ?? null
);
} elseif ( $className !== null ) {
- $validator = ValidatorFactory::loadInstance( $className,
- $validatorConfig['params'] ?? null );
+ $validator = ValidatorFactory::loadInstance(
+ $className,
+ $validatorConfig['params'] ?? null
+ );
} else {
throw new InvalidArgumentException(
'Validator configuration does not specify the \'class\' or \'id\'.'
@@ -95,8 +95,9 @@ class MessageValidator {
$isInsertable = $validatorConfig['insertable'] ?? false;
if ( $isInsertable && !$validator instanceof InsertablesSuggester ) {
+ $actualClassName = get_class( $validator );
throw new InvalidArgumentException(
- "Insertable validator does not implement InsertablesSuggester interface."
+ "Insertable validator $actualClassName does not implement InsertablesSuggester interface."
);
}
@@ -104,25 +105,28 @@ class MessageValidator {
'instance' => $validator,
'insertable' => $isInsertable,
'enforce' => $validatorConfig['enforce'] ?? false,
- 'keymatch' => $validatorConfig['keymatch'] ?? false
+ 'keymatch' => $validatorConfig['keymatch'] ?? false,
];
}
/**
* Return the currently set validators for this group.
*
- * @return MessageValidatorInterface[] List of validators
+ * @return MessageValidator[] List of validators
*/
public function getValidators(): array {
- return array_map( function ( $validator ) {
- return $validator['instance'];
- }, $this->validators );
+ return array_map(
+ function ( $validator ) {
+ return $validator['instance'];
+ },
+ $this->validators
+ );
}
/**
* Return currently set validators that are insertable.
*
- * @return MessageValidatorInterface[] List of insertable
+ * @return MessageValidator[] List of insertable
* validators
*/
public function getInsertableValidators(): array {
@@ -142,33 +146,51 @@ class MessageValidator {
* Returns a ValidationResult that contains methods to print the issues.
*/
public function validateMessage(
- TMessage $message, string $code, bool $ignoreWarnings = false
+ TMessage $message,
+ string $code,
+ bool $ignoreWarnings = false
): ValidationResult {
$errors = new ValidationIssues();
$warnings = new ValidationIssues();
foreach ( $this->validators as $validator ) {
- $this->runValidation( $validator, $message, $code, $errors, $warnings, $ignoreWarnings );
+ $this->runValidation(
+ $validator,
+ $message,
+ $code,
+ $errors,
+ $warnings,
+ $ignoreWarnings
+ );
}
- $errors = $this->filterValidations( $errors, $code );
- $warnings = $this->filterValidations( $warnings, $code );
+ $errors = $this->filterValidations( $message->key(), $errors, $code );
+ $warnings = $this->filterValidations( $message->key(), $warnings, $code );
return new ValidationResult( $errors, $warnings );
}
/** Validate a message, and return as soon as any validation fails. */
public function quickValidate(
- TMessage $message, string $code, bool $ignoreWarnings = false
+ TMessage $message,
+ string $code,
+ bool $ignoreWarnings = false
): ValidationResult {
$errors = new ValidationIssues();
$warnings = new ValidationIssues();
foreach ( $this->validators as $validator ) {
- $this->runValidation( $validator, $message, $code, $errors, $warnings, $ignoreWarnings );
+ $this->runValidation(
+ $validator,
+ $message,
+ $code,
+ $errors,
+ $warnings,
+ $ignoreWarnings
+ );
- $errors = $this->filterValidations( $errors, $code );
- $warnings = $this->filterValidations( $warnings, $code );
+ $errors = $this->filterValidations( $message->key(), $errors, $code );
+ $warnings = $this->filterValidations( $message->key(), $warnings, $code );
if ( $warnings->hasIssues() || $errors->hasIssues() ) {
break;
@@ -188,7 +210,8 @@ class MessageValidator {
}
$list = PHPVariableLoader::loadVariableFromPHPFile(
- $wgTranslateCheckBlacklist, 'checkBlacklist'
+ $wgTranslateCheckBlacklist,
+ 'checkBlacklist'
);
$keys = [ 'group', 'check', 'subcheck', 'code', 'message' ];
@@ -198,7 +221,10 @@ class MessageValidator {
$list[$key][$checkKey] = '#';
} elseif ( is_array( $pattern[$checkKey] ) ) {
$list[$key][$checkKey] =
- array_map( 'MessageValidator::foldValue', $pattern[$checkKey] );
+ array_map(
+ [ self::class, 'foldValue' ],
+ $pattern[$checkKey]
+ );
} else {
$list[$key][$checkKey] = self::foldValue( $pattern[$checkKey] );
}
@@ -210,6 +236,7 @@ class MessageValidator {
/** Filter validations based on a ignore list. */
private function filterValidations(
+ string $messageKey,
ValidationIssues $issues,
string $targetLanguage
): ValidationIssues {
@@ -217,7 +244,7 @@ class MessageValidator {
foreach ( $issues as $issue ) {
foreach ( self::$ignorePatterns as $pattern ) {
- if ( $this->shouldIgnore( $issue, $this->groupId, $targetLanguage, $pattern ) ) {
+ if ( $this->shouldIgnore( $messageKey, $issue, $this->groupId, $targetLanguage, $pattern ) ) {
continue 2;
}
}
@@ -228,26 +255,27 @@ class MessageValidator {
}
private function shouldIgnore(
+ string $messageKey,
ValidationIssue $issue,
string $messageGroupId,
string $targetLanguage,
array $pattern
): bool {
- return $this->match( $pattern['group'], $messageGroupId )
- && $this->match( $pattern['check'], $issue->type() )
- && $this->match( $pattern['subcheck'], $issue->subType() )
- && $this->match( $pattern['message'], $issue->messageKey() )
- && $this->match( $pattern['code'], $targetLanguage );
+ return $this->matchesIgnorePattern( $pattern['group'], $messageGroupId )
+ && $this->matchesIgnorePattern( $pattern['check'], $issue->type() )
+ && $this->matchesIgnorePattern( $pattern['subcheck'], $issue->subType() )
+ && $this->matchesIgnorePattern( $pattern['message'], $messageKey )
+ && $this->matchesIgnorePattern( $pattern['code'], $targetLanguage );
}
/**
* Match validation information against a ignore pattern.
*
- * @param string|array $pattern
+ * @param string|string[] $pattern
* @param string $value The actual value in the validation produced by the validator
* @return bool True if the pattern matches the value.
*/
- protected function match( $pattern, string $value ): bool {
+ private function matchesIgnorePattern( $pattern, string $value ): bool {
if ( $pattern === '#' ) {
return true;
} elseif ( is_array( $pattern ) ) {
@@ -280,7 +308,7 @@ class MessageValidator {
if ( !is_array( $match ) ) {
throw new InvalidArgumentException(
"Invalid key matcher configuration passed. Expected type: array or string. " .
- "Recieved: " . gettype( $match ) . ". match value: " . FormatJson::encode( $match )
+ "Received: " . gettype( $match ) . ". match value: " . FormatJson::encode( $match )
);
}
@@ -313,7 +341,7 @@ class MessageValidator {
bool $ignoreWarnings
): void {
// Check if key match has been specified, and then check if the key matches it.
- /** @var MessageValidatorInterface $validator */
+ /** @var MessageValidator $validator */
$validator = $validatorData['instance'];
$definition = $message->definition();
@@ -336,10 +364,12 @@ class MessageValidator {
}
// else: caller does not want warnings, skip running the validator
} catch ( Exception $e ) {
- throw new \RuntimeException(
+ throw new RuntimeException(
'An error occurred while validating message: ' . $message->key() . '; group: ' .
$this->groupId . "; validator: " . get_class( $validator ) . "\n. Exception: $e"
);
}
}
}
+
+class_alias( ValidationRunner::class, '\MediaWiki\Extensions\Translate\ValidationRunner' );
diff --git a/MLEB/Translate/src/MessageValidator/Validator.php b/MLEB/Translate/src/Validation/Validator.php
index 27325703..c89f349b 100644
--- a/MLEB/Translate/src/MessageValidator/Validator.php
+++ b/MLEB/Translate/src/Validation/Validator.php
@@ -7,7 +7,7 @@
* @license GPL-2.0-or-later
*/
-namespace MediaWiki\Extensions\Translate\MessageValidator;
+namespace MediaWiki\Extension\Translate\Validation;
use TMessage;
@@ -19,3 +19,5 @@ use TMessage;
interface Validator {
public function validate( TMessage $message, $code, array &$notices );
}
+
+class_alias( Validator::class, '\MediaWiki\Extensions\Translate\Validator' );
diff --git a/MLEB/Translate/src/MessageValidator/ValidatorFactory.php b/MLEB/Translate/src/Validation/ValidatorFactory.php
index 0bc46171..20561f08 100644
--- a/MLEB/Translate/src/MessageValidator/ValidatorFactory.php
+++ b/MLEB/Translate/src/Validation/ValidatorFactory.php
@@ -1,31 +1,29 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator;
+namespace MediaWiki\Extension\Translate\Validation;
use InvalidArgumentException;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\BraceBalanceValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\EscapeCharacterValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextNewlineValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextPluralValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRegexValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRubyVariableValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\IosVariableValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MatchSetValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiLinkValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPageNameValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiParameterValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPluralValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiTimeListValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\NewlineValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\NumericalParameterValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\PrintfValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\PythonInterpolationValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\ReplacementValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\SmartFormatPluralValidator;
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\UnicodePluralValidator;
-use MediaWiki\Extensions\Translate\Validation\LegacyValidatorAdapter;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\BraceBalanceValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\EscapeCharacterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\GettextNewlineValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\GettextPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\InsertableRegexValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\InsertableRubyVariableValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\IosVariableValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MatchSetValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiLinkValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPageNameValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiParameterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiTimeListValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\NewlineValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\NumericalParameterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\PrintfValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\PythonInterpolationValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\ReplacementValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\SmartFormatPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\UnicodePluralValidator;
use RuntimeException;
/**
@@ -116,3 +114,5 @@ class ValidatorFactory {
self::$validators[ $id ] = $ns . $validator;
}
}
+
+class_alias( ValidatorFactory::class, '\MediaWiki\Extensions\Translate\ValidatorFactory' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/BraceBalanceValidator.php b/MLEB/Translate/src/Validation/Validators/BraceBalanceValidator.php
index cd277c6c..2cc25114 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/BraceBalanceValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/BraceBalanceValidator.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -53,3 +53,5 @@ class BraceBalanceValidator implements MessageValidator {
return substr_count( $source, $str1 ) - substr_count( $source, $str2 );
}
}
+
+class_alias( BraceBalanceValidator::class, '\MediaWiki\Extensions\Translate\BraceBalanceValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/EscapeCharacterValidator.php b/MLEB/Translate/src/Validation/Validators/EscapeCharacterValidator.php
index 05d79827..c333ca98 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/EscapeCharacterValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/EscapeCharacterValidator.php
@@ -1,11 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use InvalidArgumentException;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -16,7 +17,6 @@ use TMessage;
class EscapeCharacterValidator implements MessageValidator {
/** @var string[] */
protected $allowedCharacters;
-
/** @var string */
protected $regex;
@@ -27,7 +27,7 @@ class EscapeCharacterValidator implements MessageValidator {
$this->allowedCharacters = $params['values'] ?? [];
if ( $this->allowedCharacters === [] || !is_array( $this->allowedCharacters ) ) {
- throw new \InvalidArgumentException(
+ throw new InvalidArgumentException(
'No values provided for EscapeCharacter validator.'
);
}
@@ -65,7 +65,7 @@ class EscapeCharacterValidator implements MessageValidator {
$prefix = '';
foreach ( $allowedCharacters as $character ) {
if ( !in_array( $character, self::VALID_CHARS ) ) {
- throw new \InvalidArgumentException(
+ throw new InvalidArgumentException(
"Invalid escape character encountered: $character during configuration." .
'Valid escape characters include: ' . implode( ', ', self::VALID_CHARS )
);
@@ -87,3 +87,5 @@ class EscapeCharacterValidator implements MessageValidator {
return $prefix . $regex;
}
}
+
+class_alias( EscapeCharacterValidator::class, '\MediaWiki\Extensions\Translate\EscapeCharacterValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/GettextNewlineValidator.php b/MLEB/Translate/src/Validation/Validators/GettextNewlineValidator.php
index 53895975..3b52859d 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/GettextNewlineValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/GettextNewlineValidator.php
@@ -1,9 +1,9 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -45,3 +45,5 @@ class GettextNewlineValidator extends NewlineValidator {
return $str;
}
}
+
+class_alias( GettextNewlineValidator::class, '\MediaWiki\Extensions\Translate\GettextNewlineValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/GettextPluralValidator.php b/MLEB/Translate/src/Validation/Validators/GettextPluralValidator.php
index f87dff6a..36c6affd 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/GettextPluralValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/GettextPluralValidator.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Utilities\GettextPlural;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Utilities\GettextPlural;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -104,3 +104,5 @@ class GettextPluralValidator implements MessageValidator {
return [ 'ok', [] ];
}
}
+
+class_alias( GettextPluralValidator::class, '\MediaWiki\Extensions\Translate\GettextPluralValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/InsertableRegexValidator.php b/MLEB/Translate/src/Validation/Validators/InsertableRegexValidator.php
index 89f783b1..fb056873 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/InsertableRegexValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/InsertableRegexValidator.php
@@ -1,13 +1,13 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
use InvalidArgumentException;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
-use RegexInsertablesSuggester;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\RegexInsertablesSuggester;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -76,3 +76,5 @@ class InsertableRegexValidator extends RegexInsertablesSuggester implements Mess
return $issues;
}
}
+
+class_alias( InsertableRegexValidator::class, '\MediaWiki\Extensions\Translate\InsertableRegexValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/InsertableRubyVariableValidator.php b/MLEB/Translate/src/Validation/Validators/InsertableRubyVariableValidator.php
index dafac507..50b67214 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/InsertableRubyVariableValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/InsertableRubyVariableValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
/**
* An insertable Ruby variable validator that also acts as an InsertableSuggester
@@ -14,3 +14,8 @@ class InsertableRubyVariableValidator extends InsertableRegexValidator {
parent::__construct( '/%{[a-zA-Z_]+}/' );
}
}
+
+class_alias(
+ InsertableRubyVariableValidator::class,
+ '\MediaWiki\Extensions\Translate\InsertableRubyVariableValidator'
+);
diff --git a/MLEB/Translate/src/MessageValidator/Validators/IosVariableValidator.php b/MLEB/Translate/src/Validation/Validators/IosVariableValidator.php
index 938db1f9..c981e194 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/IosVariableValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/IosVariableValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
// phpcs:disable Generic.Files.LineLength.TooLong
/**
@@ -19,3 +19,5 @@ class IosVariableValidator extends InsertableRegexValidator {
);
}
}
+
+class_alias( IosVariableValidator::class, '\MediaWiki\Extensions\Translate\IosVariableValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MatchSetValidator.php b/MLEB/Translate/src/Validation/Validators/MatchSetValidator.php
index 63d12915..a81bba20 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MatchSetValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MatchSetValidator.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
use InvalidArgumentException;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -17,10 +17,8 @@ use TMessage;
class MatchSetValidator implements MessageValidator {
/** @var string[] */
protected $possibleValues;
-
/** @var string[] */
protected $normalizedValues;
-
/** @var bool */
protected $caseSensitive;
@@ -64,3 +62,5 @@ class MatchSetValidator implements MessageValidator {
return $issues;
}
}
+
+class_alias( MatchSetValidator::class, '\MediaWiki\Extensions\Translate\MatchSetValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiLinkValidator.php b/MLEB/Translate/src/Validation/Validators/MediaWikiLinkValidator.php
index 72da49e5..0f872c6e 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiLinkValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MediaWikiLinkValidator.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use Title;
use TMessage;
@@ -70,3 +70,5 @@ class MediaWikiLinkValidator implements MessageValidator {
return $links;
}
}
+
+class_alias( MediaWikiLinkValidator::class, '\MediaWiki\Extensions\Translate\MediaWikiLinkValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiPageNameValidator.php b/MLEB/Translate/src/Validation/Validators/MediaWikiPageNameValidator.php
index aa16eab8..344c5108 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiPageNameValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MediaWikiPageNameValidator.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -37,3 +37,5 @@ class MediaWikiPageNameValidator implements MessageValidator {
return $issues;
}
}
+
+class_alias( MediaWikiPageNameValidator::class, '\MediaWiki\Extensions\Translate\MediaWikiPageNameValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiParameterValidator.php b/MLEB/Translate/src/Validation/Validators/MediaWikiParameterValidator.php
index 9c44c5b2..5c953b4c 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiParameterValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MediaWikiParameterValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
/**
* An insertable wiki parameter validator that also acts as an InsertableSuggester
@@ -13,3 +13,5 @@ class MediaWikiParameterValidator extends InsertableRegexValidator {
parent::__construct( '/\$[1-9]/' );
}
}
+
+class_alias( MediaWikiParameterValidator::class, '\MediaWiki\Extensions\Translate\MediaWikiParameterValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiPluralValidator.php b/MLEB/Translate/src/Validation/Validators/MediaWikiPluralValidator.php
index 97379b2a..b7606d8f 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiPluralValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MediaWikiPluralValidator.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
use Language;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use MediaWiki\MediaWikiServices;
use Parser;
use ParserOptions;
@@ -143,3 +143,5 @@ class MediaWikiPluralValidator implements MessageValidator {
return array_values( $forms );
}
}
+
+class_alias( MediaWikiPluralValidator::class, '\MediaWiki\Extensions\Translate\MediaWikiPluralValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiTimeListValidator.php b/MLEB/Translate/src/Validation/Validators/MediaWikiTimeListValidator.php
index 579b277a..e1fb1279 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/MediaWikiTimeListValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/MediaWikiTimeListValidator.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -80,3 +80,5 @@ class MediaWikiTimeListValidator implements MessageValidator {
return $issues;
}
}
+
+class_alias( MediaWikiTimeListValidator::class, '\MediaWiki\Extensions\Translate\MediaWikiTimeListValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/NewlineValidator.php b/MLEB/Translate/src/Validation/Validators/NewlineValidator.php
index 645a09c6..36525569 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/NewlineValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/NewlineValidator.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -50,7 +50,7 @@ class NewlineValidator implements MessageValidator {
$translationStartNewline - $definitionStartNewline
];
} elseif ( $definitionStartNewline > $translationStartNewline ) {
- // Missing whitespace at beginnning
+ // Missing whitespace at beginning
$failingChecks[] = [
'missing-start',
$definitionStartNewline - $translationStartNewline
@@ -98,3 +98,5 @@ class NewlineValidator implements MessageValidator {
return $issues;
}
}
+
+class_alias( NewlineValidator::class, '\MediaWiki\Extensions\Translate\NewlineValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/NumericalParameterValidator.php b/MLEB/Translate/src/Validation/Validators/NumericalParameterValidator.php
index 8ab8c91a..84bbf0e3 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/NumericalParameterValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/NumericalParameterValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
/**
* An insertable numerical parameter validator that also acts as an InsertableSuggester
@@ -13,3 +13,5 @@ class NumericalParameterValidator extends InsertableRegexValidator {
parent::__construct( '/\$\d+/' );
}
}
+
+class_alias( NumericalParameterValidator::class, '\MediaWiki\Extensions\Translate\NumericalParameterValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/PrintfValidator.php b/MLEB/Translate/src/Validation/Validators/PrintfValidator.php
index 79b4caab..6121e002 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/PrintfValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/PrintfValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
/**
* A validator that checks for missing and unknown printf formatting characters
@@ -14,3 +14,5 @@ class PrintfValidator extends InsertableRegexValidator {
parent::__construct( '/%(\d+\$)?(\.\d+)?[sduf]/U' );
}
}
+
+class_alias( PrintfValidator::class, '\MediaWiki\Extensions\Translate\PrintfValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/PythonInterpolationValidator.php b/MLEB/Translate/src/Validation/Validators/PythonInterpolationValidator.php
index b6d87b95..ca9a98e3 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/PythonInterpolationValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/PythonInterpolationValidator.php
@@ -1,7 +1,7 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
/**
* An insertable python interpolation validator that also acts as an InsertableSuggester
@@ -14,3 +14,5 @@ class PythonInterpolationValidator extends InsertableRegexValidator {
parent::__construct( '/\%(?:\([a-zA-Z0-9_]*?\))?[diouxXeEfFgGcrs]/U' );
}
}
+
+class_alias( PythonInterpolationValidator::class, '\MediaWiki\Extensions\Translate\PythonInterpolationValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/ReplacementValidator.php b/MLEB/Translate/src/Validation/Validators/ReplacementValidator.php
index c402a5c0..46b5382c 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/ReplacementValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/ReplacementValidator.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
use InvalidArgumentException;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -50,3 +50,5 @@ class ReplacementValidator implements MessageValidator {
return $issues;
}
}
+
+class_alias( ReplacementValidator::class, '\MediaWiki\Extensions\Translate\ReplacementValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/SmartFormatPluralValidator.php b/MLEB/Translate/src/Validation/Validators/SmartFormatPluralValidator.php
index b1d21bac..41d3ea44 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/SmartFormatPluralValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/SmartFormatPluralValidator.php
@@ -1,15 +1,15 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
-
-use Insertable;
-use InsertablesSuggester;
-use MediaWiki\Extensions\Translate\Utilities\SmartFormatPlural;
-use MediaWiki\Extensions\Translate\Utilities\UnicodePlural;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
+
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\Insertable;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertablesSuggester;
+use MediaWiki\Extension\Translate\Utilities\SmartFormatPlural;
+use MediaWiki\Extension\Translate\Utilities\UnicodePlural;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -93,7 +93,7 @@ class SmartFormatPluralValidator implements MessageValidator, InsertablesSuggest
return $issues;
}
- public function getInsertables( $text ) : array {
+ public function getInsertables( string $text ): array {
$definitionPlurals = SmartFormatPlural::getPluralInstances( $text );
$insertables = [];
@@ -108,3 +108,5 @@ class SmartFormatPluralValidator implements MessageValidator, InsertablesSuggest
return $insertables;
}
}
+
+class_alias( SmartFormatPluralValidator::class, '\MediaWiki\Extensions\Translate\SmartFormatPluralValidator' );
diff --git a/MLEB/Translate/src/MessageValidator/Validators/UnicodePluralValidator.php b/MLEB/Translate/src/Validation/Validators/UnicodePluralValidator.php
index 824290b4..da6a9eef 100644
--- a/MLEB/Translate/src/MessageValidator/Validators/UnicodePluralValidator.php
+++ b/MLEB/Translate/src/Validation/Validators/UnicodePluralValidator.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\MessageValidator\Validators;
+namespace MediaWiki\Extension\Translate\Validation\Validators;
-use MediaWiki\Extensions\Translate\Utilities\UnicodePlural;
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Utilities\UnicodePlural;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
use TMessage;
/**
@@ -108,3 +108,5 @@ class UnicodePluralValidator implements MessageValidator {
return [ 'ok', [] ];
}
}
+
+class_alias( UnicodePluralValidator::class, '\MediaWiki\Extensions\Translate\UnicodePluralValidator' );
diff --git a/MLEB/Translate/stringmangler/StringMangler.php b/MLEB/Translate/stringmangler/StringMangler.php
index b2037c83..f4e76bf9 100644
--- a/MLEB/Translate/stringmangler/StringMangler.php
+++ b/MLEB/Translate/stringmangler/StringMangler.php
@@ -32,7 +32,7 @@ interface StringMangler {
* @param string $key Message key
* @return bool
*/
- public function match( string $key ): bool;
+ public function matches( string $key ): bool;
/**
* Mangle a string.
diff --git a/MLEB/Translate/stringmangler/StringMatcher.php b/MLEB/Translate/stringmangler/StringMatcher.php
index 5a8a68ef..d435b59e 100644
--- a/MLEB/Translate/stringmangler/StringMatcher.php
+++ b/MLEB/Translate/stringmangler/StringMatcher.php
@@ -76,7 +76,7 @@ class StringMatcher implements StringMangler, MetaYamlSchemaExtender {
}
/** @inheritDoc */
- public function match( string $key ): bool {
+ public function matches( string $key ): bool {
if ( in_array( $key, $this->aExact ) ) {
return true;
}
@@ -98,7 +98,7 @@ class StringMatcher implements StringMangler, MetaYamlSchemaExtender {
/** @inheritDoc */
public function mangle( string $key ): string {
- if ( $this->match( $key ) ) {
+ if ( $this->matches( $key ) ) {
$key = $this->sPrefix . $key;
}
@@ -156,7 +156,7 @@ class StringMatcher implements StringMangler, MetaYamlSchemaExtender {
$unmangled = substr( $unescapedString, strlen( $this->sPrefix ) );
// Check if this string should be mangled / un-mangled to begin with
- if ( $this->match( $unmangled ) ) {
+ if ( $this->matches( $unmangled ) ) {
return $unmangled;
}
}
diff --git a/MLEB/Translate/tag/PageTranslationHooks.php b/MLEB/Translate/tag/PageTranslationHooks.php
index 205987f5..ed0996da 100644
--- a/MLEB/Translate/tag/PageTranslationHooks.php
+++ b/MLEB/Translate/tag/PageTranslationHooks.php
@@ -7,10 +7,13 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\PageTranslation\ParsingFailure;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\User\UserIdentity;
use Wikimedia\ScopedCallback;
@@ -23,44 +26,46 @@ use Wikimedia\ScopedCallback;
class PageTranslationHooks {
// Uuugly hacks
public static $allowTargetEdit = false;
-
// Check if job queue is running
public static $jobQueueRunning = false;
-
// Check if we are just rendering tags or such
public static $renderingContext = false;
-
// Used to communicate data between LanguageLinks and SkinTemplateGetLanguageLink hooks.
private static $languageLinkData = [];
/**
* Hook: ParserBeforeInternalParse
- * @param Parser $parser
+ *
+ * @param Parser $wikitextParser
* @param string &$text
* @param-taint $text escapes_htmlnoent
* @param string $state
* @return bool
*/
- public static function renderTagPage( $parser, &$text, $state ) {
- $title = $parser->getTitle();
+ public static function renderTagPage( $wikitextParser, &$text, $state ) {
+ $translatablePageParser = Services::getInstance()->getTranslatablePageParser();
- if ( preg_match( '~</?translate[ >]~', $text ) !== 0 ) {
+ if ( $translatablePageParser->containsMarkup( $text ) ) {
try {
- $parse = TranslatablePage::newFromText( $parser->getTitle(), $text )->getParse();
- $text = $parse->getTranslationPageText( null );
- $parser->getOutput()->addModuleStyles( 'ext.translate' );
- } catch ( TPException $e ) {
- wfDebug( 'TPException caught; expected' );
+ $parserOutput = $translatablePageParser->parse( $text );
+ // If parsing succeeds, replace text and add styles
+ $text = $parserOutput->sourcePageTextForRendering(
+ $wikitextParser->getTargetLanguage()
+ );
+ $wikitextParser->getOutput()->addModuleStyles( 'ext.translate' );
+ } catch ( ParsingFailure $e ) {
+ wfDebug( 'ParsingFailure caught; expected' );
}
}
// For section previews, perform additional clean-up, given tags are often
// unbalanced when we preview one section only.
- if ( $parser->getOptions()->getIsSectionPreview() ) {
- $text = TranslatablePage::cleanupTags( $text );
+ if ( $wikitextParser->getOptions()->getIsSectionPreview() ) {
+ $text = $translatablePageParser->cleanupTags( $text );
}
// Set display title
+ $title = $wikitextParser->getTitle();
$page = TranslatablePage::isTranslationPage( $title );
if ( !$page ) {
return true;
@@ -70,23 +75,40 @@ class PageTranslationHooks {
[ , $code ] = TranslateUtils::figureMessage( $title->getText() );
$name = $page->getPageDisplayTitle( $code );
if ( $name ) {
- $name = $parser->recursivePreprocess( $name );
- $name = $parser->getTargetLanguage()->convert( $name );
- $parser->getOutput()->setDisplayTitle( $name );
+ $name = $wikitextParser->recursivePreprocess( $name );
+ if ( method_exists( MediaWikiServices::class, 'getLanguageConverterFactory' ) ) {
+ // MW >= 1.35
+ $langConv = MediaWikiServices::getInstance()->getLanguageConverterFactory()
+ ->getLanguageConverter( $wikitextParser->getTargetLanguage() );
+ $name = $langConv->convert( $name );
+ } else {
+ $name = $wikitextParser->getTargetLanguage()->convert( $name );
+ }
+ $wikitextParser->getOutput()->setDisplayTitle( $name );
}
self::$renderingContext = false;
- $parser->getOutput()->setExtensionData(
- 'translate-translation-page',
- [
- 'sourcepagetitle' => $page->getTitle(),
- 'languagecode' => $code,
- 'messagegroupid' => $page->getMessageGroupId()
- ]
+ $extensionData = [
+ 'languagecode' => $code,
+ 'messagegroupid' => $page->getMessageGroupId()
+ ];
+ // Backwards-compatibility. If SemanticMediaWiki is installed, write the whole
+ // Title object since prior to https://github.com/SemanticMediaWiki/SemanticMediaWiki/pull/4869
+ // SMW could only understand it. To be removed after SMW release.
+ if ( ExtensionRegistry::getInstance()->isLoaded( 'SemanticMediaWiki' ) ) {
+ $extensionData['sourcepagetitle'] = $page->getTitle();
+ } else {
+ $extensionData['sourcepagetitle'] = [
+ 'namespace' => $page->getTitle()->getNamespace(),
+ 'dbkey' => $page->getTitle()->getDBkey()
+ ];
+ }
+ $wikitextParser->getOutput()->setExtensionData(
+ 'translate-translation-page', $extensionData
);
// Disable edit section links
- $parser->getOutput()->setExtensionData( 'Translate-noeditsection', true );
+ $wikitextParser->getOutput()->setExtensionData( 'Translate-noeditsection', true );
return true;
}
@@ -106,6 +128,81 @@ class PageTranslationHooks {
}
/**
+ * This sets &$revRecord to the revision of transcluded page translation if it exists,
+ * or sets it to the source language if the page translation does not exist.
+ * The page translation is chosen based on language of the source page.
+ * Used in MW >= 1.36
+ *
+ * Hook: BeforeParserFetchTemplateRevisionRecord
+ * @param LinkTarget|null $contextLink
+ * @param LinkTarget|null $templateLink
+ * @param bool &$skip
+ * @param RevisionRecord|null &$revRecord
+ */
+ public static function fetchTranslatableTemplateAndTitle(
+ ?LinkTarget $contextLink,
+ ?LinkTarget $templateLink,
+ bool &$skip,
+ ?RevisionRecord &$revRecord
+ ): void {
+ if ( !$templateLink ) {
+ return;
+ }
+
+ $templateTitle = Title::castFromLinkTarget( $templateLink );
+
+ $templateTranslationPage = TranslatablePage::isTranslationPage( $templateTitle );
+ if ( $templateTranslationPage ) {
+ // Template is referring to a translation page, fetch it and incase it doesn't
+ // exist, fetch the source fallback
+ $revRecord = $templateTranslationPage->getRevisionRecordWithFallback();
+ return;
+ }
+
+ if ( !TranslatablePage::isSourcePage( $templateTitle ) ) {
+ return;
+ }
+
+ $translatableTemplatePage = TranslatablePage::newFromTitle( $templateTitle );
+
+ if ( !( $translatableTemplatePage->supportsTransclusion() ?? false ) ) {
+ // Page being transcluded does not support language aware transclusion
+ return;
+ }
+
+ $store = MediaWikiServices::getInstance()->getRevisionStore();
+
+ if ( $contextLink ) {
+ // Fetch the context page language, and then check if template is present in that language
+ $templateTranslationTitle = $templateTitle->getSubpage(
+ Title::castFromLinkTarget( $contextLink )->getPageLanguage()->getCode()
+ );
+
+ if ( $templateTranslationTitle ) {
+ if ( $templateTranslationTitle->exists() ) {
+ // Template is present in the context page language, fetch the revision record and return
+ $revRecord = $store->getRevisionByTitle( $templateTranslationTitle );
+ } else {
+ // In case the template has not been translated to the context page language,
+ // we assign a MutableRevisionRecord in order to add a dependency, so that when
+ // it is created, the newly created page is loaded rather than the fallback
+ $revRecord = new MutableRevisionRecord( $templateTranslationTitle );
+ }
+ return;
+ }
+ }
+
+ // Context page information not available OR the template translation title could not be determined.
+ // Fetch and return the RevisionRecord of the template in the source language
+ $sourceTemplateTitle = $templateTitle->getSubpage(
+ $translatableTemplatePage->getMessageGroup()->getSourceLanguage()
+ );
+ if ( $sourceTemplateTitle && $sourceTemplateTitle->exists() ) {
+ $revRecord = $store->getRevisionByTitle( $sourceTemplateTitle );
+ }
+ }
+
+ /**
* Set the right page content language for translated pages ("Page/xx").
* Hook: PageContentLanguage
*
@@ -139,15 +236,9 @@ class PageTranslationHooks {
$notices['translate-tag'] = $msg->parseAsBlock();
}
- $label = wfMessage( 'tps-edit-sourcepage-title' )->escaped();
- $msg = Html::rawElement(
- 'div',
- [],
- wfMessage( 'tps-edit-sourcepage-text' )->parse()
- );
-
- $notices[] = TranslateUtils::fieldset(
- $label, $msg, [ 'class' => 'mw-infobox translate-edit-documentation' ]
+ $notices[] = Html::warningBox(
+ wfMessage( 'tps-edit-sourcepage-text' )->parse(),
+ 'translate-edit-documentation'
);
}
}
@@ -229,8 +320,8 @@ class PageTranslationHooks {
return true;
}
- public static function updateTranslationPage( TranslatablePage $page,
- $code, $user, $flags, $summary
+ public static function updateTranslationPage(
+ TranslatablePage $page, $code, $user, $flags, $summary
) {
$source = $page->getTitle();
$target = $source->getSubpage( $code );
@@ -243,11 +334,16 @@ class PageTranslationHooks {
$job->setUser( $user );
$job->setSummary( $summary );
$job->setFlags( $flags );
- $job->run();
+ JobQueueGroup::singleton()->push( $job );
// Invalidate caches so that language bar is up-to-date
$pages = $page->getTranslationPages();
foreach ( $pages as $title ) {
+ if ( $title->equals( $target ) ) {
+ // Handled by the TranslateRenderJob
+ continue;
+ }
+
$wikiPage = WikiPage::factory( $title );
$wikiPage->doPurge();
}
@@ -354,7 +450,7 @@ class PageTranslationHooks {
'task' => 'view'
];
- $classes[] = 'new'; // For red link color
+ $classes[] = 'new'; // For red link color
$attribs = [
'title' => wfMessage( 'tpt-languages-zero' )->inLanguage( $userLang )->text(),
'class' => $classes,
@@ -385,7 +481,7 @@ class PageTranslationHooks {
);
$out .= Html::rawElement(
'div',
- [ 'class' => 'mw-pt-languages-list autonym' ],
+ [ 'class' => 'mw-pt-languages-list' ],
$languages
);
$out .= Html::closeElement( 'div' );
@@ -609,7 +705,6 @@ class PageTranslationHooks {
return true;
}
- /** Returns any syntax error */
protected static function tpSyntaxError( ?Title $title, Content $content ): ?TPException {
if ( !$content instanceof TextContent || !$title ) {
return null;
@@ -620,17 +715,14 @@ class PageTranslationHooks {
// See T154500
$text = str_replace( [ "\r\n", "\r" ], "\n", rtrim( $text ) );
- if ( preg_match( '~</?translate[ >]~', $text ) === 0 ) {
- return null;
- }
-
- $page = TranslatablePage::newFromText( $title, $text );
-
$exception = null;
- try {
- $page->getParse();
- } catch ( TPException $e ) {
- $exception = $e;
+ $parser = Services::getInstance()->getTranslatablePageParser();
+ if ( $parser->containsMarkup( $text ) ) {
+ try {
+ $parser->parse( $text );
+ } catch ( ParsingFailure $e ) {
+ $exception = new TPException( $e->getMessageSpecification() );
+ }
}
return $exception;
@@ -691,19 +783,17 @@ class PageTranslationHooks {
if ( $content instanceof TextContent ) {
$text = $content->getNativeData();
} else {
- // Screw it, not interested
+ // Not applicable
return true;
}
- // Quick escape on normal pages
- if ( preg_match( '~</?translate[ >]~', $text ) === 0 ) {
- return true;
+ $parser = Services::getInstance()->getTranslatablePageParser();
+ if ( $parser->containsMarkup( $text ) ) {
+ // Add the ready tag
+ $page = TranslatablePage::newFromTitle( $wikiPage->getTitle() );
+ $page->addReadyTag( $revisionRecord->getId() );
}
- // Add the ready tag
- $page = TranslatablePage::newFromTitle( $wikiPage->getTitle() );
- $page->addReadyTag( $revisionRecord->getId() );
-
return true;
}
@@ -734,19 +824,17 @@ class PageTranslationHooks {
if ( $content instanceof TextContent ) {
$text = $content->getNativeData();
} else {
- // Screw it, not interested
+ // Not applicable
return true;
}
- // Quick escape on normal pages
- if ( preg_match( '~</?translate[ >]~', $text ) === 0 ) {
- return true;
+ $parser = Services::getInstance()->getTranslatablePageParser();
+ if ( $parser->containsMarkup( $text ) ) {
+ // Add the ready tag
+ $page = TranslatablePage::newFromTitle( $wikiPage->getTitle() );
+ $page->addReadyTag( $revision->getId() );
}
- // Add the ready tag
- $page = TranslatablePage::newFromTitle( $wikiPage->getTitle() );
- $page->addReadyTag( $revision->getId() );
-
return true;
}
@@ -842,7 +930,7 @@ class PageTranslationHooks {
return false;
}
- private static function checkTranslatablePageSlow( LinkTarget $unit ) : ?TranslatablePage {
+ private static function checkTranslatablePageSlow( LinkTarget $unit ): ?TranslatablePage {
$parts = TranslatablePage::parseTranslationUnit( $unit );
$translationPageTitle = Title::newFromText(
$parts[ 'sourcepage' ] . '/' . $parts[ 'language' ]
@@ -886,13 +974,16 @@ class PageTranslationHooks {
return [];
}
- // And finally check whether the language is not included in whitelist
+ // And finally check whether the language is in the inclusion list
$languages = TranslateMetadata::get( $groupId, 'prioritylangs' );
$filter = array_flip( explode( ',', $languages ) );
if ( !isset( $filter[$handle->getCode()] ) ) {
- // @todo Default reason if none provided
$reason = TranslateMetadata::get( $groupId, 'priorityreason' );
- return [ 'tpt-translation-restricted', $reason ];
+ if ( $reason ) {
+ return [ 'tpt-translation-restricted', $reason ];
+ }
+
+ return [ 'tpt-translation-restricted-no-reason' ];
}
return [];
@@ -912,12 +1003,12 @@ class PageTranslationHooks {
return true;
}
- $whitelist = [
+ $inclusionList = [
'read', 'delete', 'undelete', 'deletedtext', 'deletedhistory',
'review', // FlaggedRevs
'patrol', // T151172
];
- if ( in_array( $action, $whitelist ) ) {
+ if ( in_array( $action, $inclusionList ) ) {
return true;
}
@@ -969,7 +1060,7 @@ class PageTranslationHooks {
* Hook: ArticleViewHeader
*
* @param Article $article
- * @param bool &$outputDone
+ * @param bool|ParserOutput|null &$outputDone
* @param bool &$pcache
* @return bool
*/
@@ -1142,8 +1233,8 @@ class PageTranslationHooks {
return true;
}
- $cache = wfGetCache( CACHE_ANYTHING );
- $key = wfMemcKey( 'pt-lock', sha1( $title->getPrefixedText() ) );
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ $key = $cache->makeKey( 'pt-lock', sha1( $title->getPrefixedText() ) );
if ( $cache->get( $key ) === 'locked' ) {
$result = [ 'pt-locked-page' ];
@@ -1169,7 +1260,11 @@ class PageTranslationHooks {
}
// Copied from Skin::subPageSubtitle()
- if ( $out->isArticle() && MWNamespace::hasSubpages( $out->getTitle()->getNamespace() ) ) {
+ $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+ if (
+ $out->isArticle() &&
+ $nsInfo->hasSubpages( $out->getTitle()->getNamespace() )
+ ) {
$ptext = $out->getTitle()->getPrefixedText();
if ( strpos( $ptext, '/' ) !== false ) {
$links = explode( '/', $ptext );
@@ -1352,6 +1447,7 @@ class PageTranslationHooks {
continue;
}
+ /** @var WikiPageMessageGroup */
$group = $handle->getGroup();
if ( !$group instanceof WikiPageMessageGroup ) {
continue;
diff --git a/MLEB/Translate/tag/SpecialPageMigration.php b/MLEB/Translate/tag/SpecialPageMigration.php
index 462f0993..fa726824 100644
--- a/MLEB/Translate/tag/SpecialPageMigration.php
+++ b/MLEB/Translate/tag/SpecialPageMigration.php
@@ -25,17 +25,18 @@ class SpecialPageMigration extends SpecialPage {
$output = $this->getOutput();
$this->setHeaders();
$this->checkPermissions();
+ $this->addHelpLink( 'Help:Extension:Translate/Page translation administration' );
$this->outputHeader( 'pagemigration-summary' );
$output->addModules( 'ext.translate.special.pagemigration' );
$output->addModuleStyles( [
- 'ext.translate.special.pagemigration.styles',
+ 'ext.translate.specialpages.styles',
'jquery.uls.grid'
] );
# Do stuff
# ...
$out = '';
- $out .= Html::openElement( 'div', [ 'class' => 'grid' ] );
+ $out .= Html::openElement( 'div', [ 'class' => 'mw-tpm-sp-container grid' ] );
$out .= Html::openElement( 'div', [ 'class' => 'mw-tpm-sp-error row',
'id' => 'mw-tpm-sp-error-div' ] );
$out .= Html::element( 'div',
@@ -64,8 +65,7 @@ class SpecialPageMigration extends SpecialPage {
'value' => $this->msg( 'pm-cancel-button-label' )->text() ] );
$out .= Html::closeElement( 'form' );
$out .= Html::element( 'div', [ 'class' => 'mw-tpm-sp-instructions hide' ] );
- $out .= Html::openElement( 'div', [ 'class' => 'mw-tpm-sp-unit-listing' ] );
- $out .= Html::closeElement( 'div' );
+ $out .= Html::rawElement( 'div', [ 'class' => 'mw-tpm-sp-unit-listing' ] );
$out .= Html::closeElement( 'div' );
$output->addHTML( $out );
diff --git a/MLEB/Translate/tag/SpecialPagePreparation.php b/MLEB/Translate/tag/SpecialPagePreparation.php
index bdaf5dbf..a0f6bdc4 100644
--- a/MLEB/Translate/tag/SpecialPagePreparation.php
+++ b/MLEB/Translate/tag/SpecialPagePreparation.php
@@ -22,7 +22,7 @@ class SpecialPagePreparation extends SpecialPage {
$output = $this->getOutput();
$this->setHeaders();
$this->checkPermissions();
-
+ $this->outputHeader();
$inputValue = htmlspecialchars( $request->getText( 'page', $par ) );
$pagenamePlaceholder = $this->msg( 'pp-pagename-placeholder' )->escaped();
$prepareButtonValue = $this->msg( 'pp-prepare-button-label' )->escaped();
@@ -31,7 +31,7 @@ class SpecialPagePreparation extends SpecialPage {
$summaryValue = $this->msg( 'pp-save-summary' )->inContentLanguage()->escaped();
$output->addModules( 'ext.translate.special.pagepreparation' );
$output->addModuleStyles( [
- 'ext.translate.special.pagepreparation.styles',
+ 'ext.translate.specialpages.styles',
'jquery.uls.grid'
] );
@@ -41,7 +41,7 @@ class SpecialPagePreparation extends SpecialPage {
$this->msg( 'pp-diff-new-header' )->escaped() );
$out = <<<HTML
-<div class="grid">
+<div class="mw-tpp-sp-container grid">
<form class="mw-tpp-sp-form row" name="mw-tpp-sp-input-form" action="">
<input id="pp-summary" type="hidden" value="{$summaryValue}" />
<input name="page" id="page" class="mw-searchInput mw-ui-input"
diff --git a/MLEB/Translate/tag/SpecialPageTranslation.php b/MLEB/Translate/tag/SpecialPageTranslation.php
index df9aeb5b..1f98b538 100644
--- a/MLEB/Translate/tag/SpecialPageTranslation.php
+++ b/MLEB/Translate/tag/SpecialPageTranslation.php
@@ -8,6 +8,9 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\PageTranslation\TranslationUnit;
+use MediaWiki\Extension\Translate\Utilities\LanguagesMultiselectWidget;
+use MediaWiki\Hook\BeforeParserFetchTemplateRevisionRecordHook;
use MediaWiki\Revision\RevisionRecord;
/**
@@ -20,7 +23,7 @@ use MediaWiki\Revision\RevisionRecord;
* @ingroup SpecialPage PageTranslation
*/
class SpecialPageTranslation extends SpecialPage {
- private const LATEST_SYNTAX_VERSION = '1';
+ private const LATEST_SYNTAX_VERSION = '2';
private const DEFAULT_SYNTAX_VERSION = '1';
public function __construct() {
@@ -137,8 +140,9 @@ class SpecialPageTranslation extends SpecialPage {
if ( $action === 'unlink' ) {
$page = TranslatablePage::newFromTitle( $title );
+
$content = ContentHandler::makeContent(
- self::getStrippedSourcePageText( $page->getParse() ),
+ $page->getStrippedSourcePageText(),
$title
);
@@ -185,7 +189,7 @@ class SpecialPageTranslation extends SpecialPage {
$request = $this->getRequest();
$out = $this->getOutput();
- $out->addModuleStyles( 'ext.translate.special.pagetranslation.styles' );
+ $out->addModuleStyles( 'ext.translate.specialpages.styles' );
if ( $revision === 0 ) {
// Get the latest revision
@@ -232,14 +236,14 @@ class SpecialPageTranslation extends SpecialPage {
}
$setVersion = $firstMark || $request->getCheck( 'use-latest-syntax' );
+ $transclusion = $request->getCheck( 'transclusion' );
- $err = $this->markForTranslation( $page, $sections, $setVersion );
+ $err = $this->markForTranslation( $page, $sections, $setVersion, $transclusion );
if ( $err ) {
call_user_func_array( [ $out, 'addWikiMsg' ], $err );
} else {
$this->showSuccess( $page, $firstMark );
- $this->listPages();
}
return;
@@ -282,6 +286,8 @@ class SpecialPageTranslation extends SpecialPage {
[ 'tpage' => $page->getTitle()->getArticleID() ] );
$this->getOutput()->addWikiMsg( 'tpt-offer-notify', $link );
}
+
+ $this->getOutput()->addWikiMsg( 'tpt-list-pages-in-translations' );
}
protected function showGenericConfirmation( array $params ) {
@@ -415,6 +421,7 @@ class SpecialPageTranslation extends SpecialPage {
$page['version'] = TranslateMetadata::getWithDefaultValue(
$page['groupid'], 'version', self::DEFAULT_SYNTAX_VERSION
);
+ $page['transclusion'] = TranslateMetadata::get( $page['groupid'], 'transclusion' );
if ( !isset( $page['tp:mark'] ) ) {
// Never marked, check that the latest version is ready
@@ -559,7 +566,7 @@ class SpecialPageTranslation extends SpecialPage {
/**
* @param TranslatablePage $page
* @param bool &$error
- * @return TPSection[] The array has string keys.
+ * @return TranslationUnit[] The array has string keys.
*/
public function checkInput( TranslatablePage $page, &$error ) {
$usedNames = [];
@@ -567,8 +574,9 @@ class SpecialPageTranslation extends SpecialPage {
$parse = $page->getParse();
$sections = $parse->getSectionsForSave( $highest );
+ $ic = preg_quote( TranslationUnit::UNIT_MARKER_INVALID_CHARS, '~' );
foreach ( $sections as $s ) {
- if ( preg_match( '~[_/]~', $s->id ) ) {
+ if ( preg_match( "~[$ic]~", $s->id ) ) {
$this->getOutput()->addElement(
'p',
[ 'class' => 'errorbox' ],
@@ -703,7 +711,7 @@ class SpecialPageTranslation extends SpecialPage {
$hasChanges = true;
$out->wrapWikiMsg( '==$1==', 'tpt-sections-deleted' );
- /** @var TPSection $s */
+ /** @var TranslationUnit $s */
foreach ( $deletedSections as $s ) {
$name = $this->msg( 'tpt-section-deleted', $s->id )->escaped();
$text = TranslateUtils::convertWhiteSpaceToHTML( $s->getText() );
@@ -753,11 +761,15 @@ class SpecialPageTranslation extends SpecialPage {
$out->wrapWikiMsg( '<div class="successbox">$1</div>', 'tpt-mark-nochanges' );
}
+ $this->priorityLanguagesForm( $page );
+
+ // If an existing page does not have the supportsTransclusion flag, keep the checkbox unchecked,
+ // If the page is being marked for translation for the first time, the checkbox can be checked
+ $this->templateTransclusionForm( $page->supportsTransclusion() ?? $firstMark );
+
$version = TranslateMetadata::getWithDefaultValue(
$page->getMessageGroupId(), 'version', self::DEFAULT_SYNTAX_VERSION
);
- $this->priorityLanguagesForm( $page );
-
$this->syntaxVersionForm( $version, $firstMark );
$submitButton = new OOUI\FieldLayout(
@@ -778,15 +790,19 @@ class SpecialPageTranslation extends SpecialPage {
private function priorityLanguagesForm( TranslatablePage $page ): void {
$groupId = $page->getMessageGroupId();
+ $interfaceLanguage = $this->getLanguage()->getCode();
+ $storedLanguages = (string)TranslateMetadata::get( $groupId, 'prioritylangs' );
+ $default = $storedLanguages !== '' ? explode( ',', $storedLanguages ) : [];
$form = new OOUI\FieldsetLayout( [
'items' => [
new OOUI\FieldLayout(
- new OOUI\TextInputWidget( [
+ new LanguagesMultiselectWidget( [
+ 'infusable' => true,
'name' => 'prioritylangs',
- 'value' => TranslateMetadata::get( $groupId, 'prioritylangs' ),
- 'inputId' => 'tpt-prioritylangs',
- 'dir' => 'ltr',
+ 'id' => 'mw-translate-SpecialPageTranslation-prioritylangs',
+ 'languages' => TranslateUtils::getLanguageNames( $interfaceLanguage ),
+ 'default' => $default,
] ),
[
'label' => $this->msg( 'tpt-select-prioritylangs' )->text(),
@@ -847,22 +863,50 @@ class SpecialPageTranslation extends SpecialPage {
$out->addHTML( $checkBox->toString() );
}
+ private function templateTransclusionForm( bool $supportsTransclusion ): void {
+ // Transclusion is only supported if this hook is available so avoid showing the
+ // form if it's not. This hook should be available for MW >= 1.36
+ if ( !interface_exists( BeforeParserFetchTemplateRevisionRecordHook::class ) ) {
+ return;
+ }
+
+ $out = $this->getOutput();
+ $out->wrapWikiMsg( '==$1==', 'tpt-transclusion' );
+
+ $checkBox = new OOUI\FieldLayout(
+ new OOUI\CheckboxInputWidget( [
+ 'name' => 'transclusion',
+ 'selected' => $supportsTransclusion
+ ] ),
+ [
+ 'label' => $out->msg( 'tpt-transclusion-label' )->text(),
+ 'align' => 'inline',
+ ]
+ );
+
+ $out->addHTML( $checkBox->toString() );
+ }
+
/**
* This function does the heavy duty of marking a page.
* - Updates the source page with section markers.
* - Updates translate_sections table
* - Updates revtags table
- * - Setups renderjobs to update the translation pages
+ * - Sets up renderjobs to update the translation pages
* - Invalidates caches
+ * - Adds interim cache for MessageIndex
+ *
* @param TranslatablePage $page
- * @param TPSection[] $sections
+ * @param TranslationUnit[] $sections
* @param bool $updateVersion
+ * @param bool $transclusion
* @return array|bool
*/
protected function markForTranslation(
TranslatablePage $page,
array $sections,
- bool $updateVersion
+ bool $updateVersion,
+ bool $transclusion
) {
// Add the section markers to the source page
$wikiPage = WikiPage::factory( $page->getTitle() );
@@ -881,7 +925,7 @@ class SpecialPageTranslation extends SpecialPage {
return [ 'tpt-edit-failed', $status->getWikiText() ];
}
- if ( version_compare( MW_VERSION, '1.35', '>=' ) ) {
+ if ( version_compare( TranslateUtils::getMWVersion(), '1.35', '>=' ) ) {
// MW 1.35+
// Cannot use array_key_exists with DeprecatablePropertyArray, and
// $status->value['revision-record'] can be null, so isset doesn't
@@ -919,9 +963,7 @@ class SpecialPageTranslation extends SpecialPage {
$maxid = (int)TranslateMetadata::get( $groupId, 'maxid' );
$pageId = $page->getTitle()->getArticleID();
- /**
- * @var TPSection $s
- */
+ /** @var TranslationUnit $s */
foreach ( array_values( $sections ) as $index => $s ) {
$maxid = max( $maxid, (int)$s->name );
$changed[] = $s->name;
@@ -951,18 +993,22 @@ class SpecialPageTranslation extends SpecialPage {
TranslateMetadata::set( $groupId, 'version', self::LATEST_SYNTAX_VERSION );
}
+ $page->setTransclusion( $transclusion );
+
$page->addMarkedTag( $newRevisionId );
MessageGroups::singleton()->recache();
+ // Store interim cache
$group = $page->getMessageGroup();
$newKeys = $group->makeGroupKeys( $changed );
MessageIndex::singleton()->storeInterim( $group, $newKeys );
+
$job = TranslationsUpdateJob::newFromPage( $page, $sections );
JobQueueGroup::singleton()->push( $job );
- // Logging
$this->handlePriorityLanguages( $this->getRequest(), $page );
+ // Logging
$entry = new ManualLogEntry( 'pagetranslation', 'mark' );
$entry->setPerformer( $this->getUser() );
$entry->setTarget( $page->getTitle() );
@@ -984,14 +1030,17 @@ class SpecialPageTranslation extends SpecialPage {
* @param TranslatablePage $page
*/
protected function handlePriorityLanguages( WebRequest $request, TranslatablePage $page ) {
- // new priority languages
- $npLangs = rtrim( trim( $request->getVal( 'prioritylangs' ) ), ',' );
+ // Get the priority languages from the request
+ // We've to do some extra work here because if JS is disabled, we will be getting
+ // the values split by newline.
+ $npLangs = rtrim( trim( $request->getVal( 'prioritylangs', '' ) ), ',' );
+ $npLangs = implode( ',', explode( "\n", $npLangs ) );
+ $npLangs = array_map( 'trim', explode( ',', $npLangs ) );
+ $npLangs = array_unique( $npLangs );
+
$npForce = $request->getCheck( 'forcelimit' ) ? 'on' : 'off';
$npReason = trim( $request->getText( 'priorityreason' ) );
- // Normalize
- $npLangs = array_map( 'trim', explode( ',', $npLangs ) );
- $npLangs = array_unique( $npLangs );
// Remove invalid language codes.
$languages = Language::fetchLanguageNames();
foreach ( $npLangs as $index => $language ) {
@@ -1033,31 +1082,29 @@ class SpecialPageTranslation extends SpecialPage {
}
}
- /**
- * Returns the source page without any translation markup.
- *
- * @param TPParse $parse
- * @return string
- * @since 2014.09
- */
- public static function getStrippedSourcePageText( TPParse $parse ) {
- $text = $parse->getTranslationPageText( null );
- $text = preg_replace( '~<languages\s*/>\n?~s', '', $text );
- return $text;
- }
-
private function getPageList( array $pages, string $type ): string {
$items = [];
+ $tagDiscouraged = $this->msg( 'tpt-tag-discouraged' )->escaped();
+ $tagOldSyntax = $this->msg( 'tpt-tag-oldsyntax' )->escaped();
+ $tagNoTransclusionSupport = $this->msg( 'tpt-tag-no-transclusion-support' )->escaped();
+
foreach ( $pages as $page ) {
$link = Linker::link( $page['title'] );
$acts = $this->actionLinks( $page, $type );
$tags = [];
if ( $page['discouraged'] ) {
- $tags[] = $this->msg( 'tpt-tag-discouraged' )->escaped();
+ $tags[] = $tagDiscouraged;
}
- if ( $type !== 'proposed' && $page['version'] !== self::LATEST_SYNTAX_VERSION ) {
- $tags[] = $this->msg( 'tpt-tag-oldsyntax' )->escaped();
+ if ( $type !== 'proposed' ) {
+ if ( $page['version'] !== self::LATEST_SYNTAX_VERSION ) {
+ $tags[] = $tagOldSyntax;
+ }
+
+ if ( $page['transclusion'] !== '1' ) {
+ $tags[] = $tagNoTransclusionSupport;
+ }
+
}
$tagList = '';
diff --git a/MLEB/Translate/tag/SpecialPageTranslationDeletePage.php b/MLEB/Translate/tag/SpecialPageTranslationDeletePage.php
index 9ef78028..437dad98 100644
--- a/MLEB/Translate/tag/SpecialPageTranslationDeletePage.php
+++ b/MLEB/Translate/tag/SpecialPageTranslationDeletePage.php
@@ -17,33 +17,20 @@ use MediaWiki\MediaWikiServices;
class SpecialPageTranslationDeletePage extends SpecialPage {
// Basic form parameters both as text and as titles
protected $text;
-
- /**
- * @var Title
- */
+ /** @var Title */
protected $title;
-
// Other form parameters
/// 'check' or 'perform'
protected $subaction;
-
/// There must be reason for everything.
protected $reason;
-
/// Allow skipping non-translation subpages.
protected $doSubpages = false;
-
- /**
- * @var TranslatablePage
- */
+ /** @var TranslatablePage */
protected $page;
-
/// Contains the language code if we are working with translation page
protected $code;
-
- /**
- * @var Title[]
- */
+ /** @var Title[] */
protected $translationPages;
public function __construct() {
@@ -69,8 +56,7 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
$this->text = $request->getVal( 'wpTitle', $par );
$this->title = Title::newFromText( $this->text );
$this->reason = $request->getText( 'wpReason' );
- // Checkboxes that default being checked are tricky
- $this->doSubpages = $request->getBool( 'subpages', !$request->wasPosted() );
+ $this->doSubpages = $request->getBool( 'subpages' );
$user = $this->getUser();
@@ -182,8 +168,7 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
$formDescriptor = $this->getCommonFormFields();
- $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
- $htmlForm
+ HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
->addHiddenField( 'wpEditToken', $this->getUser()->getEditToken() )
->setMethod( 'post' )
->setAction( $this->getPageTitle( $this->text )->getLocalURL() )
@@ -322,7 +307,7 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
);
}
- if ( !$this->doSubpages ) {
+ if ( $this->doSubpages ) {
$subpages = $this->getSubpages();
foreach ( $subpages as $old ) {
if ( TranslatablePage::isTranslationPage( $old ) ) {
@@ -351,18 +336,18 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
JobQueueGroup::singleton()->push( $jobs );
- $cache = wfGetCache( CACHE_DB );
+ $cache = ObjectCache::getInstance( CACHE_DB );
$cache->set(
- wfMemcKey( 'pt-base', $target->getPrefixedText() ),
+ $cache->makeKey( 'pt-base', $target->getPrefixedText() ),
array_keys( $jobs ),
- 60 * 60 * 6
+ 6 * $cache::TTL_HOUR
);
if ( !$this->singleLanguage() ) {
$this->page->unmarkTranslatablePage();
+ $this->clearMetadata();
}
- $this->clearMetadata();
MessageGroups::singleton()->recache();
MessageIndexRebuildJob::newJob()->insertIntoJobQueue();
@@ -372,9 +357,9 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
protected function clearMetadata() {
// remove the entries from metadata table.
$groupId = $this->page->getMessageGroupId();
- TranslateMetadata::set( $groupId, 'prioritylangs', false );
- TranslateMetadata::set( $groupId, 'priorityforce', false );
- TranslateMetadata::set( $groupId, 'priorityreason', false );
+ foreach ( TranslatablePage::METADATA_KEYS as $type ) {
+ TranslateMetadata::set( $groupId, $type, false );
+ }
// remove the page from aggregate groups, if present in any of them.
$aggregateGroups = MessageGroups::getGroupsByType( AggregateMessageGroup::class );
TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ) );
@@ -430,9 +415,7 @@ class SpecialPageTranslationDeletePage extends SpecialPage {
return $this->title->getSubpages();
}
- /**
- * @return bool
- */
+ /** @return bool */
protected function singleLanguage() {
return $this->code !== '';
}
diff --git a/MLEB/Translate/tag/SpecialPageTranslationMovePage.php b/MLEB/Translate/tag/SpecialPageTranslationMovePage.php
index 87dd6fb2..64ddc81c 100644
--- a/MLEB/Translate/tag/SpecialPageTranslationMovePage.php
+++ b/MLEB/Translate/tag/SpecialPageTranslationMovePage.php
@@ -1,54 +1,42 @@
<?php
-/**
- * Contains class to override Special:MovePage for page translation.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageMover;
+use MediaWiki\Extension\Translate\Services;
use MediaWiki\MediaWikiServices;
/**
* Overrides Special:Movepage to to allow renaming a page translation page and
* all related translations and derivative pages.
*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @ingroup SpecialPage PageTranslation
*/
class SpecialPageTranslationMovePage extends MovePageForm {
// Basic form parameters both as text and as titles
- protected $newText, $oldText;
-
+ /** @var string|null */
+ protected $newText;
+ /** @var string|null */
+ protected $oldText;
// Other form parameters
- /**
- * 'check' or 'perform'
- */
- protected $subaction;
-
- /**
- * @var TranslatablePage instance.
- */
+ /** @var TranslatablePage instance. */
protected $page;
-
- /**
- * Whether MovePageForm extends SpecialPage
- */
- protected $old;
-
- /**
- * @var Title[] Cached list of translation pages. Not yet loaded if null.
- */
+ /** @var Title[] Cached list of translation pages. Not yet loaded if null. */
protected $translationPages;
-
- /**
- * @var Title[] Cached list of section pages. Not yet loaded if null.
- */
+ /** @var Title[] Cached list of section pages. Not yet loaded if null. */
protected $sectionPages;
+ /** @var TranslatablePageMover */
+ protected $pageMover;
+
+ public function __construct() {
+ parent::__construct();
+ $this->pageMover = Services::getInstance()->getTranslatablePageMover();
+ }
/**
* Partially copies from SpecialMovepage.php, because it cannot be
* extended in other ways.
- *
* @param string|null $par null if subpage not provided, string otherwise
* @throws PermissionsError
*/
@@ -99,7 +87,13 @@ class SpecialPageTranslationMovePage extends MovePageForm {
}
if ( $subaction === 'check' && $this->checkToken() && $request->wasPosted() ) {
- $blockers = $this->checkMoveBlockers( $user );
+ $blockers = $this->pageMover->checkMoveBlockers(
+ $this->oldTitle,
+ $this->newTitle,
+ $user,
+ $this->reason,
+ $this->moveSubpages
+ );
if ( count( $blockers ) ) {
$this->showErrors( $blockers );
$this->showForm( [] );
@@ -107,7 +101,14 @@ class SpecialPageTranslationMovePage extends MovePageForm {
$this->showConfirmation();
}
} elseif ( $subaction === 'perform' && $this->checkToken() && $request->wasPosted() ) {
- $this->performAction();
+ $this->pageMover->moveAsynchronously(
+ $this->oldTitle,
+ $this->newTitle,
+ $this->moveSubpages,
+ $this->getUser(),
+ $this->msg( 'pt-movepage-logreason', $this->oldTitle )->inContentLanguage()->text()
+ );
+ $this->getOutput()->addWikiMsg( 'pt-movepage-started' );
} else {
$this->showForm( [] );
}
@@ -123,7 +124,7 @@ class SpecialPageTranslationMovePage extends MovePageForm {
* the input looks anywhere near sane.
* @throws PermissionsError|ErrorPageError|ReadOnlyError|ThrottledError
*/
- protected function doBasicChecks() {
+ protected function doBasicChecks(): void {
$this->checkReadOnly();
if ( $this->oldTitle === null ) {
@@ -149,10 +150,9 @@ class SpecialPageTranslationMovePage extends MovePageForm {
/**
* Checks token. Use before real actions happen. Have to use wpEditToken
* for compatibility for SpecialMovepage.php.
- *
* @return bool
*/
- protected function checkToken() {
+ protected function checkToken(): bool {
return $this->getUser()->matchEditToken( $this->getRequest()->getVal( 'wpEditToken' ) );
}
@@ -160,10 +160,10 @@ class SpecialPageTranslationMovePage extends MovePageForm {
* Pretty-print the list of errors.
* @param SplObjectStorage $errors Array with message key and parameters
*/
- protected function showErrors( SplObjectStorage $errors ) {
+ protected function showErrors( SplObjectStorage $errors ): void {
$out = $this->getOutput();
- $out->addHtml( Html::openElement( 'div', [ 'class' => 'errorbox' ] ) );
+ $out->addHTML( Html::openElement( 'div', [ 'class' => 'errorbox' ] ) );
$out->addWikiMsg(
'pt-movepage-blockers',
$this->getLanguage()->formatNum( count( $errors ) )
@@ -173,52 +173,47 @@ class SpecialPageTranslationMovePage extends MovePageForm {
$s = '';
$context = 'pt-movepage-error-placeholder';
foreach ( $errors as $title ) {
- // @phan-suppress-next-line PhanTypeSuspiciousStringExpression
- $s .= "'''$title'''\n\n";
+ $titleText = $title->getPrefixedText();
+ $s .= "'''$titleText'''\n\n";
$s .= $errors[ $title ]->getWikiText( false, $context );
}
$out->addWikiTextAsInterface( $s );
- $out->addHtml( Html::closeElement( 'div' ) );
+ $out->addHTML( Html::closeElement( 'div' ) );
}
/**
* The query form.
- *
* @param array $err Unused.
* @param bool $isPermError Unused.
*/
- public function showForm( $err, $isPermError = false ) {
+ public function showForm( $err, $isPermError = false ): void {
$this->getOutput()->addWikiMsg( 'pt-movepage-intro' );
$formDescriptor = [
'wpOldTitle' => [
'type' => 'text',
'name' => 'wpOldTitle',
- 'label' => $this->msg( 'pt-movepage-current' )->text(),
- 'size' => 30,
+ 'label-message' => 'pt-movepage-current',
'default' => $this->oldText,
'readonly' => true,
],
'wpNewTitle' => [
'type' => 'text',
'name' => 'wpNewTitle',
- 'label' => $this->msg( 'pt-movepage-new' )->text(),
- 'size' => 30,
+ 'label-message' => 'pt-movepage-new',
'default' => $this->newText,
],
'reason' => [
'type' => 'text',
'name' => 'reason',
- 'label' => $this->msg( 'pt-movepage-reason' )->text(),
- 'size' => 45,
+ 'label-message' => 'pt-movepage-reason',
+ 'maxlength' => CommentStore::COMMENT_CHARACTER_LIMIT,
'default' => $this->reason,
]
];
- $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
- $htmlForm
- ->addHiddenField( 'wpEditToken', $this->getUser()->getEditToken() )
+ HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
->setMethod( 'post' )
->setAction( $this->getPageTitle( $this->oldText )->getLocalURL() )
->setSubmitName( 'subaction' )
@@ -229,37 +224,10 @@ class SpecialPageTranslationMovePage extends MovePageForm {
}
/**
- * Shortcut for keeping the code at least a bit readable. Adds label and
- * input into $form array.
- *
- * @param string[] &$form Array where input element and label is appended.
- * @param string $label Label text.
- * @param string $name Name attribute.
- * @param bool|int $size Size attribute of the input element. Default false.
- * @param bool|string $text Text of the value attribute. Default false.
- * @param array $attribs Extra attributes. Default empty array.
- */
- protected function addInputLabel( &$form, $label, $name, $size = false, $text = false,
- array $attribs = []
- ) {
- $br = Html::element( 'br' );
- list( $label, $input ) = Xml::inputLabelSep(
- $label,
- $name,
- $name,
- $size,
- $text,
- $attribs
- );
- $form[] = $label . $br;
- $form[] = $input . $br;
- }
-
- /**
* The second form, which still allows changing some things.
* Lists all the action which would take place.
*/
- protected function showConfirmation() {
+ protected function showConfirmation(): void {
$out = $this->getOutput();
$out->addWikiMsg( 'pt-movepage-intro' );
@@ -273,11 +241,11 @@ class SpecialPageTranslationMovePage extends MovePageForm {
'pt-movepage-list-pages' => [ $this->oldTitle ],
'pt-movepage-list-translation' => $this->getTranslationPages(),
'pt-movepage-list-section' => $this->getSectionPages(),
- 'pt-movepage-list-translatable' => $this->getTranslatableSubpages()
+ 'pt-movepage-list-translatable' => $this->pageMover->getTranslatableSubpages( $this->page )
];
if ( TranslateUtils::allowsSubpages( $this->oldTitle ) ) {
- $types[ 'pt-movepage-list-other'] = $this->getNormalSubpages();
+ $types[ 'pt-movepage-list-other'] = $this->pageMover->getNormalSubpages( $this->page );
}
foreach ( $types as $type => $pages ) {
@@ -306,7 +274,12 @@ class SpecialPageTranslationMovePage extends MovePageForm {
$subpagesCount++;
}
- $lines[] = $this->getChangeLine( $base, $old, $target, $canBeMoved );
+ if ( $canBeMoved ) {
+ $to = $this->pageMover->newPageTitle( $base, $old, $target );
+ $lines[] = '* ' . $old->getPrefixedText() . ' → ' . $to;
+ } else {
+ $lines[] = '* ' . $old->getPrefixedText();
+ }
}
$out->addWikiTextAsInterface( implode( "\n", $lines ) );
@@ -319,257 +292,57 @@ class SpecialPageTranslationMovePage extends MovePageForm {
$this->getLanguage()->formatNum( $subpagesCount )
);
- $br = Html::element( 'br' );
- $readonly = [ 'readonly' => 'readonly' ];
- $subaction = [ 'name' => 'subaction' ];
- $formParams = [
- 'method' => 'post',
- 'action' => $this->getPageTitle( $this->oldText )->getLocalURL()
+ $formDescriptor = [
+ 'wpOldTitle' => [
+ 'type' => 'text',
+ 'name' => 'wpOldTitle',
+ 'label-message' => 'pt-movepage-current',
+ 'default' => $this->oldText,
+ 'readonly' => true,
+ ],
+ 'wpNewTitle' => [
+ 'type' => 'text',
+ 'name' => 'wpNewTitle',
+ 'label-message' => 'pt-movepage-new',
+ 'default' => $this->newText,
+ 'readonly' => true,
+ ],
+ 'reason' => [
+ 'type' => 'text',
+ 'name' => 'reason',
+ 'label-message' => 'pt-movepage-reason',
+ 'maxlength' => CommentStore::COMMENT_CHARACTER_LIMIT,
+ 'default' => $this->reason,
+ ],
+ 'subpages' => [
+ 'type' => 'check',
+ 'name' => 'subpages',
+ 'id' => 'mw-subpages',
+ 'label-message' => 'pt-movepage-subpages',
+ 'default' => $this->moveSubpages,
+ ]
];
- $form = [];
- $form[] = Xml::fieldset( $this->msg( 'pt-movepage-legend' )->text() );
- $form[] = Html::openElement( 'form', $formParams );
- $form[] = Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
- $this->addInputLabel(
- $form,
- $this->msg( 'pt-movepage-current' )->text(),
- 'wpOldTitle',
- 30,
- $this->oldText,
- $readonly
- );
- $this->addInputLabel(
- $form,
- $this->msg( 'pt-movepage-new' )->text(),
- 'wpNewTitle',
- 30,
- $this->newText,
- $readonly
- );
- $this->addInputLabel(
- $form,
- $this->msg( 'pt-movepage-reason' )->text(),
- 'reason',
- 60,
- $this->reason
- );
- $form[] = Html::hidden( 'subpages', $this->moveSubpages );
- $form[] = Xml::checkLabel(
- $this->msg( 'pt-movepage-subpages' )->text(),
- 'subpagesFake',
- 'mw-subpages',
- $this->moveSubpages,
- $readonly
- ) . $br;
- $form[] = Xml::submitButton( $this->msg( 'pt-movepage-action-perform' )->text(), $subaction );
- $form[] = Xml::submitButton( $this->msg( 'pt-movepage-action-other' )->text(), $subaction );
- $form[] = Xml::closeElement( 'form' );
- $form[] = Xml::closeElement( 'fieldset' );
- $out->addHTML( implode( "\n", $form ) );
- }
-
- /**
- * @param string $base
- * @param Title $old
- * @param Title $target
- * @param bool $enabled
- * @return string
- */
- protected function getChangeLine( $base, Title $old, Title $target, $enabled = true ) {
- $to = $this->newPageTitle( $base, $old, $target );
-
- if ( $enabled ) {
- return '* ' . $old->getPrefixedText() . ' → ' . $to;
- } else {
- return '* ' . $old->getPrefixedText();
- }
- }
-
- protected function performAction() {
- $target = $this->newTitle;
- $base = $this->oldTitle->getPrefixedText();
-
- $moves = [];
- $moves[$base] = $target->getPrefixedText();
-
- foreach ( $this->getTranslationPages() as $from ) {
- $to = $this->newPageTitle( $base, $from, $target );
- $moves[$from->getPrefixedText()] = $to->getPrefixedText();
- }
-
- foreach ( $this->getSectionPages() as $from ) {
- $to = $this->newPageTitle( $base, $from, $target );
- $moves[$from->getPrefixedText()] = $to->getPrefixedText();
- }
-
- if ( $this->moveSubpages ) {
- $subpages = $this->getNormalSubpages();
- foreach ( $subpages as $from ) {
- $to = $this->newPageTitle( $base, $from, $target );
- $moves[$from->getPrefixedText()] = $to->getPrefixedText();
- }
- }
-
- $summary = $this->msg( 'pt-movepage-logreason', $base )->inContentLanguage()->text();
- $job = TranslatablePageMoveJob::newJob(
- $this->oldTitle, $this->newTitle, $moves, $summary, $this->getUser()
- );
-
- JobQueueGroup::singleton()->push( $job );
-
- $this->getOutput()->addWikiMsg( 'pt-movepage-started' );
- }
-
- protected function checkMoveBlockers( User $user ) {
- $blockers = new SplObjectStorage();
-
- $source = $this->oldTitle;
- $target = $this->newTitle;
-
- if ( !$target ) {
- $blockers[$source] = Status::newFatal( 'pt-movepage-block-base-invalid' );
-
- return $blockers;
- }
-
- if ( $target->inNamespaces( NS_MEDIAWIKI, NS_TRANSLATIONS ) ) {
- $blockers[$source] = Status::newFatal(
- 'immobile-target-namespace', $target->getNsText()
- );
-
- return $blockers;
- }
-
- if ( $target->exists() ) {
- $blockers[$source] = Status::newFatal(
- 'pt-movepage-block-base-exists', $target->getPrefixedText()
- );
- } else {
- $movePage = new MovePage( $this->oldTitle, $target );
- $status = $movePage->isValidMove();
- $status->merge( $movePage->checkPermissions( $user, $this->reason ) );
- if ( !$status->isOK() ) {
- $blockers[$source] = $status;
- }
- }
-
- // Don't spam the same errors for all pages if base page fails
- if ( count( $blockers ) ) {
- return $blockers;
- }
-
- // Collect all the old and new titles for checcks
- $titles = [];
- $base = $this->oldTitle->getPrefixedText();
- $pages = $this->getTranslationPages();
- foreach ( $pages as $old ) {
- $titles['tp'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
- }
-
- $subpages = $this->moveSubpages ? $this->getNormalSubpages() : [];
- foreach ( $subpages as $old ) {
- $titles['subpage'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
- }
-
- $pages = $this->getSectionPages();
- foreach ( $pages as $old ) {
- $titles['section'][] = [ $old, $this->newPageTitle( $base, $old, $target ) ];
- }
-
- // Check that all new titles are valid
- $lb = new LinkBatch();
- foreach ( $titles as $type => $list ) {
- // Give grep a chance to find the usages:
- // pt-movepage-block-tp-invalid, pt-movepage-block-section-invalid,
- // pt-movepage-block-subpage-invalid
- foreach ( $list as $pair ) {
- list( $old, $new ) = $pair;
- if ( $new === null ) {
- $blockers[$old] = Status::newFatal(
- "pt-movepage-block-$type-invalid",
- $old->getPrefixedText()
- );
- continue;
- }
- $lb->addObj( $old );
- $lb->addObj( $new );
- }
- }
-
- if ( count( $blockers ) ) {
- return $blockers;
- }
-
- // Check that there are no move blockers
- $lb->execute();
- foreach ( $titles as $type => $list ) {
- // Give grep a chance to find the usages:
- // pt-movepage-block-tp-exists, pt-movepage-block-section-exists,
- // pt-movepage-block-subpage-exists
- foreach ( $list as $pair ) {
- list( $old, $new ) = $pair;
- if ( $new->exists() ) {
- $blockers[$old] = Status::newFatal(
- "pt-movepage-block-$type-exists",
- $old->getPrefixedText(),
- $new->getPrefixedText()
- );
- } else {
- /* This method has terrible performance:
- * - 2 queries by core
- * - 3 queries by lqt
- * - and no obvious way to preload the data! */
- $movePage = new MovePage( $old, $target );
- $status = $movePage->isValidMove();
- // Do not check for permissions here, as these pages are not editable/movable
- // in regular use
- if ( !$status->isOK() ) {
- $blockers[$old] = $status;
- }
-
- /* Because of the poor performance, check only one of the possibly thousands
- * of section pages and assume rest are fine. This assumes section pages are
- * listed last in the array. */
- if ( $type === 'section' ) {
- break;
- }
- }
- }
- }
-
- return $blockers;
- }
-
- /**
- * Makes old title into a new title by replacing $base part of old title
- * with $target.
- * @param string $base Title::getPrefixedText() of the base page.
- * @param Title $old The title to convert.
- * @param Title $target The target title for the base page.
- * @return Title
- */
- protected function newPageTitle( $base, Title $old, Title $target ) {
- $search = preg_quote( $base, '~' );
-
- if ( $old->inNamespace( NS_TRANSLATIONS ) ) {
- $new = $old->getText();
- $new = preg_replace( "~^$search~", $target->getPrefixedText(), $new, 1 );
-
- return Title::makeTitleSafe( NS_TRANSLATIONS, $new );
- } else {
- $new = $old->getPrefixedText();
- $new = preg_replace( "~^$search~", $target->getPrefixedText(), $new, 1 );
-
- return Title::newFromText( $new );
- }
+ $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
+ $htmlForm
+ ->addButton( [
+ 'name' => 'subaction',
+ 'value' => $this->msg( 'pt-movepage-action-other' )->text(),
+ ] )
+ ->setMethod( 'post' )
+ ->setAction( $this->getPageTitle( $this->oldText )->getLocalURL() )
+ ->setSubmitName( 'subaction' )
+ ->setSubmitTextMsg( 'pt-movepage-action-perform' )
+ ->setWrapperLegendMsg( 'pt-movepage-legend' )
+ ->prepareForm()
+ ->displayForm( false );
}
/**
* Returns all section pages, including those which are currently not active.
* @return Title[]
*/
- protected function getSectionPages() {
+ protected function getSectionPages(): array {
if ( !isset( $this->sectionPages ) ) {
$this->sectionPages = $this->page->getTranslationUnitPages( 'all' );
}
@@ -581,45 +354,11 @@ class SpecialPageTranslationMovePage extends MovePageForm {
* Returns only translation subpages.
* @return Title[]
*/
- protected function getTranslationPages() {
+ protected function getTranslationPages(): array {
if ( !isset( $this->translationPages ) ) {
$this->translationPages = $this->page->getTranslationPages();
}
return $this->translationPages;
}
-
- /**
- * Returns all subpages, if the namespace has them enabled.
- * @return Title[]
- */
- protected function getSubpages() {
- $pages = $this->page->getTitle()->getSubpages();
- if ( $pages instanceof Traversable ) {
- $pages = iterator_to_array( $pages );
- }
-
- return $pages;
- }
-
- private function getNormalSubpages() {
- return array_filter(
- $this->getSubpages(),
- function ( $page ) {
- return !(
- TranslatablePage::isTranslationPage( $page ) ||
- TranslatablePage::isSourcePage( $page )
- );
- }
- );
- }
-
- private function getTranslatableSubpages() {
- return array_filter(
- $this->getSubpages(),
- function ( $page ) {
- return TranslatablePage::isSourcePage( $page );
- }
- );
- }
}
diff --git a/MLEB/Translate/tag/TPException.php b/MLEB/Translate/tag/TPException.php
index b01682d6..41b79924 100644
--- a/MLEB/Translate/tag/TPException.php
+++ b/MLEB/Translate/tag/TPException.php
@@ -14,23 +14,17 @@
* @ingroup PageTranslation
*/
class TPException extends MWException {
- protected $msg;
+ private $msg;
- /**
- * @todo Pass around Messages when Status class doesn't suck
- * @param array $msg Message key with parameters
- */
+ /** @param array $msg Message key with parameters */
public function __construct( array $msg ) {
$this->msg = $msg;
// Using ->plain() instead of ->text() due to bug T58226
- $wikitext = call_user_func_array( 'wfMessage', $msg )->plain();
+ $wikitext = wfMessage( ...$msg )->plain();
parent::__construct( $wikitext );
}
- /**
- * @return array
- */
- public function getMsg() {
+ public function getMsg(): array {
return $this->msg;
}
}
diff --git a/MLEB/Translate/tag/TPParse.php b/MLEB/Translate/tag/TPParse.php
index 07a4813e..1d2e3e5f 100644
--- a/MLEB/Translate/tag/TPParse.php
+++ b/MLEB/Translate/tag/TPParse.php
@@ -8,6 +8,8 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\PageTranslation\TranslationUnit;
+
/**
* This class represents the results of parsed source page, that is, the
* extracted sections and a template.
@@ -17,18 +19,17 @@
class TPParse {
/** @var Title Title of the page. */
protected $title;
-
- /** @var TPSection[] Parsed sections indexed with placeholder.
+ /**
* @todo Encapsulate
+ * @var TranslationUnit[] Parsed sections indexed with placeholder.
*/
public $sections = [];
- /** @var string Page source with content replaced with placeholders.
+ /**
* @todo Encapsulate
+ * @var string Page source with content replaced with placeholders.
*/
public $template = null;
- /**
- * @var null|array Sections saved in the database. array( string => TPSection, ... )
- */
+ /** @var null|array Sections saved in the database. array( string => TranslationUnit, ... ) */
protected $dbSections = null;
/// Constructor
@@ -71,8 +72,9 @@ class TPParse {
/**
* Gets the sections and assigns section id for new sections
+ *
* @param int $highest The largest used integer id (Since 2012-08-02)
- * @return TPSection[] array( string => TPSection, ... )
+ * @return TranslationUnit[] array( string => TranslationUnit, ... )
*/
public function getSectionsForSave( $highest = 0 ) {
$this->loadFromDatabase();
@@ -108,7 +110,8 @@ class TPParse {
/**
* Returns list of deleted sections.
- * @return TPSection[] List of sections indexed by id. array( string => TPsection, ... )
+ *
+ * @return TranslationUnit[] List of sections indexed by id. array( string => TranslationUnit, ... )
*/
public function getDeletedSections() {
$sections = $this->getSectionsForSave();
@@ -140,7 +143,7 @@ class TPParse {
$res = $db->select( $tables, $vars, $conds, __METHOD__ );
foreach ( $res as $r ) {
- $section = new TPSection;
+ $section = new TranslationUnit;
$section->id = $r->trs_key;
$section->text = $r->trs_text;
$section->type = 'db';
@@ -164,84 +167,6 @@ class TPParse {
}
/**
- * Returns translation page with all possible translations replaced in, ugly
- * translation tags removed and outdated translation marked with a class
- * mw-translate-fuzzy.
- *
- * @param MessageCollection|array $collection Collection that holds translated messages.
- * @param bool $showOutdated Whether to show outdated sections, wrapped in a HTML class.
- * @return string Whole page as wikitext.
- */
- public function getTranslationPageText( $collection, $showOutdated = false ) {
- $text = $this->template; // The source
-
- // For finding the messages
- $prefix = $this->title->getPrefixedDBkey() . '/';
-
- if ( $collection instanceof MessageCollection ) {
- $collection->loadTranslations();
- if ( $showOutdated ) {
- $collection->filter( 'hastranslation', false );
- } else {
- $collection->filter( 'translated', false );
- }
- }
-
- foreach ( $this->sections as $ph => $s ) {
- $sectiontext = null;
-
- if ( isset( $collection[$prefix . $s->id] ) ) {
- /** @var TMessage $msg */
- $msg = $collection[$prefix . $s->id];
- /** @var string|null */
- $sectiontext = $msg->translation();
-
- // If translation is fuzzy, $sectiontext must be a string
- if ( $msg->hasTag( 'fuzzy' ) ) {
- // We do not ever want to show explicit fuzzy marks in the rendered pages
- $sectiontext = str_replace( TRANSLATE_FUZZY, '', $sectiontext );
-
- if ( $s->canWrap() ) {
- if ( $s->isInline() ) {
- $sectiontext = "<span class=\"mw-translate-fuzzy\">$sectiontext</span>";
- } else {
- // We add new lines around the text to avoid disturbing any mark-up that
- // has special handling on line start, such as lists.
- $sectiontext =
- "<div class=\"mw-translate-fuzzy\">\n$sectiontext\n</div>";
- }
- }
- }
- }
-
- // Use the original text if no translation is available.
-
- // For the source language, this will actually be the source, which
- // contains variable declarations (tvar) instead of variables ($1).
- // The getTextWithVariables will convert declarations to normal variables
- // for us so that the variable substitutions below will also work
- // for the source language.
- if ( $sectiontext === null || $sectiontext === $s->getText() ) {
- $sectiontext = $s->getTextWithVariables();
- }
-
- // Substitute variables into section text and substitute text into document
- $sectiontext = strtr( $sectiontext, $s->getVariables() );
- $text = str_replace( $ph, $sectiontext, $text );
- }
-
- $nph = [];
- $text = TranslatablePage::armourNowiki( $nph, $text );
-
- // Remove translation markup from the template to produce the final text.
- $cb = [ __CLASS__, 'replaceTagCb' ];
- $text = preg_replace_callback( '~<translate(?: nowrap)?>(.*?)</translate>~s', $cb, $text );
- $text = TranslatablePage::unArmourNowiki( $nph, $text );
-
- return $text;
- }
-
- /**
* Chops of trailing or preceding whitespace intelligently to avoid
* build up of unintended whitespace.
* @param string[] $matches
diff --git a/MLEB/Translate/tag/TPSection.php b/MLEB/Translate/tag/TPSection.php
deleted file mode 100644
index 4624ded9..00000000
--- a/MLEB/Translate/tag/TPSection.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-/**
- * Helper for TPParse.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
-
-/**
- * This class represents one individual section in translatable page.
- *
- * @ingroup PageTranslation
- */
-class TPSection {
- /**
- * @var string Section name
- */
- public $id;
-
- /**
- * @var string|null New name of the section, that will be saved to database.
- */
- public $name = null;
-
- /**
- * @var string Section text.
- */
- public $text;
-
- /**
- * @var string Is this new, existing, changed or deleted section.
- */
- public $type;
-
- /**
- * @var string|null Text of previous version of this section.
- */
- public $oldText = null;
-
- /**
- * @var bool Whether this section is inline section.
- * E.g. "Something <translate>foo</translate> bar".
- */
- protected $inline = false;
-
- /** @var bool Whether wrapping the section is allowed */
- private $canWrap = true;
-
- /**
- * @var int Version number for the serialization.
- */
- private $version = 1;
-
- /**
- * @var string[] List of properties to serialize.
- */
- private static $properties = [ 'version', 'id', 'name', 'text', 'type', 'oldText', 'inline' ];
-
- public function setIsInline( $value ) {
- $this->inline = (bool)$value;
- }
-
- public function isInline() {
- return $this->inline;
- }
-
- /**
- * @param bool $value
- * @since 2020.07
- */
- public function setCanWrap( bool $value ): void {
- $this->canWrap = $value;
- }
-
- /**
- * @return bool
- * @since 2020.07
- */
- public function canWrap(): bool {
- return $this->canWrap;
- }
-
- /**
- * Returns section text unmodified.
- * @return string Wikitext.
- */
- public function getText() {
- return $this->text;
- }
-
- /**
- * Returns the text with tvars replaces with placeholders.
- * @return string Wikitext.
- * @since 2014.07
- */
- public function getTextWithVariables() {
- $re = '~<tvar\|([^>]+)>(.*?)</>~us';
-
- return preg_replace( $re, '$\1', $this->text );
- }
-
- /**
- * Returns section text with variables replaced.
- * @return string Wikitext.
- */
- public function getTextForTrans() {
- $re = '~<tvar\|([^>]+)>(.*?)</>~us';
-
- return preg_replace( $re, '\2', $this->text );
- }
-
- /**
- * Returns the section text with updated or added section marker.
- *
- * @return string Wikitext.
- */
- public function getMarkedText() {
- $id = $this->name ?? $this->id;
- $header = "<!--T:{$id}-->";
- $re = '~^(=+.*?=+\s*?$)~m';
- $rep = "\\1 $header";
- $count = 0;
-
- $text = preg_replace( $re, $rep, $this->text, 1, $count );
-
- if ( $count === 0 ) {
- if ( $this->inline ) {
- $text = $header . ' ' . $this->text;
- } else {
- $text = $header . "\n" . $this->text;
- }
- }
-
- return $text;
- }
-
- /**
- * Returns oldtext, or current text if not available.
- * @return string Wikitext.
- */
- public function getOldText() {
- return $this->oldText ?? $this->text;
- }
-
- /**
- * Returns array of variables defined on this section.
- * @return array ( string => string ) Values indexed with keys which are
- * prefixed with a dollar sign.
- */
- public function getVariables() {
- $re = '~<tvar\|([^>]+)>(.*?)</>~us';
- $matches = [];
- preg_match_all( $re, $this->text, $matches, PREG_SET_ORDER );
- $vars = [];
-
- foreach ( $matches as $m ) {
- $vars['$' . $m[1]] = $m[2];
- }
-
- return $vars;
- }
-
- /**
- * Serialize this object to a PHP array.
- * @return array
- * @since 2018.07
- */
- public function serializeToArray() {
- $data = [];
- foreach ( self::$properties as $index => $property ) {
- // Because this is used for the JobQueue, use a list
- // instead of an array to save space.
- $data[ $index ] = $this->$property;
- }
-
- return $data;
- }
-
- /**
- * Construct an object from previously serialized array.
- * @param array $data
- * @return self
- * @since 2018.07
- */
- public static function unserializeFromArray( $data ) {
- $section = new self;
- foreach ( self::$properties as $index => $property ) {
- $section->$property = $data[ $index ];
- }
-
- return $section;
- }
-}
diff --git a/MLEB/Translate/tag/TranslatablePage.php b/MLEB/Translate/tag/TranslatablePage.php
index f6a838cb..11dc2f12 100644
--- a/MLEB/Translate/tag/TranslatablePage.php
+++ b/MLEB/Translate/tag/TranslatablePage.php
@@ -1,63 +1,54 @@
<?php
-/**
- * Translatable page model.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+use MediaWiki\Extension\Translate\PageTranslation\TranslationPage;
+use MediaWiki\Extension\Translate\PageTranslation\TranslationUnit;
+use MediaWiki\Extension\Translate\Services;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionLookup;
+use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
use Wikimedia\Rdbms\Database;
/**
- * Class to parse translatable wiki pages.
+ * Mixed bag of methods related to translatable pages.
*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @ingroup PageTranslation
*/
class TranslatablePage {
/**
- * Title of the page.
+ * List of keys in the metadata table that need to be handled for moves and deletions
+ * @phpcs-require-sorted-array
*/
- protected $title;
+ public const METADATA_KEYS = [
+ 'maxid',
+ 'priorityforce',
+ 'prioritylangs',
+ 'priorityreason',
+ 'transclusion',
+ 'version'
+ ];
- /**
- * @var ?string Text contents of the page.
- */
+ /** @var Title */
+ protected $title;
+ /** @var ?string Text contents of the page. */
protected $text;
-
- /**
- * Revision of the page, if applicaple.
- *
- * @var int
- */
+ /** @var ?int Revision of the page, if applicable. */
protected $revision;
-
- /**
- * From which source this object was constructed.
- * Can be: text, revision, title
- */
+ /** @var string From which source this object was constructed: text, revision or title */
protected $source;
-
- /**
- * Name of the section which contains the translated page title.
- */
+ /** @var string Name of the section which contains the translated page title. */
protected $displayTitle = 'Page display title';
-
- /**
- * Whether the title should be translated
- * @var bool
- */
+ /** @var ?bool Whether the title should be translated */
protected $pageDisplayTitle;
-
+ /** @var ?TPParse */
protected $cachedParse;
+ /** @var ?string */
+ private $targetLanguage;
- /**
- * @param Title $title Title object for the page
- */
+ /** @param Title $title Title object for the page */
protected function __construct( Title $title ) {
$this->title = $title;
}
@@ -266,80 +257,21 @@ class TranslatablePage {
return $this->cachedParse;
}
- $text = $this->getText();
-
- $nowiki = [];
- $text = self::armourNowiki( $nowiki, $text );
+ $services = Services::getInstance();
+ $parser = $services->getTranslatablePageParser();
+ $placeholderFactory = $services->getParsingPlaceholderFactory();
- $sections = [];
+ $parserOutput = $parser->parse( $this->getText() );
// Add section to allow translating the page name
- $displaytitle = new TPSection;
- $displaytitle->id = $this->displayTitle;
- $displaytitle->text = $this->getTitle()->getPrefixedText();
- $sections[TranslateUtils::getPlaceholder()] = $displaytitle;
-
- $tagPlaceHolders = [];
-
- while ( true ) {
- $re = '~(<translate(?: nowrap)?>)(.*?)</translate>~s';
- $matches = [];
- $ok = preg_match( $re, $text, $matches, PREG_OFFSET_CAPTURE );
-
- if ( $ok === 0 || $ok === false ) {
- break; // No match or failure
- }
-
- $contentWithTags = $matches[0][0];
- $contentWithoutTags = $matches[2][0];
- // These are offsets to the content inside the tags in $text
- $offsetStart = $matches[0][1];
- $offsetEnd = $offsetStart + strlen( $contentWithTags );
-
- // Replace the whole match with a placeholder
- $ph = TranslateUtils::getPlaceholder();
- $text = substr( $text, 0, $offsetStart ) . $ph . substr( $text, $offsetEnd );
-
- if ( preg_match( '~<translate( nowrap)?>~', $contentWithoutTags ) !== 0 ) {
- throw new TPException( [ 'pt-parse-nested', $contentWithoutTags ] );
- }
-
- $openTag = $matches[1][0];
- $canWrap = $openTag !== '<translate nowrap>';
-
- // Parse the content inside the tags
- $contentWithoutTags = self::unArmourNowiki( $nowiki, $contentWithoutTags );
- $parse = self::sectionise( $contentWithoutTags, $canWrap );
-
- // Update list of sections and the template with the results
- $sections += $parse['sections'];
- $tagPlaceHolders[$ph] = $openTag . $parse['template'] . '</translate>';
- }
-
- $prettyTemplate = $text;
- foreach ( $tagPlaceHolders as $ph => $value ) {
- $prettyTemplate = str_replace( $ph, '[...]', $prettyTemplate );
- }
-
- if ( preg_match( '~<translate( nowrap)?>~', $text ) !== 0 ) {
- throw new TPException( [ 'pt-parse-open', $prettyTemplate ] );
- } elseif ( strpos( $text, '</translate>' ) !== false ) {
- throw new TPException( [ 'pt-parse-close', $prettyTemplate ] );
- }
-
- // Replace the tag placeholders with unit placeholders to form the template
- $text = strtr( $text, $tagPlaceHolders );
-
- if ( count( $sections ) === 1 ) {
- // Don't return display title for pages which have no sections
- $sections = [];
- }
-
- $text = self::unArmourNowiki( $nowiki, $text );
+ $displayTitle = new TranslationUnit();
+ $displayTitle->id = $this->displayTitle;
+ $displayTitle->text = $this->getTitle()->getPrefixedText();
$parse = new TPParse( $this->getTitle() );
- $parse->template = $text;
- $parse->sections = $sections;
+ $parse->template = $parserOutput->sourcePageTemplate();
+ // Make it be the first section
+ $parse->sections = [ $placeholderFactory->make() => $displayTitle ] + $parserOutput->units();
// Cache it
$this->cachedParse = $parse;
@@ -348,140 +280,52 @@ class TranslatablePage {
}
/**
- * Remove all opening and closing translate tags following the same whitespace rules
- * as the regular parsing. The difference is that this doesn't try to parse the page,
- * so it can handle unbalanced tags.
- *
- * @param string $text Wikitext
- * @return string Wikitext without translate tags.
- */
- public static function cleanupTags( $text ) {
- $nowiki = [];
- $text = self::armourNowiki( $nowiki, $text );
- $text = preg_replace( '~<translate( nowrap)?>\n?~s', '', $text );
- $text = preg_replace( '~\n?</translate>~s', '', $text );
- // Mirroring what TPSection::getTextForTrans does
- $text = preg_replace( '~<tvar\|([^>]+)>(.*?)</>~u', '\2', $text );
-
- $text = self::unArmourNowiki( $nowiki, $text );
- return $text;
- }
-
- /**
- * @param array &$holders
- * @param string $text
* @return string
+ * @since 2020.07
*/
- public static function armourNowiki( &$holders, $text ) {
- $re = '~(<nowiki>)(.*?)(</nowiki>)~s';
-
- while ( preg_match( $re, $text, $matches ) ) {
- $ph = TranslateUtils::getPlaceholder();
- $text = str_replace( $matches[0], $ph, $text );
- $holders[$ph] = $matches[0];
- }
-
- return $text;
- }
-
- /**
- * @param array $holders
- * @param string $text
- * @return mixed
- */
- public static function unArmourNowiki( $holders, $text ) {
- foreach ( $holders as $ph => $value ) {
- $text = str_replace( $ph, $value, $text );
- }
+ public function getStrippedSourcePageText(): string {
+ $parser = Services::getInstance()->getTranslatablePageParser();
+ $text = $parser->cleanupTags( $this->getText() );
+ $text = preg_replace( '~<languages\s*/>\n?~s', '', $text );
return $text;
}
/**
- * Splits the content marked with \<translate> tags into sections, which
- * are separated with with two or more newlines. Extra whitespace is captured
- * in the template and is not included in the sections.
- *
- * @param string $text Contents of one pair of \<translate> tags.
- * @param bool $canWrap
- * @return array Contains a template and array of unparsed sections.
+ * @param Title $title
+ * @return ?TranslationPage
+ * @since 2020.07
*/
- public static function sectionise( string $text, bool $canWrap ): array {
- $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE;
- $parts = preg_split( '~(^\s*|\s*\n\n\s*|\s*$)~', $text, -1, $flags );
-
- $inline = preg_match( '~\n~', $text ) === 0;
-
- $template = '';
- $sections = [];
-
- foreach ( $parts as $_ ) {
- if ( trim( $_ ) === '' ) {
- $template .= $_;
- } else {
- $ph = TranslateUtils::getPlaceholder();
- $tpsection = self::shakeSection( $_ );
- $tpsection->setIsInline( $inline );
- $tpsection->setCanWrap( $canWrap );
- $sections[$ph] = $tpsection;
- $template .= $ph;
- }
+ public static function getTranslationPageFromTitle( Title $title ): ?TranslationPage {
+ $self = self::isTranslationPage( $title );
+ if ( !$self ) {
+ return null;
}
- return [
- 'template' => $template,
- 'sections' => $sections,
- ];
+ return $self->getTranslationPage( $self->targetLanguage );
}
/**
- * Checks if this section already contains a section marker. If there
- * is not, a new one will be created. Marker will have the value of
- * -1, which will later be replaced with a real value.
- *
- * May throw a TPException if there is error with existing section
- * markers.
- *
- * @param string $content Content of one section
- * @throws TPException
- * @return TPSection
+ * @param string $targetLanguage
+ * @return TranslationPage
+ * @since 2020.07
*/
- public static function shakeSection( $content ) {
- $re = '~<!--T:(.*?)-->~';
- $matches = [];
- $count = preg_match_all( $re, $content, $matches, PREG_SET_ORDER );
+ public function getTranslationPage( string $targetLanguage ): TranslationPage {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+ $parser = Services::getInstance()->getTranslatablePageParser();
+ $parserOutput = $parser->parse( $this->getText() );
+ $pageVersion = (int)TranslateMetadata::get( $this->getMessageGroupId(), 'version' );
+ $wrapUntranslated = $pageVersion >= 2;
- if ( $count > 1 ) {
- throw new TPException( [ 'pt-shake-multiple', $content ] );
- }
-
- $section = new TPSection;
- if ( $count === 1 ) {
- foreach ( $matches as $match ) {
- list( /*full*/, $id ) = $match;
- $section->id = $id;
-
- // Currently handle only these two standard places.
- // Is this too strict?
- $rer1 = '~^<!--T:(.*?)-->( |\n)~'; // Normal sections
- $rer2 = '~\s*<!--T:(.*?)-->$~m'; // Sections with title
- $content = preg_replace( $rer1, '', $content );
- $content = preg_replace( $rer2, '', $content );
-
- if ( preg_match( $re, $content ) === 1 ) {
- throw new TPException( [ 'pt-shake-position', $content ] );
- } elseif ( trim( $content ) === '' ) {
- throw new TPException( [ 'pt-shake-empty', $id ] );
- }
- }
- } else {
- // New section
- $section->id = -1;
- }
-
- $section->text = $content;
-
- return $section;
+ return new TranslationPage(
+ $parserOutput,
+ $this->getMessageGroup(),
+ Language::factory( $targetLanguage ),
+ Language::factory( $this->getSourceLanguageCode() ),
+ $config->get( 'TranslateKeepOutdatedTranslations' ),
+ $wrapUntranslated,
+ $this->getTitle()->getPrefixedDBkey() . '/'
+ );
}
protected static $tagCache = [];
@@ -663,7 +507,7 @@ class TranslatablePage {
$prefix = $this->getTitle()->getText();
/** @var Title $title */
foreach ( $titles as $title ) {
- list( $name, $code ) = TranslateUtils::figureMessage( $title->getText() );
+ [ $name, $code ] = TranslateUtils::figureMessage( $title->getText() );
if ( !isset( $codes[$code] ) || $name !== $prefix ) {
continue;
}
@@ -749,10 +593,7 @@ class TranslatablePage {
return $units;
}
- /**
- *
- * @return array
- */
+ /** @return array */
public function getTranslationPercentages() {
// Calculate percentages for the available translations
$group = $this->getMessageGroup();
@@ -799,6 +640,36 @@ class TranslatablePage {
return $db->selectField( 'revtag', $fields, $conds, __METHOD__, $options );
}
+ public function supportsTransclusion(): ?bool {
+ $transclusion = TranslateMetadata::get( $this->getMessageGroupId(), 'transclusion' );
+ if ( $transclusion === false ) {
+ return null;
+ }
+
+ return $transclusion === '1';
+ }
+
+ public function setTransclusion( bool $supportsTransclusion ): void {
+ TranslateMetadata::set(
+ $this->getMessageGroupId(),
+ 'transclusion',
+ $supportsTransclusion ? '1' : '0'
+ );
+ }
+
+ public function getRevisionRecordWithFallback(): ?RevisionRecord {
+ $title = $this->getTitle();
+ $store = MediaWikiServices::getInstance()->getRevisionStore();
+ $revRecord = $store->getRevisionByTitle( $title->getSubpage( $this->targetLanguage ) );
+ if ( $revRecord ) {
+ return $revRecord;
+ }
+
+ // Fetch the source fallback
+ $sourceLanguage = $this->getMessageGroup()->getSourceLanguage();
+ return $store->getRevisionByTitle( $title->getSubpage( $sourceLanguage ) );
+ }
+
/**
* @param Title $title
* @return bool|self
@@ -832,6 +703,8 @@ class TranslatablePage {
return false;
}
+ $page->targetLanguage = $code;
+
return $page;
}
@@ -846,7 +719,7 @@ class TranslatablePage {
* @return array
* @since 2019.10
*/
- public static function parseTranslationUnit( LinkTarget $translationUnit ) : array {
+ public static function parseTranslationUnit( LinkTarget $translationUnit ): array {
// Format is Translations:SourcePageNamespace:SourcePageName/SectionName/LanguageCode.
// We will drop the namespace immediately here.
$parts = explode( '/', $translationUnit->getText() );
diff --git a/MLEB/Translate/tag/TranslatablePageMoveJob.php b/MLEB/Translate/tag/TranslatablePageMoveJob.php
index c0b1e189..d760c960 100644
--- a/MLEB/Translate/tag/TranslatablePageMoveJob.php
+++ b/MLEB/Translate/tag/TranslatablePageMoveJob.php
@@ -1,33 +1,28 @@
<?php
-/**
- * Contains class with job for moving translation pages.
- *
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageMover;
+use MediaWiki\Extension\Translate\Services;
/**
* Contains class with job for moving translation pages. Used together with
* SpecialPageTranslationMovePage class.
*
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
* @ingroup PageTranslation JobQueue
*/
class TranslatablePageMoveJob extends Job {
+ /** @var TranslatablePageMover */
+ private $pageMover;
- /**
- * @param Title $source
- * @param Title $target
- * @param array $moves should include base-source and base-target
- * @param string $summary
- * @param User $performer
- * @return TranslatablePageMoveJob
- */
public static function newJob(
- Title $source, Title $target, array $moves, $summary, User $performer
- ) {
+ Title $source,
+ Title $target,
+ array $moves,
+ string $summary,
+ User $performer
+ ): self {
$params = [
'source' => $source->getPrefixedText(),
'target' => $target->getPrefixedText(),
@@ -37,134 +32,28 @@ class TranslatablePageMoveJob extends Job {
];
$self = new self( $target, $params );
- $self->lock( array_keys( $moves ) );
- $self->lock( array_values( $moves ) );
return $self;
}
- public function __construct( $title, $params = [] ) {
+ public function __construct( Title $title, array $params = [] ) {
parent::__construct( __CLASS__, $title, $params );
+ $this->pageMover = Services::getInstance()->getTranslatablePageMover();
}
public function run() {
$sourceTitle = Title::newFromText( $this->params['source'] );
$targetTitle = Title::newFromText( $this->params['target'] );
- $sourcePage = TranslatablePage::newFromTitle( $sourceTitle );
- $targetPage = TranslatablePage::newFromTitle( $targetTitle );
-
- $this->doMoves();
+ $performer = User::newFromName( $this->params['performer'] );
- $this->moveMetadata(
- $sourcePage->getMessageGroupId(),
- $targetPage->getMessageGroupId()
+ $this->pageMover->moveSynchronously(
+ $sourceTitle,
+ $targetTitle,
+ $this->params['moves'],
+ $performer,
+ $this->params['summary']
);
- $entry = new ManualLogEntry( 'pagetranslation', 'moveok' );
- $entry->setPerformer( User::newFromName( $this->params['performer'] ) );
- $entry->setParameters( [ 'target' => $this->params['target'] ] );
- $entry->setTarget( $sourceTitle );
- $logid = $entry->insert();
- $entry->publish( $logid );
-
- // Re-render the pages to get everything in sync
- MessageGroups::singleton()->recache();
- // Update message index now so that, when after this job the MoveTranslationUnits hook
- // runs in deferred updates, it will not run MessageIndexRebuildJob (T175834).
- MessageIndex::singleton()->rebuild();
-
- $job = TranslationsUpdateJob::newFromPage( $targetPage );
- JobQueueGroup::singleton()->push( $job );
-
return true;
}
-
- protected function doMoves() {
- $fuzzybot = FuzzyBot::getUser();
- $performer = User::newFromName( $this->params['performer'] );
-
- PageTranslationHooks::$allowTargetEdit = true;
-
- foreach ( $this->params['moves'] as $source => $target ) {
- $sourceTitle = Title::newFromText( $source );
- $targetTitle = Title::newFromText( $target );
-
- if ( $source === $this->params['source'] ) {
- $user = $performer;
- } else {
- $user = $fuzzybot;
- }
-
- $mover = new MovePage( $sourceTitle, $targetTitle );
- $status = $mover->move( $user, $this->params['summary'], false );
- if ( !$status->isOK() ) {
- $entry = new ManualLogEntry( 'pagetranslation', 'movenok' );
- $entry->setPerformer( $performer );
- $entry->setTarget( $sourceTitle );
- $entry->setParameters( [
- 'target' => $target,
- 'error' => $status->getErrorsArray(),
- ] );
- $logid = $entry->insert();
- $entry->publish( $logid );
- }
-
- $this->unlock( [ $source, $target ] );
- }
-
- PageTranslationHooks::$allowTargetEdit = false;
- }
-
- protected function moveMetadata( $oldGroupId, $newGroupId ) {
- $types = [ 'prioritylangs', 'priorityforce', 'priorityreason' ];
-
- TranslateMetadata::preloadGroups( [ $oldGroupId, $newGroupId ] );
- foreach ( $types as $type ) {
- $value = TranslateMetadata::get( $oldGroupId, $type );
- if ( $value !== false ) {
- TranslateMetadata::set( $oldGroupId, $type, false );
- TranslateMetadata::set( $newGroupId, $type, $value );
- }
- }
-
- // Make the changes in aggregate groups metadata, if present in any of them.
- $aggregateGroups = MessageGroups::getGroupsByType( AggregateMessageGroup::class );
- TranslateMetadata::preloadGroups( array_keys( $aggregateGroups ) );
-
- foreach ( $aggregateGroups as $id => $group ) {
- $subgroups = TranslateMetadata::get( $id, 'subgroups' );
- if ( $subgroups === false ) {
- continue;
- }
-
- $subgroups = explode( ',', $subgroups );
- $subgroups = array_flip( $subgroups );
- if ( isset( $subgroups[$oldGroupId] ) ) {
- $subgroups[$newGroupId] = $subgroups[$oldGroupId];
- unset( $subgroups[$oldGroupId] );
- $subgroups = array_flip( $subgroups );
- TranslateMetadata::set(
- $group->getId(),
- 'subgroups',
- implode( ',', $subgroups )
- );
- }
- }
- }
-
- private function lock( array $titles ) {
- $cache = wfGetCache( CACHE_ANYTHING );
- $data = [];
- foreach ( $titles as $title ) {
- $data[wfMemcKey( 'pt-lock', sha1( $title ) )] = 'locked';
- }
- $cache->setMulti( $data );
- }
-
- private function unlock( array $titles ) {
- $cache = wfGetCache( CACHE_ANYTHING );
- foreach ( $titles as $title ) {
- $cache->delete( wfMemcKey( 'pt-lock', sha1( $title ) ) );
- }
- }
}
diff --git a/MLEB/Translate/tag/TranslateDeleteJob.php b/MLEB/Translate/tag/TranslateDeleteJob.php
index a25e38d4..37f29a7a 100644
--- a/MLEB/Translate/tag/TranslateDeleteJob.php
+++ b/MLEB/Translate/tag/TranslateDeleteJob.php
@@ -8,7 +8,7 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
/**
* Contains class with job for deleting translatable and translation pages.
@@ -60,9 +60,11 @@ class TranslateDeleteJob extends Job {
$error = '';
$wikipage = new WikiPage( $title );
- if ( version_compare( MW_VERSION, '1.35', '<' ) ) {
+ if ( version_compare( TranslateUtils::getMWVersion(), '1.35', '<' ) ) {
$status = $wikipage->doDeleteArticleReal(
"{$summary}: $reason",
+ // https://phabricator.wikimedia.org/T262800
+ // @phan-suppress-next-line PhanTypeMismatchArgumentReal
false,
0,
true,
@@ -104,11 +106,12 @@ class TranslateDeleteJob extends Job {
PageTranslationHooks::$allowTargetEdit = false;
- $cache = wfGetCache( CACHE_DB );
- $pages = (array)$cache->get( wfMemcKey( 'pt-base', $base ) );
+ $cache = ObjectCache::getInstance( CACHE_DB );
+ $pageKey = $cache->makeKey( 'pt-base', $base );
+ $pages = (array)$cache->get( $pageKey );
$lastitem = array_pop( $pages );
if ( $title->getPrefixedText() === $lastitem ) {
- $cache->delete( wfMemcKey( 'pt-base', $base ) );
+ $cache->delete( $pageKey );
$type = $this->getFull() ? 'deletefok' : 'deletelok';
$entry = new ManualLogEntry( 'pagetranslation', $type );
@@ -154,9 +157,7 @@ class TranslateDeleteJob extends Job {
return $this->params['full'];
}
- /**
- * @param User|string $performer
- */
+ /** @param User|string $performer */
public function setPerformer( $performer ) {
if ( is_object( $performer ) ) {
$this->params['performer'] = $performer->getName();
@@ -169,9 +170,7 @@ class TranslateDeleteJob extends Job {
return $this->params['performer'];
}
- /**
- * @param User|string $user
- */
+ /** @param User|string $user */
public function setUser( $user ) {
if ( is_object( $user ) ) {
$this->params['user'] = $user->getName();
diff --git a/MLEB/Translate/tag/TranslateRenderJob.php b/MLEB/Translate/tag/TranslateRenderJob.php
index 27fe1366..a0d37962 100644
--- a/MLEB/Translate/tag/TranslateRenderJob.php
+++ b/MLEB/Translate/tag/TranslateRenderJob.php
@@ -7,8 +7,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\Authority;
+use MediaWiki\User\UserIdentity;
/**
* Job for updating translation pages when translation or template changes.
@@ -40,28 +43,23 @@ class TranslateRenderJob extends GenericTranslateJob {
}
public function run() {
- global $wgTranslateKeepOutdatedTranslations;
-
$this->logInfo( 'Starting TranslateRenderJob' );
+ // We may be doing double wait here if this job was spawned by TranslationUpdateJob
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ if ( !$lb->waitForReplication() ) {
+ $this->logWarning( 'Continuing despite replication lag' );
+ }
+
// Initialization
$title = $this->title;
- [ , $code ] = TranslateUtils::figureMessage( $title->getPrefixedText() );
-
- // Return the actual translation page...
- $page = TranslatablePage::isTranslationPage( $title );
- if ( !$page ) {
+ $tpPage = TranslatablePage::getTranslationPageFromTitle( $title );
+ if ( !$tpPage ) {
$this->logError( 'Cannot render translation page!' );
return false;
}
- $group = $page->getMessageGroup();
- $collection = $group->initCollection( $code );
-
- $text = $page->getParse()->getTranslationPageText(
- $collection,
- $wgTranslateKeepOutdatedTranslations
- );
+ $text = $tpPage->generateSource();
// Other stuff
$user = $this->getUser();
@@ -69,10 +67,11 @@ class TranslateRenderJob extends GenericTranslateJob {
$flags = $this->getFlags();
$page = WikiPage::factory( $title );
+ $model = $page->getTitle()->getContentModel();
// @todo FuzzyBot hack
PageTranslationHooks::$allowTargetEdit = true;
- $content = ContentHandler::makeContent( $text, $page->getTitle() );
+ $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
$editStatus = $page->doEditContent( $content, $summary, $flags, false, $user );
if ( !$editStatus->isOK() ) {
$this->logError(
@@ -91,27 +90,29 @@ class TranslateRenderJob extends GenericTranslateJob {
return true;
}
+ /** @param int $flags */
public function setFlags( $flags ) {
$this->params['flags'] = $flags;
}
- public function getFlags() {
+ /** @return int */
+ private function getFlags() {
return $this->params['flags'];
}
+ /** @param string $summary */
public function setSummary( $summary ) {
$this->params['summary'] = $summary;
}
- public function getSummary() {
+ /** @return string */
+ private function getSummary() {
return $this->params['summary'];
}
- /**
- * @param User|string $user
- */
+ /** @param UserIdentity|string $user */
public function setUser( $user ) {
- if ( $user instanceof User ) {
+ if ( $user instanceof UserIdentity ) {
$this->params['user'] = $user->getName();
} else {
$this->params['user'] = $user;
@@ -121,9 +122,9 @@ class TranslateRenderJob extends GenericTranslateJob {
/**
* Get a user object for doing edits.
*
- * @return User
+ * @return Authority
*/
- public function getUser() {
+ private function getUser() {
return User::newFromName( $this->params['user'], false );
}
}
diff --git a/MLEB/Translate/tag/TranslationsUpdateJob.php b/MLEB/Translate/tag/TranslationsUpdateJob.php
index 0384b4ed..5d2574ed 100644
--- a/MLEB/Translate/tag/TranslationsUpdateJob.php
+++ b/MLEB/Translate/tag/TranslationsUpdateJob.php
@@ -1,5 +1,8 @@
<?php
-use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
+
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\PageTranslation\TranslationUnit;
+use MediaWiki\MediaWikiServices;
/**
* Job for updating translation units and translation pages when
@@ -12,9 +15,7 @@ use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
* @since 2016.03
*/
class TranslationsUpdateJob extends GenericTranslateJob {
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function __construct( Title $title, $params = [] ) {
parent::__construct( __CLASS__, $title, $params );
}
@@ -26,7 +27,7 @@ class TranslationsUpdateJob extends GenericTranslateJob {
* unit pages.
*
* @param TranslatablePage $page
- * @param TPSection[] $sections
+ * @param TranslationUnit[] $sections
* @return TranslationsUpdateJob
* @since 2018.07
*/
@@ -45,20 +46,21 @@ class TranslationsUpdateJob extends GenericTranslateJob {
// For performance reasons, message index rebuild is run a separate job after
// everything else is updated.
+ // START: This section does not care about replication lag
$this->logInfo( 'Starting TranslationsUpdateJob' );
- $page = TranslatablePage::newFromTitle( $this->title );
$sections = $this->params[ 'sections' ];
foreach ( $sections as $index => $section ) {
// Old jobs stored sections as objects because they were serialized and
// unserialized transparently. That is no longer supported, so we
// convert manually to primitive types first (to an PHP array).
if ( is_array( $section ) ) {
- $sections[ $index ] = TPSection::unserializeFromArray( $section );
+ $sections[ $index ] = TranslationUnit::unserializeFromArray( $section );
}
}
// Units should be updated before the render jobs are run
+ $page = TranslatablePage::newFromTitle( $this->title );
$unitJobs = self::getTranslationUnitJobs( $page, $sections );
foreach ( $unitJobs as $job ) {
$job->run();
@@ -68,6 +70,12 @@ class TranslationsUpdateJob extends GenericTranslateJob {
'Finished running ' . count( $unitJobs ) . ' MessageUpdate jobs for '
. count( $sections ) . ' sections'
);
+ // END: This section does not care about replication lag
+
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ if ( !$lb->waitForReplication() ) {
+ $this->logWarning( 'Continuing despite replication lag' );
+ }
// Ensure we are using the latest group definitions. This is needed so
// that in long running scripts we do see the page which was just
@@ -82,7 +90,10 @@ class TranslationsUpdateJob extends GenericTranslateJob {
// Refresh translations statistics, we want these to be up to date for the
// RenderJobs, for displaying up to date statistics on the translation pages.
$id = $page->getMessageGroupId();
- MessageGroupStats::forGroup( $id, MessageGroupStats::FLAG_NO_CACHE );
+ MessageGroupStats::forGroup(
+ $id,
+ MessageGroupStats::FLAG_NO_CACHE | MessageGroupStats::FLAG_IMMEDIATE_WRITES
+ );
$this->logInfo( 'Updated the message group stats' );
// Try to avoid stale statistics on the base page
@@ -109,12 +120,13 @@ class TranslationsUpdateJob extends GenericTranslateJob {
/**
* Creates jobs needed to create or update all translation page definitions.
+ *
* @param TranslatablePage $page
- * @param TPSection[] $sections
- * @return Job[]
+ * @param TranslationUnit[] $sections
+ * @return RunnableJob[]
* @since 2013-01-28
*/
- public static function getTranslationUnitJobs( TranslatablePage $page, array $sections ) {
+ private static function getTranslationUnitJobs( TranslatablePage $page, array $sections ): array {
$jobs = [];
$code = $page->getSourceLanguageCode();
@@ -134,10 +146,10 @@ class TranslationsUpdateJob extends GenericTranslateJob {
/**
* Creates jobs needed to create or update all translation pages.
* @param TranslatablePage $page
- * @return Job[]
+ * @return RunnableJob[]
* @since 2013-01-28
*/
- public static function getRenderJobs( TranslatablePage $page ) {
+ public static function getRenderJobs( TranslatablePage $page ): array {
$jobs = [];
$jobTitles = $page->getTranslationPages();
diff --git a/MLEB/Translate/tests/generateRandomSandboxData.php b/MLEB/Translate/tests/generateRandomSandboxData.php
index 78e2d1b5..82335342 100644
--- a/MLEB/Translate/tests/generateRandomSandboxData.php
+++ b/MLEB/Translate/tests/generateRandomSandboxData.php
@@ -7,6 +7,9 @@
* @file
*/
+use MediaWiki\Extension\Translate\TranslatorSandbox\StashedTranslation;
+use MediaWiki\Extension\Translate\TranslatorSandbox\TranslationStashStorage;
+
// Standard boilerplate to define $IP
if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
$IP = getenv( 'MW_INSTALL_PATH' );
diff --git a/MLEB/Translate/tests/phpunit/Cache/PersistentDatabaseCacheTest.php b/MLEB/Translate/tests/phpunit/Cache/PersistentDatabaseCacheTest.php
new file mode 100644
index 00000000..db2bfce3
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/Cache/PersistentDatabaseCacheTest.php
@@ -0,0 +1,339 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Cache;
+
+use DateInterval;
+use DateTime;
+use InvalidArgumentException;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonCodec;
+use MediaWiki\MediaWikiServices;
+use MediaWikiIntegrationTestCase;
+
+/**
+ * @covers \MediaWiki\Extension\Translate\Cache\PersistentDatabaseCache
+ * @covers \MediaWiki\Extension\Translate\Cache\PersistentCacheEntry
+ */
+class PersistentDatabaseCacheTest extends MediaWikiIntegrationTestCase {
+ /** @var PersistentDatabaseCache */
+ private $persistentCache;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $jsonCodec = new JsonCodec();
+ $this->persistentCache = new PersistentDatabaseCache( $lb, $jsonCodec );
+ }
+
+ protected function tearDown(): void {
+ $this->persistentCache->clear();
+ parent::tearDown();
+ }
+
+ /** @dataProvider provideTestSet */
+ public function testGetSet(
+ string $keyname,
+ $value,
+ ?int $exptime,
+ ?string $tag
+ ) {
+ $entry = new PersistentCacheEntry(
+ $keyname,
+ $value,
+ $exptime,
+ $tag
+ );
+
+ $this->persistentCache->set( $entry );
+
+ $getEntries = $this->persistentCache->get( $keyname );
+ $this->assertCacheEntryEqual( $entry, $getEntries[0] );
+ }
+
+ /** @dataProvider provideTestSetMulti */
+ public function testGetSetMulti( array $inputs, int $exptime = null, string $tag = null ) {
+ $entries = $this->getEntriesFromInput( $inputs, $exptime, $tag );
+ $this->persistentCache->set( ...$entries );
+
+ $getEntries = $this->persistentCache->get( ...array_keys( $inputs ) );
+
+ foreach ( $entries as $index => $entry ) {
+ $this->assertCacheEntryEqual(
+ $entry,
+ $getEntries[$index]
+ );
+ }
+ }
+
+ public function testHas() {
+ $entry = new PersistentCacheEntry( 'hello', null, null, null );
+ $this->persistentCache->set( $entry );
+ $this->assertTrue( $this->persistentCache->has( 'hello' ) );
+ $this->assertFalse( $this->persistentCache->has( 'hello2' ) );
+ }
+
+ /** @dataProvider provideTestHasEntryWithTag */
+ public function testHasEntryWithTag(
+ array $input,
+ string $tagToSearch,
+ bool $expected,
+ string $message
+ ) {
+ $entry = new PersistentCacheEntry(
+ $input['keyname'],
+ $input['value'],
+ $input['exptime'],
+ $input['tag']
+ );
+ $this->persistentCache->set( $entry );
+
+ $hasTag = $this->persistentCache->hasEntryWithTag( $tagToSearch );
+ $this->assertSame( $expected, $hasTag, $message );
+ }
+
+ /** @dataProvider provideTestHasExpired */
+ public function testHasExpiredEntry( array $input, bool $expected ) {
+ $entry = new PersistentCacheEntry(
+ $input['keyname'],
+ $input['value'],
+ $input['exptime'],
+ $input['tag']
+ );
+
+ $this->persistentCache->set( $entry );
+
+ $getEntry = $this->persistentCache->get( $input['keyname'] )[0];
+
+ $this->assertSame( $expected, $entry->hasExpired() );
+ $this->assertSame( $expected, $getEntry->hasExpired() );
+ }
+
+ /** @dataProvider provideTestGetByTag */
+ public function testGetByTag(
+ array $inputs, ?int $exptime, ?string $inputTag, string $searchTag, int $count
+ ) {
+ $entries = $this->getEntriesFromInput( $inputs, $exptime, $inputTag );
+
+ $this->persistentCache->set( ...$entries );
+ $entries = $this->persistentCache->getByTag( $searchTag );
+
+ $this->assertCount( $count, $entries );
+ }
+
+ public function testDelete() {
+ $testTag = 'test';
+ $entry = new PersistentCacheEntry( 'hello', null, null, $testTag );
+ $secondEntry = new PersistentCacheEntry( 'hello2', null, null, $testTag );
+
+ $this->persistentCache->set( $entry );
+ $this->persistentCache->set( $secondEntry );
+
+ $getEntries = $this->persistentCache->getByTag( $testTag );
+
+ $this->assertCount( 2, $getEntries );
+
+ $this->persistentCache->delete( 'hello', 'hello2' );
+
+ $getEntries = $this->persistentCache->getByTag( $testTag );
+ $this->assertEmpty( $getEntries );
+ }
+
+ public function testDeleteEntriesWithTag() {
+ $testTag = 'test';
+ $anotherTestTag = 'test2';
+ $entry = new PersistentCacheEntry( 'hello', null, null, $testTag );
+ $secondEntry = new PersistentCacheEntry( 'hello2', null, null, $testTag );
+ $thirdEntry = new PersistentCacheEntry( 'hello2', null, null, $anotherTestTag );
+
+ $this->persistentCache->set( $entry );
+ $this->persistentCache->set( $secondEntry );
+ $this->persistentCache->set( $thirdEntry );
+
+ $this->persistentCache->deleteEntriesWithTag( $testTag );
+
+ $testTagEntries = $this->persistentCache->getByTag( $testTag );
+ $this->assertEmpty( $testTagEntries );
+
+ $anotherTagEntries = $this->persistentCache->getByTag( $anotherTestTag );
+ $this->assertNotEmpty( $anotherTagEntries );
+ }
+
+ public function testKeyLength() {
+ $longTestKey = str_repeat( 'verylongkey', 30 );
+
+ $this->expectException( InvalidArgumentException::class );
+ $this->expectExceptionMessageMatches( '/the length of key/i' );
+
+ new PersistentCacheEntry( $longTestKey, null, null );
+ }
+
+ public function testTagLength() {
+ $longTestTag = str_repeat( 'verylongtag', 30 );
+
+ $this->expectException( InvalidArgumentException::class );
+ $this->expectExceptionMessageMatches( '/the length of tag/i' );
+
+ new PersistentCacheEntry( 'testkey', null, null, $longTestTag );
+ }
+
+ public function provideTestSet() {
+ yield [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => ( new DateTime() )->getTimestamp(),
+ 'tag' => null
+ ];
+
+ yield [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => null,
+ 'tag' => 'test'
+ ];
+
+ yield [
+ 'keyname' => 'key',
+ 'value' => null,
+ 'exptime' => null,
+ 'tag' => null
+ ];
+ }
+
+ public function provideTestSetMulti() {
+ yield [
+ 'inputs' => [
+ 'key' => 'value',
+ 'key2' => 'value2'
+ ],
+ 'exptime' => null,
+ 'tag' => null
+ ];
+
+ yield [
+ 'inputs' => [
+ 'key5' => 'value5',
+ 'key6' => null
+ ],
+ 'exptime' => ( new DateTime() )->getTimestamp(),
+ 'tag' => 'test'
+ ];
+ }
+
+ public function provideTestHasEntryWithTag() {
+ $testTag = 'test';
+ $today = new DateTime();
+ $tomorrow = ( new DateTime() )->add( new DateInterval( 'P1D' ) );
+ $yesterday = ( new DateTime() )->sub( new DateInterval( 'P1D' ) );
+
+ yield [
+ 'input' => [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => $today->getTimestamp(),
+ 'tag' => null
+ ],
+ 'expectedTag' => $testTag,
+ 'hasEntryWithTag' => false,
+ 'testMessage' => 'return false if no tag is present'
+ ];
+
+ yield [
+ 'input' => [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => $tomorrow->getTimestamp(),
+ 'tag' => $testTag
+ ],
+ 'expectedTag' => $testTag,
+ 'hasEntryWithTag' => true,
+ 'testMessage' => 'return true if tag is present'
+ ];
+
+ yield [
+ 'input' => [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => $yesterday->getTimestamp(),
+ 'tag' => $testTag
+ ],
+ 'expectedTag' => $testTag,
+ 'hasEntryWithTag' => true,
+ 'testMessage' => 'return true for entries that have expired'
+ ];
+ }
+
+ public function provideTestHasExpired() {
+ $tomorrow = ( new DateTime() )->add( new DateInterval( 'P1D' ) );
+ $yesterday = ( new DateTime() )->sub( new DateInterval( 'P1D' ) );
+
+ yield [
+ 'input' => [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => $tomorrow->getTimestamp(),
+ 'tag' => null
+ ],
+ 'hasEntryExpired' => false,
+ ];
+
+ yield [
+ 'input' => [
+ 'keyname' => 'hello',
+ 'value' => 'World',
+ 'exptime' => $yesterday->getTimestamp(),
+ 'tag' => null
+ ],
+ 'hasEntryExpired' => true,
+ ];
+ }
+
+ public function provideTestGetByTag() {
+ $testTag = 'test';
+ yield [
+ 'inputs' => [
+ 'key' => 'value',
+ 'key2' => 'value2'
+ ],
+ 'exptime' => null,
+ 'tag' => $testTag,
+ 'test2',
+ 'expectedEntryCount' => 0
+ ];
+
+ yield [
+ 'input' => [
+ 'key5' => 'value5',
+ 'key6' => null
+ ],
+ 'exptime' => ( new DateTime() )->getTimestamp(),
+ 'tag' => $testTag,
+ 'expectedTag' => $testTag,
+ 'expectedEntryCount' => 2
+ ];
+ }
+
+ private function assertCacheEntryEqual(
+ PersistentCacheEntry $expected,
+ PersistentCacheEntry $actual
+ ): void {
+ $this->assertSame( $expected->key(), $actual->key() );
+ $this->assertEquals( $expected->value(), $actual->value() );
+ $this->assertSame( $expected->exptime(), $actual->exptime() );
+ $this->assertSame( $expected->tag(), $actual->tag() );
+ }
+
+ /** @return PersistentCacheEntry[] */
+ private function getEntriesFromInput( array $inputs, ?int $exptime, ?string $tag ): array {
+ $entries = [];
+ foreach ( $inputs as $key => $value ) {
+ $entries[] = new PersistentCacheEntry(
+ $key,
+ $value,
+ $exptime,
+ $tag
+ );
+ }
+
+ return $entries;
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/ElasticSearchTTMServerTest.php b/MLEB/Translate/tests/phpunit/ElasticSearchTTMServerTest.php
new file mode 100644
index 00000000..6fcf9e2a
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/ElasticSearchTTMServerTest.php
@@ -0,0 +1,37 @@
+<?php
+declare( strict_types = 1 );
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \ElasticSearchTTMServer
+ */
+class ElasticSearchTTMServerTest extends MediaWikiIntegrationTestCase {
+ public function setUp(): void {
+ parent::setUp();
+
+ $this->config = [
+ 'primary' => [
+ 'class' => ElasticSearchTTMServer::class,
+ 'mirrors' => [ 'secondary' ],
+ ],
+ 'secondary' => [
+ 'class' => ElasticSearchTTMServer::class,
+ 'mirrors' => [ 'primary', 'unknown' ],
+ ],
+ ];
+
+ $this->setMwGlobals( [
+ 'wgTranslateTranslationServices' => $this->config,
+ 'wgTranslateTranslationDefaultService' => 'primary',
+ ] );
+ }
+
+ public function testMirrorsConfig() {
+ $primary = TTMServer::factory( $this->config['primary'] );
+ $this->assertEquals( [ 'secondary' ], $primary->getMirrors() );
+ $secondary = TTMServer::factory( $this->config['secondary'] );
+ $this->expectException( TTMServerException::class );
+ $secondary->getMirrors();
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/BlackListTest.php b/MLEB/Translate/tests/phpunit/ExclusionInclusionListTest.php
index 833b8f8e..8d3c700c 100644
--- a/MLEB/Translate/tests/phpunit/BlackListTest.php
+++ b/MLEB/Translate/tests/phpunit/ExclusionInclusionListTest.php
@@ -6,14 +6,9 @@
* @license GPL-2.0-or-later
*/
-/**
- * Unit tests for blacklisting/whitelisting languages for a message group
- */
-class BlackListTest extends MediaWikiTestCase {
+class ExclusionInclusionListTest extends MediaWikiTestCase {
- /**
- * @var MessageGroup
- */
+ /** @var MessageGroup */
protected $group;
protected $codes;
protected $groupConfiguration = [
@@ -29,13 +24,13 @@ class BlackListTest extends MediaWikiTestCase {
],
];
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->group = MessageGroupBase::factory( $this->groupConfiguration );
$this->codes = array_flip( array_keys( TranslateUtils::getLanguageNames( 'en' ) ) );
}
- protected function tearDown() : void {
+ protected function tearDown(): void {
unset( $this->group );
parent::tearDown();
}
@@ -45,7 +40,7 @@ class BlackListTest extends MediaWikiTestCase {
$this->assertNull( $translatableLanguages );
}
- public function testAllBlackList() {
+ public function testAllExclusionList() {
$conf = $this->groupConfiguration;
$conf['LANGUAGES'] = [
'blacklist' => '*',
@@ -55,7 +50,7 @@ class BlackListTest extends MediaWikiTestCase {
$this->assertEquals( count( $translatableLanguages ), 0 );
}
- public function testAllWhiteList() {
+ public function testAllInclusionList() {
$conf = $this->groupConfiguration;
$conf['LANGUAGES'] = [
'whitelist' => '*',
@@ -65,7 +60,7 @@ class BlackListTest extends MediaWikiTestCase {
$this->assertNull( $translatableLanguages );
}
- public function testWhiteListOverrideBlackList() {
+ public function testInclusionListOverridesExclusionList() {
$conf = $this->groupConfiguration;
$conf['LANGUAGES'] = [
'whitelist' => [ 'en', 'hi', 'ta' ],
@@ -77,7 +72,7 @@ class BlackListTest extends MediaWikiTestCase {
$this->assertTrue( isset( $translatableLanguages['hi'] ) );
}
- public function testSomeBlackList() {
+ public function testSomeExclusionList() {
$conf = $this->groupConfiguration;
$conf['LANGUAGES'] = [
'blacklist' => [ 'or', 'hi' ],
diff --git a/MLEB/Translate/tests/phpunit/FakeTTMServerTest.php b/MLEB/Translate/tests/phpunit/FakeTTMServerTest.php
new file mode 100644
index 00000000..811fb6ad
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/FakeTTMServerTest.php
@@ -0,0 +1,26 @@
+<?php
+declare( strict_types = 1 );
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \FakeTTMServer
+ */
+class FakeTTMServerTest extends MediaWikiIntegrationTestCase {
+ public function testFakeTTMServer() {
+ $server = new FakeTTMServer();
+ $this->assertEquals(
+ [],
+ $server->query( 'en', 'fi', 'daa' ),
+ 'FakeTTMServer returns no suggestions for all queries'
+ );
+
+ $title = $this->createMock( Title::class );
+ $handle = new MessageHandle( $title );
+
+ $this->assertNull(
+ $server->update( $handle, 'text' ),
+ 'FakeTTMServer update is no-op and always succeeds'
+ );
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/HookDocTest.php b/MLEB/Translate/tests/phpunit/HookDocTest.php
index 94ee8af4..a23a75e9 100644
--- a/MLEB/Translate/tests/phpunit/HookDocTest.php
+++ b/MLEB/Translate/tests/phpunit/HookDocTest.php
@@ -29,7 +29,7 @@ class HookDocTest extends MediaWikiIntegrationTestCase {
],
];
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$contents = file_get_contents( __DIR__ . '/../../hooks.txt' );
$blocks = preg_split( '/\n\n/', $contents );
diff --git a/MLEB/Translate/tests/phpunit/Makefile b/MLEB/Translate/tests/phpunit/Makefile
index 10dc5a05..1df7c943 100644
--- a/MLEB/Translate/tests/phpunit/Makefile
+++ b/MLEB/Translate/tests/phpunit/Makefile
@@ -2,7 +2,7 @@ ifndef MW_INSTALL_PATH
MW_INSTALL_PATH=../../../..
endif
-DIRS = api ffs insertables messagegroups pagetranslation tag translationaids unit utils MessageValidator
+DIRS = api ffs messagegroups PageTranslation tag translationaids unit utils Validation
default:
php ${MW_INSTALL_PATH}/tests/phpunit/phpunit.php .
diff --git a/MLEB/Translate/tests/phpunit/MessageCollectionTest.php b/MLEB/Translate/tests/phpunit/MessageCollectionTest.php
index 0e8bdec4..9c201241 100644
--- a/MLEB/Translate/tests/phpunit/MessageCollectionTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageCollectionTest.php
@@ -11,7 +11,7 @@
* @covers MessageCollection
*/
class MessageCollectionTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -84,9 +84,7 @@ class MessageCollectionTest extends MediaWikiIntegrationTestCase {
$this->assertNull( $untranslated->getProperty( 'revision' ) );
}
- /**
- * @covers MessageCollection::filterChanged
- */
+ /** @covers MessageCollection::filterChanged */
public function testFilterChanged() {
$this->assertTrue(
$this->editPage( 'MediaWiki:Changedtranslated_1/fi', 'pupuliini_1' )->isGood()
diff --git a/MLEB/Translate/tests/phpunit/MessageGroupBaseTest.php b/MLEB/Translate/tests/phpunit/MessageGroupBaseTest.php
index 7353d911..9f47c22d 100644
--- a/MLEB/Translate/tests/phpunit/MessageGroupBaseTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageGroupBaseTest.php
@@ -1,8 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\Validation\MessageValidator as MessageValidatorInterface;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\Insertable;
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertablesSuggester;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
/**
* @license GPL-2.0-or-later
@@ -11,7 +14,6 @@ use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
/** @var MessageGroup */
protected $group;
-
protected $groupConfiguration = [
'BASIC' => [
'class' => FileBasedMessageGroup::class,
@@ -22,12 +24,12 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
],
];
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->group = MessageGroupBase::factory( $this->groupConfiguration );
}
- protected function tearDown() : void {
+ protected function tearDown(): void {
unset( $this->group );
parent::tearDown();
}
@@ -88,65 +90,6 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
);
}
- public function testInsertablesSuggesterClass() {
- $conf = $this->groupConfiguration;
- $conf['INSERTABLES']['class'] = FakeInsertablesSuggester::class;
- $this->group = MessageGroupBase::factory( $conf );
-
- $this->assertArrayEquals(
- [ new Insertable( 'Fake', 'Insertables', 'Suggester' ) ],
- $this->group->getInsertablesSuggester()->getInsertables( '' )
- );
- }
-
- public function testInsertablesSuggesterClasses() {
- $conf = $this->groupConfiguration;
- $conf['INSERTABLES']['classes'] = [
- 'FakeInsertablesSuggester',
- 'AnotherFakeInsertablesSuggester',
- ];
- $this->group = MessageGroupBase::factory( $conf );
-
- $this->assertArrayEquals(
- [
- new Insertable( 'Fake', 'Insertables', 'Suggester' ),
- new Insertable( 'AnotherFake', 'Insertables', 'Suggester' ),
- ],
- $this->group->getInsertablesSuggester()->getInsertables( '' )
- );
- }
-
- public function testInsertablesSuggesterClassAndClasses() {
- $conf = $this->groupConfiguration;
- $conf['INSERTABLES']['class'] = FakeInsertablesSuggester::class;
- $conf['INSERTABLES']['classes'] = [ AnotherFakeInsertablesSuggester::class ];
- $this->group = MessageGroupBase::factory( $conf );
-
- $this->assertArrayEquals(
- [
- new Insertable( 'Fake', 'Insertables', 'Suggester' ),
- new Insertable( 'AnotherFake', 'Insertables', 'Suggester' ),
- ],
- $this->group->getInsertablesSuggester()->getInsertables( '' )
- );
-
- $conf['INSERTABLES']['classes'][] = 'FakeInsertablesSuggester';
- $conf['INSERTABLES']['classes'][] = 'AnotherFakeInsertablesSuggester';
- $this->group = MessageGroupBase::factory( $conf );
-
- $this->assertArrayEquals(
- [
- new Insertable( 'Fake', 'Insertables', 'Suggester' ),
- new Insertable( 'AnotherFake', 'Insertables', 'Suggester' ),
- ],
- $this->group->getInsertablesSuggester()->getInsertables( '' ),
- false,
- false,
- "should correctly get InsertablesSuggesters using " .
- "both 'class' and 'classes' options and removing duplicates."
- );
- }
-
public function testGetNamespaceInvalid() {
$conf = $this->groupConfiguration;
$conf['BASIC']['namespace'] = 'ergweofijwef';
@@ -185,8 +128,9 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
public function testInsertableValidatorConfiguration() {
$conf = $this->groupConfiguration;
- unset( $conf['INSERTABLES']['class'] );
- $conf['INSERTABLES']['classes'] = [ AnotherFakeInsertablesSuggester::class ];
+ $conf['INSERTABLES'] = [
+ [ 'class' => AnotherFakeInsertablesSuggester::class ]
+ ];
$conf['VALIDATORS'] = [];
$conf['VALIDATORS'][] = [
'class' => FakeInsertableValidator::class,
@@ -204,8 +148,8 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
$messageValidators = $this->group->getValidator();
$insertables = $this->group->getInsertablesSuggester()->getInsertables( '' );
- $this->assertInstanceOf( MessageValidator::class, $messageValidators,
- "should correctly fetch a 'MessageValidator' using the 'VALIDATOR' configuration."
+ $this->assertInstanceOf( ValidationRunner::class, $messageValidators,
+ "should correctly fetch a 'ValidationRunner' using the 'VALIDATOR' configuration."
);
// Returns insertables from,
@@ -225,8 +169,6 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
public function testInsertableArrayConfiguration() {
$conf = $this->groupConfiguration;
- unset( $conf['INSERTABLES']['class'] );
- unset( $conf['INSERTABLES']['classes'] );
$conf['INSERTABLES'] = [
[
@@ -257,33 +199,33 @@ class MessageGroupBaseTest extends MediaWikiIntegrationTestCase {
}
class FakeInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [ new Insertable( 'Fake', 'Insertables', 'Suggester' ) ];
}
}
class AnotherFakeInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [ new Insertable( 'AnotherFake', 'Insertables', 'Suggester' ) ];
}
}
-class FakeInsertableValidator implements MessageValidatorInterface, InsertablesSuggester {
+class FakeInsertableValidator implements MessageValidator, InsertablesSuggester {
public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
return new ValidationIssues();
}
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [ new Insertable( 'Fake', 'Insertable', 'Validator' ) ];
}
}
-class AnotherFakeInsertableValidator implements MessageValidatorInterface, InsertablesSuggester {
+class AnotherFakeInsertableValidator implements MessageValidator, InsertablesSuggester {
public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
return new ValidationIssues();
}
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [ new Insertable( 'Another', 'Fake Insertable', 'Validator' ) ];
}
}
diff --git a/MLEB/Translate/tests/phpunit/MessageGroupStatesUpdaterJobTest.php b/MLEB/Translate/tests/phpunit/MessageGroupStatesUpdaterJobTest.php
index 560dfd86..ea90fc16 100644
--- a/MLEB/Translate/tests/phpunit/MessageGroupStatesUpdaterJobTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageGroupStatesUpdaterJobTest.php
@@ -5,7 +5,7 @@
* @group medium
*/
class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
'wgTranslateTranslationServices' => [],
@@ -34,9 +34,7 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
}
}
- /**
- * @dataProvider provideStatValues
- */
+ /** @dataProvider provideStatValues */
public function testGetStatValue( $type, $expected ) {
$stats = [
MessageGroupStats::TOTAL => 666,
@@ -57,9 +55,7 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
];
}
- /**
- * @dataProvider provideMatchCondition
- */
+ /** @dataProvider provideMatchCondition */
public function testMatchCondition( $expected, $value, $condition, $max ) {
$actual = MessageGroupStatesUpdaterJob::matchCondition( $value, $condition, $max );
$this->assertEquals( $expected, $actual );
@@ -121,13 +117,13 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
$status = $page->doEditContent( $content, __METHOD__, 0, false, $user );
- self::runJobs();
+ self::translateRunJobs();
$currentState = ApiGroupReview::getState( $group, 'fi' );
$this->assertEquals( 'inprogress', $currentState, 'in progress after first translation' );
// First review
ApiTranslationReview::doReview( $user, self::getRevisionRecord( $status ), __METHOD__ );
- self::runJobs();
+ self::translateRunJobs();
$currentState = ApiGroupReview::getState( $group, 'fi' );
$this->assertEquals( 'inprogress', $currentState, 'in progress while untranslated messages' );
@@ -138,13 +134,13 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
$status = $page->doEditContent( $content, __METHOD__, 0, false, $user );
- self::runJobs();
+ self::translateRunJobs();
$currentState = ApiGroupReview::getState( $group, 'fi' );
$this->assertEquals( 'proofreading', $currentState, 'proofreading after second translation' );
// Second review
ApiTranslationReview::doReview( $user, self::getRevisionRecord( $status ), __METHOD__ );
- self::runJobs();
+ self::translateRunJobs();
$currentState = ApiGroupReview::getState( $group, 'fi' );
$this->assertEquals( 'ready', $currentState, 'ready when all proofread' );
@@ -155,7 +151,7 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
$page->doEditContent( $content, __METHOD__, 0, false, $user );
- self::runJobs();
+ self::translateRunJobs();
$currentState = ApiGroupReview::getState( $group, 'fi' );
$this->assertEquals(
'proofreading',
@@ -170,7 +166,7 @@ class MessageGroupStatesUpdaterJobTest extends MediaWikiIntegrationTestCase {
return $value['revision-record'];
}
- protected static function runJobs() {
+ protected static function translateRunJobs() {
do {
$job = JobQueueGroup::singleton()->pop();
if ( !$job ) {
diff --git a/MLEB/Translate/tests/phpunit/MessageGroupsTest.php b/MLEB/Translate/tests/phpunit/MessageGroupsTest.php
index adc49e4a..0f5b9d1f 100644
--- a/MLEB/Translate/tests/phpunit/MessageGroupsTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageGroupsTest.php
@@ -10,7 +10,7 @@
* ^ See AggregateMessageGroup::getGroups -> MessageGroups::getPriority
*/
class MessageGroupsTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$conf = [
@@ -35,9 +35,7 @@ class MessageGroupsTest extends MediaWikiIntegrationTestCase {
MessageIndex::singleton()->rebuild();
}
- /**
- * @dataProvider provideGroups
- */
+ /** @dataProvider provideGroups */
public function testGetParentGroups( $expected, $target ) {
$group = MessageGroups::getGroup( $target );
$got = MessageGroups::getParentGroups( $group );
diff --git a/MLEB/Translate/tests/phpunit/MessageIndexRebuildJobTest.php b/MLEB/Translate/tests/phpunit/MessageIndexRebuildJobTest.php
index 59837677..95c1677d 100644
--- a/MLEB/Translate/tests/phpunit/MessageIndexRebuildJobTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageIndexRebuildJobTest.php
@@ -10,9 +10,7 @@
* @group medium
*/
class MessageIndexRebuildJobTest extends MediaWikiIntegrationTestCase {
- protected $config = [];
-
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
diff --git a/MLEB/Translate/tests/phpunit/MessageIndexTest.php b/MLEB/Translate/tests/phpunit/MessageIndexTest.php
index f29297b8..5b408ddd 100644
--- a/MLEB/Translate/tests/phpunit/MessageIndexTest.php
+++ b/MLEB/Translate/tests/phpunit/MessageIndexTest.php
@@ -14,7 +14,7 @@ use Wikimedia\TestingAccessWrapper;
* @group large
*/
class MessageIndexTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
'wgTranslateCacheDirectory' => $this->getNewTempDirectory(),
@@ -48,9 +48,7 @@ class MessageIndexTest extends MediaWikiIntegrationTestCase {
yield [ [ 'SerializedMessageIndex' ], SerializedMessageIndex::class ];
}
- /**
- * @dataProvider provideTranslateMessageIndexConfig
- */
+ /** @dataProvider provideTranslateMessageIndexConfig */
public function testSingleton( $configValue, $expectedClass ) {
$this->setMwGlobals( [
'wgTranslateMessageIndex' => $configValue,
@@ -63,9 +61,7 @@ class MessageIndexTest extends MediaWikiIntegrationTestCase {
$this->assertInstanceOf( $expectedClass, $object );
}
- /**
- * @dataProvider provideTestGetArrayDiff
- */
+ /** @dataProvider provideTestGetArrayDiff */
public function testGetArrayDiff( $expected, $old, $new ) {
$actual = MessageIndex::getArrayDiff( $old, $new );
$this->assertEquals( $expected['keys'], $actual['keys'], 'key diff' );
@@ -165,9 +161,7 @@ class MessageIndexTest extends MediaWikiIntegrationTestCase {
return $data;
}
- /**
- * @dataProvider provideMessageIndexImplementation
- */
+ /** @dataProvider provideMessageIndexImplementation */
public function testMessageIndexImplementation( $mi ) {
$data = self::getTestData();
/** @var TestableDatabaseMessageIndex|TestableCDBMessageIndex|TestableSerializedMessageIndex */
@@ -194,7 +188,7 @@ class MessageIndexTest extends MediaWikiIntegrationTestCase {
);
}
- $this->assertEquals(
+ $this->assertSame(
count( $data ),
count( $cached ),
'Cache has same number of elements'
diff --git a/MLEB/Translate/tests/phpunit/PageTranslation/TranslationPageTest.php b/MLEB/Translate/tests/phpunit/PageTranslation/TranslationPageTest.php
new file mode 100644
index 00000000..706be63b
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/PageTranslation/TranslationPageTest.php
@@ -0,0 +1,152 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use FatMessage;
+use Language;
+use MediaWikiTestCase;
+use WikiPageMessageGroup;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\PageTranslation\TranslationPage
+ */
+class TranslationPageTest extends MediaWikiTestCase {
+ /** @dataProvider provideTestGenerateSourceFromTranslations */
+ public function testGenerateSourceFromTranslations(
+ bool $inline,
+ bool $canWrap,
+ bool $wrapUntranslated,
+ array $messages,
+ string $expected
+ ) {
+ // This test skips all the message loading from database
+
+ $template = '<S>';
+ $unitMap = [];
+ foreach ( $messages as $id => $m ) {
+ /** @var FatMessage $m */
+ $unit = new TranslationUnit();
+ $unit->id = $id;
+ $unit->text = $m->definition();
+ $unit->setIsInline( $inline );
+ $unit->setCanWrap( $canWrap );
+
+ $unitMap[$unit->id] = $unit;
+ }
+
+ // Then create appropriate units in the section. We are using the array keys, which
+ // works as long as there are less than ten units.
+ $sectionMap = [ '<S>' => new Section( '', implode( ' | ', array_keys( $unitMap ) ), '' ) ];
+ $output = new ParserOutput( $template, $sectionMap, $unitMap );
+
+ $translationPage = new TranslationPage(
+ $output,
+ $this->createMock( WikiPageMessageGroup::class ),
+ Language::factory( 'ar' ),
+ Language::factory( 'en' ),
+ true /*$showOutdated*/,
+ $wrapUntranslated,
+ '' /*$prefix*/
+ );
+
+ $actual = $translationPage->generateSourceFromTranslations( $messages );
+ $this->assertSame( $expected, $actual );
+ }
+
+ public function provideTestGenerateSourceFromTranslations() {
+ $inline = true;
+ $block = false;
+
+ $wrap = true;
+ $nowrap = false;
+
+ $wrapUntranslated = true;
+
+ $sectionText = 'Hello';
+
+ $okMessage = new FatMessage( 'ignoredKey', $sectionText );
+ $okMessage->setTranslation( 'Hallo' );
+
+ $fuzzyMessage = new FatMessage( 'ignoredKey', $sectionText );
+ $fuzzyMessage->setTranslation( 'hallo' );
+ $fuzzyMessage->addTag( 'fuzzy' );
+
+ $untranslatedMessage = new FatMessage( 'ignoredKey', $sectionText );
+
+ $identicalMessage = new FatMessage( 'ignoredKey', $sectionText );
+ $identicalMessage->setTranslation( $sectionText );
+
+ $inlineWrappedOutdated = '<span class="mw-translate-fuzzy">hallo</span>';
+ $inlineWrappedUntranslated = '<span lang="en" dir="ltr" class="mw-content-ltr">Hello</span>';
+ $blockWrappedOutdated = "<div class=\"mw-translate-fuzzy\">\nhallo\n</div>";
+ $blockWrappedUntranslated = "<div lang=\"en\" dir=\"ltr\" class=\"mw-content-ltr\">\nHello\n</div>";
+
+ // Matrix of (inline|block) * (no)wrap * (no)wrapUntranslated
+ yield [
+ $inline,
+ $wrap,
+ $wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ "Hallo | $inlineWrappedOutdated | Hello | $inlineWrappedUntranslated"
+ ];
+
+ yield [
+ $inline,
+ $wrap,
+ !$wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ "Hallo | $inlineWrappedOutdated | Hello | Hello"
+ ];
+
+ yield [
+ $inline,
+ $nowrap,
+ $wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ 'Hallo | hallo | Hello | Hello',
+ ];
+
+ yield [
+ $inline,
+ $nowrap,
+ !$wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ 'Hallo | hallo | Hello | Hello',
+ ];
+
+ yield [
+ $block,
+ $wrap,
+ $wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ "Hallo | $blockWrappedOutdated | Hello | $blockWrappedUntranslated"
+ ];
+
+ yield [
+ $block,
+ $wrap,
+ !$wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ "Hallo | $blockWrappedOutdated | Hello | Hello"
+ ];
+
+ yield [
+ $block,
+ $nowrap,
+ $wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ 'Hallo | hallo | Hello | Hello',
+ ];
+
+ yield [
+ $block,
+ $nowrap,
+ !$wrapUntranslated,
+ [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
+ 'Hallo | hallo | Hello | Hello',
+ ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/ServicesTest.php b/MLEB/Translate/tests/phpunit/ServicesTest.php
index c5cca12e..13676178 100644
--- a/MLEB/Translate/tests/phpunit/ServicesTest.php
+++ b/MLEB/Translate/tests/phpunit/ServicesTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\Services;
+use MediaWiki\Extension\Translate\Services;
/**
* @author Niklas Laxström
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\Services
+ * @covers \MediaWiki\Extension\Translate\Services
*/
class ServicesTest extends MediaWikiIntegrationTestCase {
public function testNoExceptions() {
diff --git a/MLEB/Translate/tests/phpunit/StringMatcherTest.php b/MLEB/Translate/tests/phpunit/StringMatcherTest.php
index 35b14a0f..fad88506 100644
--- a/MLEB/Translate/tests/phpunit/StringMatcherTest.php
+++ b/MLEB/Translate/tests/phpunit/StringMatcherTest.php
@@ -7,9 +7,7 @@
*/
class StringMatcherTest extends MediaWikiIntegrationTestCase {
- /**
- * @dataProvider messageKeyProvider
- */
+ /** @dataProvider messageKeyProvider */
public function testKeyPrefixing(
string $key, string $expected, string $prefix, array $rules
): void {
@@ -54,9 +52,7 @@ class StringMatcherTest extends MediaWikiIntegrationTestCase {
return $keys;
}
- /**
- * @dataProvider problematicMessageKeyProvider
- */
+ /** @dataProvider problematicMessageKeyProvider */
public function testKeyMangling( string $key ): void {
$matcher = new StringMatcher();
$mangled = $matcher->mangle( $key );
@@ -67,9 +63,7 @@ class StringMatcherTest extends MediaWikiIntegrationTestCase {
$this->assertEquals( $key, $unmangled, 'Mangling is reversible' );
}
- /**
- * @dataProvider problematicMessageKeyProvider
- */
+ /** @dataProvider problematicMessageKeyProvider */
public function testKeyManglingWithPrefixing( string $key ): void {
$matcher = new StringMatcher( 'prefix', [ '*' ] );
$mangled = $matcher->mangle( $key );
diff --git a/MLEB/Translate/tests/phpunit/Synchronization/GroupSynchronizationCacheTest.php b/MLEB/Translate/tests/phpunit/Synchronization/GroupSynchronizationCacheTest.php
new file mode 100644
index 00000000..c9ccc0a5
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/Synchronization/GroupSynchronizationCacheTest.php
@@ -0,0 +1,305 @@
+<?php
+
+namespace MediaWiki\Extension\Translate\Synchronization;
+
+use InvalidArgumentException;
+use LogicException;
+use MediaWiki\Extension\Translate\Cache\PersistentDatabaseCache;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\MediaWikiServices;
+use MediaWikiIntegrationTestCase;
+
+/**
+ * @covers \MediaWiki\Extension\Translate\Synchronization\GroupSynchronizationCache
+ * @covers \MediaWiki\Extension\Translate\Synchronization\GroupSynchronizationResponse
+ */
+class GroupSynchronizationCacheTest extends MediaWikiIntegrationTestCase {
+ /** @var GroupSynchronizationCache */
+ private $groupSyncCache;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $this->groupSyncCache = $this->getGroupSynchronizationCache();
+ }
+
+ public function testIsGroupBeingProcessed() {
+ $groupId = 'hello';
+ $this->groupSyncCache->markGroupForSync( $groupId );
+
+ $this->assertTrue( $this->groupSyncCache->isGroupBeingProcessed( $groupId ) );
+
+ $this->groupSyncCache->endSync( $groupId );
+
+ $this->assertFalse( $this->groupSyncCache->isGroupBeingProcessed( $groupId ) );
+ }
+
+ public function testGetGroupMessages() {
+ $groupId = 'hello';
+ $title = 'Title';
+
+ $this->groupSyncCache->markGroupForSync( $groupId );
+ $messageParam = $this->getMessageParam( $groupId, $title );
+ $this->groupSyncCache->addMessages( $groupId, $messageParam );
+
+ $this->assertEquals(
+ [ $title => $messageParam ],
+ $this->groupSyncCache->getGroupMessages( $groupId )
+ );
+
+ $this->groupSyncCache->removeMessages( $groupId, $title );
+
+ $this->assertSame( [], $this->groupSyncCache->getGroupMessages( $groupId ) );
+ }
+
+ public function testMultiGetGroupMessages() {
+ $groupId = 'hello';
+
+ $addedMessages = [
+ 'Title' => $this->getMessageParam( $groupId, 'Title' ),
+ 'Title_ABC' => $this->getMessageParam( $groupId, 'Title_ABC' )
+ ];
+
+ $this->groupSyncCache->addMessages( $groupId, ...array_values( $addedMessages ) );
+
+ $messages = $this->groupSyncCache->getGroupMessages( $groupId );
+ $this->assertEquals( $addedMessages, $messages );
+ }
+
+ public function testIsMessageBeingProcessed() {
+ $groupId = 'hello';
+ $title = 'Title';
+
+ $this->groupSyncCache->addMessages(
+ $groupId, $this->getMessageParam( $groupId, $title )
+ );
+
+ $this->assertTrue( $this->groupSyncCache->isMessageBeingProcessed( $groupId, $title ) );
+
+ $this->groupSyncCache->removeMessages( $groupId, $title );
+
+ $this->assertFalse( $this->groupSyncCache->isMessageBeingProcessed( $groupId, $title ) );
+ }
+
+ public function testGetGroupsInSync() {
+ $groupId = 'hello';
+
+ $this->groupSyncCache->markGroupForSync( $groupId );
+ $this->assertSame( [ $groupId ], $this->groupSyncCache->getGroupsInSync() );
+
+ $this->groupSyncCache->endSync( $groupId );
+ $this->assertSame( [], $this->groupSyncCache->getGroupsInSync() );
+ }
+
+ public function testEndSync() {
+ $groupId = 'group-id';
+ $title = 'hello';
+
+ $this->startGroupSync( $groupId, $title );
+
+ $this->expectExceptionMessageMatches( '/cannot end synchronization/i' );
+ $this->expectException( InvalidArgumentException::class );
+
+ $this->groupSyncCache->endSync( $groupId );
+
+ $messages = $this->groupSyncCache->getGroupMessages( $groupId );
+ $this->assertNotEmpty( $messages, 'endSync should not remove group messages' );
+ $this->assertIsInt(
+ $this->groupSyncCache->getSyncEndTime( $groupId ),
+ 'endSync should not remove the group key'
+ );
+ }
+
+ public function testForceEndSync() {
+ $groupId = 'group-id';
+ $title = 'hello';
+
+ $this->startGroupSync( $groupId, $title );
+
+ $this->groupSyncCache->forceEndSync( $groupId );
+
+ $messages = $this->groupSyncCache->getGroupMessages( $groupId );
+ $this->assertEmpty( $messages, 'forceEndSync should remove group messages' );
+ $this->assertNull(
+ $this->groupSyncCache->getSyncEndTime( $groupId ),
+ 'forceEndSync should remove the group key'
+ );
+ }
+
+ /** @dataProvider provideGetSynchronizationStatus */
+ public function testGetSynchronizationStatus(
+ GroupSynchronizationCache $syncCache,
+ string $groupId,
+ array $titlesToAdd,
+ array $titlesToRemove,
+ bool $hasTimedOut = false
+ ) {
+ $syncCache->markGroupForSync( $groupId );
+
+ $this->assertTrue( $syncCache->isGroupBeingProcessed( $groupId ) );
+
+ $addedMessages = [];
+ foreach ( $titlesToAdd as $title ) {
+ $messageParam = $this->getMessageParam( $groupId, $title );
+ $syncCache->addMessages( $groupId, $messageParam );
+ $addedMessages[$title] = $messageParam;
+ }
+
+ $this->assertEqualsCanonicalizing( $addedMessages, $syncCache->getGroupMessages( $groupId ) );
+
+ $syncCache->removeMessages( $groupId, ...$titlesToRemove );
+
+ $groupSyncResponse = $syncCache->getSynchronizationStatus( $groupId );
+
+ $diffTitles = array_values( array_diff( $titlesToAdd, $titlesToRemove ) );
+ $diffMessages = [];
+ foreach ( $diffTitles as $title ) {
+ $diffMessages[$title] = $addedMessages[$title];
+ }
+
+ $this->assertEquals( $diffMessages, $syncCache->getGroupMessages( $groupId ) );
+
+ if ( $diffMessages === [] ) {
+ // getSynchronizationStatus does not perform any updates
+ $this->assertContains( $groupId, $this->groupSyncCache->getGroupsInSync() );
+ }
+
+ $this->assertSame( $diffMessages === [], $groupSyncResponse->isDone() );
+ $this->assertSame( $hasTimedOut, $groupSyncResponse->hasTimedOut() );
+ $this->assertEquals( $diffMessages, $groupSyncResponse->getRemainingMessages() );
+ $this->assertSame( $groupId, $groupSyncResponse->getGroupId() );
+ }
+
+ public function testAddGroupErrors() {
+ $this->assertEmpty( $this->groupSyncCache->getGroupsWithErrors() );
+
+ $groupId = 'test-group';
+ $groupSyncResponse = $this->addTestGroupError( $groupId );
+ $this->assertContains( $groupId, $this->groupSyncCache->getGroupsWithErrors() );
+ $this->assertEquals( $groupSyncResponse, $this->groupSyncCache->getGroupErrorInfo( $groupId ) );
+
+ $this->groupSyncCache->addGroupErrors( $groupSyncResponse );
+ $this->assertContains(
+ $groupId,
+ $this->groupSyncCache->getGroupsWithErrors(),
+ 'Multiple additions of group errors don\'t duplicate entries in cache'
+ );
+ $this->assertEquals(
+ $groupSyncResponse,
+ $this->groupSyncCache->getGroupErrorInfo( $groupId ),
+ 'Multiple additions of group errors don\'t duplicate entries in cache'
+ );
+ }
+
+ public function testMarkGroupAsResolved() {
+ $groupId = 'test-group';
+ $this->addTestGroupError( $groupId );
+
+ $this->assertContains( $groupId, $this->groupSyncCache->getGroupsWithErrors() );
+ $this->groupSyncCache->markGroupAsResolved( $groupId );
+ $this->assertNotContains( $groupId, $this->groupSyncCache->getGroupsWithErrors() );
+ }
+
+ public function testMarkMessageAsResolved() {
+ $groupId = 'test-group';
+ $groupSyncResponse = $this->addTestGroupError( $groupId );
+
+ $this->assertContains( $groupId, $this->groupSyncCache->getGroupsWithErrors() );
+
+ $errorMessages = $groupSyncResponse->getRemainingMessages();
+ $pageName = $errorMessages[0]->getPageName();
+ $this->groupSyncCache->markMessageAsResolved( $groupId, $pageName );
+
+ $fixedGroupSyncResponse = $this->groupSyncCache->syncGroupErrors( $groupId );
+ $fixedErrorMessages = $fixedGroupSyncResponse->getRemainingMessages();
+
+ $this->assertEquals( count( $errorMessages ) - 1, count( $fixedErrorMessages ) );
+ }
+
+ public function testAddGroupErrorsEmpty() {
+ $groupId = 'test-group';
+ $groupHasTimedOut = true;
+ $groupSyncResponse = new GroupSynchronizationResponse( $groupId, [], $groupHasTimedOut );
+
+ $this->expectException( LogicException::class );
+ $this->groupSyncCache->addGroupErrors( $groupSyncResponse );
+ }
+
+ public function provideGetSynchronizationStatus() {
+ $groupId = 'hello';
+
+ yield [
+ $this->getGroupSynchronizationCache(),
+ $groupId,
+ [ 'Title', 'Title1' ],
+ [ 'Title' ],
+ false
+ ];
+
+ yield [
+ $this->getGroupSynchronizationCache(),
+ $groupId,
+ [ 'Hello' ],
+ [ 'Hello' ],
+ false
+ ];
+
+ yield [
+ $this->getGroupSynchronizationCache( -1 ),
+ $groupId,
+ [ 'Hello' ],
+ [ 'Hello' ],
+ false
+ ];
+
+ yield [
+ $this->getGroupSynchronizationCache( -1 ),
+ $groupId,
+ [ 'Hello', 'Title' ],
+ [ 'Hello' ],
+ true
+ ];
+ }
+
+ private function getMessageParam( string $groupId, string $title ): MessageUpdateParameter {
+ return new MessageUpdateParameter( [
+ 'fuzzy' => true,
+ 'content' => 'Hello',
+ 'title' => $title,
+ 'groupId' => $groupId
+ ] );
+ }
+
+ private function getGroupSynchronizationCache( int $timeout = null ): GroupSynchronizationCache {
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ $jsonCodec = Services::getInstance()->getJsonCodec();
+ $persistentCache = new PersistentDatabaseCache( $lb, $jsonCodec );
+ $persistentCache->clear();
+
+ if ( $timeout ) {
+ return new GroupSynchronizationCache( $persistentCache, $timeout );
+ } else {
+ return new GroupSynchronizationCache( $persistentCache );
+ }
+ }
+
+ private function startGroupSync( string $groupId, string $title ): void {
+ $this->groupSyncCache->markGroupForSync( $groupId );
+ $this->groupSyncCache->addMessages( $groupId, $this->getMessageParam( $groupId, $title ) );
+ }
+
+ private function addTestGroupError( string $groupId ): GroupSynchronizationResponse {
+ $groupHasTimedOut = true;
+ $groupSyncResponse = new GroupSynchronizationResponse(
+ $groupId,
+ [
+ $this->getMessageParam( $groupId, 'title1' ),
+ $this->getMessageParam( $groupId, 'title2' ),
+ $this->getMessageParam( $groupId, 'title3' )
+ ],
+ $groupHasTimedOut
+ );
+
+ $this->groupSyncCache->addGroupErrors( $groupSyncResponse );
+ return $groupSyncResponse;
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/TTMServerMessageUpdateJobTest.php b/MLEB/Translate/tests/phpunit/TTMServerMessageUpdateJobTest.php
index e0676dbc..29bff823 100644
--- a/MLEB/Translate/tests/phpunit/TTMServerMessageUpdateJobTest.php
+++ b/MLEB/Translate/tests/phpunit/TTMServerMessageUpdateJobTest.php
@@ -15,7 +15,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
*/
public static $mockups = [];
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
self::$mockups = [];
$this->setMwGlobals( [
@@ -36,7 +36,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
] );
}
- public function tearDown() : void {
+ protected function tearDown(): void {
parent::tearDown();
self::$mockups = [];
}
@@ -93,7 +93,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
->getMock()
);
$job->run();
- $this->assertSame( 1, count( $job->getResentJobs() ) );
+ $this->assertCount( 1, $job->getResentJobs() );
$expectedParams = [
'errorCount' => 1,
'service' => 'secondary',
@@ -132,7 +132,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
->getMock()
);
$job->run();
- $this->assertEquals( 2, count( $job->getResentJobs() ) );
+ $this->assertCount( 2, $job->getResentJobs() );
$expectedParams = [
'errorCount' => 1,
'service' => 'primary',
@@ -249,7 +249,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
->getMock()
);
$job->run();
- $this->assertSame( 1, count( $job->getResentJobs() ) );
+ $this->assertCount( 1, $job->getResentJobs() );
$expectedParams = [
'errorCount' => 0,
'retryCount' => 1,
@@ -296,7 +296,7 @@ class TTMServerMessageUpdateJobTest extends MediaWikiIntegrationTestCase {
->getMock()
);
$job->run();
- $this->assertEquals( 2, count( $job->getResentJobs() ) );
+ $this->assertCount( 2, $job->getResentJobs() );
$expectedParams = [
'errorCount' => 1,
'retryCount' => 0,
diff --git a/MLEB/Translate/tests/phpunit/TTMServerTest.php b/MLEB/Translate/tests/phpunit/TTMServerTest.php
deleted file mode 100644
index ac706a24..00000000
--- a/MLEB/Translate/tests/phpunit/TTMServerTest.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
-/**
- * @file
- * @author Niklas Laxström
- * @copyright Copyright © 2012-2013, Niklas Laxström
- * @license GPL-2.0-or-later
- */
-
-class TTMServerTest extends MediaWikiIntegrationTestCase {
- protected $config;
-
- protected function setUp() : void {
- global $wgTranslateTranslationServices;
- $this->config = $wgTranslateTranslationServices;
- parent::setUp();
-
- $wgTranslateTranslationServices = [];
- $wgTranslateTranslationServices['localtm'] = [
- 'url' => 'http://example.com/sandwiki/api.php',
- 'displayname' => 'example.com',
- 'cutoff' => 0.75,
- 'type' => 'ttmserver',
- ];
-
- $wgTranslateTranslationServices['apitm'] = [
- 'url' => 'http://example.com/w/api.php',
- 'displayname' => 'example.com',
- 'cutoff' => 0.75,
- 'timeout-sync' => 4,
- 'timeout-async' => 4,
- 'type' => 'ttmserver',
- 'class' => RemoteTTMServer::class,
- ];
- }
-
- protected function tearDown() : void {
- global $wgTranslateTranslationServices;
- $wgTranslateTranslationServices = $this->config;
- parent::tearDown();
- }
-
- public function testConstruct() {
- $server = TTMServer::primary();
- $this->assertEquals(
- 'FakeTTMServer',
- get_class( $server ),
- 'Fake server given when default server is disabled'
- );
- global $wgTranslateTranslationServices,
- $wgTranslateTranslationDefaultService;
- $wgTranslateTranslationServices[$wgTranslateTranslationDefaultService] = [
- 'database' => false, // Passed to wfGetDB
- 'cutoff' => 0.75,
- 'type' => 'ttmserver',
- 'public' => false,
- ];
- $server = TTMServer::primary();
- $this->assertEquals(
- 'DatabaseTTMServer',
- get_class( $server ),
- 'Real server given when default server is enabled'
- );
- unset( $wgTranslateTranslationServices[$wgTranslateTranslationDefaultService] );
- }
-
- public function testFakeTTMServer() {
- $server = new FakeTTMServer();
- $this->assertEquals(
- [],
- $server->query( 'en', 'fi', 'daa' ),
- 'FakeTTMServer returns no suggestions for all queries'
- );
-
- $title = $this->createMock( Title::class );
- $handle = new MessageHandle( $title );
-
- $this->assertNull(
- $server->update( $handle, 'text' ),
- 'FakeTTMServer returns null on update'
- );
- }
-
- public function testMirrorsConfig() {
- global $wgTranslateTranslationServices;
- $wgTranslateTranslationServices['primary'] = [
- 'class' => ElasticSearchTTMServer::class,
- 'mirrors' => [ 'secondary' ]
- ];
- $wgTranslateTranslationServices['secondary'] = [
- 'class' => ElasticSearchTTMServer::class,
- 'mirrors' => [ 'primary', 'unknown' ]
- ];
- $primary = TTMServer::factory( $wgTranslateTranslationServices['primary'] );
- $this->assertEquals( [ 'secondary' ], $primary->getMirrors() );
- $secondary = TTMServer::factory( $wgTranslateTranslationServices['secondary'] );
- $this->expectException( TTMServerException::class );
- $secondary->getMirrors();
- }
-}
diff --git a/MLEB/Translate/tests/phpunit/TranslateHooksTest.php b/MLEB/Translate/tests/phpunit/TranslateHooksTest.php
index 63bcb637..2133d81e 100644
--- a/MLEB/Translate/tests/phpunit/TranslateHooksTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslateHooksTest.php
@@ -12,7 +12,7 @@
* @group medium
*/
class TranslateHooksTest extends MediaWikiLangTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -43,7 +43,7 @@ class TranslateHooksTest extends MediaWikiLangTestCase {
public function testPreventCategorization() {
$user = $this->getTestSysop()->getUser();
- $title = Title::makeTitle( NS_MEDIAWIKI, 'ugakey1/fi' );
+ $title = Title::makeTitle( NS_MEDIAWIKI, 'Ugakey1/fi' );
$wikipage = WikiPage::factory( $title );
$content = ContentHandler::makeContent( '[[Category:Shouldnotbe]]', $title );
@@ -54,18 +54,18 @@ class TranslateHooksTest extends MediaWikiLangTestCase {
'translation of known message'
);
- $title = Title::makeTitle( NS_MEDIAWIKI, 'ugakey2/qqq' );
+ $title = Title::makeTitle( NS_MEDIAWIKI, 'Ugakey2/qqq' );
$wikipage = WikiPage::factory( $title );
$content = ContentHandler::makeContent( '[[Category:Shouldbe]]', $title );
$wikipage->doEditContent( $content, __METHOD__, 0, false, $user );
$this->assertEquals(
- [ 'Category:Shouldbe' => 'MediaWiki:ugakey2/qqq' ],
+ [ 'Category:Shouldbe' => 'MediaWiki:Ugakey2/qqq' ],
$title->getParentCategories(),
'message docs'
);
- $title = Title::makeTitle( NS_MEDIAWIKI, 'ugakey3/no' );
+ $title = Title::makeTitle( NS_MEDIAWIKI, 'Ugakey3/no' );
$wikipage = WikiPage::factory( $title );
$content = ContentHandler::makeContent( '[[Category:Shouldbealso]]', $title );
diff --git a/MLEB/Translate/tests/phpunit/TranslateSandboxTest.php b/MLEB/Translate/tests/phpunit/TranslateSandboxTest.php
index 060f42a4..58198f8c 100644
--- a/MLEB/Translate/tests/phpunit/TranslateSandboxTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslateSandboxTest.php
@@ -9,11 +9,9 @@
use MediaWiki\MediaWikiServices;
-/**
- * @group Database
- */
+/** @group Database */
class TranslateSandboxTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
'wgTranslateUseSandbox' => true,
@@ -24,11 +22,27 @@ class TranslateSandboxTest extends MediaWikiIntegrationTestCase {
TranslateHooks::setupTranslate();
}
+ /**
+ * @param User $user
+ * @return array|string[]
+ */
+ private function getUserGroups( User $user ): array {
+ if ( method_exists( MediaWikiServices::class, 'getUserGroupManager' ) ) {
+ // MediaWiki 1.35+
+ $userGroupManager = MediaWikiServices::getInstance()->getUserGroupManager();
+ $groups = $userGroupManager->getUserGroups( $user );
+ } else {
+ $groups = $user->getGroups();
+ }
+
+ return $groups;
+ }
+
public function testAddUser() {
$user = TranslateSandbox::addUser( 'Test user', 'test@blackhole.io', 'test password' );
- $this->assertTrue( $user->isLoggedIn(), 'User exists' );
+ $this->assertTrue( $user->isRegistered(), 'User exists' );
- $groups = array_unique( $user->getGroups() );
+ $groups = array_unique( $this->getUserGroups( $user ) );
$this->assertSame( [ 'translate-sandboxed' ], $groups, 'User is in the sandboxed group' );
}
@@ -36,7 +50,7 @@ class TranslateSandboxTest extends MediaWikiIntegrationTestCase {
public function testDeleteUser() {
$user = TranslateSandbox::addUser( 'Test user2', 'test@blackhole.io', 'test password' );
TranslateSandbox::deleteUser( $user );
- $this->assertFalse( $user->isLoggedIn(), 'User no longer exists' );
+ $this->assertFalse( $user->isRegistered(), 'User no longer exists' );
}
public function testDeleteUserPromoted() {
@@ -86,7 +100,7 @@ class TranslateSandboxTest extends MediaWikiIntegrationTestCase {
$user = TranslateSandbox::addUser( 'Test user6', 'test@blackhole.io', 'test password' );
TranslateSandbox::promoteUser( $user );
- $this->assertContains( 'translator', $user->getGroups() );
+ $this->assertContains( 'translator', $this->getUserGroups( $user ) );
}
public function testPermissions() {
@@ -104,4 +118,12 @@ class TranslateSandboxTest extends MediaWikiIntegrationTestCase {
'Promoted users can edit their own talk page'
);
}
+
+ public function testIsSandboxed() {
+ $userNotInGroup = $this->getTestUser()->getUser();
+ $userInGroup = $this->getTestUser( [ 'translate-sandboxed' ] )->getUser();
+
+ $this->assertTrue( TranslateSandbox::isSandboxed( $userInGroup ) );
+ $this->assertFalse( TranslateSandbox::isSandboxed( $userNotInGroup ) );
+ }
}
diff --git a/MLEB/Translate/tests/phpunit/TranslateUtilsTest.php b/MLEB/Translate/tests/phpunit/TranslateUtilsTest.php
index a97c778b..2c374932 100644
--- a/MLEB/Translate/tests/phpunit/TranslateUtilsTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslateUtilsTest.php
@@ -3,7 +3,6 @@
use MediaWiki\Revision\RevisionRecord;
/**
- * Class TranslateUtilsTest
* @group Database
* @covers TranslateUtils
*/
diff --git a/MLEB/Translate/tests/phpunit/TranslateYamlTest.php b/MLEB/Translate/tests/phpunit/TranslateYamlTest.php
index f89de9ed..84e37cbe 100644
--- a/MLEB/Translate/tests/phpunit/TranslateYamlTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslateYamlTest.php
@@ -1,13 +1,13 @@
<?php
+
/**
* Tests for yaml wrapper.
*
* @author Niklas Laxström
* @license GPL-2.0-or-later
*/
-
class TranslateYamlTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
diff --git a/MLEB/Translate/tests/phpunit/TranslationFuzzyUpdaterTest.php b/MLEB/Translate/tests/phpunit/TranslationFuzzyUpdaterTest.php
index 8f1649bf..2ce9401b 100644
--- a/MLEB/Translate/tests/phpunit/TranslationFuzzyUpdaterTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslationFuzzyUpdaterTest.php
@@ -14,7 +14,7 @@ use MediaWiki\Revision\RevisionRecord;
* @group medium
*/
class TranslationFuzzyUpdaterTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -48,9 +48,7 @@ class TranslationFuzzyUpdaterTest extends MediaWikiIntegrationTestCase {
$content = ContentHandler::makeContent( '$1 van $2', $title );
$status = $page->doEditContent( $content, __METHOD__ );
$value = $status->getValue();
- /**
- * @var RevisionRecord $revisionRecord
- */
+ /** @var RevisionRecord $revisionRecord */
$revisionRecord = $value['revision-record'];
$revisionId = $revisionRecord->getId();
diff --git a/MLEB/Translate/tests/phpunit/TranslationStashStorageTest.php b/MLEB/Translate/tests/phpunit/TranslatorSandbox/TranslationStashStorageTest.php
index e7a51fa5..af5a8244 100644
--- a/MLEB/Translate/tests/phpunit/TranslationStashStorageTest.php
+++ b/MLEB/Translate/tests/phpunit/TranslatorSandbox/TranslationStashStorageTest.php
@@ -1,15 +1,18 @@
<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorSandbox;
+
+use MediaWikiIntegrationTestCase;
+use Title;
+use User;
+
/**
- * @file
* @author Niklas Laxström
* @license GPL-2.0-or-later
- */
-
-/**
* @group Database
*/
class TranslationStashStorageTest extends MediaWikiIntegrationTestCase {
-
public function testAdd() {
$storage = new TranslationStashStorage( wfGetDB( DB_MASTER ) );
diff --git a/MLEB/Translate/tests/phpunit/MessageValidatorTest.php b/MLEB/Translate/tests/phpunit/Validation/ValidationRunnerTest.php
index 25dc8fd9..db2058c1 100644
--- a/MLEB/Translate/tests/phpunit/MessageValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/Validation/ValidationRunnerTest.php
@@ -7,13 +7,14 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
+
/**
- * @covers \MessageValidator
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\ValidationResult
- * @group TranslationValidators
+ * @covers \MediaWiki\Extension\Translate\Validation\ValidationRunner
+ * @covers \MediaWiki\Extension\Translate\Validation\ValidationResult
*/
-class MessageValidatorTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+class ValidationRunnerTest extends MediaWikiIntegrationTestCase {
+ protected function setUp(): void {
parent::setUp();
$this->setTemporaryHook(
@@ -30,7 +31,7 @@ class MessageValidatorTest extends MediaWikiIntegrationTestCase {
// Run with empty ignore list by default
$this->setMwGlobals( 'wgTranslateCheckBlacklist', false );
- MessageValidator::reloadIgnorePatterns();
+ ValidationRunner::reloadIgnorePatterns();
}
public function getTestGroups( &$list ) {
@@ -167,7 +168,7 @@ class MessageValidatorTest extends MediaWikiIntegrationTestCase {
public function testIgnoreList() {
$this->setMwGlobals( [
- 'wgTranslateCheckBlacklist' => __DIR__ . '/data/check-blacklist.php'
+ 'wgTranslateCheckBlacklist' => __DIR__ . '/../data/check-blacklist.php'
] );
$group = MessageGroups::getGroup( 'test-group' );
@@ -207,6 +208,13 @@ class MessageValidatorTest extends MediaWikiIntegrationTestCase {
$validationResult->getIssues(),
'warnings or errors are filtered as per check-blacklist only for specific language code.'
);
+
+ $validationResult = $msgValidator->validateMessage( $collectionFr['regex-key-test'], 'fr' );
+ $this->assertCount(
+ 0,
+ $validationResult->getIssues(),
+ 'warnings or errors are filtered as per check-blacklist for specific message key.'
+ );
}
public function testKeyMatching() {
diff --git a/MLEB/Translate/tests/phpunit/MessageValidator/Validators/MediaWikiPluralValidatorTest.php b/MLEB/Translate/tests/phpunit/Validation/Validators/MediaWikiPluralValidatorTest.php
index 55e57bbf..e99f7276 100644
--- a/MLEB/Translate/tests/phpunit/MessageValidator/Validators/MediaWikiPluralValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/Validation/Validators/MediaWikiPluralValidatorTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPluralValidator;
/**
* @author Abijeet Patro
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPluralValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPluralValidator
*/
class MediaWikiPluralValidatorTest extends PHPUnit\Framework\TestCase {
/** @dataProvider getPluralFormCountProvider */
diff --git a/MLEB/Translate/tests/phpunit/WikiPageMessageGroupTest.php b/MLEB/Translate/tests/phpunit/WikiPageMessageGroupTest.php
index 09684543..ad57a29b 100644
--- a/MLEB/Translate/tests/phpunit/WikiPageMessageGroupTest.php
+++ b/MLEB/Translate/tests/phpunit/WikiPageMessageGroupTest.php
@@ -5,11 +5,11 @@
* @file
*/
- /**
- * @group medium
- */
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
+
+/** @group medium */
class WikiPageMessageGroupTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setTemporaryHook(
@@ -36,7 +36,7 @@ class WikiPageMessageGroupTest extends MediaWikiIntegrationTestCase {
$group = MessageGroups::getGroup( 'anotherpageid' );
$msgValidator = $group->getValidator();
- $this->assertInstanceOf( MessageValidator::class, $msgValidator,
- 'returns a valid object of MessageValidator class.' );
+ $this->assertInstanceOf( ValidationRunner::class, $msgValidator,
+ 'returns a valid object of ValidationRunner class.' );
}
}
diff --git a/MLEB/Translate/tests/phpunit/api/ApiGroupReviewTest.php b/MLEB/Translate/tests/phpunit/api/ApiGroupReviewTest.php
index 3eb9c721..fec499fc 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiGroupReviewTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiGroupReviewTest.php
@@ -7,11 +7,9 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
-/**
- * @group Database
- */
+/** @group Database */
class ApiGroupReviewTest extends MediaWikiIntegrationTestCase {
public function testGetSetState() {
$group = new WikiMessageGroup( 'testgroup', 'wewgweg' );
diff --git a/MLEB/Translate/tests/phpunit/api/ApiManageMessageGroupsTest.php b/MLEB/Translate/tests/phpunit/api/ApiManageMessageGroupsTest.php
index 9f3af08b..fcbf6414 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiManageMessageGroupsTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiManageMessageGroupsTest.php
@@ -4,22 +4,20 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
/**
* @group medium
* @covers ApiManageMessageGroups
*/
class ApiManageMessageGroupsTest extends ApiTestCase {
- /**
- * @var User
- */
+ /** @var User */
protected $user;
protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
- 'wgTranslateCacheDirectory' => __DIR__ . '/../data',
+ 'wgTranslateCacheDirectory' => $this->getNewTempDirectory(),
] );
$this->setGroupPermissions( 'translate-admin', 'translate-manage', true );
@@ -127,7 +125,7 @@ class ApiManageMessageGroupsTest extends ApiTestCase {
'operation' => 'new',
'changesetName' => MessageChangeStorage::DEFAULT_NAME,
'changesetModified' => time()
- ], null, $this->user, 'csrf'
+ ], null, $this->user, 'csrf'
);
$sourceChanges = MessageChangeStorage::getGroupChanges( $filePath, 'testgroup-api' );
@@ -169,21 +167,10 @@ class ApiManageMessageGroupsTest extends ApiTestCase {
'operation' => 'new',
'changesetName' => MessageChangeStorage::DEFAULT_NAME,
'changesetModified' => $date->getTimestamp(),
- ], null, $this->user, 'csrf'
+ ], null, $this->user, 'csrf'
);
}
- public static function tearDownAfterClass() : void {
- parent::tearDownAfterClass();
-
- global $wgTranslateCacheDirectory;
- $tmp = $wgTranslateCacheDirectory;
- $wgTranslateCacheDirectory = __DIR__ . '/../data';
- $filePath = self::getStoragePath();
- unlink( $filePath );
- $wgTranslateCacheDirectory = $tmp;
- }
-
private static function getStoragePath() {
return MessageChangeStorage::getCdbPath( MessageChangeStorage::DEFAULT_NAME );
}
diff --git a/MLEB/Translate/tests/phpunit/api/ApiQueryManageMessageGroupsTest.php b/MLEB/Translate/tests/phpunit/api/ApiQueryManageMessageGroupsTest.php
index bb4b440c..8b044d43 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiQueryManageMessageGroupsTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiQueryManageMessageGroupsTest.php
@@ -4,22 +4,20 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
/**
* @group medium
* @covers ApiQueryManageMessageGroups
*/
class ApiQueryManageMessageGroupsTest extends ApiTestCase {
- /**
- * @var User
- */
+ /** @var User */
protected $user;
protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
- 'wgTranslateCacheDirectory' => __DIR__ . '/../data'
+ 'wgTranslateCacheDirectory' => $this->getNewTempDirectory()
] );
$this->setGroupPermissions( 'translate-admin', 'translate-manage', true );
@@ -49,7 +47,7 @@ class ApiQueryManageMessageGroupsTest extends ApiTestCase {
'mmggroupId' => 'testgroup-api',
'mmgmessageKey' => 'keyAdded1',
'mmgchangesetName' => MessageChangeStorage::DEFAULT_NAME,
- ], null, false, $this->user
+ ], null, false, $this->user
);
$apiRespose = $data[0]['query']['managemessagegroups'][0];
@@ -109,15 +107,4 @@ class ApiQueryManageMessageGroupsTest extends ApiTestCase {
MessageChangeStorage::writeChanges( $changeData, self::getStoragePath() );
}
-
- public static function tearDownAfterClass() : void {
- parent::tearDownAfterClass();
-
- global $wgTranslateCacheDirectory;
- $tmp = $wgTranslateCacheDirectory;
- $wgTranslateCacheDirectory = __DIR__ . '/../data';
- $filePath = self::getStoragePath();
- unlink( $filePath );
- $wgTranslateCacheDirectory = $tmp;
- }
}
diff --git a/MLEB/Translate/tests/phpunit/api/ApiQueryMessageCollectionTest.php b/MLEB/Translate/tests/phpunit/api/ApiQueryMessageCollectionTest.php
index 354fbaea..4e7d3825 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiQueryMessageCollectionTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiQueryMessageCollectionTest.php
@@ -5,11 +5,9 @@
* @license GPL-2.0-or-later
*/
-/**
- * @group medium
- */
+/** @group medium */
class ApiQueryMessageCollectionTest extends ApiTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setTemporaryHook(
diff --git a/MLEB/Translate/tests/phpunit/api/ApiQueryMessageGroupsTest.php b/MLEB/Translate/tests/phpunit/api/ApiQueryMessageGroupsTest.php
index bc797a83..227072f0 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiQueryMessageGroupsTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiQueryMessageGroupsTest.php
@@ -6,12 +6,10 @@
* @license GPL-2.0-or-later
*/
-/**
- * @group medium
- */
+/** @group medium */
class ApiQueryMessageGroupsTest extends ApiTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -72,14 +70,14 @@ class ApiQueryMessageGroupsTest extends ApiTestCase {
$this->assertCount( 2, $items, 'Only the two groups specified are in the api' );
$this->assertStringEndsWith( 'id', $items[0]['id'] );
$this->assertStringEndsWith( 'id', $items[1]['id'] );
- $this->assertSame( $items[0]['label'], 'thelabel' );
- $this->assertSame( $items[1]['label'], 'thelabel' );
- $this->assertSame( $items[0]['exists'], true );
- $this->assertSame( $items[1]['exists'], true );
- $this->assertSame( $items[0]['namespace'], 5 );
- $this->assertSame( $items[1]['namespace'], 5 );
- $this->assertSame( $items[0]['class'], WikiMessageGroup::class );
- $this->assertSame( $items[1]['class'], WikiMessageGroup::class );
+ $this->assertSame( 'thelabel', $items[0]['label'] );
+ $this->assertSame( 'thelabel', $items[1]['label'] );
+ $this->assertTrue( $items[0]['exists'] );
+ $this->assertTrue( $items[1]['exists'] );
+ $this->assertSame( 5, $items[0]['namespace'] );
+ $this->assertSame( 5, $items[1]['namespace'] );
+ $this->assertSame( WikiMessageGroup::class, $items[0]['class'] );
+ $this->assertSame( WikiMessageGroup::class, $items[1]['class'] );
}
public function testAPIFilterAccuracy() {
@@ -119,12 +117,12 @@ class ApiQueryMessageGroupsTest extends ApiTestCase {
$item = $data['query']['messagegroups'][0];
$this->assertCount( 5, $item );
- $this->assertSame( $item['id'], $id );
- $this->assertSame( $item['label'], 'thelabel' );
- $this->assertSame( $item['exists'], true );
+ $this->assertSame( $id, $item['id'] );
+ $this->assertSame( 'thelabel', $item['label'] );
+ $this->assertTrue( $item['exists'] );
$this->assertStringEndsWith( 'id', $item['id'] ); // theid, anotherid
- $this->assertSame( $item['namespace'], 5 );
- $this->assertSame( $item['class'], WikiMessageGroup::class );
+ $this->assertSame( 5, $item['namespace'] );
+ $this->assertSame( WikiMessageGroup::class, $item['class'] );
}
}
diff --git a/MLEB/Translate/tests/phpunit/api/ApiTranslationReviewTest.php b/MLEB/Translate/tests/phpunit/api/ApiTranslationReviewTest.php
index 3e98e97e..b0ae1eff 100644
--- a/MLEB/Translate/tests/phpunit/api/ApiTranslationReviewTest.php
+++ b/MLEB/Translate/tests/phpunit/api/ApiTranslationReviewTest.php
@@ -1,6 +1,5 @@
<?php
/**
- *
* @file
* @author Niklas Laxström
* @license GPL-2.0-or-later
@@ -8,11 +7,9 @@
use MediaWiki\MediaWikiServices;
-/**
- * @group Database
- */
+/** @group Database */
class ApiTranslationReviewTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
diff --git a/MLEB/Translate/tests/phpunit/data/Example-result.i18n.php b/MLEB/Translate/tests/phpunit/data/Example-result.i18n.php
index d7f34138..ae3aa743 100644
--- a/MLEB/Translate/tests/phpunit/data/Example-result.i18n.php
+++ b/MLEB/Translate/tests/phpunit/data/Example-result.i18n.php
@@ -5,52 +5,51 @@
* @file
* @ingroup Extensions
*/
-// @codingStandardsIgnoreFile
-$messages = array();
+$messages = [];
-$messages['en'] = array(
+$messages['en'] = [
'translatedmessage' => 'The database has been automatically locked due to inactivity from the administrators.',
- 'fuzzymessage' => 'Auto-locks the wiki database if the sysops are all inactive for some time',
-);
+ 'fuzzymessage' => 'Auto-locks the wiki database if the sysops are all inactive for some time',
+];
/** Message documentation (Message documentation)
* @author Purodha
* @author The Evil IP address
*/
-$messages['qqq'] = array(
+$messages['qqq'] = [
'fuzzymessage' => '{{desc}}',
-);
+];
/** Afrikaans (Afrikaans)
* @author Naudefj
*/
-$messages['af'] = array(
+$messages['af'] = [
'translatedmessage' => 'Die databasis is outomaties gesluit omdat die administrateurs nie aktief is nie.',
'fuzzymessage' => "Sluit die wiki outomaties as die administrateurs vir 'n geruime tyd nie aktief is nie",
-);
+];
/** Gheg Albanian (Gegë)
* @author Bresta
*/
-$messages['aln'] = array(
+$messages['aln'] = [
'translatedmessage' => 'Baza e të dhânave âsht bllokue automatikisht për shkak të mosaktivitetit të administruesve.',
'fuzzymessage' => 'E vetë-bllokon bazën e të dhânave nëse administruesit janë joaktiv për nji kohë të caktueme.',
-);
+];
/** Arabic (العربية)
* @author Meno25
* @author OsamaK
*/
-$messages['ar'] = array(
+$messages['ar'] = [
'translatedmessage' => 'تم غلق قاعدة البيانات تلقائيا نظرا لعدم نشاط مدراء النظام.',
'fuzzymessage' => 'قفل قاعدة بيانات الويكي تلقائيا إذا كان كل مدراء النظام غير نشطين لبعض الوقت',
-);
+];
/** Finnish (suomi)
* @author Nike the bunny
*/
-$messages['fi'] = array(
+$messages['fi'] = [
'translatedmsg' => 'translation',
'fuzzymsg' => 'translation', # Fuzzy
-);
+];
diff --git a/MLEB/Translate/tests/phpunit/data/Example.i18n.php b/MLEB/Translate/tests/phpunit/data/Example.i18n.php
index 48c25d0f..46c4c0c9 100644
--- a/MLEB/Translate/tests/phpunit/data/Example.i18n.php
+++ b/MLEB/Translate/tests/phpunit/data/Example.i18n.php
@@ -5,44 +5,43 @@
* @file
* @ingroup Extensions
*/
-// @codingStandardsIgnoreFile
-$messages = array();
+$messages = [];
-$messages['en'] = array(
+$messages['en'] = [
'translatedmessage' => 'The database has been automatically locked due to inactivity from the administrators.',
- 'fuzzymessage' => 'Auto-locks the wiki database if the sysops are all inactive for some time',
-);
+ 'fuzzymessage' => 'Auto-locks the wiki database if the sysops are all inactive for some time',
+];
/** Message documentation (Message documentation)
* @author Purodha
* @author The Evil IP address
*/
-$messages['qqq'] = array(
+$messages['qqq'] = [
'fuzzymessage' => '{{desc}}',
-);
+];
/** Afrikaans (Afrikaans)
* @author Naudefj
*/
-$messages['af'] = array(
+$messages['af'] = [
'translatedmessage' => 'Die databasis is outomaties gesluit omdat die administrateurs nie aktief is nie.',
'fuzzymessage' => "Sluit die wiki outomaties as die administrateurs vir 'n geruime tyd nie aktief is nie",
-);
+];
/** Gheg Albanian (Gegë)
* @author Bresta
*/
-$messages['aln'] = array(
+$messages['aln'] = [
'translatedmessage' => 'Baza e të dhânave âsht bllokue automatikisht për shkak të mosaktivitetit të administruesve.',
'fuzzymessage' => 'E vetë-bllokon bazën e të dhânave nëse administruesit janë joaktiv për nji kohë të caktueme.',
-);
+];
/** Arabic (العربية)
* @author Meno25
* @author OsamaK
*/
-$messages['ar'] = array(
+$messages['ar'] = [
'translatedmessage' => 'تم غلق قاعدة البيانات تلقائيا نظرا لعدم نشاط مدراء النظام.',
'fuzzymessage' => 'قفل قاعدة بيانات الويكي تلقائيا إذا كان كل مدراء النظام غير نشطين لبعض الوقت',
-);
+];
diff --git a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf2.yaml b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf2.yaml
index 30aad12d..a4b0a979 100644
--- a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf2.yaml
+++ b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf2.yaml
@@ -21,7 +21,7 @@ VALIDATORS:
- id: MediaWikiPlural
INSERTABLES:
- class: MediaWikiInsertablesSuggester
+ - class: MediaWikiInsertablesSuggester
MANGLER:
class: StringMatcher
diff --git a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf3.yaml b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf3.yaml
index dc738bb9..38c32133 100644
--- a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf3.yaml
+++ b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf3.yaml
@@ -18,7 +18,7 @@ VALIDATORS:
- id: MediaWikiPlural
INSERTABLES:
- class: MediaWikiInsertablesSuggester
+ - class: MediaWikiInsertablesSuggester
TAGS:
optional:
diff --git a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf4.yaml b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf4.yaml
index 2e0eac27..eaf6f919 100644
--- a/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf4.yaml
+++ b/MLEB/Translate/tests/phpunit/data/MediaWikiExtensionTest-conf4.yaml
@@ -18,7 +18,7 @@ VALIDATORS:
- id: MediaWikiPlural
INSERTABLES:
- class: MediaWikiInsertablesSuggester
+ - class: MediaWikiInsertablesSuggester
TAGS:
optional:
diff --git a/MLEB/Translate/tests/phpunit/data/check-blacklist.php b/MLEB/Translate/tests/phpunit/data/check-blacklist.php
index d4c2ca19..580ba437 100644
--- a/MLEB/Translate/tests/phpunit/data/check-blacklist.php
+++ b/MLEB/Translate/tests/phpunit/data/check-blacklist.php
@@ -1,7 +1,13 @@
<?php
+
$checkBlacklist = [
[
'check' => 'plural',
'code' => [ 'en-gb' ]
+ ],
+ [
+ 'message' => [
+ 'regex-key-test'
+ ]
]
];
diff --git a/MLEB/Translate/tests/phpunit/ffs/AmdFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/AmdFFSTest.php
index 4d2fb0a6..0bb8ac5f 100644
--- a/MLEB/Translate/tests/phpunit/ffs/AmdFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/AmdFFSTest.php
@@ -8,12 +8,10 @@
* @license GPL-2.0-or-later
*/
-/**
- * @see AmdFFS
- */
+/** @covers \AmdFFS */
class AmdFFSTest extends MediaWikiIntegrationTestCase {
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->groupConfiguration = [
'BASIC' => [
@@ -33,13 +31,9 @@ class AmdFFSTest extends MediaWikiIntegrationTestCase {
protected $groupConfiguration;
- /**
- * @dataProvider amdProvider
- */
+ /** @dataProvider amdProvider */
public function testParsing( $messages, $authors, $file ) {
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new AmdFFS( $group );
$parsed = $ffs->readFromVariable( $file );
@@ -98,9 +92,7 @@ JS;
public function testExport() {
$collection = new MockMessageCollectionForExport();
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new AmdFFS( $group );
$data = $ffs->writeIntoVariable( $collection );
diff --git a/MLEB/Translate/tests/phpunit/ffs/AndroidXmlFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/AndroidXmlFFSTest.php
index ac415cf0..150f6b8b 100644
--- a/MLEB/Translate/tests/phpunit/ffs/AndroidXmlFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/AndroidXmlFFSTest.php
@@ -1,11 +1,17 @@
<?php
+declare( strict_types = 1 );
+
/**
- * @file
* @author Niklas Laxström
* @license GPL-2.0-or-later
+ * @covers \AndroidXmlFFS
*/
-
class AndroidXmlFFSTest extends MediaWikiIntegrationTestCase {
+ private const DOCLANG = 'qqq';
+
+ protected function setUp(): void {
+ $this->setMwGlobals( 'wgTranslateDocumentationLanguageCode', self::DOCLANG );
+ }
protected $groupConfiguration = [
'BASIC' => [
@@ -45,9 +51,7 @@ class AndroidXmlFFSTest extends MediaWikiIntegrationTestCase {
</resources>
XML;
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new AndroidXmlFFS( $group );
$parsed = $ffs->readFromVariable( $file );
@@ -73,9 +77,7 @@ XML;
}
public function testWrite() {
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new AndroidXmlFFS( $group );
@@ -104,19 +106,43 @@ XML;
];
$this->assertEquals( $expected, $parsed );
}
+
+ public function testWriteDoc() {
+ /** @var FileBasedMessageGroup $group */
+ $group = MessageGroupBase::factory( $this->groupConfiguration );
+ $ffs = new AndroidXmlFFS( $group );
+
+ $messages = [
+ 'a' => 'b',
+ ];
+
+ $collection = new MockMessageCollection( $messages, self::DOCLANG );
+
+ $actual = $ffs->writeIntoVariable( $collection );
+ $expected = <<<'XML'
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="all">
+ <string name="a">b</string>
+</resources>
+
+XML;
+ $this->assertEquals( $expected, $actual );
+ }
}
class MockMessageCollection extends MessageCollection {
- public function __construct( $messages ) {
+ public function __construct( array $messages, string $code = 'en' ) {
+ $this->code = $code;
$keys = array_keys( $messages );
$this->keys = array_combine( $keys, $keys );
foreach ( $messages as $key => $value ) {
$m = new FatMessage( $key, $value );
$m->setTranslation( $value );
+ if ( $key === 'foobar' ) {
+ $m->addTag( 'fuzzy' );
+ }
$this->messages[$key] = $m;
}
-
- $this->messages['foobar']->addTag( 'fuzzy' );
}
public function filter( $type, $condition = true, $value = null ) {
diff --git a/MLEB/Translate/tests/phpunit/ffs/AppleFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/AppleFFSTest.php
index 5abb5d51..eac4d660 100644
--- a/MLEB/Translate/tests/phpunit/ffs/AppleFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/AppleFFSTest.php
@@ -42,9 +42,7 @@ On two lines! */
"key-with-{curlies}" = "Value that can be looked up with \"key-with-{curlies}\".";
STRINGS;
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new AppleFFS( $group );
$parsed = $ffs->readFromVariable( $file );
@@ -62,9 +60,7 @@ STRINGS;
$this->assertEquals( $expected, $parsed );
}
- /**
- * @dataProvider rowValuesProvider
- */
+ /** @dataProvider rowValuesProvider */
public function testRowRoundtrip( $key, $value, $comment ) {
$write = AppleFFS::writeRow( $key, $value );
// Trim the trailing newline
diff --git a/MLEB/Translate/tests/phpunit/ffs/AppleInfoPlistFfsTest.php b/MLEB/Translate/tests/phpunit/ffs/AppleInfoPlistFfsTest.php
index 05220dc0..d5295da6 100644
--- a/MLEB/Translate/tests/phpunit/ffs/AppleInfoPlistFfsTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/AppleInfoPlistFfsTest.php
@@ -8,9 +8,7 @@
* @file
*/
-/**
- * @covers AppleInfoPlistFfs
- */
+/** @covers AppleInfoPlistFfs */
class AppleInfoPlistFfsTest extends MediaWikiIntegrationTestCase {
protected $groupConfigurationInfoPList = [
diff --git a/MLEB/Translate/tests/phpunit/ffs/DtdFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/DtdFFSTest.php
index 357314f2..b5bb5ff3 100644
--- a/MLEB/Translate/tests/phpunit/ffs/DtdFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/DtdFFSTest.php
@@ -38,9 +38,7 @@ class DtdFFSTest extends MediaWikiIntegrationTestCase {
"Retro">
DTD;
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new DtdFFS( $group );
$parsed = $ffs->readFromVariable( $file );
diff --git a/MLEB/Translate/tests/phpunit/ffs/GettextFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/GettextFFSTest.php
index 291164ba..bf8c0606 100644
--- a/MLEB/Translate/tests/phpunit/ffs/GettextFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/GettextFFSTest.php
@@ -8,13 +8,11 @@
* @license GPL-2.0-or-later
*/
-/**
- * @see GettextFFS
- */
+/** @covers \GettextFFS */
class GettextFFSTest extends MediaWikiIntegrationTestCase {
protected $groupConfiguration;
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->groupConfiguration = [
'BASIC' => [
@@ -31,9 +29,7 @@ class GettextFFSTest extends MediaWikiIntegrationTestCase {
];
}
- /**
- * @dataProvider provideMangling
- */
+ /** @dataProvider provideMangling */
public function testMangling( $expected, $item, $algo ) {
$this->assertEquals( $expected, GettextFFS::generateKeyFromItem( $item, $algo ) );
}
@@ -156,9 +152,7 @@ GETTEXT;
);
}
- /**
- * @dataProvider provideShouldOverwrite
- */
+ /** @dataProvider provideShouldOverwrite */
public function testShouldOverwrite( $a, $b, $expected, $comment ) {
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new GettextFFS( $group );
diff --git a/MLEB/Translate/tests/phpunit/ffs/IniFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/IniFFSTest.php
index 0af4cd9a..b1c218f5 100644
--- a/MLEB/Translate/tests/phpunit/ffs/IniFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/IniFFSTest.php
@@ -27,9 +27,7 @@ class IniFFSTest extends MediaWikiIntegrationTestCase {
public function testParsing() {
$file = file_get_contents( __DIR__ . '/../data/IniFFSTest1.ini' );
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new IniFFS( $group );
@@ -48,6 +46,9 @@ class IniFFSTest extends MediaWikiIntegrationTestCase {
'AUTHORS' => [ 'The king of very small kingdom' ]
];
$this->assertEquals( $expected, $parsed );
+
+ $invalidContent = 'Invalid-Ini-Content';
+ $this->assertFalse( IniFFS::isValid( $invalidContent ) );
}
public function testExport() {
@@ -56,9 +57,7 @@ class IniFFSTest extends MediaWikiIntegrationTestCase {
$file = str_replace( '$wgSitename', $wgSitename, $file );
$collection = new MockMessageCollectionForExport();
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new IniFFS( $group );
$this->assertEquals( $file, $ffs->writeIntoVariable( $collection ) );
diff --git a/MLEB/Translate/tests/phpunit/ffs/JavaFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/JavaFFSTest.php
index cef493e0..685475cd 100644
--- a/MLEB/Translate/tests/phpunit/ffs/JavaFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/JavaFFSTest.php
@@ -39,9 +39,7 @@ key\ with\ spaces = Value that can be looked up with "key with spaces".
key-with-{curlies} = Value that can be looked up with "key-with-{curlies}".
PROPERTIES;
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new JavaFFS( $group );
$parsed = $ffs->readFromVariable( $file );
@@ -57,9 +55,7 @@ PROPERTIES;
$this->assertEquals( $expected, $parsed );
}
- /**
- * @dataProvider rowValuesProvider
- */
+ /** @dataProvider rowValuesProvider */
public function testRowRoundtrip( $key, $sep, $value, $comment ) {
$write = JavaFFS::writeRow( $key, $sep, $value );
// Trim the trailing newline
diff --git a/MLEB/Translate/tests/phpunit/ffs/JsonFFSTest.php b/MLEB/Translate/tests/phpunit/ffs/JsonFFSTest.php
index 37f7a092..4fd15049 100644
--- a/MLEB/Translate/tests/phpunit/ffs/JsonFFSTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/JsonFFSTest.php
@@ -8,12 +8,10 @@
* @license GPL-2.0-or-later
*/
-/**
- * @see JsonFFS
- */
+/** @covers \JsonFFS */
class JsonFFSTest extends MediaWikiIntegrationTestCase {
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->groupConfiguration = [
'BASIC' => [
@@ -33,13 +31,9 @@ class JsonFFSTest extends MediaWikiIntegrationTestCase {
protected $groupConfiguration;
- /**
- * @dataProvider jsonProvider
- */
+ /** @dataProvider jsonProvider */
public function testParsing( $messages, $authors, $file ) {
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new JsonFFS( $group );
$parsed = $ffs->readFromVariable( $file );
@@ -112,9 +106,7 @@ JSON;
public function testExport() {
$collection = new MockMessageCollectionForExport();
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
$group = MessageGroupBase::factory( $this->groupConfiguration );
$ffs = new JsonFFS( $group );
$data = $ffs->writeIntoVariable( $collection );
diff --git a/MLEB/Translate/tests/phpunit/ffs/MediaWikiExtensionsTest.php b/MLEB/Translate/tests/phpunit/ffs/MediaWikiExtensionsTest.php
index db823da8..a2dc72eb 100644
--- a/MLEB/Translate/tests/phpunit/ffs/MediaWikiExtensionsTest.php
+++ b/MLEB/Translate/tests/phpunit/ffs/MediaWikiExtensionsTest.php
@@ -1,4 +1,5 @@
<?php
+
/**
* Test for parsing the special definition file for mediawiki-extensions
* @author Niklas Laxström
@@ -16,8 +17,8 @@ class MediaWikiExtensionsTest extends PHPUnit\Framework\TestCase {
$list = $deps = $autoload = [];
$foo->register( $list, $deps, $autoload );
- $this->assertSame( 1, count( $deps ), 'A dependency to definition file was added' );
- $this->assertEquals( 5, count( $list ), 'Right number of groups were created' );
+ $this->assertCount( 1, $deps, 'A dependency to definition file was added' );
+ $this->assertCount( 5, $list, 'Right number of groups were created' );
$this->assertArrayHasKey( 'ext-wikimediamessages', $list );
$expected = TranslateYaml::load( __DIR__ . '/../data/MediaWikiExtensionTest-conf2.yaml' );
@@ -33,8 +34,8 @@ class MediaWikiExtensionsTest extends PHPUnit\Framework\TestCase {
$this->assertArrayHasKey( 'ext-languagesmodified', $list );
$languages = $list['ext-languagesmodified']->getTranslatableLanguages();
- $this->assertArrayHasKey( 'foo', $languages, 'Whitelisted language is available' );
- $this->assertArrayNotHasKey( 'bar', $languages, 'Blacklisted language is not available' );
+ $this->assertArrayHasKey( 'foo', $languages, 'Included language is available' );
+ $this->assertArrayNotHasKey( 'bar', $languages, 'Excluded language is not available' );
$this->assertArrayHasKey( 'de', $languages, 'Default language is available' );
$this->assertArrayHasKey( 'ext-languagesset', $list );
diff --git a/MLEB/Translate/tests/phpunit/helpers/TranslatablePageTestTrait.php b/MLEB/Translate/tests/phpunit/helpers/TranslatablePageTestTrait.php
index d3e0e744..bed15548 100644
--- a/MLEB/Translate/tests/phpunit/helpers/TranslatablePageTestTrait.php
+++ b/MLEB/Translate/tests/phpunit/helpers/TranslatablePageTestTrait.php
@@ -29,7 +29,7 @@ trait TranslatablePageTestTrait {
* @param string $title
* @param string $content
* @param User $creator
- * @return void
+ * @return TranslatablePage
*/
public function createMarkedTranslatablePage(
string $title, string $content, User $creator
diff --git a/MLEB/Translate/tests/phpunit/messagegroups/AggregateMessageGroupLoaderTest.php b/MLEB/Translate/tests/phpunit/messagegroups/AggregateMessageGroupLoaderTest.php
index de375715..3dd40e24 100644
--- a/MLEB/Translate/tests/phpunit/messagegroups/AggregateMessageGroupLoaderTest.php
+++ b/MLEB/Translate/tests/phpunit/messagegroups/AggregateMessageGroupLoaderTest.php
@@ -1,14 +1,7 @@
<?php
-/**
- * @group Database
- */
+/** @group Database */
class AggregateMessageGroupLoaderTest extends PHPUnit\Framework\TestCase {
- /**
- * @var AggregateMessageGroup
- */
- protected $mgAggregateLoader;
-
public function testCacheCalls() {
/** @var MessageGroupWANCache $mockMgWANCache */
$mockMgWANCache = $this->getMockBuilder( MessageGroupWANCache::class )
diff --git a/MLEB/Translate/tests/phpunit/messagegroups/FileBasedMessageGroupLoaderTest.php b/MLEB/Translate/tests/phpunit/messagegroups/FileBasedMessageGroupLoaderTest.php
index b1364dc1..fff76def 100644
--- a/MLEB/Translate/tests/phpunit/messagegroups/FileBasedMessageGroupLoaderTest.php
+++ b/MLEB/Translate/tests/phpunit/messagegroups/FileBasedMessageGroupLoaderTest.php
@@ -1,12 +1,10 @@
<?php
class FileBasedMessageGroupLoaderTest extends MediaWikiIntegrationTestCase {
- /**
- * @var FileBasedMessageGroupLoader
- */
+ /** @var FileBasedMessageGroupLoader */
protected $mgFileLoader;
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$conf = [
diff --git a/MLEB/Translate/tests/phpunit/messagegroups/MessageGroupLoaderTest.php b/MLEB/Translate/tests/phpunit/messagegroups/MessageGroupLoaderTest.php
index 4d4bcc37..74df03cb 100644
--- a/MLEB/Translate/tests/phpunit/messagegroups/MessageGroupLoaderTest.php
+++ b/MLEB/Translate/tests/phpunit/messagegroups/MessageGroupLoaderTest.php
@@ -1,9 +1,10 @@
<?php
+
class MessageGroupLoaderTest extends MediaWikiIntegrationTestCase {
protected $cacheLoaderMock;
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->cacheLoaderMock = $this->createMock( MockCacheMessageGroupLoader::class );
diff --git a/MLEB/Translate/tests/phpunit/messagegroups/TranslatablePageMessageGroupStoreTest.php b/MLEB/Translate/tests/phpunit/messagegroups/TranslatablePageMessageGroupStoreTest.php
index a9395d1b..d6877db9 100644
--- a/MLEB/Translate/tests/phpunit/messagegroups/TranslatablePageMessageGroupStoreTest.php
+++ b/MLEB/Translate/tests/phpunit/messagegroups/TranslatablePageMessageGroupStoreTest.php
@@ -1,16 +1,13 @@
<?php
-/**
- * @group Database
- */
+
+/** @group Database */
class TranslatablePageMessageGroupStoreTest extends MediaWikiIntegrationTestCase {
use TranslatablePageTestTrait;
- /**
- * @var TranslatablePageMessageGroupStore
- */
+ /** @var TranslatablePageMessageGroupStore */
protected $mgTranslateStore;
- public function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
diff --git a/MLEB/Translate/tests/phpunit/mocks/MockCacheMessageGroupLoader.php b/MLEB/Translate/tests/phpunit/mocks/MockCacheMessageGroupLoader.php
index fcb386fb..11278337 100644
--- a/MLEB/Translate/tests/phpunit/mocks/MockCacheMessageGroupLoader.php
+++ b/MLEB/Translate/tests/phpunit/mocks/MockCacheMessageGroupLoader.php
@@ -1,4 +1,5 @@
<?php
+
class MockCacheMessageGroupLoader extends MessageGroupLoader
implements CachedMessageGroupLoader {
diff --git a/MLEB/Translate/tests/phpunit/mocks/MockCustomInsertableSuggester.php b/MLEB/Translate/tests/phpunit/mocks/MockCustomInsertableSuggester.php
new file mode 100644
index 00000000..350e6643
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/mocks/MockCustomInsertableSuggester.php
@@ -0,0 +1,10 @@
+<?php
+declare( strict_types = 1 );
+
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertablesSuggester;
+
+class MockCustomInsertableSuggester implements InsertablesSuggester {
+ public function getInsertables( string $text ): array {
+ return [ new Insertable( 'test' ) ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/mocks/MockValidators.php b/MLEB/Translate/tests/phpunit/mocks/MockValidators.php
index 9f066b68..14e11a70 100644
--- a/MLEB/Translate/tests/phpunit/mocks/MockValidators.php
+++ b/MLEB/Translate/tests/phpunit/mocks/MockValidators.php
@@ -7,9 +7,9 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
class MockTranslateValidator implements MessageValidator {
public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
diff --git a/MLEB/Translate/tests/phpunit/mocks/MockWikiMessageGroup.php b/MLEB/Translate/tests/phpunit/mocks/MockWikiMessageGroup.php
index ad257d57..fc50c4b2 100644
--- a/MLEB/Translate/tests/phpunit/mocks/MockWikiMessageGroup.php
+++ b/MLEB/Translate/tests/phpunit/mocks/MockWikiMessageGroup.php
@@ -1,4 +1,7 @@
<?php
+
+use MediaWiki\Extension\Translate\Validation\ValidationRunner;
+
/**
* This file contains multiple unmanaged message group implementation.
*
@@ -33,7 +36,7 @@ class MockWikiMessageGroup extends WikiMessageGroup {
*/
class MockWikiValidationMessageGroup extends MockWikiMessageGroup {
public function getValidator() {
- $validator = new MessageValidator( $this->getId() );
+ $validator = new ValidationRunner( $this->getId() );
$validator->setValidators( [
[ 'class' => AnotherMockTranslateValidator::class ],
[
diff --git a/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSubClass.php b/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSubClass.php
new file mode 100644
index 00000000..0170c536
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSubClass.php
@@ -0,0 +1,42 @@
+<?php
+declare( strict_types = 1 );
+
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializableTrait;
+
+/**
+ * Testing class for JsonCodec unit tests.
+ * Remove once we need to support only MW >= 1.36
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ *
+ * @license GPL-2.0-or-later
+ */
+class MockJsonUnserializableSubClass extends MockJsonUnserializableSuperClass {
+ use JsonUnserializableTrait;
+
+ /** @var string */
+ private $subClassField;
+
+ public function __construct( string $superClassFieldValue, string $subClassFieldValue ) {
+ parent::__construct( $superClassFieldValue );
+ $this->subClassField = $subClassFieldValue;
+ }
+
+ public function getSubClassField(): string {
+ return $this->subClassField;
+ }
+
+ /**
+ * @param string[] $json
+ * @return self
+ */
+ public static function newFromJsonArray( array $json ) {
+ return new self( $json['super_class_field'], $json['sub_class_field'] );
+ }
+
+ /** @return string[] */
+ protected function toJsonArray(): array {
+ return parent::toJsonArray() + [
+ 'sub_class_field' => $this->getSubClassField()
+ ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSuperClass.php b/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSuperClass.php
new file mode 100644
index 00000000..1da38f25
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/mocks/json/MockJsonUnserializableSuperClass.php
@@ -0,0 +1,42 @@
+<?php
+declare( strict_types = 1 );
+
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializable;
+use MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializableTrait;
+
+/**
+ * Testing class for JsonCodec unit tests.
+ * Remove once we need to support only MW >= 1.36
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ *
+ * @license GPL-2.0-or-later
+ */
+class MockJsonUnserializableSuperClass implements JsonUnserializable, JsonSerializable {
+ use JsonUnserializableTrait;
+
+ /** @var string */
+ private $superClassField;
+
+ public function __construct( string $superClassFieldValue ) {
+ $this->superClassField = $superClassFieldValue;
+ }
+
+ public function getSuperClassField(): string {
+ return $this->superClassField;
+ }
+
+ /**
+ * @param string[] $json
+ * @return self
+ */
+ public static function newFromJsonArray( array $json ) {
+ return new self( $json['super_class_field'] );
+ }
+
+ /** @return string[] */
+ protected function toJsonArray(): array {
+ return [
+ 'super_class_field' => $this->getSuperClassField()
+ ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/tag/PageTranslationHooksTest.php b/MLEB/Translate/tests/phpunit/tag/PageTranslationHooksTest.php
index 372f15d6..06d4f0da 100644
--- a/MLEB/Translate/tests/phpunit/tag/PageTranslationHooksTest.php
+++ b/MLEB/Translate/tests/phpunit/tag/PageTranslationHooksTest.php
@@ -15,7 +15,7 @@ use MediaWiki\Revision\RevisionRecord;
* @group medium
*/
class PageTranslationHooksTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -95,15 +95,14 @@ class PageTranslationHooksTest extends MediaWikiIntegrationTestCase {
// Check that our code works for translation pages
$parserOutput = $parser->parse( 'fi-pupu', $translationPageTitle, $options );
$actual = $parserOutput->getExtensionData( 'translate-translation-page' );
- $expected = [
- 'sourcepagetitle' => $translatablePageTitle,
- 'languagecode' => 'fi',
- 'messagegroupid' => 'page-Vuosaari',
- ];
- $this->assertTrue( is_array( $actual ), 'Extension data is set on marked page' );
+ $this->assertIsArray( $actual, 'Extension data is set on marked page' );
+ $actualTitle = Title::makeTitle(
+ $actual[ 'sourcepagetitle' ][ 'namespace' ],
+ $actual[ 'sourcepagetitle' ][ 'dbkey' ]
+ );
$this->assertSame(
'Vuosaari',
- $actual[ 'sourcepagetitle' ]->getPrefixedText(),
+ $actualTitle->getPrefixedText(),
'Source page title is correct'
);
$this->assertSame(
@@ -145,9 +144,7 @@ class PageTranslationHooksTest extends MediaWikiIntegrationTestCase {
"translation with errors is saved if user with 'translate-manage' permission is translating." );
}
- /**
- * @covers PageTranslationHooks::updateTranstagOnNullRevisions
- */
+ /** @covers PageTranslationHooks::updateTranstagOnNullRevisions */
public function testTagNullRevision() {
$title = Title::newFromText( 'translated' );
$status = $this->editPage(
diff --git a/MLEB/Translate/tests/phpunit/tag/PageTranslationParserTest.php b/MLEB/Translate/tests/phpunit/tag/PageTranslationParserTest.php
index 7708b121..99909715 100644
--- a/MLEB/Translate/tests/phpunit/tag/PageTranslationParserTest.php
+++ b/MLEB/Translate/tests/phpunit/tag/PageTranslationParserTest.php
@@ -1,59 +1,67 @@
<?php
-/**
- * @author Niklas Laxström
- * @copyright Copyright © 2010-2013, Niklas Laxström
- * @license GPL-2.0-or-later
- * @file
- */
+declare( strict_types = 1 );
+
+use MediaWiki\Extension\Translate\PageTranslation\ParserOutput;
+use MediaWiki\Extension\Translate\PageTranslation\ParsingFailure;
+use MediaWiki\Extension\Translate\PageTranslation\TestingParsingPlaceholderFactory;
+use MediaWiki\Extension\Translate\PageTranslation\TranslatablePageParser;
+use MediaWiki\Extension\Translate\PageTranslation\TranslationPage;
/**
* Custom testing framework for page translation parser.
* @ingroup PageTranslation
- * @group Database
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
*/
class PageTranslationParserTest extends MediaWikiIntegrationTestCase {
public static function provideTestFiles() {
$dir = __DIR__;
$testFiles = glob( "$dir/pagetranslation/*.ptfile" );
foreach ( $testFiles as $i => $file ) {
- $testFiles[$i] = [ $file ];
+ $testFiles[$i] = [ basename( $file, '.ptfile' ), $file ];
}
return $testFiles;
}
- /**
- * @dataProvider provideTestFiles
- */
- public function testParsing( $file ) {
- $filename = basename( $file );
- list( $pagename, ) = explode( '.', $filename, 2 );
- $title = Title::newFromText( $pagename );
- $translatablePage = TranslatablePage::newFromText( $title, file_get_contents( $file ) );
-
- $pattern = dirname( $file ) . "/$pagename";
-
- if ( $filename === 'FailNotAtomic.ptfile' ) {
+ /** @dataProvider provideTestFiles */
+ public function testParsing( string $name, string $file ) {
+ if ( $name === 'FailNotAtomic' ) {
$this->markTestSkipped( 'Extended validation not yet implemented' );
}
- $failureExpected = strpos( $pagename, 'Fail' ) === 0;
+ if ( $name !== 'Whitespace' ) {
+ $this->markTestSkipped( 'Extended validation not yet implemented' );
+ }
- if ( $failureExpected ) {
- $this->expectException( TPException::class );
+ if ( strpos( $name, 'Fail' ) === 0 ) {
+ $this->expectException( ParsingFailure::class );
}
- $parse = $translatablePage->getParse();
- $this->assertInstanceOf( 'TPParse', $parse );
+ $title = Title::newFromText( $name );
+ $inputSourceText = file_get_contents( $file );
+ $parser = new TranslatablePageParser( new TestingParsingPlaceholderFactory() );
+ $parserOutput = $parser->parse( $inputSourceText );
+
+ $pattern = dirname( $file ) . "/$name";
if ( file_exists( "$pattern.ptsource" ) ) {
- $source = $parse->getSourcePageText();
- $this->assertEquals( file_get_contents( "$pattern.ptsource" ), $source );
+ $source = $parserOutput->sourcePageTextForSaving();
+ $this->assertSame(
+ file_get_contents( "$pattern.ptsource" ),
+ $source,
+ 'Marked source text is as expected'
+ );
}
if ( file_exists( "$pattern.pttarget" ) ) {
- $target = $parse->getTranslationPageText( [] );
- $this->assertEquals( file_get_contents( "$pattern.pttarget" ), $target );
+ $translationPage = $this->getTranslationPage( $title, $parserOutput );
+ $target = $translationPage->generateSourceFromTranslations( [] );
+ $this->assertEquals(
+ file_get_contents( "$pattern.pttarget" ),
+ $target,
+ 'Generated translation page text is as expected'
+ );
}
// Custom tests written in php
@@ -61,4 +69,23 @@ class PageTranslationParserTest extends MediaWikiIntegrationTestCase {
require "$pattern.pttest";
}
}
+
+ // This is copy of TranslatablePage::getTranslationPage, to mock WikiPageMessageGroup
+ private function getTranslationPage(
+ Title $title,
+ ParserOutput $parserOutput
+ ): TranslationPage {
+ $showOutdated = false;
+ $wrapUntranslated = false;
+
+ return new TranslationPage(
+ $parserOutput,
+ $this->createMock( WikiPageMessageGroup::class ),
+ Language::factory( 'en' ),
+ Language::factory( 'en' ),
+ $showOutdated,
+ $wrapUntranslated,
+ $title->getPrefixedDBkey() . '/'
+ );
+ }
}
diff --git a/MLEB/Translate/tests/phpunit/tag/PageTranslationTaggingTest.php b/MLEB/Translate/tests/phpunit/tag/PageTranslationTaggingTest.php
index 636e486b..264e813c 100644
--- a/MLEB/Translate/tests/phpunit/tag/PageTranslationTaggingTest.php
+++ b/MLEB/Translate/tests/phpunit/tag/PageTranslationTaggingTest.php
@@ -7,7 +7,7 @@ use MediaWiki\MediaWikiServices;
* @group medium
*/
class PageTranslationTaggingTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
@@ -34,7 +34,7 @@ class PageTranslationTaggingTest extends MediaWikiIntegrationTestCase {
$translatablePage = TranslatablePage::newFromTitle( $title );
$content = ContentHandler::makeContent( 'kissa', $title );
- $page->doEditContent( $content, 'Test case' );
+ $page->doEditContent( $content, 'Test case' );
$this->assertFalse( $translatablePage->getReadyTag(), 'No ready tag was added' );
$this->assertFalse( $translatablePage->getMarkedTag(), 'No marked tag was added' );
diff --git a/MLEB/Translate/tests/phpunit/tag/TranslatablePageIntegrationTest.php b/MLEB/Translate/tests/phpunit/tag/TranslatablePageIntegrationTest.php
index e901e56a..ed1c42e9 100644
--- a/MLEB/Translate/tests/phpunit/tag/TranslatablePageIntegrationTest.php
+++ b/MLEB/Translate/tests/phpunit/tag/TranslatablePageIntegrationTest.php
@@ -11,7 +11,7 @@ use MediaWiki\MediaWikiServices;
class TranslatablePageIntegrationTest extends MediaWikiIntegrationTestCase {
use TranslatablePageTestTrait;
- public function setUp(): void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
diff --git a/MLEB/Translate/tests/phpunit/tag/pagetranslation/NowikiOnly.pttest b/MLEB/Translate/tests/phpunit/tag/pagetranslation/NowikiOnly.pttest
index 69d14eaa..0923d10e 100644
--- a/MLEB/Translate/tests/phpunit/tag/pagetranslation/NowikiOnly.pttest
+++ b/MLEB/Translate/tests/phpunit/tag/pagetranslation/NowikiOnly.pttest
@@ -2,6 +2,4 @@
if ( !defined( 'MEDIAWIKI' ) ) die();
-if ( $parse->countSections() !== 0 ) {
- $this->fail( "Testfile $filename failed misc tests... number of sections should be zero" );
-}
+$this->assertEmpty( $parserOutput->units(), 'number of sections should be zero' );
diff --git a/MLEB/Translate/tests/phpunit/translationaids/TranslationAidDataProviderTest.php b/MLEB/Translate/tests/phpunit/translationaids/TranslationAidDataProviderTest.php
index 0d3e19c6..b82c4486 100644
--- a/MLEB/Translate/tests/phpunit/translationaids/TranslationAidDataProviderTest.php
+++ b/MLEB/Translate/tests/phpunit/translationaids/TranslationAidDataProviderTest.php
@@ -6,7 +6,7 @@
*/
class TranslationAidDataProviderTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setMwGlobals( [
'wgTranslateMessageNamespaces' => [ NS_MEDIAWIKI ]
diff --git a/MLEB/Translate/tests/phpunit/unit/PageTranslation/ParserOutputTest.php b/MLEB/Translate/tests/phpunit/unit/PageTranslation/ParserOutputTest.php
new file mode 100644
index 00000000..93f35c8d
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/PageTranslation/ParserOutputTest.php
@@ -0,0 +1,98 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use InvalidArgumentException;
+use Language;
+use MediaWikiUnitTestCase;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\PageTranslation\ParserOutput
+ */
+class ParserOutputTest extends MediaWikiUnitTestCase {
+ public function testConstructor() {
+ $actual = new ParserOutput( '', [], [] );
+ $this->assertInstanceOf( ParserOutput::class, $actual );
+ }
+
+ public function testConstructorFail() {
+ $this->expectException( InvalidArgumentException::class );
+ $actual = new ParserOutput( '', [ (object)[] ], [] );
+ $this->assertInstanceOf( ParserOutput::class, $actual );
+ }
+
+ public function testConstructorFail2() {
+ $this->expectException( InvalidArgumentException::class );
+ $actual = new ParserOutput( '', [], [ (object)[] ] );
+ $this->assertInstanceOf( ParserOutput::class, $actual );
+ }
+
+ public function testSourcePageTemplate() {
+ $output = new ParserOutput(
+ 'A<0>B',
+ [ '<0>' => new Section( '<translate>', '<1>', '</translate>' ) ],
+ []
+ );
+
+ $this->assertSame( 'A<translate><1></translate>B', $output->sourcePageTemplate() );
+ }
+
+ public function testTranslationPageTemplate() {
+ $output = new ParserOutput(
+ 'A<0>B',
+ [ '<0>' => new Section( '<translate>', '<1>', '</translate>' ) ],
+ []
+ );
+
+ $this->assertSame( 'A<1>B', $output->translationPageTemplate() );
+ }
+
+ public function testUnits() {
+ $units = [];
+ $units['<1>'] = new TranslationUnit();
+
+ $output = new ParserOutput(
+ 'A<0>B',
+ [ '<0>' => new Section( '<translate>', '<1>', '</translate>' ) ],
+ $units
+ );
+
+ $this->assertSame( $units, $output->units() );
+ }
+
+ public function testSourcePageTextForRendering() {
+ $units = [];
+ $units['<1>'] = new TranslationUnit();
+ $units['<1>']->text = 'Hello';
+
+ $output = new ParserOutput(
+ 'A<0>B',
+ [ '<0>' => new Section( '<translate>', '<1>', '</translate>' ) ],
+ $units
+ );
+
+ $language = $this->createStub( Language::class );
+ $language->method( 'getHtmlCode' )->willReturn( 'en-GB' );
+
+ $this->assertSame( 'AHelloB', $output->sourcePageTextForRendering( $language ) );
+ }
+
+ public function testSourcePageTextForSaving() {
+ $units = [];
+ $units['<1>'] = new TranslationUnit();
+ $units['<1>']->text = 'Hello';
+ $units['<1>']->id = 'abc';
+ $units['<1>']->setIsInline( true );
+
+ $output = new ParserOutput(
+ 'A<0>B',
+ [ '<0>' => new Section( '<translate>', '<1>', '</translate>' ) ],
+ $units
+ );
+
+ $this->assertSame( 'A<translate><!--T:abc--> Hello</translate>B', $output->sourcePageTextForSaving() );
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/unit/PageTranslation/SectionTest.php b/MLEB/Translate/tests/phpunit/unit/PageTranslation/SectionTest.php
new file mode 100644
index 00000000..1cfcb5f1
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/PageTranslation/SectionTest.php
@@ -0,0 +1,23 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWikiUnitTestCase;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\PageTranslation\Section
+ */
+class SectionTest extends MediaWikiUnitTestCase {
+ public function test() {
+ $section = new Section( '<translate>', '2045903458', '</translate>' );
+ $this->assertSame( '2045903458', $section->contents() );
+ $this->assertSame( '<translate>2045903458</translate>', $section->wrappedContents() );
+
+ $section = new Section( '<translate>', "\n\n<0>\n\n", '</translate>' );
+ $this->assertSame( "\n<0>\n", $section->contents() );
+ $this->assertSame( "<translate>\n\n<0>\n\n</translate>", $section->wrappedContents() );
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/insertables/TranslatablePageInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageInsertablesSuggesterTest.php
index 7d3e6198..fbf36125 100644
--- a/MLEB/Translate/tests/phpunit/insertables/TranslatablePageInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageInsertablesSuggesterTest.php
@@ -5,10 +5,14 @@
* @license GPL-2.0-or-later
*/
-class TranslatablePageInsertablesSuggesterTest extends PHPUnit\Framework\TestCase {
- /**
- * @dataProvider getInsertablesProvider
- */
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWiki\Extension\Translate\TranslatorInterface\Insertable\Insertable;
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\PageTranslation\TranslatablePageInsertablesSuggester */
+class TranslatablePageInsertablesSuggesterTest extends MediaWikiUnitTestCase {
+ /** @dataProvider getInsertablesProvider */
public function testGetInsertables( $input, $expected ) {
$suggester = new TranslatablePageInsertablesSuggester();
$this->assertEquals( $expected, $suggester->getInsertables( $input ) );
diff --git a/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageParserTest.php b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageParserTest.php
new file mode 100644
index 00000000..17a1a706
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslatablePageParserTest.php
@@ -0,0 +1,349 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
+use MediaWikiUnitTestCase;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\PageTranslation\TranslatablePageParser
+ */
+class TranslatablePageParserTest extends MediaWikiUnitTestCase {
+ /** @dataProvider provideTestContainsMarkup */
+ public function testContainsMarkup( string $input, bool $expected ) {
+ $parser = new TranslatablePageParser( new ParsingPlaceholderFactory() );
+ $this->assertSame( $expected, $parser->containsMarkup( $input ) );
+ }
+
+ public function provideTestContainsMarkup() {
+ yield [ 'Plain page', false ];
+
+ yield [ '<languages/>', false ];
+
+ yield [ '<translate>Board, Run!</translate>', true ];
+
+ yield [ '<translate nowrap>Board, Run!</translate>', true ];
+
+ yield [ '<translate unknown="attributes">Board, Run!</translate>', true ];
+
+ yield [ '</translate>', true ];
+
+ yield [ '<nowiki><translate></nowiki>', false ];
+ }
+
+ /** @dataProvider provideTestCleanupTags */
+ public function testCleanupTags( string $input, string $expected ) {
+ $parser = new TranslatablePageParser( new ParsingPlaceholderFactory() );
+ $this->assertSame( $expected, $parser->cleanupTags( $input ) );
+ }
+
+ public function provideTestCleanupTags() {
+ yield 'Unbalanced tag in a section preview' => [
+ "== Hello ==\n</translate>",
+ '== Hello ==',
+ ];
+
+ yield 'Unbalanced tags, no whitespace' => [
+ "</translate><translate>",
+ '',
+ ];
+
+ yield 'Balanced tags, non-removable whitespace' => [
+ "1\n2<translate>3\n4</translate>5\n6",
+ "1\n23\n45\n6",
+ ];
+
+ yield 'Balanced tags, removable whitespace' => [
+ "1<translate>\n\n</translate>2",
+ '12',
+ ];
+
+ yield 'Old style translation variable tag is collapsed' => [
+ '[[<tvar|wmf>Special:MyLanguage/Wikimedia Foundation</>|Wikimedia Foundation]].',
+ '[[Special:MyLanguage/Wikimedia Foundation|Wikimedia Foundation]].',
+ ];
+
+ yield 'Translation variable tag is collapsed' => [
+ '[[<tvar name=wmf>Special:MyLanguage/Wikimedia Foundation</tvar>|Wikimedia Foundation]].',
+ '[[Special:MyLanguage/Wikimedia Foundation|Wikimedia Foundation]].',
+ ];
+
+ yield 'Tag inside a nowiki is retained' => [
+ 'You can use the <nowiki><translate></nowiki> tag.',
+ 'You can use the <nowiki><translate></nowiki> tag.',
+ ];
+
+ yield 'Broken tag is retained' => [
+ 'What if I <translate and </translate>.',
+ 'What if I <translate and .',
+ ];
+
+ yield 'Tag with nowrap is removed' => [
+ '<abbr title="<translate nowrap>Careful unselfish true engineer</translate>">CUTE</abbr>',
+ '<abbr title="Careful unselfish true engineer">CUTE</abbr>',
+ ];
+
+ yield 'No content to remove' => [
+ 'Plain page',
+ 'Plain page',
+ ];
+
+ yield 'Language tag should not be removed by this method' => [
+ '<languages/>',
+ '<languages/>',
+ ];
+
+ yield 'Unclosed tag is removed' => [
+ '<translate>No worries, I will try to remember to close this tag',
+ 'No worries, I will try to remember to close this tag',
+
+ ];
+
+ yield 'Complex old translation variable syntax is parsed and replaced with contents' => [
+ '<translate nowrap>I have <tvar|!><:D></></translate>!',
+ 'I have <:D>!',
+ ];
+
+ yield 'Complex translation variable syntax is parsed and replaced with contents' => [
+ '<translate nowrap>I have <tvar name="--$"><:D></tvar></translate>!',
+ 'I have <:D>!',
+ ];
+
+ yield 'No extra newlines is added' => [
+ 'A<translate>B<translate>C</translate>D</translate>E',
+ 'ABCDE',
+ ];
+
+ yield 'Reasonable amount of newlines is stripped' => [
+ "A\n<translate>\n\nB</translate>\nC\n<translate>D\n\n\n\n</translate>E",
+ "A\n\nB\nC\nD\n\n\nE",
+
+ ];
+
+ yield 'Section markers are removed from headings' => [
+ "<translate>\n== Head of the header == <!--T:1-->\n</translate>",
+ "== Head of the header ==",
+ ];
+
+ yield 'Section markers are removed, but not other text' => [
+ ' <!--T:10--> text <!--T:11--> more text <!--T:12--> even more',
+ ' text more text even more',
+ ];
+ }
+
+ /** @dataProvider provideTestParse */
+ public function testParse(
+ string $input,
+ string $expectedTranslationTemplate,
+ string $expectedSourceTemplate,
+ array $expectedUnits
+ ) {
+ $parser = new TranslatablePageParser( new TestingParsingPlaceholderFactory() );
+ $output = $parser->parse( $input );
+ $this->assertSame( $expectedTranslationTemplate, $output->translationPageTemplate() );
+ $this->assertSame( $expectedSourceTemplate, $output->sourcePageTemplate() );
+ $this->assertEquals( $expectedUnits, $output->units() );
+ }
+
+ public function provideTestParse() {
+ // Test case 1 //
+ $s1 = new TranslationUnit();
+ $s1->text = '== Unit tests ==';
+ $s1->id = -1;
+
+ $s2 = new TranslationUnit();
+ $s2->text = 'Introduction to unit tests.';
+ $s2->id = -1;
+
+ $s3 = new TranslationUnit();
+ $s3->text = 'They are fun.';
+ $s3->id = -1;
+
+ $s4 = new TranslationUnit();
+ $s4->text = 'Smilie';
+ $s4->id = -1;
+ $s4->setCanWrap( false );
+ $s4->setIsInline( true );
+
+ yield [
+ <<<INPUT
+<languages/>
+<translate>
+== Unit tests ==
+
+Introduction to unit tests.
+
+They are fun.
+</translate>
+
+<abbr title="<translate nowrap>Smilie</translate>">:)</abbr>
+INPUT
+ , <<<TRANSLATION_TEMPLATE
+<languages/>
+<1>
+
+<2>
+
+<3>
+
+<abbr title="<5>">:)</abbr>
+TRANSLATION_TEMPLATE
+ , <<<SOURCE_TEMPLATE
+<languages/>
+<translate>
+<1>
+
+<2>
+
+<3>
+</translate>
+
+<abbr title="<translate nowrap><5></translate>">:)</abbr>
+SOURCE_TEMPLATE
+ ,
+ [
+ '<1>' => $s1,
+ '<2>' => $s2,
+ '<3>' => $s3,
+ '<5>' => $s4,
+ ]
+ ];
+
+ // Test case 2 //
+ $s1 = new TranslationUnit();
+ $s1->text = '== Unit tests ==';
+ $s1->id = '11';
+
+ $s2 = new TranslationUnit();
+ $s2->text = 'Introduction to unit tests.';
+ $s2->id = '22';
+
+ $s3 = new TranslationUnit();
+ $s3->text = 'They are fun.';
+ $s3->id = '33';
+
+ $s4 = new TranslationUnit();
+ $s4->text = 'Smilie';
+ $s4->id = '44';
+ $s4->setCanWrap( false );
+ $s4->setIsInline( true );
+
+ yield [
+ <<<INPUT
+<languages/>
+<translate>
+== Unit tests == <!--T:11-->
+
+<!--T:22-->
+Introduction to unit tests.
+
+<!--T:33-->
+They are fun.
+</translate>
+
+<abbr title="<translate nowrap><!--T:44--> Smilie</translate>">:)</abbr>
+INPUT
+ , <<<TRANSLATION_TEMPLATE
+<languages/>
+<1>
+
+<2>
+
+<3>
+
+<abbr title="<5>">:)</abbr>
+TRANSLATION_TEMPLATE
+ , <<<SOURCE_TEMPLATE
+<languages/>
+<translate>
+<1>
+
+<2>
+
+<3>
+</translate>
+
+<abbr title="<translate nowrap><5></translate>">:)</abbr>
+SOURCE_TEMPLATE
+ ,
+ [
+ '<1>' => $s1,
+ '<2>' => $s2,
+ '<3>' => $s3,
+ '<5>' => $s4,
+ ]
+ ];
+ }
+
+ /** @dataProvider provideTestParseSection */
+ public function testParseSection(
+ string $input,
+ string $expectedTemplate,
+ array $expectedUnits,
+ string $comment
+ ) {
+ $parser = new TranslatablePageParser( new TestingParsingPlaceholderFactory() );
+ $canWrap = true;
+ $result = $parser->parseSection( $input, $canWrap );
+ $this->assertSame( $expectedTemplate, $result['template'], $comment );
+ $this->assertEquals( $expectedUnits, $result['sections'], $comment );
+ }
+
+ public static function provideTestParseSection() {
+ $u = new TranslationUnit();
+ $u->text = 'Hello';
+ $u->id = -1;
+ $u->setIsInline( true );
+ yield [
+ 'Hello',
+ '<0>',
+ [ '<0>' => $u ],
+ 'No surrounding whitespace',
+ ];
+
+ $u = new TranslationUnit();
+ $u->text = 'Hello';
+ $u->id = -1;
+ yield [
+ "\nHello",
+ "\n<0>",
+ [ '<0>' => $u ],
+ 'With surrounding whitespace',
+ ];
+
+ $u0 = new TranslationUnit();
+ $u0->text = 'Hello world';
+ $u0->id = -1;
+
+ $u1 = new TranslationUnit();
+ $u1->text = 'Bunny';
+ $u1->id = -1;
+ yield [
+ "\nHello world\n\nBunny\n",
+ "\n<0>\n\n<1>\n",
+ [ '<0>' => $u0, '<1>' => $u1 ],
+ 'Splitting at one empty line',
+ ];
+
+ $u0 = new TranslationUnit();
+ $u0->text = 'First';
+ $u0->id = -1;
+
+ $u1 = new TranslationUnit();
+ $u1->text = 'Second';
+ $u1->id = -1;
+
+ $u2 = new TranslationUnit();
+ $u2->text = 'Third';
+ $u2->id = -1;
+ yield [
+ "First\n\n\n\n\nSecond\n\nThird",
+ "<0>\n\n\n\n\n<1>\n\n<2>",
+ [ '<0>' => $u0, '<1>' => $u1, '<2>' => $u2 ],
+ 'Splitting with multiple empty lines',
+ ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslationUnitTest.php b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslationUnitTest.php
new file mode 100644
index 00000000..f87860ca
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/PageTranslation/TranslationUnitTest.php
@@ -0,0 +1,295 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\PageTranslation;
+
+use FatMessage;
+use Language;
+use MediaWikiUnitTestCase;
+
+/**
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\PageTranslation\TranslationUnit
+ */
+class TranslationUnitTest extends MediaWikiUnitTestCase {
+ public function setUp(): void {
+ parent::setUp();
+
+ if ( !defined( 'TRANSLATE_FUZZY' ) ) {
+ define( 'TRANSLATE_FUZZY', '!!FUZZY!!' );
+ }
+ }
+
+ /** @dataProvider providerTestGetMarkedText */
+ public function testGetMarkedText(
+ string $name, string $text, bool $inline, string $expected
+ ) {
+ $section = new TranslationUnit();
+ $section->name = $name;
+ $section->text = $text;
+ $section->setIsInline( $inline );
+
+ $output = $section->getMarkedText();
+
+ $this->assertEquals( $expected, $output );
+ }
+
+ /** @dataProvider providerTestGetTextWithVariables */
+ public function testGetTextWithVariables( string $text, string $expected ) {
+ $section = new TranslationUnit();
+ $section->text = $text;
+
+ $output = $section->getTextWithVariables();
+
+ $this->assertEquals( $expected, $output );
+ }
+
+ /** @dataProvider providerTestGetTextForTrans */
+ public function testGetTextForTrans( string $text, string $expected ) {
+ $section = new TranslationUnit();
+ $section->text = $text;
+
+ $output = $section->getTextForTrans();
+
+ $this->assertEquals( $expected, $output );
+ }
+
+ public static function providerTestGetMarkedText() {
+ $cases = [];
+
+ // Inline syntax
+ $cases[] = [
+ 'name',
+ 'Hello',
+ true,
+ '<!--T:name--> Hello',
+ ];
+
+ // Normal syntax
+ $cases[] = [
+ 'name',
+ 'Hello',
+ false,
+ "<!--T:name-->\nHello",
+ ];
+
+ // Inline should not matter for headings, which have special syntax, but test both values
+ $cases[] = [
+ 'name',
+ '== Hello ==',
+ true,
+ '== Hello == <!--T:name-->',
+ ];
+
+ $cases[] = [
+ 'name',
+ '====== Hello ======',
+ false,
+ '====== Hello ====== <!--T:name-->',
+ ];
+
+ return $cases;
+ }
+
+ public static function providerTestGetTextWithVariables() {
+ $cases = [];
+
+ // syntax
+ $cases[] = [
+ "<tvar|abc>Peter\n cat!</>",
+ '$abc',
+ ];
+
+ $cases[] = [
+ "<tvar|1>Hello</>\n<tvar|2>Hello</>",
+ "$1\n$2",
+ ];
+
+ return $cases;
+ }
+
+ public static function providerTestGetTextForTrans() {
+ $cases = [];
+
+ // syntax
+ $cases[] = [
+ "<tvar|abc>Peter\n cat!</>",
+ "Peter\n cat!",
+ ];
+
+ $cases[] = [
+ "<tvar|1>Hello</>\n<tvar|2>Hello</>",
+ "Hello\nHello",
+ ];
+
+ return $cases;
+ }
+
+ /** @dataProvider provideTestGetTextForRendering */
+ public function testGetTextForRendering(
+ string $source,
+ ?string $translation,
+ bool $fuzzy,
+ bool $inline,
+ string $expected
+ ) {
+ $unit = new TranslationUnit();
+ $unit->text = $source;
+ $unit->setIsInline( $inline );
+
+ $msg = null;
+ if ( $translation !== null ) {
+ $msg = new FatMessage( '', $unit->getTextWithVariables() );
+ $msg->setTranslation( $translation );
+ if ( $fuzzy ) {
+ $msg->addTag( 'fuzzy' );
+ }
+ }
+
+ $sourceLanguage = $this->createStub( Language::class );
+ $sourceLanguage->method( 'getHtmlCode' )->willReturn( 'en-GB' );
+ $sourceLanguage->method( 'getCode' )->willReturn( 'en-gb' );
+ $sourceLanguage->method( 'getDir' )->willReturn( 'ltr' );
+
+ $targetLanguage = $this->createStub( Language::class );
+ $targetLanguage->method( 'getHtmlCode' )->willReturn( 'ar' );
+ $targetLanguage->method( 'getCode' )->willReturn( 'ar' );
+ $targetLanguage->method( 'getDir' )->willReturn( 'rtl' );
+
+ $wrapUntranslated = true;
+ $actual = $unit->getTextForRendering(
+ $msg,
+ $sourceLanguage,
+ $targetLanguage,
+ $wrapUntranslated
+ );
+ $this->assertEquals( $expected, $actual );
+ }
+
+ public function provideTestGetTextForRendering() {
+ $fuzzy = true;
+ $inline = true;
+ $block = false;
+
+ yield 'language wrapping' => [
+ 'Hello <tvar|abc>peter</>!',
+ null,
+ !$fuzzy,
+ $inline,
+ '<span lang="en-GB" dir="ltr" class="mw-content-ltr">Hello peter!</span>'
+ ];
+
+ yield 'old translation variable syntax' => [
+ 'Hello <tvar|abc>peter</>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'translation variable syntax without quotes' => [
+ 'Hello <tvar name=abc>peter</tvar>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'translation variable syntax with double quotes' => [
+ 'Hello <tvar name="abc">peter</tvar>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'translation variable syntax with single quotes' => [
+ 'Hello <tvar name=\'abc\'>peter</tvar>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'translation variable syntax with spaces' => [
+ 'Hello <tvar name = abc >peter</tvar>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'mixed variable syntax' => [
+ 'Hello <tvar name=2>peter</tvar> and <tvar|1>peter</>!',
+ 'Hejsan $1 and $2!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter and peter!'
+ ];
+
+ yield 'special characters in variable name' => [
+ 'Hello <tvar name=abc_123-АБВ$>peter</tvar>!',
+ 'Hejsan $abc_123-АБВ$!',
+ !$fuzzy,
+ $inline,
+ 'Hejsan peter!'
+ ];
+
+ yield 'inline fuzzy wrapping' => [
+ 'Hello <tvar|abc>peter</>!',
+ 'Hejsan $abc!',
+ $fuzzy,
+ $inline,
+ '<span class="mw-translate-fuzzy">Hejsan peter!</span>'
+ ];
+
+ yield 'block language wrapping' => [
+ 'Hello <tvar|abc>peter</>!',
+ null,
+ !$fuzzy,
+ $block,
+ "<div lang=\"en-GB\" dir=\"ltr\" class=\"mw-content-ltr\">\nHello peter!\n</div>"
+ ];
+
+ yield 'block variables' => [
+ 'Hello <tvar name=abc>peter</tvar>!',
+ 'Hejsan $abc!',
+ !$fuzzy,
+ $block,
+ 'Hejsan peter!'
+ ];
+
+ yield 'block fuzzy wrapping' => [
+ 'Hello <tvar|abc>peter</>!',
+ 'Hejsan $abc!',
+ $fuzzy,
+ $block,
+ "<div class=\"mw-translate-fuzzy\">\nHejsan peter!\n</div>"
+ ];
+
+ yield 'translation language in the source' => [
+ '{{TRANSLATIONLANGUAGE}}',
+ null,
+ !$fuzzy,
+ $inline,
+ '<span lang="en-GB" dir="ltr" class="mw-content-ltr">en-gb</span>'
+ ];
+
+ yield 'translation language in the translation' => [
+ '{{TRANSLATIONLANGUAGE}}',
+ '{{TRANSLATIONLANGUAGE}}',
+ $fuzzy,
+ $inline,
+ '<span class="mw-translate-fuzzy">ar</span>'
+ ];
+
+ yield 'translation language in a variable' => [
+ 'Lang: <tvar|code>{{TRANSLATIONLANGUAGE}}</>',
+ 'Lang: $code',
+ !$fuzzy,
+ $inline,
+ 'Lang: ar'
+ ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php b/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php
index 3c00fe15..48602904 100644
--- a/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Statistics/TranslatorActivityTest.php
@@ -1,30 +1,29 @@
<?php
-/**
- * @file
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- */
+declare( strict_types = 1 );
-namespace MediaWiki\Extensions\Translate\Statistics;
+namespace MediaWiki\Extension\Translate\Statistics;
use EmptyBagOStuff;
use HashBagOStuff;
use InvalidArgumentException;
use JobQueueGroup;
+use MediaWiki\Languages\LanguageNameUtils;
use MediaWikiUnitTestCase;
use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
- * @covers \MediaWiki\Extensions\Translate\Statistics\TranslatorActivity
+ * @author Niklas Laxström
+ * @license GPL-2.0-or-later
+ * @covers \MediaWiki\Extension\Translate\Statistics\TranslatorActivity
*/
class TranslatorActivityTest extends MediaWikiUnitTestCase {
public function testInvalidLanguage() {
$cache = $this->createMock( EmptyBagOStuff::class );
$query = $this->createMock( TranslatorActivityQuery::class );
$jobQueue = $this->createMock( JobQueueGroup::class );
- $languageValidator = function ( string $language ): bool {
- return false;
- };
+ $languageValidator = $this->createMock( LanguageNameUtils::class );
+ $languageValidator->method( 'isKnownLanguageTag' )->willReturn( false );
+
$service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator );
$this->expectException( InvalidArgumentException::class );
@@ -51,9 +50,9 @@ class TranslatorActivityTest extends MediaWikiUnitTestCase {
->with( $this->equalTo( $language ) );
$jobQueue = $this->createMock( JobQueueGroup::class );
$jobQueue->expects( $this->never() )->method( 'push' );
- $languageValidator = function ( string $language ): bool {
- return true;
- };
+ $languageValidator = $this->createMock( LanguageNameUtils::class );
+ $languageValidator->method( 'isKnownLanguageTag' )->willReturn( true );
+
$service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator );
ConvertibleTimestamp::setFakeTime( $fakeTime1 );
@@ -80,9 +79,9 @@ class TranslatorActivityTest extends MediaWikiUnitTestCase {
->with( $this->equalTo( $language ) );
$jobQueue = $this->createMock( JobQueueGroup::class );
$jobQueue->expects( $this->once() )->method( 'push' );
- $languageValidator = function ( string $language ): bool {
- return true;
- };
+ $languageValidator = $this->createMock( LanguageNameUtils::class );
+ $languageValidator->method( 'isKnownLanguageTag' )->willReturn( true );
+
$service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator );
ConvertibleTimestamp::setFakeTime( $fakeTime1 );
@@ -114,9 +113,9 @@ class TranslatorActivityTest extends MediaWikiUnitTestCase {
->with( $this->equalTo( $language ) );
$jobQueue = $this->createMock( JobQueueGroup::class );
$jobQueue->expects( $this->never() )->method( 'push' );
- $languageValidator = function ( string $language ): bool {
- return true;
- };
+ $languageValidator = $this->createMock( LanguageNameUtils::class );
+ $languageValidator->method( 'isKnownLanguageTag' )->willReturn( true );
+
$service = new TranslatorActivity( $cache, $query, $jobQueue, $languageValidator );
ConvertibleTimestamp::setFakeTime( $fakeTime1 );
@@ -132,11 +131,13 @@ class TranslatorActivityTest extends MediaWikiUnitTestCase {
private function getExampleData(): array {
$translators = [
- 'Hunter' => [
+ [
+ TranslatorActivityQuery::USER_NAME => 'Hunter',
TranslatorActivityQuery::USER_TRANSLATIONS => 1234,
TranslatorActivityQuery::USER_LAST_ACTIVITY => 10,
],
- 'Farmer' => [
+ [
+ TranslatorActivityQuery::USER_NAME => 'Farmer',
TranslatorActivityQuery::USER_TRANSLATIONS => 2,
TranslatorActivityQuery::USER_LAST_ACTIVITY => 20,
],
diff --git a/MLEB/Translate/tests/phpunit/unit/Synchronization/GroupSynchronizationCacheTest.php b/MLEB/Translate/tests/phpunit/unit/Synchronization/GroupSynchronizationCacheTest.php
deleted file mode 100644
index 8a612ee1..00000000
--- a/MLEB/Translate/tests/phpunit/unit/Synchronization/GroupSynchronizationCacheTest.php
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-
-namespace MediaWiki\Extensions\Translate\Synchronization;
-
-use HashBagOStuff;
-use MediaWikiUnitTestCase;
-
-/**
- * @covers \MediaWiki\Extensions\Translate\Synchronization\GroupSynchronizationCache
- * @covers \MediaWiki\Extensions\Translate\Synchronization\GroupSynchronizationResponse
- */
-class GroupSynchronizationCacheTest extends MediaWikiUnitTestCase {
- /** @var GroupSynchronizationCache */
- private $groupSyncCache;
-
- protected function setUp(): void {
- $this->groupSyncCache = $this->getGroupSynchronizationCache();
- }
-
- public function testIsGroupBeingProcessed() {
- $groupId = 'hello';
- $this->groupSyncCache->startSync( $groupId );
-
- $this->assertTrue( $this->groupSyncCache->isGroupBeingProcessed( $groupId ) );
-
- $this->groupSyncCache->endSync( $groupId );
-
- $this->assertFalse( $this->groupSyncCache->isGroupBeingProcessed( $groupId ) );
- }
-
- public function testGetGroupMessageKeys() {
- $groupId = 'hello';
- $title = 'Title';
-
- $this->groupSyncCache->startSync( $groupId );
- $this->groupSyncCache->addMessages(
- $groupId,
- $this->getMessageParam( $groupId, $title )
- );
-
- $this->assertEquals(
- [ $title ], $this->groupSyncCache->getGroupMessageKeys( $groupId )
- );
-
- $this->groupSyncCache->removeMessages( $title );
-
- $this->assertEquals(
- [ $title ],
- $this->groupSyncCache->getGroupMessageKeys( $groupId ),
- 'Removing a message does not update the group message list.'
- );
- }
-
- public function testGetGroupsInSync() {
- $groupId = 'hello';
-
- $this->groupSyncCache->startSync( $groupId );
- $this->assertEquals( [ $groupId ], $this->groupSyncCache->getGroupsInSync() );
-
- $this->groupSyncCache->endSync( $groupId );
- $this->assertEquals( [], $this->groupSyncCache->getGroupsInSync() );
- }
-
- public function testEndSync() {
- $groupId = 'group-id';
- $title = 'hello';
-
- $this->groupSyncCache->startSync( $groupId );
- $this->groupSyncCache->addMessages(
- $groupId, $this->getMessageParam( $groupId, $title )
- );
- $this->assertNotEmpty( $this->groupSyncCache->getMessages( $title )[$title] );
- $this->assertTrue( $this->groupSyncCache->isGroupBeingProcessed( $groupId ) );
-
- $this->groupSyncCache->endSync( $groupId );
-
- $message = $this->groupSyncCache->getMessages( $title )[$title];
- $this->assertEmpty( $message );
- }
-
- /**
- * @dataProvider provideGetSynchronizationStatus
- */
- public function testGetSynchronizationStatus(
- GroupSynchronizationCache $syncCache,
- string $groupId,
- array $titlesToAdd,
- array $titlesToRemove,
- bool $hasTimedOut = false
- ) {
- $syncCache->startSync( $groupId );
-
- $this->assertTrue( $syncCache->isGroupBeingProcessed( $groupId ) );
-
- foreach ( $titlesToAdd as $title ) {
- $syncCache->addMessages(
- $groupId, $this->getMessageParam( $groupId, $title )
- );
- }
-
- $this->assertEquals( $titlesToAdd, $syncCache->getGroupMessageKeys( $groupId ) );
-
- $syncCache->removeMessages( ...$titlesToRemove );
-
- $groupSyncResponse = $syncCache->getSynchronizationStatus( $groupId );
-
- $diffArray = array_values( array_diff( $titlesToAdd, $titlesToRemove ) );
- $this->assertEquals( $diffArray, $syncCache->getGroupMessageKeys( $groupId ) );
-
- if ( $diffArray === [] ) {
- $this->assertEmpty( $this->groupSyncCache->getGroupsInSync() );
- }
-
- $this->assertEquals( $diffArray === [], $groupSyncResponse->isDone() );
- $this->assertEquals( $hasTimedOut, $groupSyncResponse->hasTimedOut() );
- $this->assertEquals(
- $diffArray,
- $groupSyncResponse->getRemainingMessages()
- );
- $this->assertEquals( $groupId, $groupSyncResponse->getGroupId() );
- }
-
- public function testGetMulti() {
- $groupId = 'hello';
-
- $this->groupSyncCache->addMessages( $groupId,
- $this->getMessageParam( $groupId, 'Title' ),
- $this->getMessageParam( $groupId, 'Title_ABC' )
- );
-
- $messages = $this->groupSyncCache->getMessages( 'Title', 'Title_ABC', 'Title_ABCD' );
- $this->assertEquals( [ 'Title', 'Title_ABC', 'Title_ABCD' ], array_keys( $messages ) );
-
- $messages = $this->groupSyncCache->getMessages( 'Title_ABCD' );
- $this->assertNull( $messages['Title_ABCD'] );
- }
-
- public function provideGetSynchronizationStatus() {
- $groupId = 'hello';
- $syncCache = $this->getGroupSynchronizationCache();
- yield [
- $syncCache,
- $groupId,
- [ 'Title', 'Title1' ],
- [ 'Title' ],
- false
- ];
-
- $syncCache = $this->getGroupSynchronizationCache();
- yield [
- $syncCache,
- $groupId,
- [ 'Hello' ],
- [ 'Hello' ],
- false
- ];
-
- $syncCache = $this->getGroupSynchronizationCache( -1 );
- yield [
- $syncCache,
- $groupId,
- [ 'Hello' ],
- [ 'Hello' ],
- false
- ];
-
- $syncCache = $this->getGroupSynchronizationCache( -1 );
- yield [
- $syncCache,
- $groupId,
- [ 'Hello', 'Title' ],
- [ 'Hello' ],
- true
- ];
- }
-
- private function getMessageParam( string $groupId, string $title ): MessageUpdateParameter {
- return new MessageUpdateParameter( [
- 'fuzzy' => true,
- 'content' => 'Hello',
- 'title' => $title,
- 'groupId' => $groupId
- ] );
- }
-
- private function getGroupSynchronizationCache( int $timeout = null ): GroupSynchronizationCache {
- if ( $timeout ) {
- return new GroupSynchronizationCache( new HashBagOStuff(), $timeout );
- }
-
- return new GroupSynchronizationCache( new HashBagOStuff() );
- }
-}
diff --git a/MLEB/Translate/tests/phpunit/unit/Synchronization/MessageUpdateParameterTest.php b/MLEB/Translate/tests/phpunit/unit/Synchronization/MessageUpdateParameterTest.php
index 22e4f639..1f901b97 100644
--- a/MLEB/Translate/tests/phpunit/unit/Synchronization/MessageUpdateParameterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Synchronization/MessageUpdateParameterTest.php
@@ -1,18 +1,14 @@
<?php
-namespace MediaWiki\Extensions\Translate\Synchronization;
+namespace MediaWiki\Extension\Translate\Synchronization;
use MediaWikiUnitTestCase;
use MessageUpdateJob;
use Title;
-/**
- * @covers \MediaWiki\Extensions\Translate\Synchronization\MessageUpdateParameter
- */
+/** @covers \MediaWiki\Extension\Translate\Synchronization\MessageUpdateParameter */
class MessageUpdateParameterTest extends MediaWikiUnitTestCase {
- /**
- * @dataProvider provideSerializable
- */
+ /** @dataProvider provideSerializable */
public function testSerializable(
string $title,
string $content,
@@ -32,9 +28,7 @@ class MessageUpdateParameterTest extends MediaWikiUnitTestCase {
$this->assertEquals( $messageParam, $serializedMessageParam );
}
- /**
- * @dataProvider provideSerializable
- */
+ /** @dataProvider provideSerializable */
public function testCreateFromJob(
string $title,
string $content,
@@ -52,10 +46,13 @@ class MessageUpdateParameterTest extends MediaWikiUnitTestCase {
$this->assertEquals( $content, $messageParams->getContent() );
$this->assertEquals( $isRename, $messageParams->isRename() );
$this->assertEquals( $isFuzzy, $messageParams->isFuzzy() );
+
if ( $isRename ) {
$this->assertEquals( $target, $messageParams->getTargetValue() );
$this->assertEquals( $replacement, $messageParams->getReplacementValue() );
$this->assertEquals( $otherLangs, $messageParams->getOtherLangs() );
+ } else {
+ $this->assertNull( $messageParams->getOtherLangs() );
}
}
diff --git a/MLEB/Translate/tests/phpunit/insertables/CombinedInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/CombinedInsertablesSuggesterTest.php
index bc0b5b2e..1f2d82b1 100644
--- a/MLEB/Translate/tests/phpunit/insertables/CombinedInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/CombinedInsertablesSuggesterTest.php
@@ -1,15 +1,17 @@
<?php
-
/**
* @file
* @author Geoffrey Mon
* @license GPL-2.0-or-later
*/
-class CombinedInsertablesSuggesterTest extends MediaWikiIntegrationTestCase {
- /**
- * @dataProvider getInsertablesProvider
- */
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\CombinedInsertablesSuggester */
+class CombinedInsertablesSuggesterTest extends MediaWikiUnitTestCase {
+ /** @dataProvider getInsertablesProvider */
public function testGetInsertables( $suggesters, $input, $expected ) {
$suggester = new CombinedInsertablesSuggester( $suggesters );
$this->assertArrayEquals( $expected, $suggester->getInsertables( $input ) );
@@ -70,13 +72,13 @@ class CombinedInsertablesSuggesterTest extends MediaWikiIntegrationTestCase {
}
class TestingInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [ new Insertable( 'Test', 'Test', '' ) ];
}
}
class TestingDuplicateInsertablesSuggester implements InsertablesSuggester {
- public function getInsertables( $text ) {
+ public function getInsertables( string $text ): array {
return [
new Insertable( '$1', '$1', '' ),
new Insertable( '$1', '$1', '' ),
diff --git a/MLEB/Translate/tests/phpunit/unit/insertables/HtmlTagInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/HtmlTagInsertablesSuggesterTest.php
index ebd1ee8f..fd439254 100644
--- a/MLEB/Translate/tests/phpunit/unit/insertables/HtmlTagInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/HtmlTagInsertablesSuggesterTest.php
@@ -5,13 +5,13 @@
* @license GPL-2.0-or-later
*/
-/**
- * @covers HtmlTagInsertablesSuggester
- */
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\HtmlTagInsertablesSuggester */
class HtmlTagInsertablesSuggesterTest extends MediaWikiUnitTestCase {
- /**
- * @dataProvider getTestHtmlTagInsertablesSuggesterProvider
- */
+ /** @dataProvider getTestHtmlTagInsertablesSuggesterProvider */
public function testHtmlTagInsertablesSuggester( $text, $expected, $comment = '' ) {
$suggester = new HtmlTagInsertablesSuggester();
$actual = $suggester->getInsertables( $text );
diff --git a/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/InsertableFactoryTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/InsertableFactoryTest.php
new file mode 100644
index 00000000..7b20fa12
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/InsertableFactoryTest.php
@@ -0,0 +1,56 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use InvalidArgumentException;
+use MediaWikiUnitTestCase;
+use MockTranslateValidator;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\InsertableFactory */
+class InsertableFactoryTest extends MediaWikiUnitTestCase {
+ /**
+ * @dataProvider getPreProvidedInsertables
+ * @dataProvider getCustomInsertables
+ */
+ public function testValidLoadInstance( string $className, $params = null ) {
+ $instance = InsertableFactory::make( $className, $params );
+ $this->assertInstanceOf(
+ InsertablesSuggester::class,
+ $instance,
+ 'Existing class returns an instance of the InsertableSuggester'
+ );
+ }
+
+ public function testNonExistentInsertable() {
+ $this->expectException( InvalidArgumentException::class );
+ $this->expectExceptionMessageMatches( '/could not find/i' );
+ InsertableFactory::make( 'TranslateNonExistentClass', '' );
+ }
+
+ public function testInvalidInsertable() {
+ $this->expectException( InvalidArgumentException::class );
+ $this->expectExceptionMessageMatches( '/does not implement/i' );
+ InsertableFactory::make( MockTranslateValidator::class, '' );
+ }
+
+ public function getPreprovidedInsertables() {
+ yield [ HtmlTagInsertablesSuggester::class ];
+
+ yield [
+ RegexInsertablesSuggester::class,
+ [ 'regex' => 'abcd' ]
+ ];
+
+ yield [ RegexInsertablesSuggester::class, 'abcd' ];
+
+ yield 'Preprovided insertables without fully qualified namespace' => [
+ // Not using ::class since that would add the fully qualified namespace
+ 'NumericalParameterInsertablesSuggester'
+ ];
+ }
+
+ public function getCustomInsertables() {
+ yield [ \MockCustomInsertableSuggester::class ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/insertables/MediaWikiInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/MediaWikiInsertablesSuggesterTest.php
index d49206f7..a8e419c3 100644
--- a/MLEB/Translate/tests/phpunit/insertables/MediaWikiInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/MediaWikiInsertablesSuggesterTest.php
@@ -5,11 +5,13 @@
* @license GPL-2.0-or-later
*/
-class MediaWikiInsertablesSuggesterTest extends PHPUnit\Framework\TestCase {
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
- /**
- * @dataProvider getInsertablesProvider
- */
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\MediaWikiInsertablesSuggester */
+class MediaWikiInsertablesSuggesterTest extends MediaWikiUnitTestCase {
+ /** @dataProvider getInsertablesProvider */
public function testGetInsertables( $input, $expected ) {
$suggester = new MediaWikiInsertablesSuggester();
$this->assertEquals( $expected, $suggester->getInsertables( $input ) );
diff --git a/MLEB/Translate/tests/phpunit/insertables/NumericalParameterInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggesterTest.php
index d2a8f4b6..a8913585 100644
--- a/MLEB/Translate/tests/phpunit/insertables/NumericalParameterInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/NumericalParameterInsertablesSuggesterTest.php
@@ -1,17 +1,19 @@
<?php
-
/**
* @file
* @author Geoffrey Mon
* @license GPL-2.0-or-later
*/
-class NumericalParameterInsertablesSuggesterTest extends PHPUnit\Framework\TestCase {
- /**
- * @dataProvider getInsertablesProvider
- */
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\NumericalParameterInsertablesSuggester */
+class NumericalParameterInsertablesSuggesterTest extends MediaWikiUnitTestCase {
+ /** @dataProvider getInsertablesProvider */
public function testGetInsertables( $input, $expected ) {
- $suggester = new MediaWikiInsertablesSuggester();
+ $suggester = new NumericalParameterInsertablesSuggester();
$this->assertEquals( $expected, $suggester->getInsertables( $input ) );
}
diff --git a/MLEB/Translate/tests/phpunit/insertables/RegexInsertablesSuggesterTest.php b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/RegexInsertablesSuggesterTest.php
index 86b7f6e5..e17be4fd 100644
--- a/MLEB/Translate/tests/phpunit/insertables/RegexInsertablesSuggesterTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/TranslatorInterface/Insertable/RegexInsertablesSuggesterTest.php
@@ -5,10 +5,13 @@
* @license GPL-2.0-or-later
*/
-class RegexInsertablesSuggesterTest extends PHPUnit\Framework\TestCase {
- /**
- * @dataProvider getTestRegexInsertableProvider
- */
+namespace MediaWiki\Extension\Translate\TranslatorInterface\Insertable;
+
+use MediaWikiUnitTestCase;
+
+/** @covers \MediaWiki\Extension\Translate\TranslatorInterface\Insertable\RegexInsertablesSuggester */
+class RegexInsertablesSuggesterTest extends MediaWikiUnitTestCase {
+ /** @dataProvider getTestRegexInsertableProvider */
public function testRegexInsertable( $text, $params, $expectedVals ) {
$insertablesSuggester = new RegexInsertablesSuggester( $params );
$insertables = $insertablesSuggester->getInsertables( $text );
diff --git a/MLEB/Translate/tests/phpunit/unit/TtmServer/TtmServerFactoryTest.php b/MLEB/Translate/tests/phpunit/unit/TtmServer/TtmServerFactoryTest.php
new file mode 100644
index 00000000..4bcdf8e4
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/TtmServer/TtmServerFactoryTest.php
@@ -0,0 +1,59 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\TtmServer;
+
+use DatabaseTTMServer;
+use MediaWikiUnitTestCase;
+
+/**
+ * @since 2021.01
+ * @license GPL-2.0-or-later
+ * @author Niklas Laxström
+ * @covers \MediaWiki\Extension\Translate\TtmServer\TtmServerFactory
+ */
+class TtmServerFactoryTest extends MediaWikiUnitTestCase {
+ public function testGetNames() {
+ $factory = new TtmServerFactory( [ 'one' => [], 'two' => [] ] );
+ $actual = $factory->getNames();
+ $this->assertArrayEquals( [ 'one', 'two' ], $actual );
+ }
+
+ public function testHas() {
+ $factory = new TtmServerFactory( [ 'exists' => [] ], 'exists' );
+ $this->assertFalse( $factory->has( 'unknown' ) );
+ $this->assertTrue( $factory->has( 'exists' ) );
+ }
+
+ public function testCreate() {
+ $name = '1';
+ $factory = new TtmServerFactory(
+ [
+ $name => [
+ 'database' => false,
+ // Passed to wfGetDB
+ 'cutoff' => 0.75,
+ 'type' => 'ttmserver',
+ 'public' => false,
+ ],
+ ],
+ $name
+ );
+
+ $actual = $factory->create( $name );
+ $this->assertInstanceOf( DatabaseTTMServer::class, $actual );
+ }
+
+ /** @dataProvider provideCreateFailure */
+ public function testCreateFailure( array $input ) {
+ $factory = new TtmServerFactory( $input );
+ $this->expectException( ServiceCreationFailure::class );
+ $factory->create( '' );
+ }
+
+ public function provideCreateFailure() {
+ yield 'unknown' => [ [] ];
+ yield 'malformed' => [ [ '' => 'gibberish' ] ];
+ yield 'incomplete config' => [ [ '' => [ 'someoption' => 'somevalue' ] ] ];
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/unit/Utilities/GettextPluralTest.php b/MLEB/Translate/tests/phpunit/unit/Utilities/GettextPluralTest.php
index b2e1db28..bf4f727e 100644
--- a/MLEB/Translate/tests/phpunit/unit/Utilities/GettextPluralTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Utilities/GettextPluralTest.php
@@ -4,15 +4,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Utilities\GettextPlural;
+use MediaWiki\Extension\Translate\Utilities\GettextPlural;
-/**
- * @coversDefaultClass \MediaWiki\Extensions\Translate\Utilities\GettextPlural
- */
+/** @coversDefaultClass \MediaWiki\Extension\Translate\Utilities\GettextPlural */
class GettextPluralTest extends MediaWikiUnitTestCase {
- /**
- * @covers ::getPluralRule
- */
+ /** @covers ::getPluralRule */
public function testGetPluralRule() {
$expected = 'nplurals=2; plural=(n != 1);';
$actual = GettextPlural::getPluralRule( 'en' );
diff --git a/MLEB/Translate/tests/phpunit/unit/Utilities/JsonCodecTest.php b/MLEB/Translate/tests/phpunit/unit/Utilities/JsonCodecTest.php
new file mode 100644
index 00000000..9dc60874
--- /dev/null
+++ b/MLEB/Translate/tests/phpunit/unit/Utilities/JsonCodecTest.php
@@ -0,0 +1,129 @@
+<?php
+declare( strict_types = 1 );
+
+namespace MediaWiki\Extension\Translate\Utilities\Json;
+
+use InvalidArgumentException;
+use JsonSerializable;
+use MediaWikiUnitTestCase;
+use MockJsonUnserializableSubClass;
+use MockJsonUnserializableSuperClass;
+use stdClass;
+use Wikimedia\Assert\PreconditionException;
+
+/**
+ * Remove once we need to support only MW >= 1.36
+ * See Change-Id: I5433090ae8e2b3f2a4590cc404baf838025546ce
+ *
+ * @covers \MediaWiki\Extension\Translate\Utilities\Json\JsonCodec
+ * @covers \MediaWiki\Extension\Translate\Utilities\Json\JsonUnserializableTrait
+ */
+class JsonCodecTest extends MediaWikiUnitTestCase {
+
+ private function getCodec(): JsonCodec {
+ return new JsonCodec();
+ }
+
+ public function provideSimpleTypes() {
+ yield 'Integer' => [ 1, json_encode( 1 ) ];
+ yield 'Boolean' => [ true, json_encode( true ) ];
+ yield 'Null' => [ null, json_encode( null ) ];
+ yield 'Array' => [ [ 1, 2, 3 ], json_encode( [ 1, 2, 3 ] ) ];
+ yield 'Assoc array' => [ [ 'a' => 'b' ], json_encode( [ 'a' => 'b' ] ) ];
+ $object = new stdClass();
+ $object->c = 'd';
+ yield 'Object' => [ (array)$object, json_encode( $object ) ];
+ }
+
+ /**
+ * @dataProvider provideSimpleTypes
+ * @param mixed $value
+ */
+ public function testSimpleTypesUnserialize( $value, string $serialization ) {
+ $this->assertSame( $value, $this->getCodec()->unserialize( $serialization ) );
+ }
+
+ public function testInvalidJsonDataForClassExpectation() {
+ $this->expectException( InvalidArgumentException::class );
+ $this->getCodec()->unserialize( 'bad string', MockJsonUnserializableSuperClass::class );
+ }
+
+ public function testExpectedClassMustBeUnserializable() {
+ $this->expectException( PreconditionException::class );
+ $this->getCodec()->unserialize( '{}', self::class );
+ }
+
+ public function testUnexpectedClassUnserialized() {
+ $this->expectException( InvalidArgumentException::class );
+ $superClassInstance = new MockJsonUnserializableSuperClass( 'Godzilla' );
+ $this->getCodec()->unserialize(
+ $superClassInstance->jsonSerialize(),
+ MockJsonUnserializableSubClass::class
+ );
+ }
+
+ public function testExpectedClassUnserialized() {
+ $subClassInstance = new MockJsonUnserializableSubClass( 'Godzilla', 'But we are ready!' );
+ $this->assertNotNull( $this->getCodec()->unserialize(
+ $subClassInstance->jsonSerialize(),
+ MockJsonUnserializableSuperClass::class
+ ) );
+ $this->assertNotNull( $this->getCodec()->unserialize(
+ $subClassInstance->jsonSerialize(),
+ MockJsonUnserializableSubClass::class
+ ) );
+ }
+
+ public function testRoundTripSuperClass() {
+ $superClassInstance = new MockJsonUnserializableSuperClass( 'Super Value' );
+ $json = $superClassInstance->jsonSerialize();
+ $superClassUnserialized = $this->getCodec()->unserialize( $json );
+ $this->assertInstanceOf( MockJsonUnserializableSuperClass::class, $superClassInstance );
+ $this->assertSame( $superClassInstance->getSuperClassField(), $superClassUnserialized->getSuperClassField() );
+ }
+
+ public function testRoundTripSubClass() {
+ $subClassInstance = new MockJsonUnserializableSubClass( 'Super Value', 'Sub Value' );
+ $json = $subClassInstance->jsonSerialize();
+ $superClassUnserialized = $this->getCodec()->unserialize( $json );
+ $this->assertInstanceOf( MockJsonUnserializableSubClass::class, $subClassInstance );
+ $this->assertSame( $subClassInstance->getSuperClassField(), $superClassUnserialized->getSuperClassField() );
+ $this->assertSame( $subClassInstance->getSubClassField(), $superClassUnserialized->getSubClassField() );
+ }
+
+ public function provideSerializeThrowsOnFailure() {
+ yield 'crash in serialization, gzipped data' => [
+ "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xcb\x48\xcd\xc9\xc9\x57\x28\xcf\x2f'
+ . '\xca\x49\x01\x00\x85\x11\x4a\x0d\x0b\x00\x00\x00"
+ ];
+ }
+
+ /**
+ * @dataProvider provideSerializeThrowsOnFailure
+ * @covers \MediaWiki\Extension\Translate\Utilities\Json\JsonCodec::serialize
+ * @param mixed $value
+ */
+ public function testSerializeThrowsOnFailure( $value ) {
+ $this->expectException( InvalidArgumentException::class );
+ $this->getCodec()->serialize( $value );
+ }
+
+ public function provideSerializeSuccess() {
+ $serializableInstance = new class() implements JsonSerializable {
+ public function jsonSerialize() {
+ return json_encode( [ 'c' => 'd' ] );
+ }
+ };
+ yield 'array' => [ [ 'a' => 'b' ], '{"a":"b"}' ];
+ yield 'JsonSerializable' => [ $serializableInstance, '{"c":"d"}' ];
+ }
+
+ /**
+ * @dataProvider provideSerializeSuccess
+ * @covers \MediaWiki\Extension\Translate\Utilities\Json\JsonCodec::serialize
+ * @param mixed $value
+ */
+ public function testSerializeSuccess( $value, string $expected ) {
+ $this->assertSame( $expected, $this->getCodec()->serialize( $value ) );
+ }
+}
diff --git a/MLEB/Translate/tests/phpunit/unit/Utilities/ParsingPlaceholderFactoryTest.php b/MLEB/Translate/tests/phpunit/unit/Utilities/ParsingPlaceholderFactoryTest.php
index 9fd16330..76a719b0 100644
--- a/MLEB/Translate/tests/phpunit/unit/Utilities/ParsingPlaceholderFactoryTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Utilities/ParsingPlaceholderFactoryTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\Utilities\ParsingPlaceholderFactory;
+use MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory;
/**
* @author Niklas Laxström
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\Utilities\ParsingPlaceholderFactory
+ * @covers \MediaWiki\Extension\Translate\Utilities\ParsingPlaceholderFactory
*/
class ParsingPlaceholderFactoryTest extends MediaWikiUnitTestCase {
public function testMake() {
diff --git a/MLEB/Translate/tests/phpunit/unit/Utilities/SmartFormatPluralTest.php b/MLEB/Translate/tests/phpunit/unit/Utilities/SmartFormatPluralTest.php
index 488279a5..9ed3a8ed 100644
--- a/MLEB/Translate/tests/phpunit/unit/Utilities/SmartFormatPluralTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Utilities/SmartFormatPluralTest.php
@@ -4,15 +4,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Utilities\SmartFormatPlural;
+use MediaWiki\Extension\Translate\Utilities\SmartFormatPlural;
-/**
- * @covers \MediaWiki\Extensions\Translate\Utilities\SmartFormatPlural
- */
+/** @covers \MediaWiki\Extension\Translate\Utilities\SmartFormatPlural */
class SmartFormatPluralTest extends MediaWikiUnitTestCase {
- /**
- * @dataProvider provideTestGetPluralInstances
- */
+ /** @dataProvider provideTestGetPluralInstances */
public function testGetPluralInstances( $input, $expected ) {
$actual = SmartFormatPlural::getPluralInstances( $input );
$this->assertEquals( $expected, $actual );
diff --git a/MLEB/Translate/tests/phpunit/unit/Utilities/UnicodePluralTest.php b/MLEB/Translate/tests/phpunit/unit/Utilities/UnicodePluralTest.php
index a98af4fe..a7f4498d 100644
--- a/MLEB/Translate/tests/phpunit/unit/Utilities/UnicodePluralTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Utilities/UnicodePluralTest.php
@@ -4,15 +4,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Utilities\UnicodePlural;
+use MediaWiki\Extension\Translate\Utilities\UnicodePlural;
-/**
- * @coversDefaultClass \MediaWiki\Extensions\Translate\Utilities\UnicodePlural
- */
+/** @coversDefaultClass \MediaWiki\Extension\Translate\Utilities\UnicodePlural */
class UnicodePluralTest extends MediaWikiUnitTestCase {
- /**
- * @covers ::getPluralKeywords
- */
+ /** @covers ::getPluralKeywords */
public function testGetPluralKeywords() {
$expected = [ 'one', 'other' ];
$actual = UnicodePlural::getPluralKeywords( 'en' );
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BaseValidatorTestCase.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/BaseValidatorTestCase.php
index 9932ffc2..46d8ec60 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BaseValidatorTestCase.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/BaseValidatorTestCase.php
@@ -1,11 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\Validation\MessageValidator;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
-use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
+use MediaWiki\Extension\Translate\Validation\MessageValidator;
+use MediaWiki\Extension\Translate\Validation\ValidationIssue;
+use MediaWiki\Extension\Translate\Validation\ValidationIssues;
/**
+ * Base class for translation validator tests
* @license GPL-2.0-or-later
*/
class BaseValidatorTestCase extends MediaWikiUnitTestCase {
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BraceBalanceValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/BraceBalanceValidatorTest.php
index 477ff075..2e0f6dcc 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/BraceBalanceValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/BraceBalanceValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\BraceBalanceValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\BraceBalanceValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\BraceBalanceValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\BraceBalanceValidator
*/
class BraceBalanceValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/EscapeCharacterValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/EscapeCharacterValidatorTest.php
index 25661253..f1744827 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/EscapeCharacterValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/EscapeCharacterValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\EscapeCharacterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\EscapeCharacterValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\EscapeCharacterValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\EscapeCharacterValidator
*/
class EscapeCharacterValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextNewlineValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextNewlineValidatorTest.php
index 3dade6a3..e2828f1b 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextNewlineValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextNewlineValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextNewlineValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\GettextNewlineValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextNewlineValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\GettextNewlineValidator
*/
class GettextNewlineValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextPluralValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextPluralValidatorTest.php
index da81da39..a3e6dc83 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/GettextPluralValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/GettextPluralValidatorTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\GettextPluralValidator;
/**
* @author Niklas Laxström
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\GettextPluralValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\GettextPluralValidator
*/
class GettextPluralValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRegexValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRegexValidatorTest.php
index 219379ee..dc008579 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRegexValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRegexValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRegexValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\InsertableRegexValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRegexValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\InsertableRegexValidator
*/
class InsertableRegexValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRubyVariableValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRubyVariableValidatorTest.php
index 3b4c3e3b..af67dfac 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/InsertableRubyVariableValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/InsertableRubyVariableValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRubyVariableValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\InsertableRubyVariableValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\InsertableRubyVariableValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\InsertableRubyVariableValidator
*/
class InsertableRubyValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/IosVariableValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/IosVariableValidatorTest.php
index 9a2de037..e7a0e1db 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/IosVariableValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/IosVariableValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\IosVariableValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\IosVariableValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\IosVariableValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\IosVariableValidator
*/
class IosVariableValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MatchSetValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MatchSetValidatorTest.php
index 3c0ebcd8..9ca10165 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MatchSetValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MatchSetValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MatchSetValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MatchSetValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MatchSetValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MatchSetValidator
*/
class MatchSetValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiLinkValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiLinkValidatorTest.php
index 2cbf17c0..eaaa1155 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiLinkValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiLinkValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiLinkValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiLinkValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiLinkValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MediaWikiLinkValidator
*/
class MediaWikiLinkValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiPageNameValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiPageNameValidatorTest.php
index a024b398..fbc47ed5 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiPageNameValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiPageNameValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPageNameValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPageNameValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiPageNameValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MediaWikiPageNameValidator
*/
class MediaWikiPageNameValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiParameterValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiParameterValidatorTest.php
index 2e824779..f2ba8d86 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiParameterValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiParameterValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiParameterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiParameterValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiParameterValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MediaWikiParameterValidator
*/
class MediaWikiParameterValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiTimeListValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiTimeListValidatorTest.php
index 98097733..127274c7 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/MediaWikiTimeListValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/MediaWikiTimeListValidatorTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiTimeListValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\MediaWikiTimeListValidator;
/**
* @author Niklas Laxström
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\MediaWikiTimeListValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\MediaWikiTimeListValidator
*/
class MediaWikiTimeListValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NewlineValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/NewlineValidatorTest.php
index 14853688..6e310f50 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NewlineValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/NewlineValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\NewlineValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\NewlineValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\NewlineValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\NewlineValidator
*/
class NewlineValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NumericalParameterValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/NumericalParameterValidatorTest.php
index 5d900b4f..c4665c8c 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/NumericalParameterValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/NumericalParameterValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\NumericalParameterValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\NumericalParameterValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\NumericalParameterValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\NumericalParameterValidator
*/
class NumericalParameterValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PrintfValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/PrintfValidatorTest.php
index 6ea13a10..666d7bfd 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PrintfValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/PrintfValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\PrintfValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\PrintfValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\PrintfValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\PrintfValidator
*/
class PrintfValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PythonInterpolationValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/PythonInterpolationValidatorTest.php
index 709adb8f..456b2b51 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/PythonInterpolationValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/PythonInterpolationValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\PythonInterpolationValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\PythonInterpolationValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\PythonInterpolationValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\PythonInterpolationValidator
*/
class PythonInterpolationValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/ReplacementValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/ReplacementValidatorTest.php
index 44c2a5e7..31cf88a1 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/ReplacementValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/ReplacementValidatorTest.php
@@ -1,12 +1,12 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\ReplacementValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\ReplacementValidator;
/**
* @author Niklas Laxström
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\ReplacementValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\ReplacementValidator
*/
class ReplacementValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/SmartFormatPluralValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/SmartFormatPluralValidatorTest.php
index 8c2d233e..5303fef2 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/SmartFormatPluralValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/SmartFormatPluralValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\SmartFormatPluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\SmartFormatPluralValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\SmartFormatPluralValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\SmartFormatPluralValidator
*/
class SmartFormatPluralValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/UnicodePluralValidatorTest.php b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/UnicodePluralValidatorTest.php
index 1bd86f2f..df9a7604 100644
--- a/MLEB/Translate/tests/phpunit/unit/MessageValidator/Validators/UnicodePluralValidatorTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/Validation/Validators/UnicodePluralValidatorTest.php
@@ -1,11 +1,11 @@
<?php
declare( strict_types = 1 );
-use MediaWiki\Extensions\Translate\MessageValidator\Validators\UnicodePluralValidator;
+use MediaWiki\Extension\Translate\Validation\Validators\UnicodePluralValidator;
/**
* @license GPL-2.0-or-later
- * @covers \MediaWiki\Extensions\Translate\MessageValidator\Validators\UnicodePluralValidator
+ * @covers \MediaWiki\Extension\Translate\Validation\Validators\UnicodePluralValidator
*/
class UnicodePluralValidatorTest extends BaseValidatorTestCase {
/** @dataProvider provideTestCases */
diff --git a/MLEB/Translate/tests/phpunit/unit/tag/TPParseTest.php b/MLEB/Translate/tests/phpunit/unit/tag/TPParseTest.php
deleted file mode 100644
index 1228d58a..00000000
--- a/MLEB/Translate/tests/phpunit/unit/tag/TPParseTest.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-declare( strict_types = 1 );
-
-/**
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- * @covers \TPParse
- */
-class TPParseTest extends \MediaWikiUnitTestCase {
- public function setUp(): void {
- parent::setUp();
-
- if ( !defined( 'TRANSLATE_FUZZY' ) ) {
- define( 'TRANSLATE_FUZZY', '!!FUZZY!!' );
- }
- }
-
- /** @dataProvider provideTestSectionWrapping */
- public function testSectionWrapping(
- bool $inline,
- bool $canWrap,
- array $messages,
- string $expected,
- string $comment
- ) {
- $title = Title::makeTitle( NS_MAIN, __CLASS__ );
- $prefix = $title->getPrefixedDBkey() . '/';
-
- $sections = $collection = [];
- foreach ( $messages as $id => $m ) {
- /** @var FatMessage $m */
- $section = new TPSection();
- $section->id = $id;
- $section->text = $m->definition();
- $section->setIsInline( $inline );
- $section->setCanWrap( $canWrap );
-
- $sections[$id] = $section;
- $collection[$prefix . $id] = $m;
- }
-
- $parse = new TPParse( $title );
- $parse->sections = $sections;
-
- $glue = $inline ? ' | ' : "\n\n";
- $parse->template = implode( $glue, array_keys( $sections ) );
-
- $actual = $parse->getTranslationPageText( $collection );
- $this->assertSame(
- $expected,
- $actual,
- $comment
- );
- }
-
- public function provideTestSectionWrapping() {
- $inline = true;
- $block = false;
-
- $wrap = true;
- $nowrap = false;
-
- $sectionText = 'Hello';
- $fuzzyClass = 'mw-translate-fuzzy';
-
- $okMessage = new FatMessage( 'ignoredKey', $sectionText );
- $okMessage->setTranslation( 'Hallo' );
-
- $fuzzyMessage = new FatMessage( 'ignoredKey', $sectionText );
- $fuzzyMessage->setTranslation( 'hallo' );
- $fuzzyMessage->addTag( 'fuzzy' );
-
- $untranslatedMessage = new FatMessage( 'ignoredKey', $sectionText );
-
- $identicalMessage = new FatMessage( 'ignoredKey', $sectionText );
- $identicalMessage->setTranslation( $sectionText );
-
- yield [
- $inline,
- $wrap,
- [ $okMessage ],
- 'Hallo',
- 'OK inline translation is not wrapped'
- ];
-
- yield [
- $inline,
- $nowrap,
- [ $okMessage ],
- 'Hallo',
- 'OK inline translation is not wrapped in nowrap'
- ];
-
- yield [
- $block,
- $wrap,
- [ $okMessage ],
- $okMessage->translation(),
- 'OK block translation is not wrapped'
- ];
-
- yield [
- $block,
- $nowrap,
- [ $okMessage ],
- $okMessage->translation(),
- 'OK block translation is not wrapped in nowrap'
- ];
-
- yield [
- $inline,
- $wrap,
- [ $fuzzyMessage ],
- "<span class=\"$fuzzyClass\">hallo</span>",
- 'Fuzzy inline translation is wrapped'
- ];
-
- yield [
- $inline,
- $nowrap,
- [ $fuzzyMessage ],
- 'hallo',
- 'Fuzzy inline translation is not wrapped in nowrap'
- ];
-
- yield [
- $block,
- $wrap,
- [ $fuzzyMessage ],
- "<div class=\"$fuzzyClass\">\nhallo\n</div>",
- 'Fuzzy block translation is wrapped'
- ];
-
- yield [
- $block,
- $nowrap,
- [ $fuzzyMessage ],
- 'hallo',
- 'Fuzzy block translation is not wrapped in nowrap'
- ];
-
- yield [
- $inline,
- $wrap,
- [ $identicalMessage ],
- 'Hello',
- 'Identically translated inline message is not wrapped'
- ];
-
- yield [
- $block,
- $nowrap,
- [ $identicalMessage ],
- 'Hello',
- 'Identically translated block message is not wrapped in nowrap'
- ];
-
- yield [
- $inline,
- $wrap,
- [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
- "Hallo | <span class=\"$fuzzyClass\">hallo</span> | Hello | Hello",
- 'Different kinds of inline messages together are appropriately wrapped'
- ];
-
- yield [
- $inline,
- $nowrap,
- [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
- 'Hallo | hallo | Hello | Hello',
- 'Different kinds of inline messages together are not wrapped in nowrap'
- ];
-
- $blockText = <<<WIKITEXT
-Hallo
-
-<div class="{$fuzzyClass}">
-hallo
-</div>
-
-Hello
-
-Hello
-WIKITEXT;
-
- yield [
- $block,
- $wrap,
- [ $okMessage, $fuzzyMessage, $identicalMessage, $untranslatedMessage ],
- $blockText,
- 'Different kinds of block messages together are wrapped appropriately'
- ];
- }
-}
diff --git a/MLEB/Translate/tests/phpunit/unit/tag/TPSectionTest.php b/MLEB/Translate/tests/phpunit/unit/tag/TPSectionTest.php
deleted file mode 100644
index ae39b9b9..00000000
--- a/MLEB/Translate/tests/phpunit/unit/tag/TPSectionTest.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-declare( strict_types = 1 );
-
-/**
- * @author Niklas Laxström
- * @license GPL-2.0-or-later
- * @covers \TPSection
- */
-class TPSectionTest extends \MediaWikiUnitTestCase {
- /** @dataProvider providerTestGetMarkedText */
- public function testGetMarkedText(
- string $name, string $text, bool $inline, string $expected
- ) {
- $section = new TPSection();
- $section->name = $name;
- $section->text = $text;
- $section->setIsInline( $inline );
-
- $output = $section->getMarkedText();
-
- $this->assertEquals( $expected, $output );
- }
-
- /** @dataProvider providerTestGetTextWithVariables */
- public function testGetTextWithVariables( string $text, string $expected ) {
- $section = new TPSection();
- $section->text = $text;
-
- $output = $section->getTextWithVariables();
-
- $this->assertEquals( $expected, $output );
- }
-
- /** @dataProvider providerTestGetTextForTrans */
- public function testGetTextForTrans( string $text, string $expected ) {
- $section = new TPSection();
- $section->text = $text;
-
- $output = $section->getTextForTrans();
-
- $this->assertEquals( $expected, $output );
- }
-
- public static function providerTestGetMarkedText() {
- $cases = [];
-
- // Inline syntax
- $cases[] = [
- 'name',
- 'Hello',
- true,
- '<!--T:name--> Hello',
- ];
-
- // Normal syntax
- $cases[] = [
- 'name',
- 'Hello',
- false,
- "<!--T:name-->\nHello",
- ];
-
- // Inline should not matter for headings, which have special syntax, but test both values
- $cases[] = [
- 'name',
- '== Hello ==',
- true,
- '== Hello == <!--T:name-->',
- ];
-
- $cases[] = [
- 'name',
- '====== Hello ======',
- false,
- '====== Hello ====== <!--T:name-->',
- ];
-
- return $cases;
- }
-
- public static function providerTestGetTextWithVariables() {
- $cases = [];
-
- // syntax
- $cases[] = [
- "<tvar|abc>Peter\n cat!</>",
- '$abc',
- ];
-
- $cases[] = [
- "<tvar|1>Hello</>\n<tvar|2>Hello</>",
- "$1\n$2",
- ];
-
- return $cases;
- }
-
- public static function providerTestGetTextForTrans() {
- $cases = [];
-
- // syntax
- $cases[] = [
- "<tvar|abc>Peter\n cat!</>",
- "Peter\n cat!",
- ];
-
- $cases[] = [
- "<tvar|1>Hello</>\n<tvar|2>Hello</>",
- "Hello\nHello",
- ];
-
- return $cases;
- }
-}
diff --git a/MLEB/Translate/tests/phpunit/unit/tag/TranslatablePageTest.php b/MLEB/Translate/tests/phpunit/unit/tag/TranslatablePageTest.php
index a2b180ec..a1b16295 100644
--- a/MLEB/Translate/tests/phpunit/unit/tag/TranslatablePageTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/tag/TranslatablePageTest.php
@@ -9,158 +9,6 @@ use MediaWiki\Linker\LinkTarget;
* @covers \TranslatablePage
*/
class TranslatablePageTest extends \MediaWikiUnitTestCase {
- /** @dataProvider provideTestGetTranslationPageText */
- public function testGetTranslationPageText( string $pageContents, string $expected ) {
- $title = Title::makeTitle( NS_MAIN, __CLASS__ );
- $page = TranslatablePage::newFromText( $title, $pageContents );
- $prefix = $title->getPrefixedDBkey() . '/';
- $parse = $page->getParse();
-
- $collection = [];
- $actual = $parse->getTranslationPageText( $collection );
- $this->assertEquals(
- $expected,
- $actual,
- 'Variable declarations are substituted when no translation'
- );
-
- foreach ( $parse->sections as $section ) {
- $key = $prefix . $section->id;
- $message = new FatMessage( $key, $section->getText() );
- $message->setTranslation( $section->getText() );
- $collection[$key] = $message;
- }
-
- $actual = $parse->getTranslationPageText( $collection );
- $this->assertEquals(
- $expected,
- $actual,
- 'Variable declarations are substituted in source language'
- );
-
- foreach ( $parse->sections as $section ) {
- $key = $prefix . $section->id;
- $message = new FatMessage( $key, $section->getText() );
- $message->setTranslation( $section->getTextForTrans() );
- $collection[$key] = $message;
- }
- $actual = $parse->getTranslationPageText( $collection );
- $this->assertEquals(
- $expected,
- $actual,
- 'Variable declarations are substituted in translation'
- );
- }
-
- public function provideTestGetTranslationPageText() {
- yield [
- '<translate>Hello <tvar|abc>peter!</></translate>',
- 'Hello peter!'
- ];
-
- yield [
- '<translate nowrap>Hello <tvar|abc>peter!</></translate>',
- 'Hello peter!'
- ];
- }
-
- /** @dataProvider provideTestSectionise */
- public function testSectionise( string $input, string $pattern, string $comment ) {
- $canWrap = true;
- $result = TranslatablePage::sectionise( $input, $canWrap );
- $pattern = addcslashes( $pattern, '~' );
- $this->assertRegExp( "~^$pattern$~", $result['template'], $comment );
- }
-
- public static function provideTestSectionise() {
- // Ugly implicit assumption
- $ph = "\x7fUNIQ[a-z0-9]{8,16}-\d+";
-
- $cases = [];
-
- yield [
- 'Hello',
- "$ph",
- 'No surrounding whitespace',
- ];
-
- yield [
- "\nHello",
- "\n$ph",
- 'With surrounding whitespace',
- ];
-
- yield [
- "\nHello world\n\nBunny\n",
- "\n$ph\n\n$ph\n",
- 'Splitting at one empty line',
- ];
-
- yield [
- "First\n\n\n\n\nSecond\n\nThird",
- "$ph\n\n\n\n\n$ph\n\n$ph",
- 'Splitting with multiple empty lines',
- ];
-
- return $cases;
- }
-
- /** @dataProvider provideTestCleanupTags */
- public function testCleanupTags( string $input, string $expected, string $comment ) {
- $output = TranslatablePage::cleanupTags( $input );
- $this->assertEquals( $expected, $output, $comment );
- }
-
- public static function provideTestCleanupTags() {
- yield [
- "== Hello ==\n</translate>",
- '== Hello ==',
- 'Unbalanced tag in a section preview',
- ];
-
- yield [
- "</translate><translate>",
- '',
- 'Unbalanced tags, no whitespace',
- ];
-
- yield [
- "1\n2<translate>3\n4</translate>5\n6",
- "1\n23\n45\n6",
- 'Balanced tags, non-removable whitespace',
- ];
-
- yield [
- "1<translate>\n\n</translate>2",
- '12',
- 'Balanced tags, removable whitespace',
- ];
-
- yield [
- '[[<tvar|wmf>Special:MyLanguage/Wikimedia Foundation</>|Wikimedia Foundation]].',
- '[[Special:MyLanguage/Wikimedia Foundation|Wikimedia Foundation]].',
- 'TVAR tag is collapsed',
- ];
-
- yield [
- 'You can use the <nowiki><translate></nowiki> tag.',
- 'You can use the <nowiki><translate></nowiki> tag.',
- 'Tag inside a nowiki is retained',
- ];
-
- yield [
- 'What if I <translate and </translate>.',
- 'What if I <translate and .',
- 'Broken tag is retained',
- ];
-
- yield [
- '<abbr title="<translate nowrap>Careful unselfish true engineer</translate>">CUTE</abbr>',
- '<abbr title="Careful unselfish true engineer">CUTE</abbr>',
- 'Nowrap is removed',
- ];
- }
-
/** @dataProvider provideTestParseTranslationUnit */
public function testParseTranslationUnit( LinkTarget $input, array $expected ) {
$output = TranslatablePage::parseTranslationUnit( $input );
diff --git a/MLEB/Translate/tests/phpunit/unit/utils/ArrayFlattenerTest.php b/MLEB/Translate/tests/phpunit/unit/utils/ArrayFlattenerTest.php
index 1b72e56a..bb4f7a2c 100644
--- a/MLEB/Translate/tests/phpunit/unit/utils/ArrayFlattenerTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/utils/ArrayFlattenerTest.php
@@ -5,9 +5,7 @@
* @license GPL-2.0-or-later
*/
-/**
- * @coversDefaultClass \ArrayFlattener
- */
+/** @coversDefaultClass \ArrayFlattener */
class ArrayFlattenerTest extends \MediaWikiUnitTestCase {
/**
* @dataProvider provideTestFlatten
diff --git a/MLEB/Translate/tests/phpunit/unit/utils/MessageSourceChangeTest.php b/MLEB/Translate/tests/phpunit/unit/utils/MessageSourceChangeTest.php
index 7929f5e9..99b71beb 100644
--- a/MLEB/Translate/tests/phpunit/unit/utils/MessageSourceChangeTest.php
+++ b/MLEB/Translate/tests/phpunit/unit/utils/MessageSourceChangeTest.php
@@ -4,15 +4,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
-/**
- * @covers MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange
- */
+/** @covers MediaWiki\Extension\Translate\MessageSync\MessageSourceChange */
class MessageSourceChangeTest extends MediaWikiUnitTestCase {
- /**
- * @var MessageSourceChange
- */
+ /** @var MessageSourceChange */
protected $change;
/**
@@ -136,7 +132,7 @@ class MessageSourceChangeTest extends MediaWikiUnitTestCase {
'en-gb', 'renameDeleted', [ MessageSourceChange::CHANGE ]
);
$this->assertNull(
- $changed, 'findMessage returns null when searching changes for renamed message.'
+ $changed, 'findMessage returns null when searching changes for renamed message.'
);
$this->change->breakRename( 'en-gb', 'renameAdded' );
diff --git a/MLEB/Translate/tests/phpunit/utils/MessageGroupCacheTest.php b/MLEB/Translate/tests/phpunit/utils/MessageGroupCacheTest.php
index 06734c10..61d8e2c6 100644
--- a/MLEB/Translate/tests/phpunit/utils/MessageGroupCacheTest.php
+++ b/MLEB/Translate/tests/phpunit/utils/MessageGroupCacheTest.php
@@ -5,9 +5,7 @@
* @license GPL-2.0-or-later
*/
-/**
- * @coversDefaultClass \MessageGroupCache
- */
+/** @coversDefaultClass \MessageGroupCache */
class MessageGroupCacheTest extends MediaWikiIntegrationTestCase {
public function testCacheRoundtrip() {
$parseOutput = [
diff --git a/MLEB/Translate/tests/phpunit/utils/MessageGroupStatsTest.php b/MLEB/Translate/tests/phpunit/utils/MessageGroupStatsTest.php
index 05777c5e..b26299d9 100644
--- a/MLEB/Translate/tests/phpunit/utils/MessageGroupStatsTest.php
+++ b/MLEB/Translate/tests/phpunit/utils/MessageGroupStatsTest.php
@@ -6,7 +6,7 @@
*/
class MessageGroupStatsTest extends MediaWikiIntegrationTestCase {
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setTemporaryHook(
@@ -54,7 +54,7 @@ class MessageGroupStatsTest extends MediaWikiIntegrationTestCase {
$validLang = MessageGroupStats::forLanguage( 'en', MessageGroupStats::FLAG_CACHE_ONLY );
$invalidLang = MessageGroupStats::forLanguage( 'ffff', MessageGroupStats::FLAG_CACHE_ONLY );
- $validGroup = MessageGroupStats::forGroup( 'theid', MessageGroupStats::FLAG_CACHE_ONLY );
+ $validGroup = MessageGroupStats::forGroup( 'theid', MessageGroupStats::FLAG_CACHE_ONLY );
$invalidGroup = MessageGroupStats::forGroup( 'invalid-mg-group',
MessageGroupStats::FLAG_CACHE_ONLY );
diff --git a/MLEB/Translate/tests/phpunit/utils/MessageGroupWANCacheTest.php b/MLEB/Translate/tests/phpunit/utils/MessageGroupWANCacheTest.php
index 4887b9f2..1f52ccde 100644
--- a/MLEB/Translate/tests/phpunit/utils/MessageGroupWANCacheTest.php
+++ b/MLEB/Translate/tests/phpunit/utils/MessageGroupWANCacheTest.php
@@ -1,8 +1,9 @@
<?php
+
class MessageGroupWANCacheTest extends MediaWikiIntegrationTestCase {
protected $mgCache;
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->mgCache = new MessageGroupWANCache(
new WANObjectCache( [ 'cache' => wfGetCache( 'hash' ) ] )
diff --git a/MLEB/Translate/tests/phpunit/utils/MessageWebImporterTest.php b/MLEB/Translate/tests/phpunit/utils/MessageWebImporterTest.php
index 0c9dd7b1..69a6f810 100644
--- a/MLEB/Translate/tests/phpunit/utils/MessageWebImporterTest.php
+++ b/MLEB/Translate/tests/phpunit/utils/MessageWebImporterTest.php
@@ -1,12 +1,10 @@
<?php
-/**
- * @group Database
- */
+/** @group Database */
class MessageWebImporterTest extends MediaWikiIntegrationTestCase {
private const PAGE = 'MediaWiki:' . __METHOD__ . '_translated';
- protected function setUp() : void {
+ protected function setUp(): void {
parent::setUp();
$this->setTemporaryHook( 'TranslatePostInitGroups', [ $this, 'getTestGroups' ] );
@@ -27,9 +25,7 @@ class MessageWebImporterTest extends MediaWikiIntegrationTestCase {
return false;
}
- /**
- * @covers MessageWebImporter::doFuzzy
- */
+ /** @covers MessageWebImporter::doFuzzy */
public function testDoFuzzy() {
$this->assertTrue(
$this->editPage( self::PAGE . '/en', 'English Original' )->isGood(),
diff --git a/MLEB/Translate/translationaids/SupportAid.php b/MLEB/Translate/translationaids/SupportAid.php
index b4a65c12..98c72b93 100644
--- a/MLEB/Translate/translationaids/SupportAid.php
+++ b/MLEB/Translate/translationaids/SupportAid.php
@@ -17,30 +17,21 @@
class SupportAid extends TranslationAid {
public function getData() {
return [
- 'url' => self::getSupportUrl( $this->handle->getTitle() ),
+ 'url' => self::getSupportUrl( $this->handle ),
];
}
/**
* Target URL for a link provided by a support button/aid.
*
- * @param Title $title Title object for the translation message.
+ * @param MessageHandle $handle MessageHandle object for the translation message.
* @since 2015.09
* @return string
* @throws TranslationHelperException
*/
- public static function getSupportUrl( Title $title ) {
- global $wgTranslateSupportUrl, $wgTranslateSupportUrlNamespace;
- $namespace = $title->getNamespace();
-
- // Fetch the configuration for this namespace if possible, or the default.
- if ( isset( $wgTranslateSupportUrlNamespace[$namespace] ) ) {
- $config = $wgTranslateSupportUrlNamespace[$namespace];
- } elseif ( $wgTranslateSupportUrl ) {
- $config = $wgTranslateSupportUrl;
- } else {
- throw new TranslationHelperException( 'Support page not configured' );
- }
+ public static function getSupportUrl( MessageHandle $handle ) {
+ $title = $handle->getTitle();
+ $config = self::getConfig( $handle );
// Preprocess params
$params = [];
@@ -63,4 +54,31 @@ class SupportAid extends TranslationAid {
throw new TranslationHelperException( 'Support page not configured properly' );
}
}
+
+ /**
+ * Fetches Support URL config
+ * @param MessageHandle $handle
+ * @return array
+ * @throws TranslationHelperException
+ */
+ private static function getConfig( MessageHandle $handle ): array {
+ global $wgTranslateSupportUrl, $wgTranslateSupportUrlNamespace;
+
+ if ( !$handle->isValid() ) {
+ throw new TranslationHelperException( 'Invalid MessageHandle' );
+ }
+
+ // Fetch group level configuration if possible, fallback to namespace based, or default
+ $group = $handle->getGroup();
+ $namespace = $handle->getTitle()->getNamespace();
+ $config = $group->getSupportConfig()
+ ?? $wgTranslateSupportUrlNamespace[$namespace]
+ ?? $wgTranslateSupportUrl;
+
+ if ( !$config ) {
+ throw new TranslationHelperException( 'Support page not configured' );
+ }
+
+ return $config;
+ }
}
diff --git a/MLEB/Translate/translationaids/TranslationAid.php b/MLEB/Translate/translationaids/TranslationAid.php
index a8068a34..1b715643 100644
--- a/MLEB/Translate/translationaids/TranslationAid.php
+++ b/MLEB/Translate/translationaids/TranslationAid.php
@@ -16,24 +16,13 @@
* @since 2013-01-01
*/
abstract class TranslationAid {
- /**
- * @var MessageGroup
- */
+ /** @var MessageGroup */
protected $group;
-
- /**
- * @var MessageHandle
- */
+ /** @var MessageHandle */
protected $handle;
-
- /**
- * @var IContextSource
- */
+ /** @var IContextSource */
protected $context;
-
- /**
- * @var TranslationAidDataProvider
- */
+ /** @var TranslationAidDataProvider */
protected $dataProvider;
public function __construct(
diff --git a/MLEB/Translate/translationaids/TranslationAidDataProvider.php b/MLEB/Translate/translationaids/TranslationAidDataProvider.php
index 02b54093..e5aec47a 100644
--- a/MLEB/Translate/translationaids/TranslationAidDataProvider.php
+++ b/MLEB/Translate/translationaids/TranslationAidDataProvider.php
@@ -12,13 +12,10 @@ use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
use Wikimedia\Rdbms\IDatabase;
-/**
- * @since 2018.01
- */
+/** @since 2018.01 */
class TranslationAidDataProvider {
private $handle;
private $group;
-
private $definition;
private $translations;
@@ -51,9 +48,7 @@ class TranslationAidDataProvider {
return $this->definition;
}
- /**
- * @return Content
- */
+ /** @return Content */
public function getDefinitionContent() {
return ContentHandler::makeContent( $this->getDefinition(), $this->handle->getTitle() );
}
@@ -91,21 +86,12 @@ class TranslationAidDataProvider {
private static function loadTranslationData( IDatabase $db, MessageHandle $handle ) {
$revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
- if ( is_callable( [ $revisionStore, 'newRevisionsFromBatch' ] ) ) {
- $queryInfo = $revisionStore->getQueryInfo( [ 'page' ] );
- $tables = $queryInfo[ 'tables' ];
- $fields = $queryInfo[ 'fields' ];
- $conds = [];
- $options = [];
- $joins = $queryInfo[ 'joins' ];
- } else {
- $queryInfo = Revision::getQueryInfo( [ 'page', 'text' ] );
- $tables = $queryInfo[ 'tables' ];
- $fields = $queryInfo[ 'fields' ];
- $conds = [];
- $options = [];
- $joins = $queryInfo[ 'joins' ];
- }
+ $queryInfo = $revisionStore->getQueryInfo( [ 'page' ] );
+ $tables = $queryInfo[ 'tables' ];
+ $fields = $queryInfo[ 'fields' ];
+ $conds = [];
+ $options = [];
+ $joins = $queryInfo[ 'joins' ];
// The list of pages we want to select, and their latest versions
$conds['page_namespace'] = $handle->getTitle()->getNamespace();
@@ -124,22 +110,16 @@ class TranslationAidDataProvider {
$rows = $db->select( $tables, $fields, $conds, __METHOD__, $options, $joins );
$pages = [];
- if ( is_callable( [ $revisionStore, 'newRevisionsFromBatch' ] ) ) {
- $revisions = $revisionStore->newRevisionsFromBatch( $rows, [
- 'slots' => [ SlotRecord::MAIN ]
- ] )->getValue();
- foreach ( $rows as $row ) {
- /** @var RevisionRecord|null $rev */
- $rev = $revisions[$row->rev_id];
- if ( $rev && $rev->getContent( SlotRecord::MAIN ) instanceof TextContent ) {
- $pages[$row->page_title] = $rev->getContent( SlotRecord::MAIN )->getText();
- }
- }
- } else {
- foreach ( $rows as $row ) {
- $pages[$row->page_title] = Revision::getRevisionText( $row );
+ $revisions = $revisionStore->newRevisionsFromBatch( $rows, [ 'slots' => [ SlotRecord::MAIN ] ] )
+ ->getValue();
+ foreach ( $rows as $row ) {
+ /** @var RevisionRecord|null $rev */
+ $rev = $revisions[$row->rev_id];
+ if ( $rev && $rev->getContent( SlotRecord::MAIN ) instanceof TextContent ) {
+ $pages[$row->page_title] = $rev->getContent( SlotRecord::MAIN )->getText();
}
}
+
return $pages;
}
}
diff --git a/MLEB/Translate/ttmserver/CrossLanguageTranslationSearchQuery.php b/MLEB/Translate/ttmserver/CrossLanguageTranslationSearchQuery.php
index 6a6d0226..c10ac5d6 100644
--- a/MLEB/Translate/ttmserver/CrossLanguageTranslationSearchQuery.php
+++ b/MLEB/Translate/ttmserver/CrossLanguageTranslationSearchQuery.php
@@ -1,4 +1,5 @@
<?php
+
/**
* Cross Language Translation Search.
* @since 2015.08
@@ -6,16 +7,12 @@
class CrossLanguageTranslationSearchQuery {
/** @var SearchableTTMServer */
protected $server;
-
/** @var array */
protected $params;
-
/** @var \Elastica\ResultSet */
protected $resultset;
-
/** @var int */
protected $total = 0;
-
protected $hl = [ '', '' ];
public function __construct( array $params, SearchableTTMServer $server ) {
@@ -143,9 +140,7 @@ class CrossLanguageTranslationSearchQuery {
return $ret;
}
- /**
- * @return array
- */
+ /** @return array */
public function getAvailableFilters() {
return [
'translated',
diff --git a/MLEB/Translate/ttmserver/ElasticSearchTTMServer.php b/MLEB/Translate/ttmserver/ElasticSearchTTMServer.php
index 1a98c8cc..ff4c7b79 100644
--- a/MLEB/Translate/ttmserver/ElasticSearchTTMServer.php
+++ b/MLEB/Translate/ttmserver/ElasticSearchTTMServer.php
@@ -45,16 +45,12 @@ class ElasticSearchTTMServer
*/
protected const FROZEN_TYPE = 'frozen';
- /**
- * @var \Elastica\Client
- */
+ /** @var \Elastica\Client */
protected $client;
-
/**
* Reference to the maintenance script to relay logging output.
*/
protected $logger;
-
/**
* Used for Reindex
*/
@@ -376,12 +372,12 @@ class ElasticSearchTTMServer
$mapping = new \Elastica\Type\Mapping();
$mapping->setType( $type );
$mapping->setProperties( [
- 'wiki' => [ 'type' => 'keyword' ],
- 'localid' => [ 'type' => 'keyword' ],
- 'uri' => [ 'type' => 'keyword' ],
+ 'wiki' => [ 'type' => 'keyword' ],
+ 'localid' => [ 'type' => 'keyword' ],
+ 'uri' => [ 'type' => 'keyword' ],
'language' => [ 'type' => 'keyword' ],
- 'group' => [ 'type' => 'keyword' ],
- 'content' => [
+ 'group' => [ 'type' => 'keyword' ],
+ 'content' => [
'type' => 'text',
'fields' => [
'content' => [
@@ -468,16 +464,12 @@ class ElasticSearchTTMServer
return $this->client;
}
- /**
- * @return true if the backend is configured with the wikimedia extra plugin
- */
+ /** @return true if the backend is configured with the wikimedia extra plugin */
public function useWikimediaExtraPlugin() {
return isset( $this->config['use_wikimedia_extra'] ) && $this->config['use_wikimedia_extra'];
}
- /**
- * @return string
- */
+ /** @return string */
private function getIndexName() {
return $this->config['index'] ?? 'ttmserver';
}
@@ -517,7 +509,7 @@ class ElasticSearchTTMServer
* Wait for the index to go green
*
* NOTE: This method has been copied and adjusted from
- * CirrusSearch/includes/Maintenance/ConfigUtils.php. Ideally we'd
+ * CirrusSearch/includes/Maintenance/ConfigUtils.php. Ideally we'd
* like to make these utility methods available in the Elastica
* extension, but this one requires some refactoring in cirrus first.
* TODO: Remove this code in the future as we drop support for
@@ -547,28 +539,16 @@ class ElasticSearchTTMServer
}
protected function waitUntilReady() {
- if ( method_exists( MWElasticUtils::class, 'waitForGreen' ) ) {
- $statuses = MWElasticUtils::waitForGreen(
- $this->getClient(),
- $this->getIndexName(),
- self::WAIT_UNTIL_READY_TIMEOUT );
- $this->logOutput( "Waiting for the index to go green..." );
- foreach ( $statuses as $message ) {
- $this->logOutput( $message );
- }
-
- if ( !$statuses->getReturn() ) {
- die( "Timeout! Please check server logs for {$this->getIndexName()}." );
- }
-
- return;
+ $statuses = MWElasticUtils::waitForGreen(
+ $this->getClient(),
+ $this->getIndexName(),
+ self::WAIT_UNTIL_READY_TIMEOUT );
+ $this->logOutput( "Waiting for the index to go green..." );
+ foreach ( $statuses as $message ) {
+ $this->logOutput( $message );
}
- // TODO: This code can be removed in the future as we drop support for
- // older versions of the Elastica extension.
- $indexName = $this->getType()->getIndex()->getName();
- $this->logOutput( "Waiting for the index to go green..." );
- if ( !$this->waitForGreen( $indexName, self::WAIT_UNTIL_READY_TIMEOUT ) ) {
+ if ( !$statuses->getReturn() ) {
die( "Timeout! Please check server logs for {$this->getIndexName()}." );
}
}
@@ -806,83 +786,26 @@ class ElasticSearchTTMServer
* in 2.x and returned in 5.x.
*
* @param \Elastica\Type $type the source index
- * @param \Elastica\Query $query the query
+ * @param \Elastica\Query $query
* @throws \RuntimeException
*/
private function deleteByQuery( \Elastica\Type $type, \Elastica\Query $query ) {
- if ( method_exists( MWElasticUtils::class, 'deleteByQuery' ) ) {
- try {
- MWElasticUtils::deleteByQuery( $type->getIndex(), $query, /* $allowConflicts = */ true );
- } catch ( \Exception $e ) {
- LoggerFactory::getInstance( 'ElasticSearchTTMServer' )->error(
- 'Problem encountered during deletion.',
- [ 'exception' => $e ]
- );
-
- throw new \RuntimeException( "Problem encountered during deletion.\n" . $e );
- }
- return;
- }
- // TODO: This code can be removed in the future as we drop support for
- // older versions of the Elastica extension.
- $retryAttempts = self::BULK_INDEX_RETRY_ATTEMPTS;
- $search = new \Elastica\Search( $this->getClient() );
- $search->setQuery( $query );
- $search->addType( $type );
- $search->addIndex( $type->getIndex() );
- $scroll = new \Elastica\Scroll( $search, '15m' );
-
- foreach ( $scroll as $results ) {
- $ids = [];
- foreach ( $results as $result ) {
- $ids[] = $result->getId();
- }
-
- if ( $ids === [] ) {
- continue;
- }
-
- MWElasticUtils::withRetry( $retryAttempts,
- function () use ( $ids, $type ) {
- $type->deleteIds( $ids );
- }
+ try {
+ MWElasticUtils::deleteByQuery( $type->getIndex(), $query, /* $allowConflicts = */ true );
+ } catch ( \Exception $e ) {
+ LoggerFactory::getInstance( 'ElasticSearchTTMServer' )->error(
+ 'Problem encountered during deletion.',
+ [ 'exception' => $e ]
);
+
+ throw new \RuntimeException( "Problem encountered during deletion.\n" . $e );
}
}
- /**
- * @return bool
- */
+ /** @return bool */
public function isFrozen() {
- if ( method_exists( MWElasticUtils::class, 'isFrozen' ) ) {
- try {
- return MWElasticUtils::isFrozen( $this->getClient() );
- } catch ( \Exception $e ) {
- LoggerFactory::getInstance( 'ElasticSearchTTMServer' )->warning(
- 'Problem encountered while checking the frozen index.',
- [ 'exception' => $e ]
- );
- return false;
- }
- }
-
- // TODO: This code can be removed in the future as we drop support for
- // older versions of the Elastica extension.
- if ( !isset( $this->config['frozen_index'] ) ) {
- return false;
- }
- $frozenIndex = $this->config['frozen_index'];
- $indices = [ static::ALL_INDEXES_FROZEN_NAME, $this->getIndexName() ];
- $ids = ( new \Elastica\Query\Ids() )
- ->setIds( $indices );
-
try {
- $resp = $this->getClient()
- ->getIndex( $frozenIndex )
- ->getType( static::FROZEN_TYPE )
- ->search( \Elastica\Query::create( $ids ) );
-
- return $resp->count() !== 0;
+ return MWElasticUtils::isFrozen( $this->getClient() );
} catch ( \Exception $e ) {
LoggerFactory::getInstance( 'ElasticSearchTTMServer' )->warning(
'Problem encountered while checking the frozen index.',
diff --git a/MLEB/Translate/ttmserver/FuzzyLikeThis.php b/MLEB/Translate/ttmserver/FuzzyLikeThis.php
index 82798584..8369f25b 100644
--- a/MLEB/Translate/ttmserver/FuzzyLikeThis.php
+++ b/MLEB/Translate/ttmserver/FuzzyLikeThis.php
@@ -53,42 +53,36 @@ class FuzzyLikeThis extends \Elastica\Query\AbstractQuery {
* @var array Field names
*/
protected $_fields = [];
-
/**
* Like text.
*
* @var string Like text
*/
protected $_likeText = '';
-
/**
* Ignore term frequency.
*
* @var bool ignore term frequency
*/
protected $_ignoreTF = false;
-
/**
* Max query terms value.
*
* @var int Max query terms value
*/
protected $_maxQueryTerms = 25;
-
/**
* fuzziness.
*
* @var int fuzziness
*/
protected $_fuzziness = 2;
-
/**
* Prefix Length.
*
* @var int Prefix Length
*/
protected $_prefixLength = 0;
-
/**
* Analyzer.
*
@@ -152,8 +146,6 @@ class FuzzyLikeThis extends \Elastica\Query\AbstractQuery {
}
/**
- * Set Prefix Length.
- *
* @param int $value Prefix length
*
* @return $this
@@ -178,8 +170,6 @@ class FuzzyLikeThis extends \Elastica\Query\AbstractQuery {
}
/**
- * Set analyzer.
- *
* @param string $text Analyzer text
*
* @return $this
diff --git a/MLEB/Translate/ttmserver/TTMServer.php b/MLEB/Translate/ttmserver/TTMServer.php
index 2a7f0900..d39eab05 100644
--- a/MLEB/Translate/ttmserver/TTMServer.php
+++ b/MLEB/Translate/ttmserver/TTMServer.php
@@ -8,20 +8,20 @@
* @defgroup TTMServer The Translate extension translation memory interface
*/
+use MediaWiki\Extension\Translate\Services;
+
/**
* Some general static methods for instantiating TTMServer and helpers.
* @since 2012-01-28
* Rewritten in 2012-06-27.
* @ingroup TTMServer
*/
-class TTMServer {
+abstract class TTMServer {
/** @var array */
protected $config;
- /**
- * @param array $config
- */
- protected function __construct( array $config ) {
+ /** @param array $config */
+ public function __construct( array $config ) {
$this->config = $config;
}
@@ -29,8 +29,10 @@ class TTMServer {
* @param array $config
* @return TTMServer|null
* @throws MWException
+ * @deprecated Use Services::getInstance()->getTtmServerFactory()->create()
*/
public static function factory( array $config ) {
+ // Cannot call factory directly because we don't have the name.
if ( isset( $config['class'] ) ) {
$class = $config['class'];
@@ -55,18 +57,10 @@ class TTMServer {
* Primary instance is defined by $wgTranslateTranslationDefaultService
* which is a key to $wgTranslateTranslationServices.
* @return WritableTTMServer
+ * @deprecated Use Services::getInstance()->getTtmServerFactory()->getDefault()
*/
public static function primary() {
- global $wgTranslateTranslationServices,
- $wgTranslateTranslationDefaultService;
- if ( isset( $wgTranslateTranslationServices[$wgTranslateTranslationDefaultService] ) ) {
- $obj = self::factory( $wgTranslateTranslationServices[$wgTranslateTranslationDefaultService] );
- if ( $obj instanceof WritableTTMServer ) {
- return $obj;
- }
- }
-
- return new FakeTTMServer();
+ return Services::getInstance()->getTtmServerFactory()->getDefault();
}
/**
@@ -74,27 +68,14 @@ class TTMServer {
* @return array[]
*/
public static function sortSuggestions( array $suggestions ) {
- usort( $suggestions, [ __CLASS__, 'qualitySort' ] );
+ usort( $suggestions, function ( $a, $b ) {
+ return $b['quality'] <=> $a['quality'];
+ } );
return $suggestions;
}
/**
- * @param array $a
- * @param array $b
- * @return int
- */
- protected static function qualitySort( $a, $b ) {
- list( $c, $d ) = [ $a['quality'], $b['quality'] ];
- if ( $c === $d ) {
- return 0;
- }
-
- // Descending sort
- return ( $c > $d ) ? -1 : 1;
- }
-
- /**
* PHP implementation of Levenshtein edit distance algorithm.
* Uses the native PHP implementation when possible for speed.
* The native levenshtein is limited to 255 bytes.
@@ -175,9 +156,7 @@ class TTMServer {
JobQueueGroup::singleton()->push( $job );
}
- /**
- * @return string[]
- */
+ /** @return string[] */
public function getMirrors() {
global $wgTranslateTranslationServices;
if ( isset( $this->config['mirrors'] ) ) {
@@ -198,9 +177,7 @@ class TTMServer {
return [];
}
- /**
- * @return bool
- */
+ /** @return bool */
public function isFrozen() {
return false;
}
diff --git a/MLEB/Translate/ttmserver/TTMServerMessageUpdateJob.php b/MLEB/Translate/ttmserver/TTMServerMessageUpdateJob.php
index 2d59813e..c9193607 100644
--- a/MLEB/Translate/ttmserver/TTMServerMessageUpdateJob.php
+++ b/MLEB/Translate/ttmserver/TTMServerMessageUpdateJob.php
@@ -117,9 +117,7 @@ class TTMServerMessageUpdateJob extends Job {
return true;
}
- /**
- * @inheritDoc
- */
+ /** @inheritDoc */
public function allowRetries() {
return false;
}
diff --git a/MLEB/Translate/utils/ArrayFlattener.php b/MLEB/Translate/utils/ArrayFlattener.php
index db57b4f5..5e8d91bc 100644
--- a/MLEB/Translate/utils/ArrayFlattener.php
+++ b/MLEB/Translate/utils/ArrayFlattener.php
@@ -14,7 +14,6 @@
class ArrayFlattener {
protected $sep;
protected $parseCLDRPlurals;
-
// For CLDR pluralization rules
protected static $pluralWords = [
'zero' => 1,
diff --git a/MLEB/Translate/utils/ExternalMessageSourceStateComparator.php b/MLEB/Translate/utils/ExternalMessageSourceStateComparator.php
index a6b53f4f..9b4b298d 100644
--- a/MLEB/Translate/utils/ExternalMessageSourceStateComparator.php
+++ b/MLEB/Translate/utils/ExternalMessageSourceStateComparator.php
@@ -8,21 +8,17 @@
* @since 2013.12
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
-use MediaWiki\Extensions\Translate\Utilities\StringComparators\StringComparator;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Utilities\StringComparators\StringComparator;
class ExternalMessageSourceStateComparator {
/** Process all languages supported by the message group */
public const ALL_LANGUAGES = 'all languages';
- /**
- * @var StringComparator
- */
+ /** @var StringComparator */
protected $stringComparator;
- /**
- * @param StringComparator $stringComparator
- */
+ /** @param StringComparator $stringComparator */
public function __construct( StringComparator $stringComparator ) {
$this->stringComparator = $stringComparator;
}
@@ -129,9 +125,8 @@ class ExternalMessageSourceStateComparator {
) {
/* This throws a warning if message definitions are not yet
* cached and will read the file for definitions. */
- Wikimedia\suppressWarnings();
- $wiki = $group->initCollection( $language );
- Wikimedia\restoreWarnings();
+ // phpcs:disable Generic.PHP.NoSilencedErrors.Discouraged
+ $wiki = @$group->initCollection( $language );
$wiki->filter( 'hastranslation', false );
$wiki->loadTranslations();
$wikiKeys = $wiki->getMessageKeys();
@@ -233,10 +228,6 @@ class ExternalMessageSourceStateComparator {
$added = array_diff( $fileKeys, $wikiKeys );
foreach ( $added as $key ) {
$sourceContent = $file['MESSAGES'][$key];
- if ( trim( $sourceContent ) === '' ) {
- continue;
- }
-
$changes->addAddition( $language, $key, $sourceContent );
}
diff --git a/MLEB/Translate/utils/ExternalMessageSourceStateImporter.php b/MLEB/Translate/utils/ExternalMessageSourceStateImporter.php
index 51674921..5fa3f471 100644
--- a/MLEB/Translate/utils/ExternalMessageSourceStateImporter.php
+++ b/MLEB/Translate/utils/ExternalMessageSourceStateImporter.php
@@ -8,7 +8,10 @@
* @since 2016.02
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\Synchronization\MessageUpdateParameter;
+use MediaWiki\MediaWikiServices;
class ExternalMessageSourceStateImporter {
@@ -22,13 +25,9 @@ class ExternalMessageSourceStateImporter {
$jobs = [];
$jobs[] = MessageIndexRebuildJob::newJob();
- /**
- * @var MessageSourceChange $changesForGroup
- */
+ /** @var MessageSourceChange $changesForGroup */
foreach ( $changeData as $groupId => $changesForGroup ) {
- /**
- * @var FileBasedMessageGroup
- */
+ /** @var FileBasedMessageGroup */
$group = MessageGroups::getGroup( $groupId );
if ( !$group ) {
unset( $changeData[$groupId] );
@@ -38,10 +37,12 @@ class ExternalMessageSourceStateImporter {
$processed[$groupId] = [];
$languages = $changesForGroup->getLanguages();
+ $groupJobs = [];
+
+ $groupSafeLanguages = self::identifySafeLanguages( $group, $changesForGroup );
foreach ( $languages as $language ) {
- if ( !self::isSafe( $changesForGroup, $language ) ) {
- // changes other than additions were present
+ if ( !$groupSafeLanguages[ $language ] ) {
$skipped[$groupId] = true;
continue;
}
@@ -51,16 +52,21 @@ class ExternalMessageSourceStateImporter {
continue;
}
- [ $groupJobs, $groupProcessed ] = $this->createMessageUpdateJobs(
+ [ $groupLanguageJobs, $groupProcessed ] = $this->createMessageUpdateJobs(
$group, $additions, $language
);
- $jobs = array_merge( $jobs, $groupJobs );
+ $groupJobs = array_merge( $groupJobs, $groupLanguageJobs );
$processed[$groupId][$language] = $groupProcessed;
$changesForGroup->removeChangesForLanguage( $language );
$group->getMessageGroupCache( $language )->create();
}
+
+ if ( $groupJobs !== [] ) {
+ $this->updateGroupSyncInfo( $groupId, $groupJobs );
+ $jobs = array_merge( $jobs, $groupJobs );
+ }
}
// Remove groups where everything was imported
@@ -84,16 +90,6 @@ class ExternalMessageSourceStateImporter {
}
/**
- * Checks if changes for a language in a group are safe.
- * @param MessageSourceChange $changesForGroup
- * @param string $language
- * @return bool
- */
- public static function isSafe( MessageSourceChange $changesForGroup, $language ) {
- return $changesForGroup->hasOnly( $language, MessageSourceChange::ADDITION );
- }
-
- /**
* Creates MessagUpdateJobs additions for a language under a group
*
* @param MessageGroup $group
@@ -123,4 +119,111 @@ class ExternalMessageSourceStateImporter {
return [ $jobs, $processed ];
}
+
+ /**
+ * @param string $groupId
+ * @param MessageUpdateJob[] $groupJobs
+ */
+ private function updateGroupSyncInfo( string $groupId, array $groupJobs ): void {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+
+ if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
+ return;
+ }
+
+ $messageParams = [];
+ $groupMessageKeys = [];
+ foreach ( $groupJobs as $job ) {
+ $messageParams[] = MessageUpdateParameter::createFromJob( $job );
+ // Ensure there are no duplicates as the same key may be present in
+ // multiple languages
+ $groupMessageKeys[( new MessageHandle( $job->getTitle() ) )->getKey()] = true;
+ }
+
+ $group = MessageGroups::getGroup( $groupId );
+ if ( $group === null ) {
+ // How did we get here? This should never happen.
+ throw new RuntimeException( "Did not find group $groupId" );
+ }
+
+ MessageIndex::singleton()->storeInterim( $group, array_keys( $groupMessageKeys ) );
+
+ $groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
+ $groupSyncCache->addMessages( $groupId, ...$messageParams );
+ $groupSyncCache->markGroupForSync( $groupId );
+ }
+
+ /**
+ * Identifies languages in a message group that are safe to import
+ * @param MessageGroup $group
+ * @param MessageSourceChange $changesForGroup
+ * @return bool[]
+ */
+ private static function identifySafeLanguages(
+ MessageGroup $group,
+ MessageSourceChange $changesForGroup
+ ): array {
+ $sourceLanguage = $group->getSourceLanguage();
+ $safeLanguagesMap = [];
+ $modifiedLanguages = $changesForGroup->getLanguages();
+
+ // Set all languages to not safe to start with.
+ $safeLanguagesMap[ $sourceLanguage ] = false;
+ foreach ( $modifiedLanguages as $language ) {
+ $safeLanguagesMap[ $language ] = false;
+ }
+
+ if ( !$changesForGroup->hasOnly( $sourceLanguage, MessageSourceChange::ADDITION ) ) {
+ return $safeLanguagesMap;
+ }
+
+ $sourceLanguageKeyCache = [];
+ foreach ( $changesForGroup->getAdditions( $sourceLanguage ) as $change ) {
+ if ( $change['content'] === '' ) {
+ return $safeLanguagesMap;
+ }
+
+ $sourceLanguageKeyCache[ $change['key'] ] = true;
+ }
+
+ $safeLanguagesMap[ $sourceLanguage ] = true;
+
+ $groupNamespace = $group->getNamespace();
+
+ // Remove source language from the modifiedLanguage list if present since it's already processed.
+ // The $sourceLanguageKeyCache will only have values if sourceLanguage has safe changes.
+ if ( $sourceLanguageKeyCache ) {
+ array_splice( $modifiedLanguages, array_search( $sourceLanguage, $modifiedLanguages ), 1 );
+ }
+
+ foreach ( $modifiedLanguages as $language ) {
+ if ( !$changesForGroup->hasOnly( $language, MessageSourceChange::ADDITION ) ) {
+ continue;
+ }
+
+ foreach ( $changesForGroup->getAdditions( $language ) as $change ) {
+ if ( $change['content'] === '' ) {
+ continue 2;
+ }
+
+ $msgKey = $change['key'];
+
+ if ( !isset( $sourceLanguageKeyCache[ $msgKey ] ) ) {
+ // This is either a new external translation which is not added in the same sync
+ // as the source language key, or this translation does not have a correspoding
+ // definition. We will check the message index to determine which of the two.
+ $sourceHandle = new MessageHandle( Title::makeTitle( $groupNamespace, $msgKey ) );
+ $sourceLanguageKeyCache[ $msgKey ] = $sourceHandle->isValid();
+ }
+
+ if ( !$sourceLanguageKeyCache[ $msgKey ] ) {
+ continue 2;
+ }
+ }
+
+ $safeLanguagesMap[ $language ] = true;
+ }
+
+ return $safeLanguagesMap;
+ }
}
diff --git a/MLEB/Translate/utils/FCFontFinder.php b/MLEB/Translate/utils/FCFontFinder.php
deleted file mode 100644
index 37fa4ac7..00000000
--- a/MLEB/Translate/utils/FCFontFinder.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-/**
- * Contains class with wrapper around font-config.
- *
- * @author Niklas Laxström
- * @author Harry Burt
- * @license Unlicense
- * @file
- */
-
-/**
- * Wrapper around font-config to get useful ttf font given a language code.
- * Uses wfShellExec, wfEscapeShellArg and wfDebugLog, wfGetCache and
- * wfMemckey from %MediaWiki.
- *
- * @ingroup Stats
- */
-class FCFontFinder {
- /**
- * Searches for suitable font in the system.
- * @param string $code Language code.
- * @return bool|string Full path to the font file, false on failure
- */
- public static function findFile( $code ) {
- $data = self::callFontConfig( $code );
- if ( is_array( $data ) ) {
- return $data['file'];
- }
-
- return false;
- }
-
- /**
- * Searches for suitable font family in the system.
- * @param string $code Language code.
- * @return bool|string Name of font family, false on failure
- */
- public static function findFamily( $code ) {
- $data = self::callFontConfig( $code );
- if ( is_array( $data ) ) {
- return $data['family'];
- }
-
- return false;
- }
-
- protected static function callFontConfig( $code ) {
- if ( ini_get( 'open_basedir' ) ) {
- wfDebugLog( 'fcfont', 'Disabled because of open_basedir is active' );
-
- // Most likely we can't access any fonts we might find
- return false;
- }
-
- $cache = self::getCache();
- $cachekey = wfMemcKey( 'fcfont', $code );
- $timeout = 60 * 60 * 12;
-
- $cached = $cache->get( $cachekey );
- if ( is_array( $cached ) ) {
- return $cached;
- } elseif ( $cached === 'NEGATIVE' ) {
- return false;
- }
-
- $code = wfEscapeShellArg( ":lang=$code" );
- $ok = 0;
- $cmd = "fc-match $code";
- $suggestion = wfShellExec( $cmd, $ok );
-
- wfDebugLog( 'fcfont', "$cmd returned $ok" );
-
- if ( $ok !== 0 ) {
- wfDebugLog( 'fcfont', "fc-match error output: $suggestion" );
- $cache->set( $cachekey, 'NEGATIVE', $timeout );
-
- return false;
- }
-
- $pattern = '/^(.*?): "(.*)" "(.*)"$/';
- $matches = [];
-
- if ( !preg_match( $pattern, $suggestion, $matches ) ) {
- wfDebugLog( 'fcfont', "fc-match: return format not understood: $suggestion" );
- $cache->set( $cachekey, 'NEGATIVE', $timeout );
-
- return false;
- }
-
- list( , $file, $family, $type ) = $matches;
- wfDebugLog( 'fcfont', "fc-match: got $file: $family $type" );
-
- $file = wfEscapeShellArg( $file );
- $family = wfEscapeShellArg( $family );
- $type = wfEscapeShellArg( $type );
- $cmd = "fc-list $family $type $code file | grep $file";
-
- $candidates = trim( wfShellExec( $cmd, $ok ) );
-
- wfDebugLog( 'fcfont', "$cmd returned $ok" );
-
- if ( $ok !== 0 ) {
- wfDebugLog( 'fcfont', "fc-list error output: $candidates" );
- $cache->set( $cachekey, 'NEGATIVE', $timeout );
-
- return false;
- }
-
- # trim spaces
- $files = array_map( 'trim', explode( "\n", $candidates ) );
- $count = count( $files );
- if ( !$count ) {
- wfDebugLog( 'fcfont', "fc-list got zero canditates: $candidates" );
- }
-
- # remove the trailing ":"
- $chosen = substr( $files[0], 0, -1 );
-
- wfDebugLog( 'fcfont', "fc-list got $count candidates; using $chosen" );
-
- $data = [
- 'family' => $family,
- 'type' => $type,
- 'file' => $chosen,
- ];
-
- $cache->set( $cachekey, $data, $timeout );
-
- return $data;
- }
-
- /**
- * @return BagOStuff
- */
- protected static function getCache() {
- return wfGetCache( CACHE_ANYTHING );
- }
-}
diff --git a/MLEB/Translate/utils/HTMLJsSelectToInputField.php b/MLEB/Translate/utils/HTMLJsSelectToInputField.php
index 57f4443c..d3b22472 100644
--- a/MLEB/Translate/utils/HTMLJsSelectToInputField.php
+++ b/MLEB/Translate/utils/HTMLJsSelectToInputField.php
@@ -19,9 +19,7 @@ class HTMLJsSelectToInputField extends HTMLTextField {
$input = parent::getInputHTML( $value );
if ( isset( $this->mParams['select'] ) ) {
- /**
- * @var JsSelectToInput $select
- */
+ /** @var JsSelectToInput $select */
$select = $this->mParams['select'];
$input = $select->getHtmlAndPrepareJS() . '<br />' . $input;
}
diff --git a/MLEB/Translate/utils/JsSelectToInput.php b/MLEB/Translate/utils/JsSelectToInput.php
index 83d5cc65..188b5e0f 100644
--- a/MLEB/Translate/utils/JsSelectToInput.php
+++ b/MLEB/Translate/utils/JsSelectToInput.php
@@ -15,27 +15,18 @@ class JsSelectToInput {
protected $targetId;
/// Id of the \<option> field
protected $sourceId;
-
- /**
- * @var XmlSelect
- */
+ /** @var XmlSelect */
protected $select;
-
/// Id on the button
protected $buttonId;
-
- /**
- * @var string Text for the append button
- */
+ /** @var string Text for the append button */
protected $msg = 'translate-jssti-add';
public function __construct( XmlSelect $select = null ) {
$this->select = $select;
}
- /**
- * @return string
- */
+ /** @return string */
public function getSourceId() {
return $this->sourceId;
}
@@ -48,9 +39,7 @@ class JsSelectToInput {
$this->targetId = $id;
}
- /**
- * @return string
- */
+ /** @return string */
public function getTargetId() {
return $this->targetId;
}
@@ -63,9 +52,7 @@ class JsSelectToInput {
$this->msg = $message;
}
- /**
- * @return string Message key.
- */
+ /** @return string Message key. */
public function getMessage() {
return $this->msg;
}
diff --git a/MLEB/Translate/utils/MemProfile.php b/MLEB/Translate/utils/MemProfile.php
deleted file mode 100644
index 7ebc3423..00000000
--- a/MLEB/Translate/utils/MemProfile.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-if ( !defined( 'MEDIAWIKI' ) ) {
- die();
-}
-/**
- * Very crude tools to track memory usage
- *
- * @file
- * @author Niklas Laxström
- * @copyright Copyright © 2008, Niklas Laxström
- * @license GPL-2.0-or-later
- */
-
-/// Memory usage at checkpoints
-$wgMemUse = [];
-/// Tracks the deepness of the stack
-$wgMemStack = 0;
-
-/**
- * Call to start memory counting for a block.
- * @param string $a Block name.
- */
-function wfMemIn( $a ) {
- global $wgLang, $wgMemUse, $wgMemStack;
-
- $mem = memory_get_usage();
- $memR = memory_get_usage();
-
- $wgMemUse[$a][] = [ $mem, $memR ];
-
- $memF = $wgLang->formatNum( $mem );
- $memRF = $wgLang->formatNum( $memR );
-
- $pad = str_repeat( '.', $wgMemStack );
- wfDebug( "$pad$a-IN: \t$memF\t\t$memRF\n" );
- $wgMemStack++;
-}
-
-/**
- * Call to start stop counting for a block. Difference from start is shown.
- * @param string $a Block name.
- */
-function wfMemOut( $a ) {
- global $wgLang, $wgMemUse, $wgMemStack;
-
- $mem = memory_get_usage();
- $memR = memory_get_usage();
-
- list( $memO, $memOR ) = array_pop( $wgMemUse[$a] );
-
- $memF = $wgLang->formatNum( $mem );
- $memRF = $wgLang->formatNum( $memR );
-
- $memD = $mem - $memO;
- $memRD = $memR - $memOR;
-
- $memDF = $wgLang->formatNum( $memD );
- $memRDF = $wgLang->formatNum( $memRD );
-
- $pad = str_repeat( '.', $wgMemStack - 1 );
- wfDebug( "$pad$a-OUT:\t$memF ($memDF)\t$memRF ($memRDF)\n" );
- $wgMemStack--;
-}
diff --git a/MLEB/Translate/utils/MessageChangeStorage.php b/MLEB/Translate/utils/MessageChangeStorage.php
index 6fbd8a0a..b53f966c 100644
--- a/MLEB/Translate/utils/MessageChangeStorage.php
+++ b/MLEB/Translate/utils/MessageChangeStorage.php
@@ -8,7 +8,7 @@
* @file
*/
-use MediaWiki\Extensions\Translate\MessageSync\MessageSourceChange;
+use MediaWiki\Extension\Translate\MessageSync\MessageSourceChange;
class MessageChangeStorage {
public const DEFAULT_NAME = 'default';
@@ -25,9 +25,7 @@ class MessageChangeStorage {
$keys = array_keys( $changes );
$cache->set( '#keys', TranslateUtils::serialize( $keys ) );
- /**
- * @var MessageSourceChange $change
- */
+ /** @var MessageSourceChange $change */
foreach ( $changes as $key => $change ) {
$value = TranslateUtils::serialize( $change->getAllModifications() );
$cache->set( $key, $value );
diff --git a/MLEB/Translate/utils/MessageGroupCache.php b/MLEB/Translate/utils/MessageGroupCache.php
index fdb1fc01..fa174a35 100644
--- a/MLEB/Translate/utils/MessageGroupCache.php
+++ b/MLEB/Translate/utils/MessageGroupCache.php
@@ -19,24 +19,13 @@ class MessageGroupCache {
public const NO_CACHE = 2;
public const CHANGED = 3;
- /**
- * @var FileBasedMessageGroup
- */
+ /** @var FileBasedMessageGroup */
protected $group;
-
- /**
- * @var \Cdb\Reader
- */
+ /** @var \Cdb\Reader */
protected $cache;
-
- /**
- * @var string
- */
+ /** @var string */
protected $code;
-
- /**
- * @var string
- */
+ /** @var string */
private $cacheFilePath;
/**
@@ -253,6 +242,11 @@ class MessageGroupCache {
return false;
}
+ public function invalidate(): void {
+ $this->close();
+ unlink( $this->getCacheFilePath() );
+ }
+
private function serialize( array $data ): string {
// Using simple prefix for easy future extension
return 'J' . json_encode( $data );
diff --git a/MLEB/Translate/utils/MessageGroupStatesUpdaterJob.php b/MLEB/Translate/utils/MessageGroupStatesUpdaterJob.php
index dda4a8f9..c261106e 100644
--- a/MLEB/Translate/utils/MessageGroupStatesUpdaterJob.php
+++ b/MLEB/Translate/utils/MessageGroupStatesUpdaterJob.php
@@ -8,14 +8,16 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\MediaWikiServices;
/**
* Logic for handling automatic message group state changes
*
* @ingroup JobQueue
*/
-class MessageGroupStatesUpdaterJob extends Job {
+class MessageGroupStatesUpdaterJob extends GenericTranslateJob {
/**
* @param Title $title
* @param array $params
@@ -49,6 +51,11 @@ class MessageGroupStatesUpdaterJob extends Job {
}
public function run() {
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ if ( !$lb->waitForReplication() ) {
+ $this->logWarning( 'Continuing despite replication lag' );
+ }
+
$title = $this->title;
$handle = new MessageHandle( $title );
$code = $handle->getCode();
diff --git a/MLEB/Translate/utils/MessageGroupStats.php b/MLEB/Translate/utils/MessageGroupStats.php
index 91267f22..dc7b1133 100644
--- a/MLEB/Translate/utils/MessageGroupStats.php
+++ b/MLEB/Translate/utils/MessageGroupStats.php
@@ -8,6 +8,7 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use Wikimedia\Rdbms\IDatabase;
@@ -34,14 +35,9 @@ class MessageGroupStats {
/// Do not defer updates. Meant for jobs like MessageGroupStatsRebuildJob.
public const FLAG_IMMEDIATE_WRITES = 4;
- /**
- * @var array[]
- */
+ /** @var array[] */
protected static $updates = [];
-
- /**
- * @var string[]
- */
+ /** @var string[] */
private static $languages;
/**
@@ -547,9 +543,7 @@ class MessageGroupStats {
if ( $code === $wgTranslateDocumentationLanguageCode ) {
$ffs = $group->getFFS();
if ( $ffs instanceof GettextFFS ) {
- /**
- * @var FileBasedMessageGroup $group
- */
+ /** @var FileBasedMessageGroup $group */
'@phan-var FileBasedMessageGroup $group';
$cache = $group->getMessageGroupCache( $group->getSourceLanguage() );
if ( $cache->exists() ) {
@@ -566,7 +560,7 @@ class MessageGroupStats {
}
$collection->filter( 'ignored' );
- $collection->filter( 'optional' );
+ $collection->filterUntranslatedOptional();
// Store the count of real messages for later calculation.
$total = count( $collection );
@@ -626,6 +620,18 @@ class MessageGroupStats {
return;
}
+ // This path should only be hit during web requests
+ if ( count( $updates ) > 100 ) {
+ $groups = array_unique( array_column( $updates, 'tgs_group' ) );
+ LoggerFactory::getInstance( 'Translate' )->warning(
+ "Huge translation update of {count} rows for group(s) {groups}",
+ [
+ 'count' => count( $updates ),
+ 'groups' => implode( ', ', $groups ),
+ ]
+ );
+ }
+
$primaryKey = [ 'tgs_group', 'tgs_lang' ];
$dbw->replace( $table, [ $primaryKey ], $updates, $method );
$updates = [];
diff --git a/MLEB/Translate/utils/MessageGroupStatsRebuildJob.php b/MLEB/Translate/utils/MessageGroupStatsRebuildJob.php
index e813d614..53c3a496 100644
--- a/MLEB/Translate/utils/MessageGroupStatsRebuildJob.php
+++ b/MLEB/Translate/utils/MessageGroupStatsRebuildJob.php
@@ -7,12 +7,15 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\MediaWikiServices;
+
/**
* Job for rebuilding message group stats.
*
* @ingroup JobQueue
*/
-class MessageGroupStatsRebuildJob extends Job {
+class MessageGroupStatsRebuildJob extends GenericTranslateJob {
/**
* @param array $params
* @return self
@@ -45,6 +48,11 @@ class MessageGroupStatsRebuildJob extends Job {
}
public function run() {
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+ if ( !$lb->waitForReplication() ) {
+ $this->logWarning( 'Continuing despite replication lag' );
+ }
+
$params = $this->params;
$flags = 0;
diff --git a/MLEB/Translate/utils/MessageGroupWANCache.php b/MLEB/Translate/utils/MessageGroupWANCache.php
index 4df5b4c7..78d8e817 100644
--- a/MLEB/Translate/utils/MessageGroupWANCache.php
+++ b/MLEB/Translate/utils/MessageGroupWANCache.php
@@ -14,50 +14,41 @@
*/
class MessageGroupWANCache {
- /**
- * @var WANObjectCache
- */
+ /** @var WANObjectCache */
protected $cache;
-
/**
* Cache key
*
* @var string
*/
protected $cacheKey;
-
/**
* Cache version
*
* @var int
*/
protected $cacheVersion;
-
/**
* To be called when the cache is empty or expired to get the data
* to repopulate the cache
* @var \Closure
*/
protected $regenerator;
-
/**
* @see @https://doc.wikimedia.org/mediawiki-core/master/php/classWANObjectCache.html
* @var int
*/
protected $lockTSE;
-
/**
* @see @https://doc.wikimedia.org/mediawiki-core/master/php/classWANObjectCache.html
* @var array
*/
protected $checkKeys;
-
/**
* @see @https://doc.wikimedia.org/mediawiki-core/master/php/classWANObjectCache.html
* @var \Closure
*/
protected $touchedCallback;
-
/**
* @see @https://doc.wikimedia.org/mediawiki-core/master/php/classWANObjectCache.html
* @var int
diff --git a/MLEB/Translate/utils/MessageHandle.php b/MLEB/Translate/utils/MessageHandle.php
index bb9c43c5..3d95608f 100644
--- a/MLEB/Translate/utils/MessageHandle.php
+++ b/MLEB/Translate/utils/MessageHandle.php
@@ -16,24 +16,13 @@ use MediaWiki\MediaWikiServices;
* @since 2011-03-13
*/
class MessageHandle {
- /**
- * @var LinkTarget
- */
+ /** @var LinkTarget */
protected $title;
-
- /**
- * @var string|null
- */
+ /** @var string|null */
protected $key;
-
- /**
- * @var string|null Language code
- */
+ /** @var string|null Language code */
protected $code;
-
- /**
- * @var string[]|null
- */
+ /** @var string[]|null */
protected $groupIds;
public function __construct( LinkTarget $title ) {
@@ -76,7 +65,7 @@ class MessageHandle {
/**
* Returns the identified or guessed message key.
- * @return String
+ * @return string
*/
public function getKey() {
$this->figureMessage();
@@ -87,7 +76,7 @@ class MessageHandle {
/**
* Returns the language code.
* For language codeless source messages will return empty string.
- * @return String
+ * @return string
*/
public function getCode() {
$this->figureMessage();
@@ -272,7 +261,8 @@ class MessageHandle {
public function getInternalKey() {
$key = $this->getKey();
- if ( !MWNamespace::isCapitalized( $this->title->getNamespace() ) ) {
+ $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+ if ( !$nsInfo->isCapitalized( $this->title->getNamespace() ) ) {
return $key;
}
diff --git a/MLEB/Translate/utils/MessageIndex.php b/MLEB/Translate/utils/MessageIndex.php
index 128efe85..1cbdaf39 100644
--- a/MLEB/Translate/utils/MessageIndex.php
+++ b/MLEB/Translate/utils/MessageIndex.php
@@ -21,22 +21,14 @@ use MediaWiki\Logger\LoggerFactory;
abstract class MessageIndex {
private const CACHEKEY = 'Translate-MessageIndex-interim';
- /**
- * @var self
- */
+ /** @var self */
protected static $instance;
-
- /**
- * @var MapCacheLRU|null
- */
+ /** @var MapCacheLRU|null */
private static $keysCache;
-
/** @var BagOStuff */
protected $interimCache;
- /**
- * @return self
- */
+ /** @return self */
public static function singleton() {
if ( self::$instance === null ) {
global $wgTranslateMessageIndex;
@@ -91,9 +83,7 @@ abstract class MessageIndex {
return $value;
}
- /**
- * @return MapCacheLRU
- */
+ /** @return MapCacheLRU */
private static function getCache() {
if ( self::$keysCache === null ) {
self::$keysCache = new MapCacheLRU( 30 );
@@ -202,9 +192,7 @@ abstract class MessageIndex {
$old = $this->retrieve( 'rebuild' );
$postponed = [];
- /**
- * @var MessageGroup $g
- */
+ /** @var MessageGroup $g */
foreach ( $groups as $g ) {
if ( !$g->exists() ) {
$id = $g->getId();
@@ -451,11 +439,8 @@ abstract class MessageIndex {
* which provides random access - this backend doesn't support that.
*/
class SerializedMessageIndex extends MessageIndex {
- /**
- * @var array|null
- */
+ /** @var array|null */
protected $index;
-
protected $filename = 'translate_messageindex.ser';
/**
@@ -496,9 +481,7 @@ class SerializedMessageIndex extends MessageIndex {
* @since 2012-04-12
*/
class DatabaseMessageIndex extends MessageIndex {
- /**
- * @var array|null
- */
+ /** @var array|null */
protected $index;
protected function lock() {
@@ -618,10 +601,7 @@ class DatabaseMessageIndex extends MessageIndex {
class CachedMessageIndex extends MessageIndex {
protected $key = 'translate-messageindex';
protected $cache;
-
- /**
- * @var array|null
- */
+ /** @var array|null */
protected $index;
protected function __construct() {
@@ -637,7 +617,7 @@ class CachedMessageIndex extends MessageIndex {
return $this->index;
}
- $key = wfMemcKey( $this->key );
+ $key = $this->cache->makeKey( $this->key );
$data = $this->cache->get( $key );
if ( is_array( $data ) ) {
$this->index = $data;
@@ -649,7 +629,7 @@ class CachedMessageIndex extends MessageIndex {
}
protected function store( array $array, array $diff ) {
- $key = wfMemcKey( $this->key );
+ $key = $this->cache->makeKey( $this->key );
$this->cache->set( $key, $array );
$this->index = $array;
@@ -670,19 +650,11 @@ class CachedMessageIndex extends MessageIndex {
* @since 2012-04-10
*/
class CDBMessageIndex extends MessageIndex {
- /**
- * @var array|null
- */
+ /** @var array|null */
protected $index;
-
- /**
- * @var \Cdb\Reader|null
- */
+ /** @var \Cdb\Reader|null */
protected $reader;
-
- /**
- * @var string
- */
+ /** @var string */
protected $filename = 'translate_messageindex.cdb';
/**
@@ -776,9 +748,7 @@ class CDBMessageIndex extends MessageIndex {
* @since 2015.04
*/
class HashMessageIndex extends MessageIndex {
- /**
- * @var array
- */
+ /** @var array */
protected $index = [];
/**
diff --git a/MLEB/Translate/utils/MessageIndexException.php b/MLEB/Translate/utils/MessageIndexException.php
index b0e5c7a6..77916d1c 100644
--- a/MLEB/Translate/utils/MessageIndexException.php
+++ b/MLEB/Translate/utils/MessageIndexException.php
@@ -5,8 +5,6 @@
* @license GPL-2.0-or-later
*/
-/**
- * @since 2020.05
- */
+/** @since 2020.05 */
class MessageIndexException extends RuntimeException {
}
diff --git a/MLEB/Translate/utils/MessageIndexRebuildJob.php b/MLEB/Translate/utils/MessageIndexRebuildJob.php
index abcb7b91..a155ff9e 100644
--- a/MLEB/Translate/utils/MessageIndexRebuildJob.php
+++ b/MLEB/Translate/utils/MessageIndexRebuildJob.php
@@ -8,7 +8,7 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
/**
* Job for rebuilding message index.
@@ -16,9 +16,7 @@ use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
* @ingroup JobQueue
*/
class MessageIndexRebuildJob extends GenericTranslateJob {
- /**
- * @return self
- */
+ /** @return self */
public static function newJob() {
$timestamp = microtime( true );
$job = new self( Title::newMainPage(), [ 'timestamp' => $timestamp ] );
diff --git a/MLEB/Translate/utils/MessageUpdateJob.php b/MLEB/Translate/utils/MessageUpdateJob.php
index 8d4ff35a..7ad7b998 100644
--- a/MLEB/Translate/utils/MessageUpdateJob.php
+++ b/MLEB/Translate/utils/MessageUpdateJob.php
@@ -8,9 +8,11 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\Jobs\GenericTranslateJob;
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
-use MediaWiki\Extensions\Translate\Utilities\TranslateReplaceTitle;
+use MediaWiki\Extension\Translate\Jobs\GenericTranslateJob;
+use MediaWiki\Extension\Translate\Services;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\Utilities\TranslateReplaceTitle;
+use MediaWiki\MediaWikiServices;
/**
* Job for updating translation pages when translation or message definition changes.
@@ -22,10 +24,12 @@ class MessageUpdateJob extends GenericTranslateJob {
* Create a normal message update job without a rename process
* @param Title $target
* @param string $content
- * @param bool $fuzzy
- * @return MessageUpdateJob
+ * @param string|false $fuzzy
+ * @return self
*/
- public static function newJob( Title $target, $content, $fuzzy = false ) {
+ public static function newJob(
+ Title $target, string $content, $fuzzy = false
+ ): self {
$params = [
'content' => $content,
'fuzzy' => $fuzzy,
@@ -38,17 +42,22 @@ class MessageUpdateJob extends GenericTranslateJob {
/**
* Create a message update job containing a rename process
- * @param Title $target Target message being modified
- * @param string $targetStr Target string
- * @param string $replacement Replacement string
- * @param bool $fuzzy Whether to fuzzy the message
- * @param string $content Content of the source language
- * @param array $otherLangContents Content to be updated for other languages
- * @return MessageUpdateJob
+ * @param Title $target
+ * @param string $targetStr
+ * @param string $replacement
+ * @param string|false $fuzzy
+ * @param string $content
+ * @param array $otherLangContents
+ * @return self
*/
public static function newRenameJob(
- Title $target, $targetStr, $replacement, $fuzzy, $content, $otherLangContents = []
- ) {
+ Title $target,
+ string $targetStr,
+ string $replacement,
+ $fuzzy,
+ string $content,
+ array $otherLangContents = []
+ ): self {
$params = [
'target' => $targetStr,
'replacement' => $replacement,
@@ -78,6 +87,7 @@ class MessageUpdateJob extends GenericTranslateJob {
$isRename = $params['rename'] ?? false;
$isFuzzy = $params['fuzzy'] ?? false;
$otherLangs = $params['otherLangs'] ?? [];
+ $originalTitle = Title::newFromLinkTarget( $this->title->getTitleValue(), Title::NEW_CLONE );
if ( $isRename ) {
$this->title = $this->handleRename( $params['target'], $params['replacement'], $user );
@@ -90,6 +100,8 @@ class MessageUpdateJob extends GenericTranslateJob {
'target' => $params['target']
]
);
+
+ $this->removeFromCache( $originalTitle );
return true;
}
}
@@ -121,6 +133,7 @@ class MessageUpdateJob extends GenericTranslateJob {
$this->handleFuzzy( $title );
}
+ $this->removeFromCache( $originalTitle );
return true;
}
@@ -152,16 +165,10 @@ class MessageUpdateJob extends GenericTranslateJob {
$renameSummary = wfMessage( 'translate-manage-import-rename-summary' )
->inContentLanguage()->plain();
- /**
- * @var Title[] $movableTitles
- */
- foreach ( $movableTitles as $mTitle ) {
- /**
- * @var Title $sourceTitle
- * @var Title $replacementTitle
- */
- [ $sourceTitle, $replacementTitle ] = $mTitle;
- $mv = new MovePage( $sourceTitle, $replacementTitle );
+ foreach ( $movableTitles as [ $sourceTitle, $replacementTitle ] ) {
+ $mv = MediaWikiServices::getInstance()
+ ->getMovePageFactory()
+ ->newMovePage( $sourceTitle, $replacementTitle );
$status = $mv->move( $user, $renameSummary, false );
if ( !$status->isOK() ) {
@@ -278,4 +285,48 @@ class MessageUpdateJob extends GenericTranslateJob {
}
}
}
+
+ private function removeFromCache( Title $title ): void {
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+
+ if ( !$config->get( 'TranslateGroupSynchronizationCache' ) ) {
+ return;
+ }
+
+ $currentTitle = $title;
+ // Check if the current title, is equal to the title passed. This condition will be
+ // true incase of rename where the old title would have been renamed.
+ if ( $this->title && $this->title->getPrefixedDBkey() !== $title->getPrefixedDBkey() ) {
+ $currentTitle = $this->title;
+ }
+
+ $sourceMessageHandle = new MessageHandle( $currentTitle );
+ $groupIds = $sourceMessageHandle->getGroupIds();
+ if ( !$groupIds ) {
+ $this->logWarning(
+ 'Could not find group Id for message title',
+ $this->getParams()
+ );
+ return;
+ }
+
+ $groupId = $groupIds[0];
+ $group = MessageGroups::getGroup( $groupId );
+
+ if ( !$group instanceof FileBasedMessageGroup ) {
+ return;
+ }
+
+ $groupSyncCache = Services::getInstance()->getGroupSynchronizationCache();
+ $messageKey = $title->getPrefixedDBkey();
+
+ if ( $groupSyncCache->isMessageBeingProcessed( $groupId, $messageKey ) ) {
+ $groupSyncCache->removeMessages( $groupId, $messageKey );
+ } else {
+ $this->logWarning(
+ "Did not find key: $messageKey; in group: $groupId in group sync cache",
+ $this->getParams()
+ );
+ }
+ }
}
diff --git a/MLEB/Translate/utils/MessageWebImporter.php b/MLEB/Translate/utils/MessageWebImporter.php
index 308eba62..2ba543c9 100644
--- a/MLEB/Translate/utils/MessageWebImporter.php
+++ b/MLEB/Translate/utils/MessageWebImporter.php
@@ -10,7 +10,7 @@
* @license GPL-2.0-or-later
*/
-use MediaWiki\Extensions\Translate\SystemUsers\FuzzyBot;
+use MediaWiki\Extension\Translate\SystemUsers\FuzzyBot;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\SlotRecord;
@@ -19,28 +19,16 @@ use MediaWiki\Revision\SlotRecord;
* displays them in pretty way with diffs and finally executes the actions the user choices.
*/
class MessageWebImporter {
- /**
- * @var Title
- */
+ /** @var Title */
protected $title;
-
- /**
- * @var User
- */
+ /** @var User */
protected $user;
-
- /**
- * @var MessageGroup
- */
+ /** @var MessageGroup */
protected $group;
protected $code;
protected $time;
-
- /**
- * @var OutputPage
- */
+ /** @var OutputPage */
protected $out;
-
/**
* Maximum processing time in seconds.
*/
@@ -66,30 +54,22 @@ class MessageWebImporter {
return $this->title;
}
- /**
- * @param Title $title
- */
+ /** @param Title $title */
public function setTitle( Title $title ) {
$this->title = $title;
}
- /**
- * @return User
- */
+ /** @return User */
public function getUser() {
return $this->user ?: RequestContext::getMain()->getUser();
}
- /**
- * @param User $user
- */
+ /** @param User $user */
public function setUser( User $user ) {
$this->user = $user;
}
- /**
- * @return MessageGroup
- */
+ /** @return MessageGroup */
public function getGroup() {
return $this->group;
}
@@ -106,30 +86,22 @@ class MessageWebImporter {
}
}
- /**
- * @return string
- */
+ /** @return string */
public function getCode() {
return $this->code;
}
- /**
- * @param string $code
- */
+ /** @param string $code */
public function setCode( $code = 'en' ) {
$this->code = $code;
}
- /**
- * @return string
- */
+ /** @return string */
protected function getAction() {
return $this->getTitle()->getFullURL();
}
- /**
- * @return string
- */
+ /** @return string */
protected function doHeader() {
$formParams = [
'method' => 'post',
@@ -143,16 +115,12 @@ class MessageWebImporter {
Html::hidden( 'process', 1 );
}
- /**
- * @return string
- */
+ /** @return string */
protected function doFooter() {
return '</form>';
}
- /**
- * @return bool
- */
+ /** @return bool */
protected function allowProcess() {
$request = RequestContext::getMain()->getRequest();
@@ -161,9 +129,7 @@ class MessageWebImporter {
&& $this->getUser()->matchEditToken( $request->getVal( 'token' ) );
}
- /**
- * @return array
- */
+ /** @return array */
protected function getActions() {
if ( $this->code === 'en' ) {
return [ 'import', 'fuzzy', 'ignore' ];
@@ -393,7 +359,7 @@ class MessageWebImporter {
* Perform an action on a given group/key/code
*
* @param string $action Options: 'import', 'conflict' or 'ignore'
- * @param MessageGroup $group Group object
+ * @param MessageGroup $group
* @param string $key Message key
* @param string $code Language code
* @param string $message Contents for the $key/code combination
@@ -507,10 +473,7 @@ class MessageWebImporter {
);
$changed = [];
- $slots = [];
- if ( is_callable( [ $revStore, 'getContentBlobsForBatch' ] ) ) {
- $slots = $revStore->getContentBlobsForBatch( $rows, [ SlotRecord::MAIN ] )->getValue();
- }
+ $slots = $revStore->getContentBlobsForBatch( $rows, [ SlotRecord::MAIN ] )->getValue();
foreach ( $rows as $row ) {
global $wgTranslateDocumentationLanguageCode;
diff --git a/MLEB/Translate/utils/StatsBar.php b/MLEB/Translate/utils/StatsBar.php
index f663e84f..4a6aaef9 100644
--- a/MLEB/Translate/utils/StatsBar.php
+++ b/MLEB/Translate/utils/StatsBar.php
@@ -18,15 +18,9 @@ class StatsBar {
* @var int[]
*/
protected $stats;
-
- /**
- * @var string Message group id
- */
+ /** @var string Message group id */
protected $group;
-
- /**
- * @var string Language
- */
+ /** @var string Language */
protected $language;
/**
diff --git a/MLEB/Translate/utils/StatsTable.php b/MLEB/Translate/utils/StatsTable.php
index 03b9d73f..46493683 100644
--- a/MLEB/Translate/utils/StatsTable.php
+++ b/MLEB/Translate/utils/StatsTable.php
@@ -15,24 +15,13 @@
* @ingroup Stats
*/
class StatsTable {
- /**
- * @var Language
- */
+ /** @var Language */
protected $lang;
-
- /**
- * @var Title
- */
+ /** @var Title */
protected $translate;
-
- /**
- * @var string
- */
+ /** @var string */
protected $mainColumnHeader;
-
- /**
- * @var Message[]
- */
+ /** @var Message[] */
protected $extraColumns = [];
public function __construct() {
@@ -88,16 +77,12 @@ class StatsTable {
return $colors[ $index ];
}
- /**
- * @return string
- */
+ /** @return string */
public function getMainColumnHeader() {
return $this->mainColumnHeader;
}
- /**
- * @param Message $msg
- */
+ /** @param Message $msg */
public function setMainColumnHeader( Message $msg ) {
$this->mainColumnHeader = $this->createColumnHeader( $msg );
}
@@ -114,9 +99,7 @@ class StatsTable {
$this->extraColumns[] = $column;
}
- /**
- * @return Message[]
- */
+ /** @return Message[] */
public function getOtherColumnHeaders() {
return array_merge( [
wfMessage( 'translate-total' ),
@@ -127,9 +110,7 @@ class StatsTable {
], $this->extraColumns );
}
- /**
- * @return string HTML
- */
+ /** @return string HTML */
public function createHeader() {
// Create table header
$out = Html::openElement(
@@ -276,10 +257,10 @@ class StatsTable {
* @param string $code Language code
* @return bool
*/
- public function isBlacklisted( $groupId, $code ) {
+ public function isExcluded( $groupId, $code ) {
global $wgTranslateBlacklist;
- $blacklisted = null;
+ $excluded = null;
$checks = [
$groupId,
@@ -289,10 +270,10 @@ class StatsTable {
foreach ( $checks as $check ) {
if ( isset( $wgTranslateBlacklist[$check] ) && isset( $wgTranslateBlacklist[$check][$code] ) ) {
- $blacklisted = $wgTranslateBlacklist[$check][$code];
+ $excluded = $wgTranslateBlacklist[$check][$code];
}
- if ( $blacklisted !== null ) {
+ if ( $excluded !== null ) {
break;
}
}
@@ -300,32 +281,14 @@ class StatsTable {
$group = MessageGroups::getGroup( $groupId );
$languages = $group->getTranslatableLanguages();
if ( $languages !== null && !isset( $languages[$code] ) ) {
- $blacklisted = true;
+ $excluded = true;
}
$include = Hooks::run( 'Translate:MessageGroupStats:isIncluded', [ $groupId, $code ] );
if ( !$include ) {
- $blacklisted = true;
+ $excluded = true;
}
- return $blacklisted;
- }
-
- /**
- * Used to circumvent ugly tooltips when newlines are used in the
- * message content ("x\ny" becomes "x y").
- * @param string $text
- * @return string
- */
- public static function formatTooltip( $text ) {
- $wordSeparator = wfMessage( 'word-separator' )->text();
-
- $text = strtr( $text, [
- "\n" => $wordSeparator,
- "\r" => $wordSeparator,
- "\t" => $wordSeparator,
- ] );
-
- return $text;
+ return $excluded;
}
}
diff --git a/MLEB/Translate/utils/TranslateLogFormatter.php b/MLEB/Translate/utils/TranslateLogFormatter.php
index 39a1243e..24049de4 100644
--- a/MLEB/Translate/utils/TranslateLogFormatter.php
+++ b/MLEB/Translate/utils/TranslateLogFormatter.php
@@ -63,6 +63,13 @@ class TranslateLogFormatter extends LogFormatter {
return $message->isBlank() ? $value : $message->text();
}
+ /**
+ * @param Title|null $title The page
+ * @param string|null $text
+ * @param array $parameters Query parameters
+ * @return string
+ * @return-taint onlysafefor_html
+ */
protected function makePageLinkWithText(
?Title $title, $text, array $parameters = []
) {
diff --git a/MLEB/Translate/utils/TranslateMetadata.php b/MLEB/Translate/utils/TranslateMetadata.php
index c6d0027e..a0cd25f6 100644
--- a/MLEB/Translate/utils/TranslateMetadata.php
+++ b/MLEB/Translate/utils/TranslateMetadata.php
@@ -14,9 +14,7 @@ class TranslateMetadata {
/** @var array Map of (group => key => value) */
private static $cache = [];
- /**
- * @param string[] $groups List of translate groups
- */
+ /** @param string[] $groups List of translate groups */
public static function preloadGroups( array $groups ) {
$missing = array_keys( array_diff_key( array_flip( $groups ), self::$cache ) );
if ( !$missing ) {
@@ -93,12 +91,12 @@ class TranslateMetadata {
/**
* Wrapper for getting subgroups.
* @param string $groupId
- * @return string[]|bool
+ * @return string[]|null
* @since 2012-05-09
*/
- public static function getSubgroups( $groupId ) {
+ public static function getSubgroups( string $groupId ): ?array {
$groups = self::get( $groupId, 'subgroups' );
- if ( $groups !== false ) {
+ if ( is_string( $groups ) ) {
if ( strpos( $groups, '|' ) !== false ) {
$groups = explode( '|', $groups );
} else {
@@ -110,6 +108,8 @@ class TranslateMetadata {
unset( $groups[$index] );
}
}
+ } else {
+ $groups = null;
}
return $groups;
diff --git a/MLEB/Translate/utils/TranslateSandbox.php b/MLEB/Translate/utils/TranslateSandbox.php
index 0ed2ea18..125c5afb 100644
--- a/MLEB/Translate/utils/TranslateSandbox.php
+++ b/MLEB/Translate/utils/TranslateSandbox.php
@@ -10,7 +10,7 @@
use MediaWiki\Auth\AuthenticationRequest;
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\AuthManager;
-use MediaWiki\Extensions\Translate\SystemUsers\TranslateUserManager;
+use MediaWiki\Extension\Translate\SystemUsers\TranslateUserManager;
use MediaWiki\MediaWikiServices;
use Wikimedia\ScopedCallback;
@@ -19,8 +19,6 @@ use Wikimedia\ScopedCallback;
* lot of assumptions about what happens to the user account.
*/
class TranslateSandbox {
- public static $userToCreate = null;
-
/**
* Adds a new user without doing much validation.
*
@@ -33,7 +31,7 @@ class TranslateSandbox {
public static function addUser( $name, $email, $password ) {
$user = User::newFromName( $name, 'creatable' );
- if ( !$user instanceof User ) {
+ if ( !$user ) {
throw new MWException( 'Invalid user name' );
}
@@ -83,7 +81,12 @@ class TranslateSandbox {
}
// group-translate-sandboxed group-translate-sandboxed-member
- $user->addGroup( 'translate-sandboxed' );
+ if ( method_exists( MediaWikiServices::class, 'getUserGroupManager' ) ) {
+ // MediaWiki 1.35+
+ MediaWikiServices::getInstance()->getUserGroupManager()->addUserToGroup( $user, 'translate-sandboxed' );
+ } else {
+ $user->addGroup( 'translate-sandboxed' );
+ }
return $user;
}
@@ -97,6 +100,7 @@ class TranslateSandbox {
*/
public static function deleteUser( User $user, $force = '' ) {
$uid = $user->getId();
+ $actorId = $user->getActorId();
if ( $force !== 'force' && !self::isSandboxed( $user ) ) {
throw new MWException( 'Not a sandboxed user' );
@@ -108,11 +112,10 @@ class TranslateSandbox {
$dbw->delete( 'user_groups', [ 'ug_user' => $uid ], __METHOD__ );
$dbw->delete( 'user_properties', [ 'up_user' => $uid ], __METHOD__ );
- $m = ActorMigration::newMigration();
$dbw->delete( 'actor', [ 'actor_user' => $uid ], __METHOD__ );
// Assume no joins are needed for logging or recentchanges
- $dbw->delete( 'logging', $m->getWhere( $dbw, 'log_user', $user )['conds'], __METHOD__ );
- $dbw->delete( 'recentchanges', $m->getWhere( $dbw, 'rc_user', $user )['conds'], __METHOD__ );
+ $dbw->delete( 'logging', [ 'log_actor' => $actorId ], __METHOD__ );
+ $dbw->delete( 'recentchanges', [ 'rc_actor' => $actorId ], __METHOD__ );
// Update the site stats
$statsUpdate = SiteStatsUpdate::factory( [ 'users' => -1 ] );
@@ -170,13 +173,33 @@ class TranslateSandbox {
throw new MWException( 'Not a sandboxed user' );
}
- $user->removeGroup( 'translate-sandboxed' );
- if ( $wgTranslateSandboxPromotedGroup ) {
- $user->addGroup( $wgTranslateSandboxPromotedGroup );
+ $services = MediaWikiServices::getInstance();
+
+ if ( method_exists( $services, 'getUserGroupManager' ) ) {
+ // MediaWiki 1.35+
+ $userGroupManager = $services->getUserGroupManager();
+ $userGroupManager->removeUserFromGroup( $user, 'translate-sandboxed' );
+
+ if ( $wgTranslateSandboxPromotedGroup ) {
+ $userGroupManager->addUserToGroup( $user, $wgTranslateSandboxPromotedGroup );
+ }
+ } else {
+ $user->removeGroup( 'translate-sandboxed' );
+
+ if ( $wgTranslateSandboxPromotedGroup ) {
+ $user->addGroup( $wgTranslateSandboxPromotedGroup );
+ }
}
- $user->setOption( 'translate-sandbox-reminders', '' );
- $user->saveSettings();
+ if ( method_exists( $services, 'getUserOptionsManager' ) ) {
+ // MW 1.35+
+ $userOptionsManager = $services->getUserOptionsManager();
+ $userOptionsManager->setOption( $user, 'translate-sandbox-reminders', '' );
+ $userOptionsManager->saveOptions( $user );
+ } else {
+ $user->setOption( 'translate-sandbox-reminders', '' );
+ $user->saveSettings();
+ }
}
/**
@@ -247,11 +270,15 @@ class TranslateSandbox {
* @since 2013.06
*/
public static function isSandboxed( User $user ) {
- if ( in_array( 'translate-sandboxed', $user->getGroups(), true ) ) {
- return true;
+ if ( method_exists( MediaWikiServices::class, 'getUserGroupManager' ) ) {
+ // MediaWiki 1.35+
+ $userGroupManager = MediaWikiServices::getInstance()->getUserGroupManager();
+ $groups = $userGroupManager->getUserGroups( $user );
+ } else {
+ $groups = $user->getGroups();
}
- return false;
+ return in_array( 'translate-sandboxed', $groups, true );
}
/**
@@ -295,7 +322,7 @@ class TranslateSandbox {
}
/**
- * Whitelisting for certain API modules. See also enforcePermissions.
+ * Inclusion listing for certain API modules. See also enforcePermissions.
* Hook: ApiCheckCanExecute
* @param ApiBase $module
* @param User $user
@@ -303,7 +330,7 @@ class TranslateSandbox {
* @return bool
*/
public static function onApiCheckCanExecute( ApiBase $module, User $user, &$message ) {
- $whitelist = [
+ $inclusionList = [
// Obviously this is needed to get out of the sandbox
'ApiTranslationStash',
// Used by UniversalLanguageSelector for example
@@ -312,7 +339,7 @@ class TranslateSandbox {
if ( self::isSandboxed( $user ) ) {
$class = get_class( $module );
- if ( $module->isWriteMode() && !in_array( $class, $whitelist, true ) ) {
+ if ( $module->isWriteMode() && !in_array( $class, $inclusionList, true ) ) {
$message = ApiMessage::create( 'apierror-writeapidenied' );
return false;
}
diff --git a/MLEB/Translate/utils/TranslateSandboxEmailJob.php b/MLEB/Translate/utils/TranslateSandboxEmailJob.php
index 4c3716b9..1c078e6f 100644
--- a/MLEB/Translate/utils/TranslateSandboxEmailJob.php
+++ b/MLEB/Translate/utils/TranslateSandboxEmailJob.php
@@ -51,11 +51,16 @@ class TranslateSandboxEmailJob extends Job {
$reminders = $user->getOption( 'translate-sandbox-reminders' );
$reminders = $reminders ? explode( '|', $reminders ) : [];
$reminders[] = wfTimestamp();
- $user->setOption( 'translate-sandbox-reminders', implode( '|', $reminders ) );
- $reminders = $user->getOption( 'translate-sandbox-reminders' );
- $user->setOption( 'translate-sandbox-reminders', $reminders );
- $user->saveSettings();
+ if ( method_exists( $services, 'getUserOptionsManager' ) ) {
+ // MW 1.35+
+ $userOptionsManager = $services->getUserOptionsManager();
+ $userOptionsManager->setOption( $user, 'translate-sandbox-reminders', implode( '|', $reminders ) );
+ $userOptionsManager->saveOptions( $user );
+ } else {
+ $user->setOption( 'translate-sandbox-reminders', implode( '|', $reminders ) );
+ $user->saveSettings();
+ }
}
return $isOK;
diff --git a/MLEB/Translate/utils/TranslateToolbox.php b/MLEB/Translate/utils/TranslateToolbox.php
index 0836f485..9503f3ab 100644
--- a/MLEB/Translate/utils/TranslateToolbox.php
+++ b/MLEB/Translate/utils/TranslateToolbox.php
@@ -48,7 +48,7 @@ class TranslateToolbox {
/**
* This handler will be called for MW >= 1.35
*
- * @param Skin $skin The skin
+ * @param Skin $skin
* @param array &$sidebar Array with sidebar items
*
* @return void
diff --git a/MLEB/Translate/utils/TranslationHelpers.php b/MLEB/Translate/utils/TranslationHelpers.php
index 9b585c72..38ee5acb 100644
--- a/MLEB/Translate/utils/TranslationHelpers.php
+++ b/MLEB/Translate/utils/TranslationHelpers.php
@@ -19,24 +19,18 @@ class TranslationHelpers {
* @since 2012-01-04
*/
protected $handle;
-
- /**
- * @var TranslationAidDataProvider
- */
+ /** @var TranslationAidDataProvider */
private $dataProvider;
-
/**
* The group object of the message (or null if there isn't any)
* @var MessageGroup|null
*/
protected $group;
-
/**
* The current translation.
* @var string
*/
private $translation;
-
/**
* HTML id to the text area that contains the translation. Used to insert
* suggestion directly into the text area, for example.
@@ -79,21 +73,13 @@ class TranslationHelpers {
/**
* Gets the HTML id of the text area that contains the translation.
- * @return String
+ * @return string
*/
public function getTextareaId() {
return $this->textareaId;
}
/**
- * Sets the HTML id of the text area that contains the translation.
- * @param string $id
- */
- public function setTextareaId( $id ) {
- $this->textareaId = $id;
- }
-
- /**
* Enable or disable extra help for editing.
* @param bool $mode
*/
@@ -152,29 +138,10 @@ class TranslationHelpers {
}
/**
- * Gets the linguistically correct language code for translation
- * @return string
- */
- public function getTargetLanguage() {
- global $wgLanguageCode, $wgTranslateDocumentationLanguageCode;
-
- $code = $this->handle->getCode();
- if ( !$code ) {
- $this->mustBeKnownMessage();
- $code = $this->group->getSourceLanguage();
- }
- if ( $code === $wgTranslateDocumentationLanguageCode ) {
- return $wgLanguageCode;
- }
-
- return $code;
- }
-
- /**
* Returns block element HTML snippet that contains the translation aids.
* Not all boxes are shown all the time depending on whether they have
* any information to show and on configuration variables.
- * @return String Block level HTML snippet or empty string.
+ * @return string Block level HTML snippet or empty string.
*/
public function getBoxes() {
// Box filter
@@ -218,13 +185,8 @@ class TranslationHelpers {
}
}
- /**
- * @return array
- */
- public function getBoxNames() {
+ public function getBoxNames(): array {
return [
- 'other-languages' => [ $this, 'getOtherLanguagesBox' ],
- 'separator' => [ $this, 'getSeparatorBox' ],
'documentation' => [ $this, 'getDocumentationBox' ],
'definition' => [ $this, 'getDefinitionBox' ],
];
@@ -234,20 +196,11 @@ class TranslationHelpers {
$this->mustHaveDefinition();
$en = $this->getDefinition();
- $title = Linker::link(
- SpecialPage::getTitleFor( 'Translate' ),
- htmlspecialchars( $this->group->getLabel() ),
- [],
- [
- 'group' => $this->group->getId(),
- 'language' => $this->handle->getCode()
- ]
- );
-
+ $linkTag = self::ajaxEditLink( $this->handle->getTitle(), $this->group->getLabel() );
$label =
wfMessage( 'translate-edit-definition' )->escaped() .
wfMessage( 'word-separator' )->escaped() .
- wfMessage( 'parentheses' )->rawParams( $title )->escaped();
+ wfMessage( 'parentheses' )->rawParams( $linkTag )->escaped();
// Source language object
$sl = Language::factory( $this->group->getSourceLanguage() );
@@ -265,89 +218,11 @@ class TranslationHelpers {
$msg .= $this->wrapInsert( $id, $en );
- $class = [ 'class' => 'mw-sp-translate-edit-definition mw-translate-edit-definition' ];
-
- return TranslateUtils::fieldset( $label, $msg, $class );
- }
-
- public function getTranslationDisplayBox() {
- $en = $this->getTranslation();
- if ( $en === null ) {
- return null;
- }
- $label = wfMessage( 'translate-edit-translation' )->escaped();
- $class = [ 'class' => 'mw-translate-edit-translation' ];
- $msg = Html::rawElement( 'span',
- [ 'class' => 'mw-translate-edit-translationtext' ],
- TranslateUtils::convertWhiteSpaceToHTML( $en )
- );
+ $class = [ 'class' => 'mw-sp-translate-edit-definition' ];
return TranslateUtils::fieldset( $label, $msg, $class );
}
- public function getOtherLanguagesBox() {
- $code = $this->handle->getCode();
- $page = $this->handle->getKey();
- $ns = $this->handle->getTitle()->getNamespace();
-
- $boxes = [];
- foreach ( self::getFallbacks( $code ) as $fbcode ) {
- $text = TranslateUtils::getMessageContent( $page, $fbcode, $ns );
- if ( $text === null ) {
- continue;
- }
-
- $fbLanguage = Language::factory( $fbcode );
- $context = RequestContext::getMain();
- $label = TranslateUtils::getLanguageName( $fbcode, $context->getLanguage()->getCode() ) .
- $context->msg( 'word-separator' )->text() .
- $context->msg( 'parentheses', $fbLanguage->getHtmlCode() )->text();
-
- $target = $this->handle->getTitleForLanguage( $fbcode );
-
- if ( $target ) {
- $label = self::ajaxEditLink( $target, $label );
- }
-
- $dialogID = $this->dialogID();
- $id = Sanitizer::escapeIdForAttribute( "other-$fbcode-$dialogID" );
-
- $params = [ 'class' => 'mw-translate-edit-item' ];
-
- $display = TranslateUtils::convertWhiteSpaceToHTML( $text );
- $display = Html::rawElement( 'div', [
- 'lang' => $fbLanguage->getHtmlCode(),
- 'dir' => $fbLanguage->getDir() ],
- $display
- );
-
- $contents = self::legend( $label ) . "\n" . $this->adder( $id, $fbLanguage ) .
- $display . self::clear();
-
- $boxes[] = Html::rawElement( 'div', $params, $contents ) .
- $this->wrapInsert( $id, $text );
- }
-
- if ( count( $boxes ) ) {
- $sep = Html::element( 'hr', [ 'class' => 'mw-translate-sep' ] );
-
- return TranslateUtils::fieldset(
- wfMessage(
- 'translate-edit-in-other-languages',
- $page
- )->escaped(),
- implode( "$sep\n", $boxes ),
- [ 'class' => 'mw-sp-translate-edit-inother' ]
- );
- }
-
- return null;
- }
-
- public function getSeparatorBox() {
- return Html::element( 'div', [ 'class' => 'mw-translate-edit-extra' ] );
- }
-
public function getDocumentationBox() {
global $wgTranslateDocumentationLanguageCode;
@@ -388,60 +263,7 @@ class TranslationHelpers {
);
}
- /**
- * @param string $label
- * @return string
- */
- protected static function legend( $label ) {
- # Float it to the opposite direction
- return Html::rawElement( 'div', [ 'class' => 'mw-translate-legend' ], $label );
- }
-
- /**
- * @return string
- */
- protected static function clear() {
- return Html::element( 'div', [ 'style' => 'clear:both;' ] );
- }
-
- /**
- * @param string $code
- * @return array
- */
- protected static function getFallbacks( $code ) {
- global $wgTranslateLanguageFallbacks;
-
- // User preference has the final say
- $user = RequestContext::getMain()->getUser();
- $preference = $user->getOption( 'translate-editlangs' );
- if ( $preference !== 'default' ) {
- $fallbacks = array_map( 'trim', explode( ',', $preference ) );
- foreach ( $fallbacks as $k => $v ) {
- if ( $v === $code ) {
- unset( $fallbacks[$k] );
- }
- }
-
- return $fallbacks;
- }
-
- // Global configuration settings
- $fallbacks = [];
- if ( isset( $wgTranslateLanguageFallbacks[$code] ) ) {
- $fallbacks = (array)$wgTranslateLanguageFallbacks[$code];
- }
-
- $list = Language::getFallbacksFor( $code );
- array_pop( $list ); // Get 'en' away from the end
- $fallbacks = array_merge( $list, $fallbacks );
-
- return array_unique( $fallbacks );
- }
-
- /**
- * @return string
- */
- public function dialogID() {
+ public function dialogID(): string {
$hash = sha1( $this->handle->getTitle()->getPrefixedDBkey() );
return substr( $hash, 0, 4 );
@@ -449,7 +271,7 @@ class TranslationHelpers {
/**
* @param string $source jQuery selector for element containing the source
- * @param Language $lang Language object
+ * @param Language $lang
* @return string
*/
public function adder( $source, $lang ) {
diff --git a/MLEB/Translate/webservices/GoogleTranslateWebService.php b/MLEB/Translate/webservices/GoogleTranslateWebService.php
index abb435ea..4b51c9c6 100644
--- a/MLEB/Translate/webservices/GoogleTranslateWebService.php
+++ b/MLEB/Translate/webservices/GoogleTranslateWebService.php
@@ -23,10 +23,16 @@ class GoogleTranslateWebService extends TranslationWebService {
/** @inheritDoc */
protected function mapCode( $code ) {
- if ( $code === 'be-tarask' ) {
- $code = 'be';
- }
- return $code;
+ /** @phpcs-require-sorted-array */
+ $map = [
+ 'be-tarask' => 'be',
+ 'zh-cn' => 'zh-CN',
+ 'zh-hans' => 'zh-CN',
+ 'zh-hant' => 'zh-TW',
+ 'zh-tw' => 'zh-TW',
+ ];
+
+ return $map[$code] ?? $code;
}
/** @inheritDoc */
diff --git a/MLEB/Translate/webservices/MicrosoftWebService.php b/MLEB/Translate/webservices/MicrosoftWebService.php
index eb7fa0ff..6dd1711c 100644
--- a/MLEB/Translate/webservices/MicrosoftWebService.php
+++ b/MLEB/Translate/webservices/MicrosoftWebService.php
@@ -42,7 +42,7 @@ class MicrosoftWebService extends TranslationWebService {
$key = $this->config['key'];
$options = [];
- $options['method'] = 'GET';
+ $options['method'] = 'GET';
$options['timeout'] = $this->config['timeout'];
$url = $this->config['url'] . '/languages?api-version=3.0';
diff --git a/MLEB/Translate/webservices/TranslationQuery.php b/MLEB/Translate/webservices/TranslationQuery.php
index 3e0fbf31..bee779fb 100644
--- a/MLEB/Translate/webservices/TranslationQuery.php
+++ b/MLEB/Translate/webservices/TranslationQuery.php
@@ -19,10 +19,7 @@ class TranslationQuery {
protected $params = [];
protected $body;
protected $headers = [];
-
- /**
- * @var mixed Arbitrary data that is returned with TranslationQueryResponse
- */
+ /** @var mixed Arbitrary data that is returned with TranslationQueryResponse */
protected $instructions;
// URL is mandatory, so using it here
diff --git a/MLEB/Translate/webservices/TranslationQueryResponse.php b/MLEB/Translate/webservices/TranslationQueryResponse.php
index a8f9f6dd..624a4688 100644
--- a/MLEB/Translate/webservices/TranslationQueryResponse.php
+++ b/MLEB/Translate/webservices/TranslationQueryResponse.php
@@ -17,10 +17,7 @@ class TranslationQueryResponse {
protected $headers;
protected $body;
protected $error;
-
- /**
- * @var TranslationQuery
- */
+ /** @var TranslationQuery */
protected $query;
protected function __construct() {
diff --git a/MLEB/Translate/webservices/TranslationWebService.php b/MLEB/Translate/webservices/TranslationWebService.php
index be424316..de7001f1 100644
--- a/MLEB/Translate/webservices/TranslationWebService.php
+++ b/MLEB/Translate/webservices/TranslationWebService.php
@@ -172,19 +172,11 @@ abstract class TranslationWebService implements LoggerAwareInterface {
/* Default implementation */
- /**
- * @var string Name of this webservice.
- */
+ /** @var string Name of this webservice. */
protected $service;
-
- /**
- * @var array
- */
+ /** @var array */
protected $config;
-
- /**
- * @var LoggerInterface
- */
+ /** @var LoggerInterface */
protected $logger;
/**
@@ -219,20 +211,23 @@ abstract class TranslationWebService implements LoggerAwareInterface {
* @throws TranslationWebServiceConfigurationException
*/
protected function getSupportedLanguagePairs() {
- $key = wfMemcKey( 'translate-tmsug-pairs-' . $this->service );
- $pairs = wfGetCache( CACHE_ANYTHING )->get( $key );
- if ( !is_array( $pairs ) ) {
- try {
- $pairs = $this->doPairs();
- } catch ( Exception $e ) {
- $this->reportTranslationServiceFailure( $e->getMessage() );
- return [];
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+
+ return $cache->getWithSetCallback(
+ $cache->makeKey( 'translate-tmsug-pairs-' . $this->service ),
+ $cache::TTL_DAY,
+ function ( &$ttl ) use ( $cache ) {
+ try {
+ $pairs = $this->doPairs();
+ } catch ( Exception $e ) {
+ $pairs = [];
+ $this->reportTranslationServiceFailure( $e->getMessage() );
+ $ttl = $cache::TTL_UNCACHEABLE;
+ }
+
+ return $pairs;
}
- // Cache the result for a day
- wfGetCache( CACHE_ANYTHING )->set( $key, $pairs, 60 * 60 * 24 );
- }
-
- return $pairs;
+ );
}
/**
@@ -271,7 +266,6 @@ abstract class TranslationWebService implements LoggerAwareInterface {
* consider the service being temporarily off-line.
*/
protected $serviceFailureCount = 5;
-
/**
* @var int How long after the last detected failure we clear the status and
* try again.
@@ -284,18 +278,21 @@ abstract class TranslationWebService implements LoggerAwareInterface {
*/
public function checkTranslationServiceFailure() {
$service = $this->service;
- $key = wfMemcKey( "translate-service-$service" );
- $value = wfGetCache( CACHE_ANYTHING )->get( $key );
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+
+ $key = $cache->makeKey( "translate-service-$service" );
+ $value = $cache->get( $key );
if ( !is_string( $value ) ) {
return false;
}
+
list( $count, $failed ) = explode( '|', $value, 2 );
if ( $failed + ( 2 * $this->serviceFailurePeriod ) < wfTimestamp() ) {
if ( $count >= $this->serviceFailureCount ) {
$this->logger->warning( "Translation service $service (was) restored" );
}
- wfGetCache( CACHE_ANYTHING )->delete( $key );
+ $cache->delete( $key );
return false;
} elseif ( $failed + $this->serviceFailurePeriod < wfTimestamp() ) {
@@ -318,8 +315,10 @@ abstract class TranslationWebService implements LoggerAwareInterface {
$service = $this->service;
$this->logger->warning( "Translation service $service problem: $msg" );
- $key = wfMemcKey( "translate-service-$service" );
- $value = wfGetCache( CACHE_ANYTHING )->get( $key );
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ $key = $cache->makeKey( "translate-service-$service" );
+
+ $value = $cache->get( $key );
if ( !is_string( $value ) ) {
$count = 0;
} else {
@@ -328,7 +327,7 @@ abstract class TranslationWebService implements LoggerAwareInterface {
$count++;
$failed = wfTimestamp();
- wfGetCache( CACHE_ANYTHING )->set(
+ $cache->set(
$key,
"$count|$failed",
$this->serviceFailurePeriod * 5
diff --git a/MLEB/UniversalLanguageSelector/.eslintrc.json b/MLEB/UniversalLanguageSelector/.eslintrc.json
index 8eb6a069..dc89fd8e 100644
--- a/MLEB/UniversalLanguageSelector/.eslintrc.json
+++ b/MLEB/UniversalLanguageSelector/.eslintrc.json
@@ -1,12 +1,14 @@
{
"root": true,
"extends": [
- "wikimedia/client",
+ "wikimedia/client-es5",
"wikimedia/jquery",
"wikimedia/mediawiki"
],
"rules": {
"no-jquery/no-global-selector": "off",
- "mediawiki/class-doc": "warn"
+ "mediawiki/class-doc": "warn",
+ "no-shadow": "warn",
+ "compat/compat": "warn"
}
}
diff --git a/MLEB/UniversalLanguageSelector/.phpcs.xml b/MLEB/UniversalLanguageSelector/.phpcs.xml
index 28d3cbae..a35218c6 100644
--- a/MLEB/UniversalLanguageSelector/.phpcs.xml
+++ b/MLEB/UniversalLanguageSelector/.phpcs.xml
@@ -4,6 +4,7 @@
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate" />
<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected" />
</rule>
<file>.</file>
<arg name="extensions" value="php" />
diff --git a/MLEB/UniversalLanguageSelector/Gruntfile.js b/MLEB/UniversalLanguageSelector/Gruntfile.js
index c0c32336..cbb8ad88 100644
--- a/MLEB/UniversalLanguageSelector/Gruntfile.js
+++ b/MLEB/UniversalLanguageSelector/Gruntfile.js
@@ -14,10 +14,7 @@ module.exports = function ( grunt ) {
fix: grunt.option( 'fix' )
},
all: [
- '**/*.{js,json}',
- '!lib/**',
- '!resources/js/ext.uls.webfonts.repository.js',
- '!{vendor,node_modules}/**'
+ '.'
]
},
stylelint: {
diff --git a/MLEB/UniversalLanguageSelector/RELEASE-NOTES b/MLEB/UniversalLanguageSelector/RELEASE-NOTES
index 5f4810bb..4eaf5699 100644
--- a/MLEB/UniversalLanguageSelector/RELEASE-NOTES
+++ b/MLEB/UniversalLanguageSelector/RELEASE-NOTES
@@ -1,8 +1,5 @@
-== UniversalLanguageSelector 2020.07 ==
-Released at 2020-07-24.
+== UniversalLanguageSelector 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* SkinTemplateOutputPageBeforeExec is deprecated, use SkinAfterPortlet instead. ([[phab:T253178|phab:T253178]])
-
-=== Input Methods ===
-* Added Baoulé tilde keyboard.
+* Restore suggested languages to compact languages button. ({{Phab|T282037}})
diff --git a/MLEB/UniversalLanguageSelector/composer.json b/MLEB/UniversalLanguageSelector/composer.json
index 0647240f..424420ee 100644
--- a/MLEB/UniversalLanguageSelector/composer.json
+++ b/MLEB/UniversalLanguageSelector/composer.json
@@ -25,9 +25,9 @@
"mediawiki/cldr": "Language names in all languages"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
"php-parallel-lint/php-parallel-lint": "1.2.0"
},
@@ -40,6 +40,7 @@
"parallel-lint . --exclude vendor --exclude node_modules",
"phpcs -p -s",
"minus-x check ."
- ]
+ ],
+ "phan": "phan -d . --long-progress-bar"
}
}
diff --git a/MLEB/UniversalLanguageSelector/composer.lock b/MLEB/UniversalLanguageSelector/composer.lock
deleted file mode 100644
index f495097a..00000000
--- a/MLEB/UniversalLanguageSelector/composer.lock
+++ /dev/null
@@ -1,1574 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "cdb3bcdc5684a1ae8c0ac713b6a53e40",
- "packages": [
- {
- "name": "composer/installers",
- "version": "v1.9.0",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/installers.git",
- "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
- "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^1.0 || ^2.0"
- },
- "replace": {
- "roundcube/plugin-installer": "*",
- "shama/baton": "*"
- },
- "require-dev": {
- "composer/composer": "1.6.* || 2.0.*@dev",
- "composer/semver": "1.0.* || 2.0.*@dev",
- "phpunit/phpunit": "^4.8.36",
- "sebastian/comparator": "^1.2.4",
- "symfony/process": "^2.3"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "Composer\\Installers\\Plugin",
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Installers\\": "src/Composer/Installers"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kyle Robinson Young",
- "email": "kyle@dontkry.com",
- "homepage": "https://github.com/shama"
- }
- ],
- "description": "A multi-framework Composer library installer",
- "homepage": "https://composer.github.io/installers/",
- "keywords": [
- "Craft",
- "Dolibarr",
- "Eliasis",
- "Hurad",
- "ImageCMS",
- "Kanboard",
- "Lan Management System",
- "MODX Evo",
- "MantisBT",
- "Mautic",
- "Maya",
- "OXID",
- "Plentymarkets",
- "Porto",
- "RadPHP",
- "SMF",
- "Thelia",
- "Whmcs",
- "WolfCMS",
- "agl",
- "aimeos",
- "annotatecms",
- "attogram",
- "bitrix",
- "cakephp",
- "chef",
- "cockpit",
- "codeigniter",
- "concrete5",
- "croogo",
- "dokuwiki",
- "drupal",
- "eZ Platform",
- "elgg",
- "expressionengine",
- "fuelphp",
- "grav",
- "installer",
- "itop",
- "joomla",
- "known",
- "kohana",
- "laravel",
- "lavalite",
- "lithium",
- "magento",
- "majima",
- "mako",
- "mediawiki",
- "modulework",
- "modx",
- "moodle",
- "osclass",
- "phpbb",
- "piwik",
- "ppi",
- "puppet",
- "pxcms",
- "reindex",
- "roundcube",
- "shopware",
- "silverstripe",
- "sydes",
- "sylius",
- "symfony",
- "typo3",
- "wordpress",
- "yawik",
- "zend",
- "zikula"
- ],
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2020-04-07T06:57:05+00:00"
- }
- ],
- "packages-dev": [
- {
- "name": "composer/semver",
- "version": "1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e",
- "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.5 || ^5.0.5",
- "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Semver\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
- "time": "2019-03-19T17:25:45+00:00"
- },
- {
- "name": "composer/spdx-licenses",
- "version": "1.5.2",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/spdx-licenses.git",
- "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5",
- "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Spdx\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "SPDX licenses list and validation library.",
- "keywords": [
- "license",
- "spdx",
- "validator"
- ],
- "time": "2019-07-29T10:31:59+00:00"
- },
- {
- "name": "composer/xdebug-handler",
- "version": "1.4.1",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7",
- "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0",
- "psr/log": "^1.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Composer\\XdebugHandler\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
- }
- ],
- "description": "Restarts a process without Xdebug.",
- "keywords": [
- "Xdebug",
- "performance"
- ],
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- }
- ],
- "time": "2020-03-01T12:26:26+00:00"
- },
- {
- "name": "felixfbecker/advanced-json-rpc",
- "version": "v3.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
- "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/0ed363f8de17d284d479ec813c9ad3f6834b5c40",
- "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40",
- "shasum": ""
- },
- "require": {
- "netresearch/jsonmapper": "^1.0 || ^2.0",
- "php": ">=7.0",
- "phpdocumentor/reflection-docblock": "^4.0.0 || ^5.0.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.0.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "AdvancedJsonRpc\\": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "ISC"
- ],
- "authors": [
- {
- "name": "Felix Becker",
- "email": "felix.b@outlook.com"
- }
- ],
- "description": "A more advanced JSONRPC implementation",
- "time": "2020-03-11T15:21:41+00:00"
- },
- {
- "name": "jakub-onderka/php-console-color",
- "version": "v0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
- "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
- "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
- "shasum": ""
- },
- "require": {
- "php": ">=5.4.0"
- },
- "require-dev": {
- "jakub-onderka/php-code-style": "1.0",
- "jakub-onderka/php-parallel-lint": "1.0",
- "jakub-onderka/php-var-dump-check": "0.*",
- "phpunit/phpunit": "~4.3",
- "squizlabs/php_codesniffer": "1.*"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "JakubOnderka\\PhpConsoleColor\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "Jakub Onderka",
- "email": "jakub.onderka@gmail.com"
- }
- ],
- "abandoned": "php-parallel-lint/php-console-color",
- "time": "2018-09-29T17:23:10+00:00"
- },
- {
- "name": "jakub-onderka/php-console-highlighter",
- "version": "v0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
- "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
- "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "jakub-onderka/php-console-color": "~0.2",
- "php": ">=5.4.0"
- },
- "require-dev": {
- "jakub-onderka/php-code-style": "~1.0",
- "jakub-onderka/php-parallel-lint": "~1.0",
- "jakub-onderka/php-var-dump-check": "~0.1",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~1.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jakub Onderka",
- "email": "acci@acci.cz",
- "homepage": "http://www.acci.cz/"
- }
- ],
- "description": "Highlight PHP code in terminal",
- "abandoned": "php-parallel-lint/php-console-highlighter",
- "time": "2018-09-29T18:48:56+00:00"
- },
- {
- "name": "jakub-onderka/php-parallel-lint",
- "version": "v1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/JakubOnderka/PHP-Parallel-Lint.git",
- "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/JakubOnderka/PHP-Parallel-Lint/zipball/04fbd3f5fb1c83f08724aa58a23db90bd9086ee8",
- "reference": "04fbd3f5fb1c83f08724aa58a23db90bd9086ee8",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "jakub-onderka/php-console-highlighter": "~0.3",
- "nette/tester": "~1.3",
- "squizlabs/php_codesniffer": "~2.7"
- },
- "suggest": {
- "jakub-onderka/php-console-highlighter": "Highlight syntax in code snippet"
- },
- "bin": [
- "parallel-lint"
- ],
- "type": "library",
- "autoload": {
- "classmap": [
- "./"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "Jakub Onderka",
- "email": "ahoj@jakubonderka.cz"
- }
- ],
- "description": "This tool check syntax of PHP files about 20x faster than serial check.",
- "homepage": "https://github.com/JakubOnderka/PHP-Parallel-Lint",
- "abandoned": "php-parallel-lint/php-parallel-lint",
- "time": "2018-02-24T15:31:20+00:00"
- },
- {
- "name": "mediawiki/mediawiki-codesniffer",
- "version": "v29.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/wikimedia/mediawiki-tools-codesniffer.git",
- "reference": "7f8017557c6f223079f712baa05b58a0f7acf3ff"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/wikimedia/mediawiki-tools-codesniffer/zipball/7f8017557c6f223079f712baa05b58a0f7acf3ff",
- "reference": "7f8017557c6f223079f712baa05b58a0f7acf3ff",
- "shasum": ""
- },
- "require": {
- "composer/semver": "1.5.0",
- "composer/spdx-licenses": "1.5.2",
- "ext-mbstring": "*",
- "php": ">= 7.2.0",
- "squizlabs/php_codesniffer": "3.5.3"
- },
- "require-dev": {
- "jakub-onderka/php-console-highlighter": "0.3.2",
- "jakub-onderka/php-parallel-lint": "1.0.0",
- "mediawiki/minus-x": "0.3.2",
- "phpunit/phpunit": "^8.4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "MediaWiki\\": "MediaWiki"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-2.0-or-later"
- ],
- "description": "MediaWiki CodeSniffer Standards",
- "homepage": "https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP",
- "keywords": [
- "codesniffer",
- "mediawiki"
- ],
- "time": "2020-01-09T18:09:25+00:00"
- },
- {
- "name": "mediawiki/mediawiki-phan-config",
- "version": "0.9.1",
- "source": {
- "type": "git",
- "url": "https://github.com/wikimedia/mediawiki-tools-phan.git",
- "reference": "44288f2e76c107f4b25a4ccb68b6fbed9879ccef"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/wikimedia/mediawiki-tools-phan/zipball/44288f2e76c107f4b25a4ccb68b6fbed9879ccef",
- "reference": "44288f2e76c107f4b25a4ccb68b6fbed9879ccef",
- "shasum": ""
- },
- "require": {
- "phan/phan": "2.4.7",
- "php": ">=7.2.0"
- },
- "require-dev": {
- "jakub-onderka/php-console-highlighter": "0.3.2",
- "jakub-onderka/php-parallel-lint": "1.0.0",
- "mediawiki/mediawiki-codesniffer": "29.0.0",
- "mediawiki/minus-x": "0.3.2",
- "ockcyp/covers-validator": "^1.1",
- "phpunit/phpunit": "^8.4"
- },
- "type": "library",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-2.0-or-later"
- ],
- "authors": [
- {
- "name": "MediaWiki developers",
- "email": "wikitech-l@lists.wikimedia.org"
- }
- ],
- "description": "Standard MediaWiki phan configuration",
- "homepage": "https://www.mediawiki.org/wiki/Continuous_integration/Phan",
- "time": "2020-01-24T18:53:07+00:00"
- },
- {
- "name": "mediawiki/minus-x",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/wikimedia/mediawiki-tools-minus-x.git",
- "reference": "f02469c5a302615efbdd725ca85f2805f58f0219"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/wikimedia/mediawiki-tools-minus-x/zipball/f02469c5a302615efbdd725ca85f2805f58f0219",
- "reference": "f02469c5a302615efbdd725ca85f2805f58f0219",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.9",
- "symfony/console": "^5"
- },
- "require-dev": {
- "jakub-onderka/php-console-highlighter": "0.3.2",
- "jakub-onderka/php-parallel-lint": "1.0.0",
- "mediawiki/mediawiki-codesniffer": "29.0.0"
- },
- "bin": [
- "bin/minus-x"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "MediaWiki\\MinusX\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-3.0-or-later"
- ],
- "authors": [
- {
- "name": "Kunal Mehta",
- "email": "legoktm@member.fsf.org"
- }
- ],
- "description": "Removes executable bit from files that shouldn't be executable",
- "homepage": "https://www.mediawiki.org/wiki/MinusX",
- "time": "2020-01-20T05:12:15+00:00"
- },
- {
- "name": "microsoft/tolerant-php-parser",
- "version": "v0.0.18",
- "source": {
- "type": "git",
- "url": "https://github.com/microsoft/tolerant-php-parser.git",
- "reference": "e255aa978b45729094da2a1a6f9954044a244ff2"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/e255aa978b45729094da2a1a6f9954044a244ff2",
- "reference": "e255aa978b45729094da2a1a6f9954044a244ff2",
- "shasum": ""
- },
- "require": {
- "php": ">=7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Microsoft\\PhpParser\\": [
- "src/"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Rob Lourens",
- "email": "roblou@microsoft.com"
- }
- ],
- "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios",
- "time": "2019-07-01T02:21:00+00:00"
- },
- {
- "name": "netresearch/jsonmapper",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/cweiske/jsonmapper.git",
- "reference": "0d4d1b48d682a93b6bfedf60b88c7750e9cb0b06"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/0d4d1b48d682a93b6bfedf60b88c7750e9cb0b06",
- "reference": "0d4d1b48d682a93b6bfedf60b88c7750e9cb0b06",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-spl": "*",
- "php": ">=5.6"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4",
- "squizlabs/php_codesniffer": "~1.5"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "JsonMapper": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "OSL-3.0"
- ],
- "authors": [
- {
- "name": "Christian Weiske",
- "email": "cweiske@cweiske.de",
- "homepage": "http://github.com/cweiske/jsonmapper/",
- "role": "Developer"
- }
- ],
- "description": "Map nested JSON structures onto PHP classes",
- "time": "2019-08-15T19:41:25+00:00"
- },
- {
- "name": "phan/phan",
- "version": "2.4.7",
- "source": {
- "type": "git",
- "url": "https://github.com/phan/phan.git",
- "reference": "a300b0331269bbdc77ba03f36176740579dbb457"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phan/phan/zipball/a300b0331269bbdc77ba03f36176740579dbb457",
- "reference": "a300b0331269bbdc77ba03f36176740579dbb457",
- "shasum": ""
- },
- "require": {
- "composer/semver": "^1.4",
- "composer/xdebug-handler": "^1.3.2",
- "ext-filter": "*",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "felixfbecker/advanced-json-rpc": "^3.0.4",
- "microsoft/tolerant-php-parser": "0.0.18",
- "netresearch/jsonmapper": "^1.6.0",
- "php": "^7.1.0",
- "sabre/event": "^5.0",
- "symfony/console": "^2.3|^3.0|^4.0|^5.0",
- "symfony/polyfill-mbstring": "^1.11.0"
- },
- "require-dev": {
- "brianium/paratest": "^3.1.2",
- "phpunit/phpunit": "^7.5.0"
- },
- "suggest": {
- "ext-ast": "Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed.",
- "ext-iconv": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8",
- "ext-igbinary": "Improves performance of polyfill when ext-ast is unavailable",
- "ext-mbstring": "Either iconv or mbstring is needed to ensure issue messages are valid utf-8",
- "ext-tokenizer": "Needed for non-AST support and file/line-based suppressions."
- },
- "bin": [
- "phan",
- "phan_client",
- "tocheckstyle"
- ],
- "type": "project",
- "autoload": {
- "psr-4": {
- "Phan\\": "src/Phan"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Tyson Andre"
- },
- {
- "name": "Rasmus Lerdorf"
- },
- {
- "name": "Andrew S. Morrison"
- }
- ],
- "description": "A static analyzer for PHP",
- "keywords": [
- "analyzer",
- "php",
- "static"
- ],
- "time": "2020-01-23T00:57:08+00:00"
- },
- {
- "name": "phpdocumentor/reflection-common",
- "version": "2.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a",
- "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "~6"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
- }
- ],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
- "keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
- ],
- "time": "2018-08-07T13:53:10+00:00"
- },
- {
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
- "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
- "shasum": ""
- },
- "require": {
- "ext-filter": "^7.1",
- "php": "^7.2",
- "phpdocumentor/reflection-common": "^2.0",
- "phpdocumentor/type-resolver": "^1.0",
- "webmozart/assert": "^1"
- },
- "require-dev": {
- "doctrine/instantiator": "^1",
- "mockery/mockery": "^1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- },
- {
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
- }
- ],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2020-02-22T12:28:44+00:00"
- },
- {
- "name": "phpdocumentor/type-resolver",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
- "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
- "shasum": ""
- },
- "require": {
- "php": "^7.2",
- "phpdocumentor/reflection-common": "^2.0"
- },
- "require-dev": {
- "ext-tokenizer": "^7.2",
- "mockery/mockery": "~1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- }
- ],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
- "time": "2020-02-18T18:59:58+00:00"
- },
- {
- "name": "psr/container",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
- "time": "2017-02-14T16:28:37+00:00"
- },
- {
- "name": "psr/log",
- "version": "1.1.3",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
- "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
- "time": "2020-03-23T09:12:05+00:00"
- },
- {
- "name": "sabre/event",
- "version": "5.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/sabre-io/event.git",
- "reference": "d00a17507af0e7544cfe17096372f5d733e3b276"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sabre-io/event/zipball/d00a17507af0e7544cfe17096372f5d733e3b276",
- "reference": "d00a17507af0e7544cfe17096372f5d733e3b276",
- "shasum": ""
- },
- "require": {
- "php": "^7.1"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "~2.16.1",
- "phpunit/phpunit": "^7 || ^8"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Sabre\\Event\\": "lib/"
- },
- "files": [
- "lib/coroutine.php",
- "lib/Loop/functions.php",
- "lib/Promise/functions.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Evert Pot",
- "email": "me@evertpot.com",
- "homepage": "http://evertpot.com/",
- "role": "Developer"
- }
- ],
- "description": "sabre/event is a library for lightweight event-based programming",
- "homepage": "http://sabre.io/event/",
- "keywords": [
- "EventEmitter",
- "async",
- "coroutine",
- "eventloop",
- "events",
- "hooks",
- "plugin",
- "promise",
- "reactor",
- "signal"
- ],
- "time": "2020-01-31T18:52:29+00:00"
- },
- {
- "name": "squizlabs/php_codesniffer",
- "version": "3.5.3",
- "source": {
- "type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/557a1fc7ac702c66b0bbfe16ab3d55839ef724cb",
- "reference": "557a1fc7ac702c66b0bbfe16ab3d55839ef724cb",
- "shasum": ""
- },
- "require": {
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": ">=5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
- },
- "bin": [
- "bin/phpcs",
- "bin/phpcbf"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Greg Sherwood",
- "role": "lead"
- }
- ],
- "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
- "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
- "keywords": [
- "phpcs",
- "standards"
- ],
- "time": "2019-12-04T04:46:47+00:00"
- },
- {
- "name": "symfony/console",
- "version": "v5.0.7",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/5fa1caadc8cdaa17bcfb25219f3b53fe294a9935",
- "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php73": "^1.8",
- "symfony/service-contracts": "^1.1|^2"
- },
- "conflict": {
- "symfony/dependency-injection": "<4.4",
- "symfony/event-dispatcher": "<4.4",
- "symfony/lock": "<4.4",
- "symfony/process": "<4.4"
- },
- "provide": {
- "psr/log-implementation": "1.0"
- },
- "require-dev": {
- "psr/log": "~1.0",
- "symfony/config": "^4.4|^5.0",
- "symfony/dependency-injection": "^4.4|^5.0",
- "symfony/event-dispatcher": "^4.4|^5.0",
- "symfony/lock": "^4.4|^5.0",
- "symfony/process": "^4.4|^5.0",
- "symfony/var-dumper": "^4.4|^5.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Console Component",
- "homepage": "https://symfony.com",
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-03-30T11:42:42+00:00"
- },
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.15.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
- "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.15-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-02-27T09:26:54+00:00"
- },
- {
- "name": "symfony/polyfill-mbstring",
- "version": "v1.15.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
- "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.15-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for the Mbstring extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-03-09T19:04:49+00:00"
- },
- {
- "name": "symfony/polyfill-php73",
- "version": "v1.15.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
- "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.15-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
- },
- "files": [
- "bootstrap.php"
- ],
- "classmap": [
- "Resources/stubs"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-02-27T09:26:54+00:00"
- },
- {
- "name": "symfony/service-contracts",
- "version": "v2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/service-contracts.git",
- "reference": "144c5e51266b281231e947b51223ba14acf1a749"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749",
- "reference": "144c5e51266b281231e947b51223ba14acf1a749",
- "shasum": ""
- },
- "require": {
- "php": "^7.2.5",
- "psr/container": "^1.0"
- },
- "suggest": {
- "symfony/service-implementation": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Contracts\\Service\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Generic abstractions related to writing services",
- "homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
- "time": "2019-11-18T17:27:11+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.7.0",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozart/assert.git",
- "reference": "aed98a490f9a8f78468232db345ab9cf606cf598"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598",
- "reference": "aed98a490f9a8f78468232db345ab9cf606cf598",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.3 || ^7.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "vimeo/psalm": "<3.6.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.36 || ^7.5.13"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
- }
- ],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
- "time": "2020-02-14T12:15:55+00:00"
- }
- ],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": {
- "php": ">=7.1"
- },
- "platform-dev": [],
- "plugin-api-version": "1.1.0"
-}
diff --git a/MLEB/UniversalLanguageSelector/data/LanguageNameIndexer.php b/MLEB/UniversalLanguageSelector/data/LanguageNameIndexer.php
index 37a6825f..49d585f8 100644
--- a/MLEB/UniversalLanguageSelector/data/LanguageNameIndexer.php
+++ b/MLEB/UniversalLanguageSelector/data/LanguageNameIndexer.php
@@ -120,12 +120,12 @@ class LanguageNameIndexer extends Maintenance {
// - shortest matches appear first, especially exact matches
// Sort buckets by index
ksort( $buckets );
- foreach ( $buckets as $index => &$bucketTypes ) {
+ foreach ( $buckets as &$bucketTypes ) {
$lengths[] = array_sum( array_map( 'count', $bucketTypes ) );
// Ensure 'prefix' is before 'infix';
krsort( $bucketTypes );
// Ensure each bucket has entries sorted
- foreach ( $bucketTypes as $type => &$bucket ) {
+ foreach ( $bucketTypes as &$bucket ) {
ksort( $bucket );
}
}
@@ -145,7 +145,7 @@ class LanguageNameIndexer extends Maintenance {
private function getLanguageData() {
$file = __DIR__ . '/../lib/jquery.uls/src/jquery.uls.data.js';
$contents = file_get_contents( $file );
- if ( !preg_match( '/.*\$\.uls\.data = (.*?)} \( jQuery \)/s', $contents, $matches ) ) {
+ if ( !preg_match( '/.*\$\.uls\.data\s*=\s*(.*?)\s*}\s*\(\s*jQuery\s*\)/s', $contents, $matches ) ) {
throw new LogicException( 'Syntax error in jquery.uls.data.js?' );
}
$json = $matches[ 1 ];
@@ -157,11 +157,11 @@ class LanguageNameIndexer extends Maintenance {
}
private function generateFile( array $buckets ) {
- $template = <<<PHP
+ $template = <<<'PHP'
<?php
-// This file is generated by script!
+// This file is generated by a script!
class LanguageNameSearchData {
- public static \$buckets = ___;
+ public static $buckets = ___;
}
PHP;
@@ -170,7 +170,7 @@ PHP;
$data = var_export( $buckets, true );
$data = str_replace( "array (", '[', $data );
$data = str_replace( "),", '],', $data );
- // Closing of the array, add correct indendation
+ // Closing of the array, add correct indentation
$data = preg_replace( "/\)$/", "\t]", $data );
// Remove newlines after =>s
$data = preg_replace( '/(=>)\s+(\[)/m', '\1 \2', $data );
diff --git a/MLEB/UniversalLanguageSelector/data/LanguageNameSearchData.php b/MLEB/UniversalLanguageSelector/data/LanguageNameSearchData.php
index d8623833..d64c6301 100644
--- a/MLEB/UniversalLanguageSelector/data/LanguageNameSearchData.php
+++ b/MLEB/UniversalLanguageSelector/data/LanguageNameSearchData.php
@@ -677,6 +677,9 @@ class LanguageNameSearchData {
'althochdeutsch' => 'goh',
'althochtüütsch' => 'goh',
'altirisch' => 'sga',
+ 'altjapanisch' => 'ojp',
+ 'altjapanisch (hiragana-schrift)' => 'ojp-hira',
+ 'altjapanisch (kanji-schrift)' => 'ojp-hani',
'altnordisch' => 'non',
'alto alemán antiguo' => 'goh',
'alto alemán medio' => 'gmh',
@@ -1170,6 +1173,7 @@ class LanguageNameSearchData {
'armeńšćina' => 'hy',
'armãneashti' => 'roa-rup',
'arménien' => 'hy',
+ 'arménien occidental' => 'hyw',
'arménio' => 'hy',
'arménčina' => 'hy',
'arménština' => 'hy',
@@ -1416,6 +1420,7 @@ class LanguageNameSearchData {
'australijski angielski' => 'en-au',
'australijski engleski' => 'en-au',
'australijski jezik' => 'aus',
+ 'australisches englisch' => 'en-au',
'australisk engelska' => 'en-au',
'australsk engelsk' => 'en-au',
'australski engleski' => 'en-au',
@@ -2333,6 +2338,7 @@ class LanguageNameSearchData {
'bas-sorabe' => 'dsb',
'basa' => 'bas',
'basa acèh' => 'ace',
+ 'basa bali' => 'ban',
'basa banyumasan' => 'map-bms',
'basa dili' => 'bas',
'basa multilingua' => 'mul',
@@ -3170,6 +3176,7 @@ class LanguageNameSearchData {
'bakur — luriya bakur' => 'lrc',
'bakur — samiya bakur' => 'se',
'bakur — sotoyiya bakur' => 'nso',
+ 'bali — basa bali' => 'ban',
'bali — cànan bali' => 'ban',
'bali — tiếng bali' => 'ban',
'balkar — karachai balkar' => 'krc',
@@ -3954,6 +3961,7 @@ class LanguageNameSearchData {
'croatie' => 'hr',
'croato' => 'hr',
'croată' => 'hr',
+ 'créole guyanais' => 'gcr',
'créole haïtien' => 'ht',
'créole jamaïcain' => 'jam',
'créole louisianais' => 'lou',
@@ -4055,7 +4063,6 @@ class LanguageNameSearchData {
'cənubi ndebele' => 'nr',
'cənubi sami' => 'sma',
'cɛkikan' => 'cs',
- 'cебертатар' => 'sty',
],
'infix' => [
'cabo-verdiano — crioulo cabo-verdiano' => 'kea',
@@ -4321,6 +4328,7 @@ class LanguageNameSearchData {
'cornwall — tiếng cornwall' => 'kw',
'corsica — tiếng corsica' => 'co',
'cosaan — sinuwaa bu cosaan' => 'zh-hant',
+ 'cree — east cree' => 'crl',
'cree — tiếng cree' => 'cr',
'creek — tiếng creek' => 'mus',
'creole — ffrangeg seselwa creole' => 'crs',
@@ -5477,6 +5485,7 @@ class LanguageNameSearchData {
'eabhrais' => 'he',
'eadailtis' => 'it',
'eadailtis napoli' => 'nap',
+ 'east cree' => 'crl',
'east-frysk' => 'frs',
'eastenryks dútsk' => 'de-at',
'eastern balochi' => 'bgp',
@@ -5873,6 +5882,8 @@ class LanguageNameSearchData {
'europski španjolski' => 'es-es',
'europäescht portugisesch' => 'pt-pt',
'europäescht spuenesch' => 'es-es',
+ 'europäisches portugiesisch' => 'pt-pt',
+ 'europäisches spanisch' => 'es-es',
'europæisk portugisisk' => 'pt-pt',
'europæisk spansk' => 'es-es',
'európai portugál' => 'pt-pt',
@@ -6010,6 +6021,7 @@ class LanguageNameSearchData {
'engleski — srednjovjekovni engleski' => 'enm',
'engleskom — kreolski ili pidžin zasnovan na engleskom' => 'cpe',
'englisch — amerikanisches englisch' => 'en-us',
+ 'englisch — australisches englisch' => 'en-au',
'englisch — britisches englisch' => 'en-uk',
'englisch — einfaches englisch' => 'simple',
'englisch — kanadisches englisch' => 'en-ca',
@@ -8273,6 +8285,7 @@ class LanguageNameSearchData {
'german — isi-swiss high german' => 'de-ch',
'german — low german' => 'nds',
'german — middle high german' => 'gmh',
+ 'german — middle low german' => 'gml',
'german — old high german' => 'goh',
'german — palatine german' => 'pfl',
'german — pennsylvania german' => 'pdc',
@@ -8342,6 +8355,7 @@ class LanguageNameSearchData {
'gujarati — tiếng gujarati' => 'gu',
'gujarati — èdè gujarati' => 'gu',
'gusii — tiếng gusii' => 'guz',
+ 'guyanais — créole guyanais' => 'gcr',
'gwichʼin — tiếng gwichʼin' => 'gwi',
'gwiyannen — kriyòl gwiyannen' => 'gcr',
'gälisch — schottisches gälisch' => 'gd',
@@ -10093,6 +10107,7 @@ class LanguageNameSearchData {
'italų kalbos emilijos tarmė' => 'egl',
'italų kalbos pjemonto tarmė' => 'pms',
'italų kalbos romanijos tarmė' => 'rgn',
+ 'itnuxalkmc' => 'blc',
'itáliagiella' => 'it',
'itäfriisi' => 'frs',
'itävallansaksa' => 'de-at',
@@ -10390,10 +10405,18 @@ class LanguageNameSearchData {
'japanek' => 'ja',
'japanesch' => 'ja',
'japanese' => 'ja',
+ 'japanese (hiragana script)' => 'ja-hira',
+ 'japanese (kana script)' => 'ja-hrkt',
+ 'japanese (kanji script)' => 'ja-hani',
+ 'japanese (katakana script)' => 'ja-kana',
'japangbe' => 'ja',
'japani' => 'ja',
'japanimiusut' => 'ja',
'japanisch' => 'ja',
+ 'japanisch (hiragana-schrift)' => 'ja-hira',
+ 'japanisch (kana-schrift)' => 'ja-hrkt',
+ 'japanisch (kanji-schrift)' => 'ja-hani',
+ 'japanisch (katakana-schrift)' => 'ja-kana',
'japannees' => 'ja',
'japans' => 'ja',
'japansk' => 'ja',
@@ -10675,6 +10698,9 @@ class LanguageNameSearchData {
'jaman — asụsụ jaman' => 'de',
'jamaïcain — créole jamaïcain' => 'jam',
'japanese — asụsụ japanese' => 'ja',
+ 'japanese — old japanese' => 'ojp',
+ 'japanese — old japanese (hiragana script)' => 'ojp-hira',
+ 'japanese — old japanese (kanji script)' => 'ojp-hani',
'japanii — afaan japanii' => 'ja',
'jargon — chinook jargon' => 'chn',
'jarmanii — afaan jarmanii' => 'de',
@@ -14237,6 +14263,7 @@ class LanguageNameSearchData {
'leżgjan' => 'lez',
'lhudi-għarbi' => 'jrb',
'lhudi-persjan' => 'jpr',
+ 'li niha' => 'nia',
'lialabo' => 'ar',
'lialemaniki' => 'gsw',
'lialemá' => 'de',
@@ -14933,6 +14960,7 @@ class LanguageNameSearchData {
'louisiana — tiếng creole louisiana' => 'lou',
'louisianais — créole louisianais' => 'lou',
'louiziana — kreoleg louiziana' => 'lou',
+ 'low — middle low german' => 'gml',
'low — west low german' => 'nds-nl',
'lozi — tiếng lozi' => 'loz',
'luba — katanga luba' => 'lu',
@@ -15524,6 +15552,7 @@ class LanguageNameSearchData {
'mapúitsis' => 'arn',
'maqahi' => 'mag',
'maqedonisht' => 'mk',
+ 'mara' => 'mrh',
'maraitis' => 'mr',
'marata' => 'mr',
'marathera' => 'mr',
@@ -15851,6 +15880,7 @@ class LanguageNameSearchData {
'mexicansk spansk' => 'es-mx',
'mexikaansch spaansch' => 'es-mx',
'mexikanescht spuenesch' => 'es-mx',
+ 'mexikanisches spanisch' => 'es-mx',
'mexikansk spanska' => 'es-mx',
'mexikańska špańšćina' => 'es-mx',
'mexikoko espainiera' => 'es-mx',
@@ -15900,6 +15930,7 @@ class LanguageNameSearchData {
'middle french' => 'frm',
'middle high german' => 'gmh',
'middle irish' => 'mga',
+ 'middle low german' => 'gml',
'mikmak' => 'mic',
'mikmak dili' => 'mic',
'mikmakeg' => 'mic',
@@ -16124,6 +16155,7 @@ class LanguageNameSearchData {
'mon-khmer-spraken' => 'mkh',
'mon-khmer-spriaken' => 'mkh',
'mon-kmerski jezik' => 'mkh',
+ 'monegassisch' => 'lij-mc',
'mongais' => 'hmn',
'mongjohlesch' => 'mn',
'mongo' => 'lol',
@@ -16176,6 +16208,7 @@ class LanguageNameSearchData {
'monqol' => 'mn',
'montenegrin' => 'sr-me',
'montenegrinisch' => 'cnr',
+ 'monégasque' => 'lij-mc',
'moore' => 'mos',
'moorisayn' => 'mfe',
'mordovià erza' => 'myv',
@@ -17722,6 +17755,7 @@ class LanguageNameSearchData {
'nigèiriach — beurla nigèiriach' => 'pcm',
'nigèria — pidgin de nigèria' => 'pcm',
'nigérian — pidgin nigérian' => 'pcm',
+ 'niha — li niha' => 'nia',
'nijirya — tapidgint n nijirya' => 'pcm',
'nimšćina — awstriska nimšćina' => 'de-at',
'nimšćina — šwicarska nimšćina' => 'gsw',
@@ -17881,6 +17915,7 @@ class LanguageNameSearchData {
'oberengadinisch' => 'rm-puter',
'obersorbisch' => 'hsb',
'obestämt språk' => 'und',
+ 'obolo' => 'ann',
'occitaans' => 'oc',
'occitaansk' => 'oc',
'occitan' => 'oc',
@@ -17970,6 +18005,9 @@ class LanguageNameSearchData {
'old french' => 'fro',
'old high german' => 'goh',
'old irish' => 'sga',
+ 'old japanese' => 'ojp',
+ 'old japanese (hiragana script)' => 'ojp-hira',
+ 'old japanese (kanji script)' => 'ojp-hani',
'old norse' => 'non',
'old persian' => 'peo',
'old provençal' => 'pro',
@@ -18132,9 +18170,9 @@ class LanguageNameSearchData {
'ossezisch' => 'os',
'ossète' => 'os',
'ossético' => 'os',
- 'ost-jiddisch' => 'ydd',
'ostfriesesch' => 'frs',
'ostfriesisch' => 'frs',
+ 'ostjiddisch' => 'ydd',
'ostmari' => 'mhr',
'osztrák német' => 'de-at',
'oszét' => 'os',
@@ -18191,6 +18229,7 @@ class LanguageNameSearchData {
'o — brak treści o charakterze językowym' => 'zxx',
'obsah — žádný jazykový obsah' => 'zxx',
'obsahu — bez jazykového obsahu' => 'zxx',
+ 'occidental — arménien occidental' => 'hyw',
'occidental — balochi occidental' => 'bgn',
'occidental — baloutchi occidental' => 'bgn',
'occidental — baluchi occidental' => 'bgn',
@@ -18555,12 +18594,16 @@ class LanguageNameSearchData {
'philippinen-austroneesk spriaken' => 'phi',
'phoeniceg' => 'phn',
'phoenician' => 'phn',
+ 'phoenician (latin script)' => 'phn-latn',
+ 'phoenician (phoenician script)' => 'phn-phnx',
'phénicien' => 'phn',
'phönieksch' => 'phn',
'phöniikisk' => 'phn',
'phönikesch' => 'phn',
'phönikisch' => 'phn',
'phönizisch' => 'phn',
+ 'phönizisch (lateinische schrift)' => 'phn-latn',
+ 'phönizisch (phönizische schrift)' => 'phn-phnx',
'piamontés' => 'pms',
'picard' => 'pcd',
'picard dili' => 'pcd',
@@ -19119,6 +19162,7 @@ class LanguageNameSearchData {
'portuges — brasilgo portuges' => 'pt-br',
'portuges — europako portuges' => 'pt-pt',
'portugiesisch — brasilianisches portugiesisch' => 'pt-br',
+ 'portugiesisch — europäisches portugiesisch' => 'pt-pt',
'portugiisisch — brasilianischs portugiisisch' => 'pt-br',
'portugiisisch — iberischs portugiisisch' => 'pt-pt',
'portugiisk — brasiliaansk portugiisk' => 'pt-br',
@@ -22459,6 +22503,8 @@ class LanguageNameSearchData {
'spaansk — europeesk spaansk' => 'es-es',
'spaansk — latynsk-amerikaansk spaansk' => 'es-419',
'spaansk — meksikaansk spaansk' => 'es-mx',
+ 'spanisch — europäisches spanisch' => 'es-es',
+ 'spanisch — mexikanisches spanisch' => 'es-mx',
'spanish — asụsụ spanish' => 'es',
'spanish — asụsụ spanish ndị europe' => 'es-es',
'spanish — asụsụ spanish ndị latin america' => 'es-419',
@@ -26197,6 +26243,7 @@ class LanguageNameSearchData {
'washo' => 'was',
'washo-schpraach' => 'was',
'washo-sprooch' => 'was',
+ 'wawle' => 'bci',
'wayuu' => 'guc',
'wayuu dili' => 'guc',
'wayú' => 'guc',
@@ -28763,6 +28810,7 @@ class LanguageNameSearchData {
'алжирски арапски' => 'arq',
'алжирська арабська' => 'arq',
'алман' => 'de',
+ 'алтай тил' => 'alt',
'альбанская' => 'sq',
'алют' => 'ale',
'америк-англи' => 'en-us',
@@ -28954,6 +29002,8 @@ class LanguageNameSearchData {
'албански — гешки албански' => 'aln',
'алман — югары алман (швейцария)' => 'de-ch',
'алтай — оңтүстік алтай тілі' => 'alt',
+ 'алтай — тÿндÿк алтай тил' => 'atv',
+ 'алтай — тÿштÿк алтай тил' => 'alt',
'алтай — өмнөд алтай' => 'alt',
'алтайн — къилба алтайн' => 'alt',
'алтайча — түштүк алтайча' => 'alt',
@@ -32259,6 +32309,8 @@ class LanguageNameSearchData {
],
1090 => [
'prefix' => [
+ 'тÿндÿк алтай тил' => 'atv',
+ 'тÿштÿк алтай тил' => 'alt',
'тагалог' => 'tl',
'тагальська' => 'tl',
'таджикийн' => 'tg',
@@ -32540,10 +32592,13 @@ class LanguageNameSearchData {
'таркиби — тил таркиби йўқ' => 'zxx',
'текст — природномовний текст відсутній' => 'zxx',
'тел — билгесез тел' => 'und',
+ 'тил — алтай тил' => 'alt',
'тил — аргындашкан тил (нигерия)' => 'pcm',
'тил — бир нечта тил' => 'mul',
'тил — малай тил' => 'ms',
'тил — номаълум тил' => 'und',
+ 'тил — тÿндÿк алтай тил' => 'atv',
+ 'тил — тÿштÿк алтай тил' => 'alt',
'тилде — белгисиз тилде' => 'und',
'тилде — бир нече тилде' => 'mul',
'тили — бразилиялык португал тили' => 'pt-br',
@@ -53181,6 +53236,7 @@ class LanguageNameSearchData {
'ᠰᡞᠪᡝ ᡤᡞᠰᡠᠨ' => 'sjo',
'ᨅᨔ ᨕᨘᨁᨗ' => 'bug',
'ᬩᬮᬶ' => 'ban-bali',
+ 'ᬩᬲᬩᬮᬶ' => 'ban-bali',
],
'infix' => [
'នីនូស — ន័រវែស នីនូស' => 'nn',
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.ttf
new file mode 100644
index 00000000..b9e4631c
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.woff2
new file mode 100644
index 00000000..2e280ae7
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/BoyoGagrai.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/font.ini
new file mode 100644
index 00000000..b44a02a3
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/BoyoGagrai/font.ini
@@ -0,0 +1,6 @@
+[Boyo Gagrai]
+languages=hoc
+version=1.1
+license=OFL-1.1
+licensefile=OFL.txt
+url=https://github.com/Singkiring57/esel-sadom
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.ttf
new file mode 100644
index 00000000..91750518
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff
new file mode 100644
index 00000000..bab2d23e
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff2
new file mode 100644
index 00000000..4d136254
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/GochiHand-Regular.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/font.ini
new file mode 100644
index 00000000..47ba3d5a
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/GochiHand/font.ini
@@ -0,0 +1,10 @@
+[GochiHand]
+languages=eu
+version=f528c43
+license=OFL
+licensefile=OFL.txt
+url=https://github.com/huertatipografica/gochi-hand
+request-url=https://phabricator.wikimedia.org/T258839
+ttf=GochiHand-Regular.ttf
+woff=GochiHand-Regular.woff
+woff2=GochiHand-Regular.woff2
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.ttf
index 8af545b1..4bf0bfae 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff
index 9081b671..04fc8b45 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff2
index 7419ad29..361ce0d8 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Bold.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.ttf
index 06847e5d..43a378c8 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff
index ef305689..19a77f69 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff2
index 29a3ac63..fdf2ad73 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-BoldItalic.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.ttf
index 6986092a..99e984cd 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff
index d400147c..2a8f5104 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff2
index bd171b9e..ce082150 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode-Italic.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.ttf
index d21505da..a61b964c 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff
index b8354301..4c09f533 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff2
index 4523487f..08435fa2 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/Junicode.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/font.ini
index 610d8e75..d20bcef1 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/font.ini
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Junicode/font.ini
@@ -1,6 +1,6 @@
[Junicode]
languages=ang
-version=2013-01-17
+version=1.002
license=OFL-1.1
licensefile=OFL.txt
url=http://junicode.sourceforge.net/
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.ttf
index d29bfe38..71e79ff8 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff
index e4e9fdc8..053a0c08 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff2
index 3b3c56db..db0b4a87 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/Kadiri.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/font.ini
index 8c12fe6d..d2a82233 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/font.ini
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Kadiri/font.ini
@@ -1,6 +1,6 @@
[Kadiri]
languages=ban-bali,kaw-bali,sas-bali,sa-bali,ms-bali,id-bali
-version=1.00
+version=1.01
license=OFL-1.1
licensefile=OFL.txt
url=https://github.com/longnow/bali-fonts
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.ttf
index d6124a1c..a3cf16c0 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff
index bc506acf..5ea09104 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff2
index a998cff9..b71abaf5 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/PustakaBali.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/font.ini
index b5248e7b..cd814b5d 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/font.ini
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/PustakaBali/font.ini
@@ -1,6 +1,6 @@
[Pustaka Bali]
languages=ban-bali,kaw-bali,sas-bali,sa-bali,ms-bali,id-bali
-version=2.04
+version=2.05
license=OFL-1.1
licensefile=OFL.txt
url=https://github.com/longnow/bali-fonts
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/README b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/README
index 8fdbee59..4609c342 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/README
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/README
@@ -47,5 +47,3 @@ Preparing font formats
2. To generate woff format, get: https://github.com/rillig/sfntly
3. Use https://github.com/google/woff2 to generate woff2 from ttf. This will
produce a compressed woff2 file. Modern browsers support this format.
-4. The eot file format is used only by older IE, but it can be generated using
- sfntly. Make sure to use -mtx flag to get enhanced compression.
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.ttf b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.ttf
index 79599029..791eeb8a 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.ttf
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.ttf
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff
index b5f044ae..ab28be15 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff2 b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff2
index bd4a3d42..1c2ce318 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff2
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/Vimala.woff2
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/font.ini b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/font.ini
index 23b2e22b..f0afb712 100644
--- a/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/font.ini
+++ b/MLEB/UniversalLanguageSelector/data/fontrepo/fonts/Vimala/font.ini
@@ -1,6 +1,6 @@
[Vimala]
languages=ban-bali*,kaw-bali*,sas-bali*,sa-bali*,ms-bali*,id-bali*
-version=2.04
+version=2.05
license=OFL-1.1
licensefile=OFL.txt
url=https://github.com/longnow/bali-fonts
diff --git a/MLEB/UniversalLanguageSelector/data/langsamples.json b/MLEB/UniversalLanguageSelector/data/langsamples.json
index 4d985354..ac6121ad 100644
--- a/MLEB/UniversalLanguageSelector/data/langsamples.json
+++ b/MLEB/UniversalLanguageSelector/data/langsamples.json
@@ -1,122 +1,122 @@
{
- "adx": "",
- "af": " Verander wagwoord Vee bladsye uit Daar is geen bladsye wat skakel na hierdie lêer nie. Sinhala Verskuiwing het geslaag Gereedskap Medewerkers Die bestemming bestaan nie Vlak 2-opskrif Donderdag Voorkom dat die gebruiker tydens die blokkade sy eie besprekingsblad kan wysig Fout met herstel van lêer: $1 Aantal subkategorieë Nooit Terugplasing was onsuksesvol:\n$1 Die bladsy is laas op $1 om $2 bygewerk. Onbekende laai fout Gesondheid Arabies Veranderlikes Onveranderd Gebruikersregtelogboek Blaaie met 'n bladsy-eienskap Geen voorkeur planar dataformat Die e-pos bevestiging is gekanselleer. klein wysigings Verskil tussen weergawes van \"$1\" Moontlike uitbreidings Spieëlbeeld van linksonder-regsbo Fout met verwydering van lêer: $1 Stelselboodskappe anonieme gebruiker $1 meld aan Verkeerde protokol Vertoon wysigings vanaf $3 $2 Ongeldige inhoud skrap Die lêer wat u probeer oplaai is te groot. $1 {{PLURAL:$1|week|weke}} Rekening geskep Iemand, waarskynlik u vanaf IP-adres $1\nhet die e-posadres van rekening \"$2\" na hierdie adres op {{SITENAME}} verander.\n\nOm te bevestig dat hierdie adres werklik aan u behoort, en die e-pos-funksies op {{SITENAME}} te aktiveer, maak hierdie skakel in u blaaier oop:\n\n$3\n\nIndien die rekening *nie* aan u behoort nie, volg hierdie skakel om die bevestiging te kanselleer:\n\n$5\n\nDie bevestigingskode sal om $4 verval.",
- "ahr": " भाषा: $1 भाषा: भाषा: भाषा",
- "akk": "𒀝𒂵𒌈",
- "am": " MediaWiki የስፓም ማፅዳት በዚሁ ዊኪ መግቢያ ቃል መቀይር አልተቻለም የአባልነት መዝገብ (user log) ይዞታውን ሁሉ (ከነውይይት ገጾች) ለመፈለግ ይህን ገጽ ሰርዝ አዲስ ገጽ የፋይሎች መዝገብ የ1 አባል ማዕረግ ለማስተዳደር የአባል ገጾች የሚቀጥለው ገጽ → የውስጥ ስህተት: የእርስዎን ፋይል ለመላክ ሲሞከር ችግር ተፈጠረ። በመጣጥፎች ይዘት ለመፈልግ... ያው ገጽ አይኖርም ፌብሩ. የዊኪ-ሥርአተ ቋንቋን ቸል ለማድረግ ክፍሉን «$1» ለማስተካከል ፊርማ የታገዱት ተጠቃሚዎች ፎቶው የተነሣበት ከተማ ለMedia ፋይል ስም ፍለጋ፦ የፋይሉ ስም የተፈቀደ አይደለም። ተዛማጅ ስራዎች የየክፍለ ነገሩ ትርጉም ሥርዓቱ እንዲህ ነው፦\n\nበ* የሚጀምሩ መስመሮች ብቻ ይቆጠራል። በመስመሩ መጀመርያው መያያዣ የመጥፎ ስዕል መያያዣ መሆን አለበት። ከዚያ ቀጥሎ በዚያው በመስመር መያያዣ ቢገኝ ግን ስዕሉ እንደ ተፈቀደበት ገጽ ይቆጠራል። የኢ-ሜል ማረጋገጫ የመላክ ማስጠንቀቂያ ፋይሉ ለመቆጠብ «$1» የሚባል ፋይል አሁን ይኖራል። ምንም መነሻ አድራሻ የለም ገጾች ሁሉ በሙሉ ኢ-ሜል ተልኳል። ያልገቡት የቁ. አድራሻዎች ብቻ የምከታተላቸው ለውጦች የመጨረሻው ዕትም ቀን ኖቬምበር የጉዳዩ ሥፍራ ከቅርብ አስተያየት ቀጥሎ (ተቀጥሏል) ምሥራቅ ኬንትሮስ ምክንያት: ROLLBACK የመጨረሻውን አዛጋጅ ለውጦች በፍጥነት ይገልበጣል። ሌላ ይህ ገጽ ጠፍቷል። የመጥፋቱ ምክንያት ከዚህ በታች ይታያል። ደግሞ ከጠፋ በፊት ያዘጋጁት ተጠቃሚዎች ይዘረዘራሉ። የተደለዙት ዕትሞች ጽሕፈት ለመጋቢዎች ብቻ ሊታይ ይችላል። ዋናውን ገጽ ተመልከት ኅብረተሠባዊ ጉዳይ መነሻ ጥሩ ($1) ቀጥሎ ገጽ ማውጫ ዝርያ በዚህ የሚዘረዘሩ EXIF መረጃ አይነቶች በፋይል ገጽ ላይ በቀጥታ ይታያሉ። ሌሎቹ 'ተጨማሪ መረጃ ይታይ' ካልተጫነ በቀር ይደበቃሉ።",
- "ang": " Þīn þafungword sceal wesan ungelīc þīnum brūcendes naman. Nīwe þafungword: Manigfeald sēcung ← Ieldre adihtung [URL is tō lang] Warnung: Se tramet þe þū wilt forlēosan hafaþ stǣr mid $1 {{PLURAL:$1|fadunge|fadunga}}: Cyrillisc Adihtunge wiþdǣd: $1 Mīne trametas Inbringan Nān Eall Gerȳman Sēcan Ūtmeldian Hafast þū reccinge ǣr? $1. Wrītan spearcǣrend þissum brūcende ieldeste Cȳþþu Fruman for $1 sēon Þū scealt $1 to adihtenne trametas. Gewilnode floccas Nāht tō sēonne. Bemetan gecorena ednīwunga Scieppan {{PLURAL:$1|āne adihtunge|$1 adihtunga}} eft (fornōm adihtunge sceortnesse) Īwan gehȳdede floccas $1 fadung of MediaWiki is behēfe Sifan Sēcan {{SITENAME}} Solmōnþes Ūtmǣlan Ōðre syndrige trametas Scieppan þisne tramet {{GENDER:$1|brūcend|brūcicge}} Inweard wōh $1 {{PLURAL:$1|bita|bitena}} Hȳdan þurhfōr Scorte trametas Ne cūðe findan ymelan \"$1\". Wæccgetæl Ǣrendgewrit: Þīn selfmearc mid tīdmearce Þū hæfst $1 ($2). Gehæftes emnet: Īwan þæt rīm behealdendra brūcenda Spearcǣrenda nama (ungenēdedlic)",
- "ar": " لا يمكن إجراء هذا الفعل على هذه الصفحة. غير متأثر بحدود المعدل تدوير الصورة {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة صفحات تصنيف «$1» مضمن الأولوية محددة من قبل المستخدم ($1) تحكم أعلى منخفض أكثر الملفات ارتباطا تصحيح GPS التفاضلي محددات التصغير غير صحيحة إنشاء «$1» ميدياويكي برنامج حر، يحق لك توزيعه و/أو تعديله وفقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (وفقا لاختيارك أنت) أي إصدار لاحق.\n\nهذا البرنامج يوزع على أمل أن يكون مفيداً، ولكن '''دون أية ضمانات'''، بما في ذلك ضمانات '''التسويق''' أو '''الملاءمة لغرض معين'''. انظر رخصة غنو العمومية لمزيد من التفاصيل.\n\nينبغي أن تكون قد تلقيت نسخة من رخصة غنو العمومية إذا لم يتم ذلك، اكتب إلى: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA أو [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اقرأ على الإنترنت]. مؤلفون تنتهي في: إنشاء الحسابات ممنوع صباحا ومساء صباحا ابحث عن الملفات المكررة بناء على قيم الهاش. إنشاء صفحات النقاش تعديل $1",
- "arb": "",
- "arc": " ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ ܫܢܝܬܐ ܕܗܢܐ ܠܦܦܐ ܛܪ ܠܗܕܐ ܦܐܬܐ ܙܠ $1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܐܣܘܪ̈ܐ ܐܚܪ̈ܢܐ {{GENDER:$1|ܡܦܠܚܢܐ ܡܫܪܪܐ ܝܬܐܝܬ|ܡܦܠܚܢܬܐ ܡܫܪܪܬܐ ܝܬܐܝܬ}} ܠܝܬܝܟ ܥܠܝܠܐ ܒܨܝ ܒܚܩܠܬ̈ܐ: ܪܟܝܟܐ ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' ܡܢܘ {{SITENAME}} ܫܘܡܗܐ ܕܠܦܦܐ \"$1\" ܛܥܝܡܘܬܐ ܕܐܛܘܡ ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ \"ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ. ܠܒܟܬܐ ܕܦܐܬܐ ܢܬܟܬܒ ܐܝ ܦܝ (IP) ܕܝܠܟ ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ.\" ܢܩܕܘܬܐ ܐܘܦܩܝܬܐ ܒܪܝ ܚܘܫܒܢ̈ܐ ܕܡܦܠܚܢܐ ܚܕܬܐ ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ: ܕܠܐ ܢܘܦܐ ܣܪܛܐ $1: ܥܠܬܐ: ܦܚܘܡ ܒܝܢܝ ܦܐܬܬ̈ܐ ܬܫܥܝܬܐ ܫܝܦܬܐ ܚܒܝܫܘܬ ܡܢܝܢܐ ܐܚܪܢܐ ܡܦܐܬ ܨܚܚ̈ܐ ܦܘܕܐ ܒܫܟܚܐ ܕURL: $1 {{PLURAL:$1|$1 ܝܘܡܐ|$1 ܝܘܡܬ̈ܐ}} ܚܪܘܡ ܡܦܠܚܢܐ ܚܘܝ ܣܕܪ̈ܐ ܕܫܪܝܢ ܒ: ܟܠ ܦܐܬܬ̈ܐ ܢܛܪ \"[[$1]]\" ܚܙܝ ܦܐܬܐ ܕܣܕܪܐ ܚܙܝ ܡܒܘܥܐ ܟܘܢܝܐ ܠܐ ܛܒܐ ܡܠܬܐ ܕܥܠܠܐ ܠܐ ܬܪܝܨܬܐ ܐܥܠܬ.\nܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ. ܡܢܝܢܐ ܕܪ̈ܗܝܐ ܡܠܬܐ ܕܥܠܠܐ ܕܐܥܠܬ ܣܦܝܩܬܐ ܐܝܬܝܗ.\nܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ. $1 ܐܣܘܪ̈ܐ ܡܢ: ܠܝܬ ܦܐܬܬ̈ܐ ܠܡܥܠܢܘܬܐ. ܛܪ ܠܗܕܐ ܦܐܬܐ [[$1]] ܐܬܫܢܝܬ ܠ [[$2]] ܟܠ ܡܕܡ ܠܝܬܝܟ ܥܠܝܠܐ ܒܛܘܠ ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ {{PLURAL:$1|ܫܘܬܦܢܐ ܚܕܬܐ|ܫܘܬܦܢ̈ܐ ܚܕ̈ܬܐ}} ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܝܢ ܒ: ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܦܐܬ ܬܫܥܝܬܐ ܡܠܬܐ ܕܥܠܠܐ ܚܕܬܐ: ܫܪܪ ܢܘܛܪܐ ܫܡܐ ܕܡܦܠܚܢܐ:",
- "as": " শুদ্ধ শিৰোনাম প্ৰদৰ্শন কৰক কিটিপ: টেব্‌ তালিকাত থকা টেবসমূহৰ মাজত বিচৰণ কৰিবলৈ সোঁ আৰু বাঁও কাঁড়চিনৰ কী টিপিব পাৰে। হয়, পৃষ্ঠাটো বিলোপ কৰক এই সদস্যনাম আৰু গুপ্তশব্দৰ ব্যৱহাৰ নিষিদ্ধ কৰা হৈছে । $3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা $1 (পৃষ্ঠাটো নাই) বৰ্তমানৰ ম্যাদ উকলা সময়: $3, $2 এই পৃষ্ঠাত নিৰ্বাচিত দুটা সংশোধনৰ মাজত পাৰ্থক্য দেখুৱাওক $1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল কিয়নো ইয়াৰ আকাৰ {{PLURAL:$2|এক বাইটতকৈ|$2 বাইটতকৈ}} বেছি। পুনঃনিৰ্দেশ কৰা হৈছে: ৯০° CCW ঘুৰিলে আৰু উলম্ভভাৱে লুটি খালে ব্যৱহাৰ কৰাৰ চৰ্ত্ত প্ৰতি পৃষ্ঠাত $1 টা বিষয়বস্তু দেখুৱাওক উপসৰ্গ ($1 namespace) -ৰ সৈতে সকলো পৃষ্ঠা প্ৰৱেশ বাৰণ কৰা সফল হ'ল স্পাম সা-সঁজুলি আপুনি কৰিব বিচৰা পৰিৱৰ্তনটো এটা এক্সটেনচন হুকৰ দ্বাৰা বাতিল কৰা হৈছে । অবিচল '''সতৰ্কবাণী: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে সম্পাদনা কৰিব পাৰিব ।'''\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল । এই ৱিকি '''[https://www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দ্বাৰা প্ৰচলিত , কপিৰাইট © ২০০১-$1 $2.",
- "bbc": "",
- "bh": "",
- "bho": " बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।\nई पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।\nई पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इन्तजार करीं।\n\n$1 श्रेणी: हटावल लॉग घटना सब लॉग की इतिहास में जरूर लउकी बाकी उन्हन के सामग्री जनता खातिर पहुँच से बाहर रही। सदस्य लोग जे पछिला {{PLURAL:$1|दिन|$1 दिन}} में कौनों काम कइले बाटे खाता में प्रवेश नइखे पन्ना देखाई जे शुरू होत बा: २ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite प्रबंधक निरस्त श्रेणी चाहत बा रउआँ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी: याद रहे की आप अपनी सदस्य CSS के खाली नमूना भर देखत बानी।\nई अबहिन ले सहेजल ना गइल बाटे। बुधवार अगर पन्ना मौजूद होखे त ठीक एही नाँव की पन्ना पर जाईं याद रहे की आप ए जावास्क्रिप्ट कोड क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा! सभसे ढेर ट्रांसक्लूजन वाला पन्ना ए फाइल में एक्स्ट्रा जानकारी उपलब्ध बा, हो सकत बा कि ई डिजिटल कैमरा या स्कैनर से लेवल गइल होखे। अगर ई वर्तमान फाइल एकरी ओरिजनल फाइल से सुधार के बनल बा त हो सकेला कुछ जानकारी ना लउके।",
- "bk": "",
- "bn": " রোলব্যাকের পরে পার্থক্য দেখিও না মেয়াদোত্তীর্ণ সময় অবৈধ। দল যা আপনি পরিবর্তন করতে পারেন আসল নাম (ঐচ্ছিক) এটি যাচাইকৃত রিভিশনের তালিকা। GPS গ্রাহকের দ্রুতি মঙ্গলবার এই পাতার বিষয়বস্তুর মডেল পরিবর্তন করা যাবে না। অ্যাকাউন্ট তৈরি করুন ফাইলের বর্ণনা পাতা এখনো বিদ্যমান নয় প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক সাধারণ প্রোগ্রাম পাতার ইতিহাসগুলি একত্র করা হোক আপনার জমাকৃত ফাইলটি অনেক বড়। {{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি। ছাকনী $1 {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2। বিষয়বস্তুর অবস্থান বাতির উৎস অনুমতি ত্রুটিসমূহ ফরম্যাটটি এরকম:\n\nকেবল তালিকা আইটেমগুলি (* দিয়ে শুরু হওয়া লাইনগুলি) গণ্য করা হবে। কোন লাইনের প্রথম সংযোগটিকে অবশ্যই কোন অচল ফাইলের প্রতি সংযোগ হতে হবে।\nএকই লাইনের পরবর্তী সমস্ত সংযোগ ব্যতিক্রম হিসেবে গণ্য করা হবে, অর্থাৎ যেসমস্ত পাতায় ফাইলটি ইনলাইন হিসেবে বিদ্যমান। '''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে''' আদর্শ আলো C সক্রিয় ব্যবহারকারী তালিকা ইমেইল করো অন্য উইকি থেকে পাতা আমদানী করো",
- "bo": " $1 རང་འགུལ་འཕྲུལ་ཆས། ཡིག་ཆ་ཡར་འཇུག་ལས་ནང་འདྲེན་བྱེད་པའི་ཤོག་ངོས། \"$1\" ཤོག་ངོས་འདིར་བསྐྱར་བཅོས་གསར་སྐྲུན་བྱེད་ཐུབ་མ་སོང། ཤོག་ངོས་ཚང་མ་བལྟས་ཟིན་དུ་རྟགས་རྒྱོབ། མཐའ་མ། གནས་སྐབས་ལམ་ཡིག ངོས་མ་ཟིན་པའི་དྲ་འབུ། ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད། ཤོག་ངོས་འདི་མི་སུབ་རོགས། མེད། ཟླ་བ་བརྒྱད་པ། $1 མཉམ་འཇོག་ཐོར་ལྟ་བ་དང་བསྒྱུར་བཅོས་བྱེད་པ། ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ། {{SITENAME}}ཡི་སྐོར། མ་བལྟས་ཤོག་ངོས་ཀྱི་ཐོ་ལ་ལྟ་བ། $1 ཁ་ཕྱོགས་བསྐྱར་སྟོན། སྔོན་མ་{{PLURAL:$1|$1}} མིང་མེད་སྤྱོད་མི $1 ལོ་རྒྱུས། འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན། རྩོམ་སྒྲིག གཤམ་གྱི་{{PLURAL:$1|ཡིག་ཆ་འདི་|$1ཡིག་ཆ་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད། དཔེ་པང་ཤོག་ངོས་ལ་ལྟ་བ། འཚོལ་འདྲི། $1 བཀོལ་སྤྱོད་མཁན་ལ་ནོར་འཁྲུལ། $1 དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཤོག་ངོས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། \nཤོག་ངོས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་རིང་སྒུག་རོགས་གནང། $1 དཀར་ཆག་མེད་པའི་ཤོག་ངོས། ཡིག་ཆ་བརྗེ་ལེན། གང་དུ་འཚོལ་བའི་གནས། ཉེ་བའི་བཟོ་བཅོས། ཁྱེད་ཀྱི་རེ་ཞུ་བྱས་པའི་བྱ་བ་འདི་ཁྱེད་ཉིད་ནས་ལག་ལེན་བསྟར་མི་ཆོག། སྡེ་ཚན་གསར་བ་ཞིག་འགོ་འཛུགས་པ།",
- "bod": "",
- "bpy": " আটলান্টিক মহাসাগর ফাইল আপলোড কর আগস্ট বারোইতুকর একাউন্টহান হঙকরানি ইল [[User:$1|$1]]-রে এরে চিঙনাঙর পাতা হঙকরানিত্ত থেত করিয়া থনা ইসে। কারণ: $2। ইরে তরতা একাউন্টহান নেই থাং? $1 পতানি নাউচা... থেপকরানির log শিংলুপ অক্টো শিংহলী পাতাএহান লুকর ফাইলগ খিয়ালে থ '''তর আতাকুরা নাঙহান নাইলেউ আইপি ঠিকানাহানরে থেপকরানি অসে।'''\n\nথেপকরিসেতাই: $1\nএহানর কারণহান অসেতাইঃ: ''$2''\n\n* থেপকরানি অকরিসিতা: $8\n* থেপকরানিহান লমিতইতা: $6\n* থেপকরানি মনাসিলাতা: $7\n\nতি $1 নাইলেউ [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকর]] মা যে কোন আগর লগে বিষয় এহান্ন য়্যারি পরি দে পারর। বিশেষ মাতিলতাঃ তর ই-মেইল ঠিকানাহান যদি [[Special:Preferences|তর পছন তালিকাত]] বরিয়া নাথার, অতা ইলে তি উইকিপিডিয়াত হের আতাকুরারে ই-মেইল করানি নুৱারবে। তর আইপি ঠিকানাহান ইলতাই $3 বারো থেপকরিসি আইপিগ ইলতাই #$5।\nকৃপা করিয়া যে কোন যোগাযোগর সময়ত এরে আইপি ঠিকানাহানি যেসাদেউ বরিস। পাতাহান থেইকর কোন কারণ দেনা নাইসে আরাক পতাহাত পুসিসি মডেলর জর থা পরসেগা পছন করাতা নেই থাম্বনেইল হংকরানিত লেইলেক অসে: $1 তরতা $2 -ত য়্যাথাং নেই, অহানর {{PLURAL:$1|কারণ|কারণহানি}}:",
- "btk": "",
- "bug": " Leppa Indoë Mapadécéŋ $1 Leppa papaké Link risaliweŋ (jangan lupa awalan http:// ) Kamisi' Accalinruŋi Judul dek essa (sininna) Pranala permanen pakitaï/tapo' Ita leppa panginriŋ Ita leppa proyék Leppa média Leppa séuwani Désémber Sappa Désémber séuwani Log maessu Fébruari Berowoso Misc E-mail Méi Lao ri Leppa Indoë Maré' E-mail: File-file nalise menré Tenriampi Puŋgawa Paŋinriŋ (Riredirect polé $1) Iyé', peddé iyaro leppa Maré' Mapeddé berkas Paŋinriŋ mapadécéŋ Éro internal Lao ri leppa aseŋna pappada iyyé rekko eŋkaï Jum Padécéŋ kajuru: $1 Asenéŋ Lontara Januari (kapa) Luppe lao: Assapparaŋ Antivirus dé' riisseŋ: Rapang Pasewodo matoa: Teks totok Ita lontara Rusa Déppa log attama Masappa Oktober Lao ri leppa $1 Polé {{SITENAME}} [[$1]] ésuk ri [[$2]] Salasa Aseŋ papaké: Log Papaké sibawa hak-hak Project:FAQ Tool sialé-alé Leppa kosoŋë Juni Leppa baru ←Revisi riolo Lao September September Leppana iya' Paleccé Leppa béla ida pile ni ujuk, a dek essa.\nSilakan pile aseng laing. $1 bot Ita pribiu",
- "ca": " La base de dades està temporalment bloquejada a noves entrades i altres tasques de manteniment, segurament per tasques rutinàries de manteniment, després de les quals es tornarà a la normalitat.\n\nL'administrador que l'ha bloquejada ha donat aquesta explicació: $1 En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, l'última entrada del registre es mostra a continuació: Text per defecte de juliol Una o més referències recursives en el valor per ser codificat {{PLURAL:$1|anterior|$1 anteriors}} $1 {{PLURAL:$1|des de la darrera visita}} $1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5» $1 de març Octets per component Llista d'usuaris $1 {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3 Envia la descripció del fitxer modificat {{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}} Amaga el contingut de la pàgina davall de la taula de diferències $1 edicions pròpies Tractar la signatura com a text wiki (sense enllaç automàtic)",
- "cdo": " 敆擴展監視單單臺中顯示所有其更改,伓啻最近其更改 1點鐘:1 hour,1 日:1 day,1禮拜:1 week,2禮拜:2 weeks,1間月日:1 month,3間月日:3 months,6間月日:6 months,1年:1 year,永遠:infinite 敆汝開始修改茲蜀頁之前,已經有其他人改變茲蜀頁去了。懸頂文本區域包括原底存在其頁面文本。汝其改變敆下底文本區域顯示。汝必須合併汝其改變遘已經存在其文本。敆汝擪「{{int:savearticle}}」以後,'''囇有'''敆懸頂文本區域其文本會保存。 無頁鏈接遘'''[[:$1]]'''。 過濾器 用戶名: 伓是 「$1」共「$2」臺中𣍐蜀樣其地方 防止開賬戶 刪除 下蜀頁 → 茲蜀萆標題共[[User:$1|$1]]保護其咯。\n原因是$2。 改變賬戶其密碼 修改茲頁 (敆新窗口打開) 關於 確定密碼 我其討論頁有變其辰候,寄電批乞我 用戶 過幼修改 汝著指定蜀萆用戶名。 這般其改變 顯示$2日以內產生其$1回改變$3 *普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名 操作失敗 茲頁無修改歷史。 所有乇 尋討 相關其改變 ({{PLURAL:$1|$1字節}}) 去 茲蜀頁其會拍印其版本 總結預覽: 每頁顯示$1{{PLURAL:$1|萆結果}} 頭𡅏無 汝其設定已經乞保存了。 管理員 亞洲 密碼 茲蜀頁 添加我編輯其頁面共文件遘我其監視單 ←加舊其版本 http://www.example.com 鏈接標題 框定其等級: '''記定茲若是蜀萆預覽。'''\n汝其改變固𡅏未保存! 茲蜀段使其{{PLURAL:$1|模板}}: 綻去:𣍐使提交表單。 轉去$1。 警告:茲蜀頁敆汝編輯以前已經乞刪唻了! 覷蜀覷內容頁面 一月$1號 印度洋 確認 $1 文件鏈接 內部錯誤:$1 敆$1𡅏尋討 修改數量: 修改封鎖原因 原因: 嵌入其文件 敆嚽塊拍入汝其用戶名 永久鏈接 非洲 覷蜀覷頭頁 加入{{SITENAME}} 𣍐使趁「$1」𡅏複製文件遘「$2」。 汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。 看分類頁 封鎖茲用戶 (繼續前斗) 是",
- "ckb": " تایلەندی دەتوانیت دەق و مێژووی دەستکاریی پەڕەیەکی دەستنیشان کراو یان کۆمەڵێک پەڕە کە ناو پەڕگەیەکی XML دا پێچراونەتەوە، هەناردە بکەیت.\nدەکرێت ئەمە لە ویکییەکی دیکەدا ھاوردە بکرێت بە کەڵک وەرگرتن لە ئامرازی [[Special:Import|ھاوردە کردنی پەڕە]]ی MediaWiki.\n\nبۆ هەناردە کردنی پەڕەکان، سەرناوەکانیان لە چوارچێوەی خوارەوەدا بنووسە، هەر سەرناوێک لە هێڵێکدا. و هەڵبژێرە کە پێداچوونەوەی ئێستا و ھەموو پێداچوونەوە کۆنەکانت دەوێت یان تەنھا پێداچوونەوەی ئێستا و زانیاریی سەبارەت بە دوایین دەستکاری.\n\nئەگەر تەنھا پێداچوونەوەی ئێستات دەوێت، دەتوانیت بەستەرێکیش بە کار بھێنیت، بۆ نموونە [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] بۆ پەڕەی «[[{{MediaWiki:Mainpage}}]]». ئەمە لۆگێکی دروستکردنی بەکارھێنەرە. ئەم پەڕەیە لە لیستی چاودێریت لاببە بۆشاییی ناوی پەیوەندیدار نیشان بدە/بشارەوە $1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}. بچیتە ژوورەوە نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو لاپەڕەی DjVu لەدەرۆی ڕیز ئەم ماڵپەڕە ناتوانێ ئیمەیل بنێرێ. ئایا دڵنیایت دەتەوێ پێداچوونەوەی سڕاوەی پەڕگەی \"$1\" لە $2، لە $3دا ببیینی؟",
- "cr": " ᓃᔥᑕᒻᐹᔅᑌᒋᓂᑲᓐ ᓃᔥᑕᒻᐹᔅᑌᒋᓂᑲᓐ",
- "cu": "Хрⷭ҇то́съ воскре́се и҆з̾ ме́ртвыхъ, сме́ртїю сме́рть попра́въ, и҆ сꙋ́щымъ во гробѣ́хъ живо́тъ дарова́въ.",
- "cy": " Dyma'r tocyn cudd i borthiant gwe eich rhestr wylio.\nBydd unrhyw un sy'n gwybod hwn yn gallu darllen eich rhestr wylio, felly peidiwch a'i roi i neb.\n[[Special:ResetTokens|Cliciwch fan hyn os oes angen ailosod y tocyn]]. gweld/adfer Tudalen defnyddiwr $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} Rydych wedi ceisio golygu adran nad ydy'n bod.\nEfallai bod yr adran wedi cael ei symud neu ei dileu ers i chi agor y dudalen. Rhagolwg pwnc: Cyfeiriad IP neu enw defnyddiwr: Cyfraniadau hyd at y flwyddyn (ac yn gynharach): Categori '$1' Erthyglau yn nhrefn nifer eu categorïau Gwall gweld hanes dilëedig y dudalen hon Ydw, rydw i wir am ddatgloi'r gronfa ddata. Ni ellir symud ffeil i barth arall {{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}} Mae cyfrinair newydd wedi'i ddanfon at gyfeiriad e-bost cofrestredig \"$1\". Mewngofnodwch eto ar ôl i chi dderbyn y cyfrinair, os gwelwch yn dda. '''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
- "da": " Følgende tekst udløste vores spamfilter: $1 '''Kunne ikke ændre logsynligheden.'''\n$1 Syntaksen i signaturen er ugyldig; kontroller venligst den brugte HTML. RSS-feed for denne side Se en liste over uovervågede sider Ugyldig eller fejlbehæftet JSON $1 {{PLURAL:$1|meter|meter}} over havets overflade Om projektet, hvad du kan gøre, hvor tingene findes Kreativprogram med tendens til stor skarphedsdybde januar {{PLURAL:$1|$1 dag|$1 dage}} Kun aften Anvendes ikke længere E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet. mandag '''\".$1\"''' er {{PLURAL:$4|en uønsket filtype|uønskede filtyper}}. {{PLURAL:$3|Den tilladte filtype|De tilladte filtyper}} er $2. {{PLURAL:$1|Anonym bruger|Anonyme brugere}} på {{SITENAME}} Geografisk bredde $1 {{PLURAL:$1|byte|bytes}} Ja Angiv et gyldigt sidenavn som destinationsside. Fra år (og tidligere): Fjern fra overvågningsliste mar $1 med $2 Søg APEX lysstyrke",
- "de": " Filter Datei speichern Gesundheit $1 und $2: Unterschied zwischen den Seiten Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert. Seite nicht vorhanden Mit diesem Formular kannst du eine IP-Adresse oder einen Benutzer freigeben. Art des Mediums Diese Datei hat die Dateiprüfung nicht bestanden. RSS-Feed für „$1“ {{PLURAL:$1|vorheriger|vorherige $1}} High gain up Eine neue Markierung erstellen '''Logbuchsichtbarkeit kann nicht geändert werden:'''\n$1 Fehler bei der Anmeldung Seite Dateien hochladen {{PLURAL:$2|Diese Kategorie enthält folgende Unterkategorie:|{{PLURAL:$1|Folgende Unterkategorie ist eine von insgesamt $2 Unterkategorien in dieser Kategorie:|Es werden $1 von insgesamt $2 Unterkategorien in dieser Kategorie angezeigt:}}}} Falscher Interwiki-Link Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2 {{PLURAL:$4|Du hast}} $1 von {{PLURAL:$3|einem anderen Benutzer|$3 Benutzern}} ($2). Suche Zeitautomatik Navigation Seite 1 Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
- "dre": "",
- "dv": " ފައިލު މަޒުމޫނު މަސްދަރު ބައްލަވާ \"ކުރީގެ ނުސްހާ އަކަށް ބަދަލުކުރައްވާ\" އިން މި ޞަފްޙާއަށް އެންމެ ފަހުން އުނިއިތުރު ގެންނެވި މެމްބަރުގެ އުނިއިތުރު(އުނިއިތުރުތައް) ފޮހެލެވޭނެއެވެ. ބަހުސް ބައްލަވާ މި ވިކީ އަށް ތިބޭފުޅާގެ އައިޕީ އެޑްރެސް އިން ފާއިތުވެދިޔަ 24 ގަޑިއިރު ތެރޭ {{PLURAL:$1|1 އެކައުންޓް|$1 އެކައުންޓްތައް}} ހައްދަވާފައިވެއެވެ. އެއީ މި މުއްދަތު ތެރޭގައި ހެއްދެވޭނެ އެންމެ ގިނަ ޢަދަދެވެ.\nއެހެންކަމުން މި ވަގުތު އިތުރު އެކައުންޓެއް ނުހެއްދެވޭނެއެވެ. އެހެން ވަގުތެއްގައި އަދި މަސައްކަތް ކޮށްލައްވާށެވެ. ބޭރަށް ވަޑައިގަންނަވާ ގުޅުންހުރި ބަދަލުތައް މަގޭ ނަޒަރުން ވަދެފައިވާ މެމްބަރުންގެ އުނިއުތުރުތައް ފޮރުއްވާ ޞަފްޙާގެ ތަފާސްހިސާބު ތިޔަ ލިޔުއްވި ނަން މިހާރުވެސް ދަނީ ބޭނުން ކުރެވެމުންނެވެ.\nއައު ނަމެއް އިހުތިޔާރު ކުރައްވާށެވެ. ވަދެވަޑައިގަތުމުގެ ސިއްރު ބަހާއި މެމްބަރު ނަން ހަނދާންނެތުނީތޯ؟ ހޯއްދަވާ މޮނޯސްޕޭސްޑް ފޮންޓް ޞަފްޙާތައް ފާއިތުވެދިޔަ {{PLURAL:$1|ދުވަސް|$1 ދުވަސްތައް}} ތެރޭގައި ކޮންމެވެސް ކަމެއް ކޮށްފައިވާ މެމްބަރުން ޚާއްސަ ޞަފްޙާ އިއާދަ ކުރޭ! ބައްލަވާ މި ޞަފްޙާ ވަނީ {{PLURAL:$1|އެއްފަހަރު|$1 ފަހަރު}} ބައްލަވާފައެވެ.",
- "dz": " $1 ཨེ་ཊོམ་ འབྱུང་ས། ཤོག་ལེབ་འདི་ལྟ། འདི་ གལ་གནད་ཆུང་བའི་ཞུན་དག་ཅིག་ཨིན། སྦ། གྲོགས་རམ། འབྲེལ་ལམ་མགོ་མིང་། འབྲུག་གཟའ་སྤེནཔ་ ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད། འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས། འོག་གི་ཤོག་ལེབ་ཚུ་ '''[[:$1]]''' ལུ་ འབྲེལ་མཐུད་འབད་ཨིན: (གཙོ་བོ།) བཀག་བཤོལ་ ཡིག་སྣོད་དེ་དང་འབྲེལ་བ་ཡོད་པའི་ཤོག་ལེབ་མིན་འདུག། སྤྱི་ཟླ་ ༨ པའི་ འཕྲོ་མཐུད་འགྱོ་: ཕུརཔ། '''ད་འབདན་ཁྱོད་ {{SITENAME}} ནང་ \"$1\" སྦེ་ ནང་བསྐྱོད་འབད་ཡོདཔ།''' ཝི་ཀི་ནང་གི་ཕྲལ་གྱི་བསྒྱུར་བཅོས་ཐོ་ཡིག། ཟླ་༡༡ པ། སྐད་ཡིག་འབྲེལ་ལམ་མེད་པའི་ཤོག་ལེབ། གང་འབྱུང་སླར་ལོག། ཟླ་༢ པ། དུས་བཀོད་དང་གཅིག་ཁར་ ཁྱོད་རའི་མིང་རྟགས། ཤོག་ལེབ་འདི་གྲོས་བསྡུར་འབད། དབྱེ་རིམ་མ་བཟོ་བའི་ཡིག་སྣོད། ཟླ་༡༠ པ། རྩིས་ཐོ་གསརཔ་བཟོ། དབྱེ་རིམ་ \"$1\" ནང་གི་ཤོག་ལེབ་ཚུ། རིམ་ལུགས་འཕྲིན་དོན། བཅུད་དོན།: ལོག་སྤོ་བཤུད་འབད། ཤོག་ལེབ་བཀྲམ་སྟོན་འགོ་བཙུགས་: གྲོས་བསྡུར། ནང་བསྐྱོད། ལག་ལེན་པ་ལུ་ གློག་འཕྲིན་གཏང་ འབྲེལ་བ་ཡོད་པའི་བསྒྱུར་བཅོས་ཚུ་སྟོན། ཆ་མཉམ། མཐེ་གཟེར་གསར་བཟོའི་སྐབས་ལུ་འཛོལ་བ་: $1 ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས། Project: སྤྱིར་བཏང་ཁས་མི་ལེན་པ། སྤྱོད་ཤུལ ད་ལྟོའི་བསྐྱར་ཞིབ།",
- "en": " Sorry! We could not process your edit due to a loss of session data.\n\nBecause {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.\n\nIf this is a legitimate edit attempt, please try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site. Uploading by URL is disabled on this server. Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden. Error: Block ID $1 not found. It may have been unblocked already. The following consists of deleted revisions of [[:$1|$1]]. Invalid title in result set: $1 Pattern You need to provide a valid email address. Page length (in bytes) {{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}} Ignore warning and save file anyway Edit pages protected as \"{{int:protect-level-autoconfirmed}}\" Password sent",
- "es": " Incluir páginas enlazadas a una profundidad de: Su dirección IP está listada como proxy abierto en DNSBL. cont. Contribuciones No tienes ninguna página en tu lista de seguimiento. $1 {{GENDER:$2|combinó}} $3 en $4 (revisiones hasta el $5) Trasladar páginas raíz de usuario {{ns:project}}:Administradores Al mencionarte, el software usará palabras de género neutro siempre que sea posible El título de la página solicitada apunta a una página de discusión imposible. confirmación de la dirección de correo de {{SITENAME}} Ayuda Se ha fusionado [[:$1]] en [[:$2]] Usuarios activos Motivo: Software instalado Para completar el inicio de sesión debes definir una contraseña nueva. Páginas sin categorizar Línea $1: Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.\nPara evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}. Versión para imprimir No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.",
- "et": " Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist. Resümee: Digisuumi tegur Särituse meetod Vigased pisipildi parameetrid Tühi objekt Tihendatud vormingud Siin loetletud pildi metaandmete välju näidatakse pildi kirjelduslehel vähemdetailse metaandmete vaate korral.\nÜlejäänud andmed on vaikimisi peidetud.",
- "fa": " پرونده‌های استفاده‌نشده ذخیرهٔ پرونده ایجاد صفحه (در مورد صفحه‌های غیر بحث) شما اجازهٔ اجرای عملی که درخواست کرده‌اید را ندارید. این صفحات پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند: نشان‌دادن تصویرهای جدید از $2، $1 به بعد به طور پیش‌فرض، تگ‌های تازه ایجاد شده برای استفاده کاربران و ربات‌ها در دسترس قرار می‌گیرند. نظرهای نوشته‌شده در صفحهٔ بحث باید با «~~~~» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد. بارگذاری تصاویر و پرونده‌های دیگر [بدون نام] تعداد پیش‌فرض ویرایش‌های نمایش یافته: برای ذخیرهٔ فایل استش خطایی رخ داده است. سیاههٔ گشت نهفتن متغییرها و هدف شرمنده! این تارنما از مشکلات فنی رنج می‌برد. تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند: $1 (صفحه وجود ندارد) زمان جی‌پی‌اس (ساعت اتمی) قطب شمالی زمان سرور: هدف ''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.'' این صفحه محافظت‌شده‌است.\nمی‌توانید متن مبدأ آن را ببینید $1 آوریل ویرایش دلایل حذف نام تگ باید مشخص شود. $1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
- "fi": " Tiedostoa ei voi poistaa Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. \nTässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus. Näytä sähköpostiosoitteeni muille lähetetyissä ilmoituksissa Sinun täytyy kirjautua sisään, jos haluat nähdä oman tarkkailulistasi. Sivua $1 ei voi poistaa URL-lähde Tekstitiedostot Muokata olemassa olevia sivuja Varoitus: Olet muokkaamassa sivua, joka sisältää ohjelmiston käyttöliittymän tekstiä.\nMuutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymään tässä wikissä. Ei määritelty IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa Näytä lista {{GENDER:$1|tämän käyttäjän}} muokkauksista ← Vanhempi versio Torstaina klo $1 Kaikki sivut Nämä luokat ovat olemassa, mutta niitä ei käytetä. Objektiivi Läntistä pituutta Googlen indeksi ei välttämättä ole ajan tasalla. Virheellinen asetus: Tuntematon virustorjuntaohjelma: ''$1''",
- "fo": " Ein feilur hendi, meðan tú royndi at broyta innstillingarnar fyri tín eftirlitslista fyri \"$1\". Brúkarasíða '''$1 er endurstovnað'''\n\nSí [[Special:Log/delete|slettingarloggin]] fyri at síggja seinastu strikingar og endurstovningar. Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi. marka hesa rætting sum lítla {{SITENAME}} síðan $1 er blivin {{GENDER:$2|flutt}} hin $PAGEEDITDATE av $2, sí $3 fyri at síggja nýggjastu versjónina. Rætningur Teksturin ið tú ynskti at goyma varð sperraður av spammfilturinum. Orsøkin til hetta er nokk ein leinkja til eina eksterna heimasíðu, sum er á svartalista. Set avmarkinga fyri sjónligheit T-post Ongin fíla við hesum navninum finst. Upplótan av avritum ber ikki til frá hesum domeninum. (Nýggj) $1 síðan Friða Sperrað sjálvvirkandi tað seinastu IP adressuna, sum hesin brúkari brúkti og allar fylgjandi IP adressur, sum viðkomandi roynir at rætta/skriva frá Tað ber ikki til at upprætta konto Gomul $1 {{PLURAL:$1|úrslit|úrslit}} Tilset t-post frá øðrum brúkarum",
- "fr": " Manuelle Une erreur interne est survenue en voulant créer un fichier temporaire sur le serveur. Veuillez contacter un [[Special:ListUsers/sysop|administrateur]]. {{GENDER:$1|utilisateur autoconfirmé|utilisatrice autoconfirmée}} Erreur : la modification a échoué Les restrictions de mot de passe de robots empêchent cette connexion. Confirmer {{PLURAL:$1|Événement de journal sélectionné|Événements de journal sélectionnés}} : Autres langues Cette page dépasse le nombre maximal de nœuds. Pages sans liens inter-langues Page 1 Écraser localement un fichier présent sur un dépôt partagé La page cible contient un lien interwiki ne pouvant être utilisé dans les titres. Fusionner les versions de deux pages : Ne pas être affecté par les limitations de débit liées aux adresses IP {{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}} Vous pouvez voir et copier le contenu de vos modifications à cette page. (tous) Date de la prise originelle Prévisualisation La base de données n'est pas verrouillée.",
- "fy": " Trochstrings tal bewurkings per side Trochferwizings himmelje Brûkersnamme: \n$1\n\nTydlik wachtwurd: \n$2 Oanbied-warskôging $1 tekstwizigings feroarje nivo fan skoatteljen Oaren {{PLURAL:$1|1 âlder|$1 âlder}} Skiednis fan kombinearjen Triem Gjin meidoggers fûn. (ferzjenûmer: $1) {{PLURAL:$1|$1 jier|$1 jierren}} Brûkersnamme: Annulearje Proefbyld Ferburgen Tydlik wachtwurd: Yndyske Oseaan Symboalen Samar in side sjen litte. E-mailadres alle nivo's Auteur ferzje: Oanmelde Ynterne fout: $1 Underwiis Lettertype mei skreven Werom nei oanbied-side. \"$1\" RSS-feed '''\".$1\"''' is in net winske triem-type.\n{{PLURAL:$3|Oanwiisd triem-type is|Oanwiisde triem-typen binne}} $2. De ferzje fan '''[[Media:$1|$1]]''' fan $2, $3 is fuorthelle. Gau de lêste bewurking(s) fan in brûker fan in side tebekdraaie Opmerkings E-mailadres ynfiere blokkade feroarje Dy meidoggersnamme wurdt al brûkt. \nBesykje in oarenien. Gjin brûker fûn. Side skoattelje Klik op in tiid om de ferzje fan de triem op dat stuit te sjen. Tichtby",
- "ga": " Tharlaigh earráid leis an seoladh: $1 Cuir na leagain roghnaithe i gcomparáid {{GENDER:|Do}} chuid sainroghanna Féach ar fhoinse Focal faire reatha: Deimhniú do ríomhsheoladh ar an {{SITENAME}} Leagain stairiúla den leathanach seo. Comhadainm Dréachtaí úsáideora scriosta Iompaigh rogha bunoscionn athúsáid Iúil Cló iodálach {{PLURAL:$1|Teimpléad|Teimpléid}} a úsáidtear sa réamhamharc seo: Liosta is ea seo thíos de leathanaigh athainmnithe. Ag athrú $1 (mir) Sábháil comhad Glasáil Folaigh athruithe de chuid róbat ón liosta faire Ainm comhaid: Sábháil do chuid athruithe Cuir cóip chugam de gach teactaireacht r-phoist a chuirim chuig úsáideoirí eile Gach leathanach '''Aire''': scriosadh an leathanach seo nuair a bhí tu ag athrú é! Fáth: Tá comhad eile leis an ainm seo ann fós, agus ní féidie é a forscríobh.\nMá theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid ainm nua, le do thoil. [[File:$1|thumb|center|$1]] Teanga: $1 Bánchothromaíocht uathoibríoch Theip ar an cuntas a chruthú: $1",
- "gd": " A làimh Dìon na duilleige ID fa leth na sgrìobhainn tùsail Cliù airson na duilleige Dh'fhàillig leis an iarrtas HTTP ri linn mearachd neo-aithnichte. Cead càch a bhacadh o dheasachadh Chaidh an cleachdaiche seo a chasgadh. Chan eil logadh a-steach ceadaichte dhaibh. Chaidh $1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}} ion-phortachadh $1 gus an seòladh puist-d agad a dhearbhadh. Tùs $1 {{PLURAL:$1|roinn-seòrsa|roinn-seòrsa|roinnean-seòrsa|roinn-seòrsa}} Cuir post-d gu cleachdaiche dhen t-Samhain Dèan ceangal buan gu mùthadh seo na duilleige Obair air a sguabadh às Chaidh $1 a bhacadh mar-thà. A bheil thu airson na roghainnean atharrachadh? Seall is deasaich mo chlàr-faire Iuch Modh portraid (airson dealbhan faisg gun fhòcas air a' chùlaibh) Log a-steach Cuir am fiosrachadh a bharrachd am falach Faidhlichean a thathar 'gan iarraidh Seo liosta nam faidhlichean 's an tionndadh as ùire dhiubh 'na dhùblachadh aig an tionndadh as ùire de dh'fhaidhle air choireigin eile. Chan fhaic thu ach faidhlichean ionadail.",
- "gez": "",
- "gl": " Buscar un usuario bloqueado Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios. contribucións Rexeitado Novo título: \"[[:$1]]\" xa existe nun repositorio compartido. Ao mover un ficheiro a este título sobrescribirase o ficheiro compartido. Altitude Utilizar unha conexión segura sempre que acceda ao sistema Non especificou a páxina ou o usuario no cal levar a cabo esta función. Non existe ningún ficheiro con este nome, pero pode [$1 cargalo]. O nome do ficheiro que está cargando comeza con '''\"$1\"''', que é un típico nome non descritivo asignado automaticamente polas cámaras dixitais.\nPor favor, escolla un nome máis descritivo para o seu ficheiro. Ningunha páxina para importar! Redirección aleatoria Non hai ningunha descrición dispoñible. {{PLURAL:$1|anterior|$1 anteriores}} Non ten os permisos necesarios para desbloquearse a si mesmo Os grupos que pode cambiar",
- "goe": "",
- "gom": " Tujea fatle bhette san bodol'lean tim panam '''datt''' dakhoileant. Panachi mahiti Sod",
- "got": " 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍅𐌰𐌿𐍂𐌳𐌰 l 𐍆𐌴𐌹𐌻𐌰 Habiþ þu niutandis? '''$1''' 𐌻𐌰𐌿𐍆𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄. 𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰): 𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐍆𐌹𐌽𐌸𐌰𐌽 Sokeiþ 𐌽𐌿 𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉 [[Special:Tags|𐍄𐌰𐌹𐌺𐌽𐍉𐍃]] 𐍆𐌹𐌻𐌷𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌰𐌽𐌰𐍃𐌹𐌿𐌽𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍃 𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰 𐍅𐌹𐌸𐍂𐌰 𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌼𐌰𐌹𐌳𐌾𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉 Melja 𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉 $1 {{PLURAL:$1|máidein|máideins}} 𐌰𐍆𐌲𐌰𐌲𐌲𐌰𐌽 $1 lietila máideins 𐍃𐍉𐌺𐌴𐌹 𐍅𐌹𐍄𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐍃𐌺𐌰𐍀𐌴𐌹 𐌽𐌹𐌿𐌾𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 𐌲𐍂𐌰 𐌽𐌿 Sinteino 𐌳𐍂𐌹𐌿𐍃𐍉 𐌱𐍉𐌺𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃 𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽. 𐌾𐌰 Sokeiþ 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐍄𐌰𐌹𐍂𐌰𐌽 {{ns:project}}:𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃 𐍄𐌰𐌹𐌺𐌽𐌹𐌳𐌰 𐌸𐌿: $1 Gaírnedum seidam 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌻𐌹𐌴𐌺𐍃 𐌹𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}} (halb-gabaírgjan) 𐍃𐌰 𐌳𐌰𐍄𐌰𐌱𐌿𐍃 𐌽𐌹 𐌲𐌰𐌽𐌰𐌼 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽 𐌴𐌹 𐌹𐍄𐌰 𐍃𐌺𐌰𐌻 𐌱𐌹𐌲𐌹𐍄𐌰𐌽: \"$1\" $2\n\n(The data base did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.)",
- "grc": " Βεβασισμένον τῷ ἔργῳ τοῦ/τῶν $1. Κατάστασις φωτομέτρου Κανονική Πείρασον ἀναμένειν ὀλίγα λεπτὰ τῆς ὥρας καὶ ὕστερον ἐπιφόρτισον πάλιν. Οὐδεμία δέλτος ἐν {{PLURAL:$2|τῷ ὀνοματείῳ|τοῖς ὀνοματείοις}} \"$1\". Στόχος Οὐδὲν ἐν τῇδε τῇ δέλτῳ γεγραμμένον. \nἜξεστί σοι [[Special:Search/{{PAGENAME}}|δέλτον τινὰ οὕτως ὀνόματι ζητήσειν]] ἐν ἔτερες δέλτους, ἤ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ζητήσειν τα συγγενή αρχεία καταγραφών],\nὄμως οὔ δύνασαι τήνδε τὴν δέλτον δημιουργήσειν. Ἐκκινεῖν ἐπιφόρτωσιν Χρῆμα: Δε Δεῖ σε ἐπιλέξειν σύνθημα δίαφορον τοῦ σοῦ ὀνόματος χρωμένου. Ἐπιλογαὶ ἠλ-ταχυδρομείου Κατάλογος τῶν ἐνθάδε ἀγόντων Αἱ τῆς δέλτου πρότεραι Στοιχεῖα χρωμένου μὴ δυναμένη ἡ μεταγραφή τῆς δέλτου σου ἐστίν Ἀγνοεῖν βικι-μορφοποιίαν Κατάλογοι δέλτων Βέβαιος εἶ περὶ τῆς προβολῆς διαγεγραμμένης ἀναθεωρήσεως τινὸς τοῦ ἀρχείου \"$1\" ἐκ τῆς $2 ἐν τῇ $3; Οὐκ ἔστι καταγεγραμμένη ἔκδοσις τοῦ '''$1''' μετὰ τῶν καθωρισμένων χαρακτηριστικῶν. Διεύθυνσις ἠλ-ταχυδρομείου προαπαιτεῖται. Αὐξάνειν Οὐκ ἔξεστί σοι μετακινήσειν δέλτον τινὰ πρὸς δέλτον χρωμένου (πλὴν μόνον πρὸς ὑποδέλτον χρωμένου).",
- "gu": " ઈ-મેલ મોકલો ગુપ્તસંજ્ઞા બદલો \"$1\" અજ્ઞાત ક્રિયા. તમે દર્શાવેલ સમય વખતની મૂળ ફાઇલ સ્થાનિક સ્વરુપે પ્રાપ્ય નથી. હા, આ પાનું હટાવો આપેલ ISBN વૈધ નથી લાગતો; મૂળ સ્રોતને ચકાસી, ભૂલ શોધી, ખરી માહિતી આપો. જમા કરો સાયન્સ અને ટેકનોલોજી $1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} માહિતી સંબંધી ચેતવણી ઉલટાવવું નિષ્ફળ પુષ્ટિકરણ ન થયેલ પાનાની સાઇટ સંબંધી માહિતી મીટાવો. ISO સ્ટુડીયો ટંગસ્ટન /* $1 */ નવો વિભાગ સમુદ્ર સપાટી ઉપર $1 {{PLURAL:$1|મીટર|મીટર}} બધાં પાનાઓ નિકાસ કરો/પાના અન્યત્ર મોકલો આ પાનું ફરી પુનર્જીવીત કરો અન્ય મારા ઈ-મેલની પ્રત મને મોકલો પૂર્વાવલોકન સમાપ્તિ શુક્ર [$1 માટે ઢાંચો ખેંચી લાવવામાં અસફળ ] સરખાવો છુપાવો આપ આ પાનું તેના ઇતિહાસ (બધાજ પૂર્વ ફેરફારો) સાથે હટાવી રહ્યાં છો.\nકૃપા કરી ખાત્રી કરો કે આપ આમ કરવા ઇચ્છો છો, આપ આના સારા-નરસા પરિણામોથી વાકેફ છો, અને આપ આ કાર્ય [[{{MediaWiki:Policy-url}}|નીતિ]]ને અનુરૂપ જ કરી રહ્યાં છો. ઓગસ્ટ આ પાનાં પર દિશાનિર્દેશનોની સંખ્યા આ શબ્દ ધરાવતા... ઢાંચો સંરક્ષિત પાનું સર્વર પર હંગામી ફાઇલ રચતા કોઇ આંતરીક ત્રુટિ નિર્માણ થઇ.\nકૃપયા [[Special:ListUsers/sysop|administrator]]નો સંપર્ક કરો.",
- "hbo": "",
- "he": " קישור בינוויקי שגוי ההרשאה או ההרשאות המאפשרות למשתמשים לערוך גרסה שנמחקה מהדף $1 (מ־$5, $4) מאת $3: התוכן בדף [[:$1]] אינו יכול להיות מומר לסוג של $2. עריכת התגיות של רשומות היומן שנבחרו {{ns:project}}:זכויות יוצרים גרסה $1 סיווג דפים לקטגוריות משתמשים אנונימיים בלבד '''\".$1\"''' הוא סוג קובץ בלתי מומלץ.\n{{PLURAL:$3|סוג הקובץ המומלץ הוא|סוגי הקבצים המומלצים הם}} $2. השחזור לא יבוצע אם הגרסה הנוכחית של הדף מחוקה בחלקה. במקרה כזה, עליכם לבטל את ההסתרה של הגרסאות המחוקות החדשות ביותר. קובץ שמע מקושר (הפניה $1) עריכת סיבות המחיקה בפברואר עריכת התיאור המקומי שם עקיפת הגבלת קצב העריכות המבוססת על כתובת IP סימון כל פעולת עריכה כמשנית כברירת מחדל בשימוש {{PLURAL:$1|בדף אחד|ב־$1 דפים}} לא ניתן להוסיף את התגית \"$1\" ידנית. '''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של הקובץ הזה לא תהיינה מונפשות.''' קוד אימות דוא\"ל כבר נשלח אליכם; אם יצרתם את החשבון לאחרונה, ייתכן שתרצו לחכות מספר דקות עד שיגיע לפני שתנסו לבקש קוד חדש. הזמן ביום שהמדיה מיועדת אליו כתובת האתר עבור רישיון זכויות יוצרים סיומת הקובץ החדשה אינה מתאימה לסוג הקובץ",
- "hi": " फ़ाइल विवरण अन्य सदस्यों के जावास्क्रिप्ट पृष्ठ सम्पादित करें उप पृष्ठ भी ले जाएँ ($1 तक) आप बाधित होने की स्थिति में सुरक्षा स्थर में परिवर्तन नहीं कर सकते।\nपृष्ठ '''$1''' की वर्तमान स्थिति यह है: इस समय इन नियमों द्वारा कोई पृष्ठ सुरक्षित नहीं हैं। सद्य जब मैं किसी सम्पादन पृष्ठ को बिना सहेजे बदलावों के साथ छोड़ूँ तो मुझे सूचित करें। फ़ाइल पुनर्स्थापन में त्रुटि: $1 श्रम ...से युक्त $1 पृष्ठ $2 नाम पर स्थानांतरित कर दिया गया है। ध्यानसूची सब्जेक्टका स्थान अपरिवर्तनीय रूप से इस टैग को हटाएँ लॉग इन $1 के फ़ाइल के हटाये गये अवतरण को पुनर्स्थापित नहीं किया जा सकता: फ़ाइल का नाम मेल नहीं खाता पृष्ठ हटाएँ कस्टम इमेज प्रोसेसिंग सपोर्टेड फ्लॅशपीक्स अवतरण विकि प्रारूपण नज़रंदाज़ करें खोजें ध्यानसूची यू॰आर॰एल से इस फ़ाइल को चढ़ाने $1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} किया एक पुनर्निर्देशन भी निर्मित किया गया है। भाषा चुनें श्रेणी $1 पर आपके लिए नया संदेश है छोटे परिवर्तनों के लिए भी मुझे ईमेल भेजें \"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें। टिप्पणी हटायें मार्च दो घंटे:2 hours,एक दिन:1 day,तीन दिन:3 days,एक सप्ताह:1 week,दो सप्ताह:2 weeks,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक साल:1 year,हमेशा के लिये:infinite",
- "hu": " talpatlan (sans-serif) betűtípus A fájlban történő mentés felkínálása Lap figyelése Színkép érzékenysége Az összes sablon hozzáadása Telugu Megjelenítési beállítások A(z) „$1” kategóriába tartozó lapok Expozíciós program Aláírás: Fióklétrehozási hiba hét Be kell jelentkezned a fájl feltöltéséhez. Szélességi fok Nem változtathatod meg a védelmi szinteket, amíg blokkolnak. Itt vannak a(z)\n'''$1''' lap jelenlegi beállításai: Ábrázolt helyszín Az ideiglenes kóddal jelentkeztél be. A bejelentkezés befejezéséhez meg kell adnod egy új jelszót: A megadott jelszavak nem egyeznek. a lap utolsó szerkesztésének gyors visszaállítása Pipáld ki a dobozt, ha el szeretnéd rejteni a kiválasztott névterekben található hivatkozásokat. Botok elrejtése CCITT Group 3 1 dimenziós módosított Huffman kódolás Védett lap Valaki (vélhetően te, a(z) $1 IP-címről) új jelszót kért a(z)\n{{SITENAME}} wikis ($4) felhasználói fiókjához.\n\"$2\" számára most egy ideiglenes jelszót készítettünk: \"$3\".\nHa te kértél új jelszót, lépj be, és változtasd meg.\nAz ideiglenes jelszó {{PLURAL:$5|egy nap|$5 nap}} múlva érvényét veszti.\n\nHa nem te küldted a kérést, vagy közben eszedbe jutott a régi, és már nem akarod megváltoztatni, hagyd figyelmen kívül ezt az üzenetet, és használd továbbra is a régi jelszavadat.",
- "hut": "",
- "id": " Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Catatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan. membuat akun pengguna ini menggunakan API penulisan",
- "ii": " ꀨꏾꌠ",
- "is": " Tæma listann Dagsljós flúrlýsing (D 5700 - 7100K) Streymi: Skrá með nafninu \"$1\" er þegar til og ekki er hægt að yfirskrifa hana. Eftirfarandi skrár eru í notkun en eru ekki til. Þar að auki, eru síður sem innihalda skrár sem eru ekki til, taldar upp á [[:$1]]. raða í stafrófsröð Þetta er afritað eintak af umbeðinni síðu og gæti verið úreld. Athugasemdir: Ef farið er af þessari síðu gætu þær breytingar sem þú hefur gert tapast.\nEf þú ert skráður inn, þá getur þú gert þessi skilaboð óvirk í „{{int:prefs-editing}}\"-hluta kjörstillinganna þinna. Banna {{GENDER:$1|notanda}} $1 {{PLURAL:$1|sekúndu|sekúndum}} Senda þessum notanda tölvupóst Hreinsun á MediaWiki amasendingum [vefslóðin er of löng] Færa þessa síðu GIF athugasemd skv. vafrastillingu Gildi: Þú verður að taka fram notandanafn. Læsa gagnagrunni Handahófsvalin rótarsíða {{SITENAME}} {{PLURAL:$2|nafnlaus notandi|nafnlausir notendur}} $1 Sérstök myndvinnsla (endurbeining $1) Breytingar tengdar \"$1\" Project:Samfélagsgátt Leita í eyddum síðum",
- "it": " Legenda Questo è un registro delle modifiche alla lingua delle pagine. Versione attuale Miglia orarie Vai Ci sono problemi con i dati inseriti Non è possibile modificare le password Oceano Indiano Australia (si apre in una nuova finestra) Cerca Salva le preferenze Spostamenti Distanza del soggetto Hai cercato di inviare una e-mail senza un indirizzo. È stato fornito un valore di un tipo che non può essere codificato [[$1]] è stata spostato.\nÈ stato automaticamente aggiornato e ora è un redirect a [[$2]]. Errore sconosciuto nella funzione PHP mail() Confronta Non riuscita apertura del file di blocco per \"$1\". Non puoi cancellare questa pagina perché è stata protetta. Dati e strumenti correlati Nuovi utenti Caricamento del file per l'importazione non riuscito. Il file supera le dimensioni massime consentite per l'upload. La modifica è stata salvata. Aiuto Errore Importazione delle pagine in corso... Posizione dei dati immagine Linea orizzontale (usare con giudizio) Si è tentato di modificare una sezione inesistente.\nPotrebbe essere stata spostata o eliminata mentre si stava visionando la pagina.",
- "iu": "",
- "jv": " Jeneng panganggo: Riwayat suntingan Tèks baku Balèkna Nyunting kaca-kaca Astamiwa Bayangan samb. urutna miturut angka Jeneng berkas kacendhèken. ninjo lan mbalèkaké revisi sing didhelikaké iki Kasalahan: Asil ora dikenal saka API Daftar pamblokiran kosong. Pariwara Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2. ID unik gambar Berkas kuwi berkas ZIP sing kaisi berkas .class Java.\nNgungga berkas Java ora dililakaké amarga bisa nyebabaké ngluwèhaké wates kamanan. Pindhahna kaca iki Kapusat (Aja diowahi) Patroli owah-owahan pungkasan dipatèni Pranala interwiki rusak Tuduhna Opsional: Dipigunakaké kanggo panyebutan jinis kelamin sing bener déning piranti alus.\nInformasi iki bakal kabuka kanggo publik. $1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4 nindesi pangalihan liyane Alamat layang èlèktronik Sunting hak-hak para panganggo ing situs-situs wiki liya Nambahaké kaca saka bilik jeneng: Tanggal Singidaken '''Pènget''': Kaca iki wis kabusak sawisé panjenengan miwiti nyunting!",
- "jv-java": "",
- "kbg": "",
- "khg": "",
- "km": " លក្ខខណ្ឌប្រើប្រាស់ គ្មានទំព័រដែលអ្នកចង់រកនៅក្នុងឃ្លាំងផ្ទុកទំព័រលុបចោលទេ។ ប្រៀបធៀបទំព័រ បន្ទាប់ {{PLURAL:$1|$1}} '''ឈ្មោះគណនីឬអាសយដ្ឋានIPរបស់អ្នកស្ថិតក្រោមការហាមឃាត់ហើយ។'''\n\nការហាមឃាត់ត្រូវបានធ្វើដោយ $1\n\nដោយសំអាងលើហេតុផល ''$2''។\n\n\n* ចាប់ផ្ដើមការហាមឃាត់ ៖ $8\n* ផុតកំណត់ការហាមឃាត់ ៖ $6\n* គណនីហាមឃាត់់ ៖ $7\n\n\nអ្នកអាចទាក់ទងទៅ $1 ឬ [[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ដទៃទៀតដើម្បីពិភាក្សាពីការហាមឃាត់នេះ ។\n\nអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលទៅអ្នកប្រើប្រាស់នេះ\" បានទេ លើកលែងតែអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ​ត្រូវបានផ្ដល់អោយក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]​របស់លោកអ្នកហើយលោកអ្នកមិនត្រូវបានគេហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់លោកអ្នកគឺ $3 និងអត្តលេខហាមឃាត់គឺ #$5 ។\n\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។ ដាក់ស្នើ ស្វែងរកក្នុងប្រវត្តិ ផ្ញើអ៊ីមែល​មកខ្ញុំ​កាលបើ​មានបន្លាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ '''គន្លឹះ ៖ ''' សូមប្រើប្រាស់ប៊ូតុង\"{{int:showpreview}}\"ដើម្បី​ធ្វើតេស្ត​សន្លឹក CSS ថ្មីរបស់អ្នក​មុននឹង​រក្សាទុកវា ។ អក្សរឡាវ គណនីរបស់លោកអ្នកត្រូវបានបង្កើតហើយ",
- "kn": " $1{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಗಳು}} ಕಾರ್ಯ: $1 ಕೇವಲ ಇತ್ತೀಚಿನ ಪರಿಷ್ಕರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಸಂಪಾದನೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು ಸಿಂಧುವಲ್ಲದ ಪ್ರಕಾರದ ಫೀಡು. ಇತರ ವಿಶೇಷ ಪುಟಗಳು [[$1]] - [[$2]] ಪುಟಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ \"[[$1]]\" ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ವಿವರವಾದ ನೋಟ ಇಲ್ಲ. ಬೇರೆ ಸದಸ್ಯರಿಂದ ಈ-ಮೈಲ್‍ಗಳನ್ನು ಸ್ವೀಕರಿಸು ಹಳೆಯ \"ವಜಾ ಮಾಡಿ\" ಈ ಸಂಪಾದನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯ ಗೊಳಿಸಿ ಸಂಪಾದನಾ ಪುಟವನ್ನು ಮುನ್ನೋಟದೊಂದಿಗೆ ತೆರೆಯುತ್ತದೆ.\nಇಲ್ಲಿ ಸಾರಾಂಶದಲ್ಲಿ ಕಾರಣವನ್ನು ಸೇರಿಸುವ ಅನುಮತಿ ಇದೆ. ಮುಕ್ತಾಯ ಎಲ್ಲವನ್ನೂ ಅಳಿಸು ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ ಖಾಲಿ ಪುಟ (ವಿಭಾಗ $1) {{PLURAL:$1|೧ ಶೀರ್ಷಿಕೆಯನ್ನು|$1 ಶೀರ್ಷಿಕೆಗಳನ್ನು}} ಸೇರಿಸಲಾಯಿತು: ಬೇರೆ ಭಾಷೆಗಳಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರದ ಪುಟಗಳು $1 (ಹೊಸ ವಿಭಾಗ) ಸಂಪಾದಿಸಲಾಗುತ್ತಿದೆ [[:$1]] ಪುಟದ ಈ ಕೆಳಗಿನ ಬದಲಾವಣೆಗಳನ್ನು [[:$2]] ಒಳಗೆ ಸೇರ್ಪಡೆ ಮಾಡಬಹುದು.\nರೇಡಿಯೊ ಗುಂಡಿಗಳ ಸಾಲನ್ನು ಉಪಯೋಗಿಸಿ ತೋರಿಸಲಾಗಿರುವ ಕಾಲದ ಮುಂಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಮಾತ್ರ ಸೇರ್ಪಡೆ ಮಾಡಿ.\nಗಮನಿಸಿ: ಸಂಚರಣೆ ಕೊಂಡಿಗಳನ್ನು ಉಪಯೋಗಿಸಿದಲ್ಲಿ ಈ ಸಾಲು ವಸ್ತುಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗುತ್ತದೆ. $1 ({{PLURAL:$2|೧ ಪದ|$2 ಪದಗಳು}}) ಚಿತ್ರಬಿಂದು ರಚನೆ ಸಂರಕ್ಷಿಸು ಹುಡುಕು ಮರೆ ಮಾಡಿ ಬದಲಾಯಿಸಿ ಕೊಕ್ಕೆ ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ ಸಂಪಾದಿಸಿ .\nಇದು ಯಾವುದೇ ವಿವರಣೆ ನೀಡಿದರು .",
- "kok": "",
- "kte": "",
- "lb": " Lëscht vun {{GENDER:|Äre}} Kontributiounen Benotzer Dës Ännerung gouf vun engem Bot gemaacht Son De Fichier $1 konnt net op $2 geréckelt ginn. Aloggen Jul. Iwwerwaachungslëscht eidelmaachen De Fichier $1 konnt net op $2 kopéiert ginn. Säiten, op denen d'maximal Gréist vun agebonnene Schablounen iwwerschratt ass Dir gesitt eng Versioun vun dëser Säit aus dem Tëschespäicher (cache), déi eventuell net méi aktuell ass. Sichen däerf seng Diskussiounssäiten net änneren Extern sichen D'Markéierung (tag) ''$1'' gëtt et schonn. D'URL muss mat http:// oder ftp:// ufänken. Verhënneren datt ageloggte Benotzer vun dëser IP-Adress aus Ännerunge maache kënnen Member vun: Geläscht Versioun vu(n) $1 (Versioun vum $4 um $5 Auer) vum $3: Skin E Fichier mam Numm \"$1\" gëtt et schonn am gedeelte Repertoire an e kann net iwwerschriwwe ginn. Benotzernumm op Lëschten a bei Ännerunge verstoppen Dir hutt rezent zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert. Feeler beim Schécke vun der E-Mail: $1",
- "lbj": "",
- "lhm": "",
- "li": " Zwaal 's óchtes es 's aoves Wit fluorescerend (WW 3200 - 3700K) Botbewirkinge op mien volglies verberge Jao [URL is te lank] Wèt se zeker det se 'n gewösjdje versie ven 't bestandj \"$1\" ven $2 óm $3 wils bekieke? d'r is geine vörge lokale versie van dit bestand mit 't opgegaeve tiejdstip. Doorverwiezinge opsjone Gank Datum en momènt van digitizing Wachwaord opnuuj intype De bewerking kon neet ongedaan gemaak waere, omdat die neet besteet of is verwijderd. Betrach pazjena's mit 't veurvoogsel: Veurvoegsel Hulp bie bewirke Spórt Blokkeerlogbook Kan gebroekers oet deze {{PLURAL:$2|groep|groepe}} wisse: $1 Biedraag ven nuuj gebroekers Tusseköpske (hoogste niveau) Kopië oplajen is neet besjikbaar in dit domein. Ruumdjelik of temporeel scoop vanne media D'r sjtit niks op dien volglies. Aan volglies toeveuge Hieonger staon de $1 {{PLURAL:$1|resultaat|resultaat}}, vanaaf #$2. Sjuunsen tèks {{PLURAL:$1|Sjabloon|Sjablone}} gebroek in dees veurvertuining: Reeje veur beveiliging bewèrke blokkaasj verangere",
- "lo": " ລາຍການໜ້າທີ່ທ່ານຕິດຕາມການປ່ຽນແປງ ມັງກອນ ໂອນໜ້າ 2 ຄັ້ງ ສະແດງ ໜ້າ ຂຶ້ນຕົ້ນດ້ວຍ: ຕຸລາ $1 Atom ຟີດ (ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ ) ໜ້ານີ້ຖືກປົກປ້ອງ. ທ່ານສາມາດເບິ່ງຊອສ. ໄຟລ໌ $1 × $2 ປິກເຊລ, ຂະໜາດໄຟລ໌: $3, MIME type: $4 ດັດແກ້ ໝົດອາຍຸ $1 (UTC) ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1 ແມ່ແບບ ມີ ບັນຊີແລ້ວບໍ? '''$1'''. ສະແດງ ຜົນການດັດແກ້ ໃນ ເວລາດັດແກ້ເທື່ອທຳອິດ ສ້າງໜ້ານີ້ ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ. ຄວາມສູງ ເບິ່ງຊອສ໌ ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ ສິງຫາ ເຊົາຕິດຕາມ ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ການດັດແກ້ຫຼ້າສຸດ ກ່ຽວຂ້ອງ ປະຫວັດ ຄຳອະທິບາຍໂດຍຫຍໍ້: ສະຫຼຸບ {{PLURAL:$2|ໝວດນີ້ມີໜ້າຢູ່ພຽງໜ້າດຽວ|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້ ເຕັມ $2}} ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ {{PLURAL:$1|$1}} ຕໍ່ໄປ ດັດແກ້ ພາກ: $1 ການສ້າງບັນຊີ ຈາກ IP ນີ້ ($1) ໄດ້ຖືກຫ້າມ ໂດຍ [[User:$3|$3]].\n\nເຫດຜົນ ໃຫ້ໄວ້ ໂດຍ $3 ແມ່ນ ''$2'' ບໍ່ຂີດ ໜ້າບໍ່ມີໜ້າໃດເຊື່ອມຕໍ່ຫາ ບັນທຶກ ການລຶບ ນີ້ແມ່ນ ບັນທຶກການສ້າງ ບັນຊີຜູ້ໃຊ້ໃໝ່ ການດັດແກ້ ໝ້າພິເສດ ພວມດັດແກ້ $1 ໜ້ານີ້ ບໍ່ສາມາດສ້າງ ບັນຊີ ໄດ້ ເນື້ອໃນ ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມ ຢູ່ທາງລຸ່ມ ສ່ວນຕ່າງ",
- "loy": "",
- "luk": "",
- "lya": "",
- "mai": " कोनो और विकि सँ आयात करी {{जालस्थल}} ई-पत्र संकेत सत्यापन नवीनतम सम्पादन तिथि दुखी छी, वितरक सभ एखन व्यस्त अछि।\nबड्ड बेशी लोक ऐ पन्नाकेँ देखबामे लागल छथि।\nऐ पन्नाकेँ फेरसँ देखबा लेल कनी बिलमू। \n$1 दोसर कारण दोसर कारण कोनो पुरान संशोधन नै भेटल। प्रयोक्तानाम इ ट्यागसभ हटाबी: \"$1\" केँ नै ब्याकअप क सकल। रद्द करु विषयमे निकालू {{PLURAL:$2|वर्ग|वर्ग}}: $1 अस्वीकृत ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ '''टिप्पणी:''' संरक्षणक बाद, अहाँकेँ परिवर्तन देखबा लेल अपन गवेषकक उपस्मृतिकेँ हटबए पड़त।\n''' मोजिल्ला/ फायरफॉक्स/ सफारी:''' दाबि कऽ राखू ''शिफ्ट'' केँ ''पुनर्भारित'' क्लिक करबाक समए, वा दाबू चाहे ''Ctrl-F5'' वा ''Ctrl-R'' (''Command-R'' मैकिनटोशपर);\n'''कन्करर: ''' क्लिक करू ''पुनर्भारित करू'' वा दाबू''F5'';\n'''ओपेरा:''' उपस्मृति खतम करू ''Tools → Preferences'';\n'''इन्टरनेट एक्सप्लोरर:''' दाबि कऽ राखू ''Ctrl'' क्लिक करबा काल ''नवीकरण,'' वा दाबू ''Ctrl-F5'' । $1 {{GENDER:$2|आयात केल गेल}} $3 कोनो और विकि सँ $1 {{PLURAL:$1|खाका |खाका सभ }} एकटा अबूझ भ्रम आएल मदति हटाउ सभसँ बेसी लागिबला पन्ना सभ दिसंबर",
- "mak": "",
- "mi": " Mo {{SITENAME}} hunaia Whārangi motuhake Rāhina Ngā hononga mai Huringa pūtahi Whakaaturia Rāapa Mahuru Hōngongoi Poutū-te-rangi Hau Kāinga Paenga-whāwhā Tiro rerekētanga Here-turi-kōkā Kōrerohia Rārangi kōrero Haratua Haere Tipihaere Pānui pūnaha Whakakore Haere papa tauira Hunaia Tomokanga hapori Project:Kōrero Kōrero nehe Kawepūrongo Wāhanga Pipiri Tāia Rāmere Hononga toitū Kōrerorero Hui-tanguru Kōwhiringa Huarahi Whakamārama Rārangi mātaki Kohi-tātea Rārangi mātaki Project:Tikanga tūmataiti Reo kē Huringa pūtahi - pouaka utauta Whiringa-ā-nuku Āwhina Hakihea Rātū Rāpare Project:Tomokanga hapori Huringa hou Tuku atu Rātapu kāti te mātaki Whiringa-ā-rangi whakakite Tiaki Whakatika tangohia Nekehia Hau Kāinga Ka whakaaturia i raro iho nei ngā '''huringa hou''' o tēnei Wiki. Rerekētanga pū tahi Whakarere Mātaki tuhi pānui Ngā whārangi katoa Tuhinga/kaituhi Tikanga tūmataiti Rāhoroi Whakangungua Rapua",
- "ml": " കാണുക ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം. '''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.\n\n{{PLURAL:$2|ഒരു വിളി|$2 വിളികൾ}} മാത്രമുണ്ടാകേണ്ടയിടത്ത്, ഇപ്പോൾ {{PLURAL:$1|ഒരു വിളി|$1 വിളികൾ}} ഉണ്ട്. പ്രമാണത്തിന്റെ പേര്: ഈ താളിന്റെ പതിപ്പുകൾ '''മായ്ച്ചിരിക്കുന്നു'''.\n\nതാങ്കൾക്ക് അവ കാണാവുന്നതാണ്; കൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] ഉണ്ട്. പുറകോട്ട് കൊളുത്തുകൾ ഒരു അനുബന്ധം നിർവ്വചിച്ചിരിക്കുന്നത് പ്രകാരം കളർ സ്പേസ് ഈ താളിന്റെ നാൾവഴി ലയിപ്പിക്കുക പ്രമാണത്തിന്റെ പേര് വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ തിരുത്ത് മുമ്പേ തന്നെ ഒഴിവാക്കിയതായി കാണുന്നു. താളുകൾ സം‌യോജിപ്പിച്ചതിന്റെ രേഖകൾ തന്നിരിക്കുന്ന സമയത്തിനുള്ളിൽ ഇതുമായി പൊരുത്തപ്പെടുന്ന മാറ്റങ്ങൾ ഒന്നുമില്ല. പകർപ്പവകാശത്തിന്റെ സ്ഥിതി: അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. ഔട്ട്പുട്ട് ആന്തരിക പിഴവ്: അപ്‌ലോഡ് ഘടകം സജ്ജമാക്കിയിട്ടില്ല. താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ പ്രവേശിച്ചിരിക്കുമ്പോൾ എപ്പോഴും സുരക്ഷിതമായ കണൿഷൻ ഉപയോഗിക്കുക മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് നടത്തിയ തിരുത്തലുകൾ {{GENDER:$1|[[User:$1|$1]]}} സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു",
- "mr": " वैयक्तिक साधने प्रकल्प पान पहा माफ करा,हे पान अलीकडेच (मागील २४ तासात) वगळल्या गेले आहे.हा पानाच्या वगळण्याचा व हलविण्याचा लॉग संदर्भासाठी खाली दिला आहे. तुम्ही या पानाची सुरक्षा पातळी बदलू शकत नाही कारण तुम्हाला तसे करण्याची परवानगी नाही. अज्ञात झलक प्रगत पर्याय विपत्र अवरूद्ध केले ({{GENDER:$1|$1}} द्वारे $2 ला $3 वाजता) मापन अचूकता सुस्पष्ट लेखकांची सध्या असलेली संख्या {{PLURAL:$1|एक वगळलेले संपादन|$1 वगळलेली संपादने}} पहा. \"$1\" ला मोकळे करता आले नाही;ते कुलूपबंद नाही. एकूण संपादने सनोंद-प्रवेश करा जा एकही सदस्य सापडला नाही. {{SITENAME}} वरील अनामी {{PLURAL:$2|सदस्य|सदस्य}} $1 विशेष पृष्ठ चित्राचे / फोटोचे सामान्य नाव बदल सुचीवर कसे दिसेल रूपरेषा खालीलप्रमाणे आहे:\n\nफक्त सूचीमधील संचिका (ज्यांच्यापुढे * हे चिन्ह आहे, अशा ओळी) लक्षात घेतल्या आहेत. ओळीवरील पहिला दुवा हा चुकीच्या संचिकेचा असल्याची खात्री करा.\nत्याच ओळीवरील पुढील दुवे हे अपवाद मानावेत, अर्थात ती अशी पाने आहेत, ज्यांत ही संचिका मिळू शकते. वाईट ($1) वगळण्याची क्रिया रद्द करा प्रकाश दर्जा A वगळलेला इतिहास प्रत्येक पानासाठी योगदात्यांच्या पूर्ण सूचीचा(यादीचा) समावेश करावा",
- "ms": " Dibalikkan secara menegak Project:Hal semasa Semakan semasa Lain-lain (nyatakan imbangan) '''Ingat bahawa anda hanya menguji/melihat pralihat JavaScript anda, ia belum lagi disimpan!''' Fail import tidak dapat dimuat naik kerana melebihi had muat naik yang dibenarkan. $1 hari E-mel: Nisbah zum digital Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan. Fungsi img_auth.php ialah mengoutput fail-fail daripada wiki peribadi.\nWiki ini telah dikonfigurasikan sebagai wiki awam.\nUntuk keselamatan optimum, img_auth.php telah dilumpuhkan. Lihat laman pengguna Ralat log masuk Dihapuskan untuk membuka laluan untuk pemindahan dari \"[[$1]]\" mencari laman-laman yang telah dihapuskan Birokrat $1 telah {{GENDER:$2|menyekat}} {{GENDER:$4|$3}} selama $5 $6 Tajuk ringkas Nyahsekat pengguna Ralat pertanyaan pangkalan data telah terjadi. Terdapat beberapa masalah dengan input anda \"$1\" sedang disalurkan. Tarikh dan waktu pendigitan Maaf, laman ini baru-baru sahaja dihapuskan (dalam 24 jam yang lepas).\nLog penghapusan dan pemindahan untuk laman ini dinyatakan di bawah sebagai rujukan.",
- "muk": "",
- "mul": "",
- "my": " စာမျက်နှာ \"$1\" နှင့် \"$2\" အကြား ကွဲပြားမှု ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။ သိုရာတွင် ယင်းကို [$1 upload တင်]နိုင်သည်။ မူပိုင်ခွင့် အခြေအနေ - စီမံခန့်ခွဲသူများသာ {{GENDER:|သင်၏ အသုံးပြုသူ}} စာမျက်နှာ ဖိုင်စာမျက်နှာကိုကြည့်ရန် ဤစာမျက်နှာတွင် ဝီကီ၏ လတ်တလောပြောင်းလဲမှုများကို နောက်ကြောင်းခံလိုက်ရန် ဗားရှင်း နေ ခေါင်းစဉ်များအား အလိုအလျောက် နံပါတ်စဉ်ရန် $3 $2 မှစသော အပြောင်းအလဲအသစ်များကို ပြရန် ပရင့်ထုတ်ရန် အလိုရှိသော ဖိုင်များ နိုဝင်ဘာ စာမျက်နှာများကို တည်းဖြတ်ရန် စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန် စာမျက်နှာအားလုံး ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။ ($1 မှ ပြန်ညွှန်းထားသည်) အောက်တိုဘာ ဤစာမျက်နှာကို မဖျက်တော့ရန် မသတ်မှတ်ထားသော ဤကဏ္ဍသည် လက်ရှိတွင် စာမျက်နှာများ သို့မဟုတ် မီဒီယာများ မရှိပါ။ အကူအညီ စာမျက်နှာ အနောက်လောင်ဂျီကျု ဘာသာ - Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန် အသုံးပြုထားသော ဆော့ဝဲ ဖိုင်​တင်​ရန်​ စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန် လက်မှတ် ဝမ်းနည်းပါသည်။ ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အခက်အခဲများ ကြုံတွေ့နေရပါသည်။ ← ပြီးခဲ့သော စာမျက်နှာ",
- "nan": " Khoàⁿ chit ia̍h ê logs Tī chit--ê wiki, lí boē-tàng kái bi̍t-bé. Só͘-ū gōa-phôe kong-ke ê CSS/JavaScript Hó ah Ko·-ia̍h kàm-sī 記錄 Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té Ia̍h le̍k-sú 無提供系統服務總數的統計。 Tó-ūi liân kàu chia Chit ia̍h tī $1, $2 ū kái--koè 名空間編號 $1(毋知名)的\"$2\"文字標題袂使用。 {{PLURAL:$1|chêng|chêng $1 ê}} Iáⁿ-siōng ê miâ í-keng kái chò \"$1\". Í-keng uì lí ê kám-sī-toaⁿ soá {{PLURAL:$1|ia̍h}} cháu: Siu-kái chit ia̍h Choán-ia̍h Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3) 這个編輯抑無巡視過 Teng-ji̍p / khui sin kháu-chō Lí-iû: ''Chit-má chit ê lūi-pia̍t bô ia̍h ia̍h-sī mûi-thé.'' Tò-tńg khì $1. Chhú-siau Kî-thaⁿ--ê {{PLURAL:$2|kái-sek-tō͘ }}: $1. It Lí-iû: Ká bē tńg khì Iōng-chiá thóng-kè sò·-ba̍k Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng. {{PLURAL:$1|āu|āu $1 ê}} Sì Khu̍t-thâu-ia̍h Só·-ū ê ia̍h ($1 miâ-khong-kan) Bô chit-khoán tōng-chok Khoàⁿ lōe-iông sī: '$1' Teng-chhut kái pó-hō· Se̍h chām 開另外一个口座 Hit ê URL só͘ chí-tēng ê tōng-chok bô-hāu.\nLí khó-lêng phah m̄-tio̍h URL, ia̍h sī ji̍h tio̍h chhò-ngō͘ ê liân-kiat.\nChe mā khó-lêng sī {{SITENAME}} só͘ sú-iōng ê nńg-thé chhut būn-tê.",
- "nb": " Side: Å låse opp databasen vil si at alle brukere igjen\nkan redigere sider, endre sine innstillinger, redigere sin\novervåkningsliste, og andre ting som krever endringer i databasen.\nBekreft at du har til hensikt å gjøre dette. merke andre brukeres redigeringer som patruljert Legg denne siden til overvåkningslisten din Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider. Antall underkategorier Slett denne taggen '''Husk at du bare forhåndsviser denne JavaScript-koden.'''\n'''Den har ikke blitt lagret ennå!''' Logg inn for å kunne se siden eller utføre denne handlingen. Fjerner fra overvåkningsliste… Databasen er nå låst Aktiver taggen Avkjenningsmetode Tegninger (vektor-bilder) Tilpasset bildebehandling Tilfeldig side innenfor kategorien Oppgi en e-postadresse for at disse funksjonene skal fungere. Vis nye filer fra og med $2 $1 Denne lista er ufullstendig. Fjern redigeringer Underkategorier Kunne ikke hente filnumre for sammenligning. En ukjent feil har oppstått Fjerne blokkering av seg selv",
- "ne": " \"[[$2]]\" बाट \"[[$1]]\"मा सुरक्षा व्यवस्था सारियो एक्सएमएल पार्स रूख देखाउने $1 ले ट्याग $4 {{GENDER:$2|तयार गरेको छ}} $1 पंक्ति $2 , हरफ $3 (बाइट $4): $5 मिडिया तथ्याङ्कहरू यो पृष्ठ ती पृष्ठहरूको सूची दिन्छ जुन अन्य पुनर्निर्देशित पृष्ठहरू तिर पुनर्निर्देशित छ। प्रत्येक पङ्क्तिमा पहिलो र दोश्रो पुनर्निर्देशनको लिङ्कहरू, तथा दोश्रो पुनर्निर्देशनको लक्ष्य पनि छ, सामान्यत यहि \"वास्तविक\" लक्ष्यित पृष्ठ हुनेछ, र पहिलो पुनर्देशन वास्तवमा यसैको लक्षित हुनु पर्नेछ। काटिएको प्रविष्टिहरू समाधान गरिएको छ। प्रयोगकर्ता श्रृजना लग प्रवेश विन्दु युआरयलहरू योगदानकर्ताहरु त्यस गन्तव्य शिर्षकमा सार्न सकिन्न। {{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो सबैभन्दा बढि ट्रान्सक्ल्युडेड पृष्ठहरू देखाई रहेको छ{{PLURAL:$1|1 result|$1 परिणाम}} सम्म पहुँच #$2 देखि #$3 मा। उदाहरण अमान्य सामग्री डेटा डाउनलोड स्वत: स्वेत वचत *सामान्य सुरक्षाका कारणहरु\n** अत्यधिक बर्बरता\n** अत्यधिक अचाहिंदा सन्देश\n** जवाबी सम्पादन-झगडा\n** अधिकतम खोलिने पृष्ठ तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
- "nl": " Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.\nDeze versie kan niet verborgen worden. U hebt geen rechten om bestanden te hernoemen. Cyrillisch U kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''. De verschillen tussen de geselecteerde versies van deze pagina bekijken. U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk. Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina {{GENDER:$1|verwijderd}}. Bevestig dat u de pagina opnieuw wilt aanmaken. Bronnen en gegevens over een boek zoeken Ongeldige titel met naamruimte \"$2\" en tekst \"$3\" Versie door {{GENDER:$6|$2}} op $4 om $5$7 '''Let op: u test nu uw persoonlijke JavaScript.'''\n'''De pagina is niet opgeslagen!''' Tokens opnieuw instellen De pagina \"$1\" is aan uw volglijst toegevoegd. Gebeurtenissen rond het inhoudsmodel van een pagina Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
- "oc": " Connexion Dimg $1 jorn{{PLURAL:$1||s}} Afichar Precision de la mesura Edicion dels istorics fusionables (void) Confirmacion de l’adreça de corrièr electronic anullada Africa tornar nomenar las paginas de l’utilizaire de banca. Valor imprevista : « $1 » = « $2 ». indefinit I a pas d’entresenhas d’atribucion disponiblas per aquesta pagina. Pòt levar $2 {{PLURAL:$2|gropa|gropes}} : $1 Tornar nomenar las sospaginas (fins a $1 paginas) Programa normal Opcions de telecargament {{PLURAL:$1|Lo fichièr seguent es un duplicata|Los fichièrs seguents son de duplicatas}} d'aqueste fichièr ([[Special:FileDuplicateSearch/$2|mai de detalhs]]): Còde del luòc representat &#32;e Nombre de foncions d’analisi costosas Tipe de flux invalid. pagina seguenta → Setembre Error : la modificacion a fracassat actu Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment Importar un fichièr dempuèi una adreça URL Picatz un senhal Adreça de corrièr electronic : Gujarati La modificacion qu'avètz ensajat de realizar es estada anullada per una extension.",
- "ola": "",
- "or": " ଇଣ୍ଟରଉଇକି ଲିଙ୍କ ପୃଷ୍ଠା ଘୁଞ୍ଚାଇବା ନିମନ୍ତେ ଏକ ବୈଧ ଲକ୍ଷସ୍ଥଳ ନୁହେଁ । ସଙ୍କଳନସବୁକୁ ମିଶାଇଦେବେ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ ମାନକ ଆଲୁଅ A {{SITENAME}} ସହିତ ଯୋଡ଼ା ମିଳୁଥିବା ଲଗସବୁ ।\nଆପଣ ଲଗର ପ୍ରକାର ଅନୁସାରେ ବି ସେସବୁକୁ ବାଛି ପାରିବେ । ଇଉଜରନାଆଁଟି ଛୋଟ ଓ ବଡ଼ ଅକ୍ଷର ଅନୁସାରେ ଅଲଗା ହୋଇଥାଏ, ପୃଷ୍ଠାର ନାଆଁ ସବୁ ବି ଛୋଟ ଓ ବଡ଼ ଇଂରାଜି ଅକ୍ଷର ଅନୁସାରେ ଅଲଗା ହୋଇଥାଏ । '''ଜାଣିବା କଥା:''' ଆପଣା ନୂଆ ଜାଭାସ୍କ୍ରିପ୍ଟ (JavaScript) ସାଇତିବା ଆଗରୁ \"{{int:showpreview}}\" ବ୍ୟବହାର କରି ପରଖି ନିଅନ୍ତୁ । ନିଜର ପସନ୍ଦ ସମ୍ପାଦନା କରନ୍ତୁ '''ଚେତାବନୀ:''' ଆପଣ ସଫ୍ଟୱେରର ଇଣ୍ଟରଫେସ ଲେଖା ଯୋଗାଇବା ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଉଥିବା ଏକ ପୃଷ୍ଠାର ସମ୍ପାଦନା କରୁଅଛନ୍ତି ।\nଏହି ଉଇକିପୃଷ୍ଠାର କିଛି ବି ବଦଳ ବାକି ସଭ୍ୟମାନଙ୍କ ଇଣ୍ଟରଫେସର ଦେଖଣାକୁ ପ୍ରଭାବିତ କରିବ । $1 ଗୋପନ ଭାବେ $3 ପୃଷ୍ଠାରେ {{PLURAL:$5|ସଂସ୍କରଣଟିଏର|$5 ଗୋଟି ସଂସ୍କରଣର}} ଦେଖଣା {{GENDER:$2|ବଦଳାଇଦେଲେ}}: $4 ଏହି ପୃଷ୍ଠାଟି କିଛି ଜଟିଳ ପାର୍ସ ଫଙ୍କସନ ବ୍ୟବହାର କରେ (ଯଥା #ifexist) । [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] ଦେଖନ୍ତୁ । ଭିତରର ଭୁଲ \"$1\" ପ୍ରକାରର ତ୍ରୁଟି ।",
- "otb": "",
- "pa": " ਬਾਹਰੀ ਲਿੰਕ ਖੋਜ ਹੋਰ {{PLURAL:$2|ਰੈਜ਼ੋਲਿਊਸ਼ਨ|ਰੈਜ਼ੋਲਿਊਸ਼ਨਜ਼}}: $1. ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ ਫ਼ਾਈਲ ਮੰਗਾਈ ਨਾ ਜਾ ਸਕੀ ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ‘ਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ। ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ $1 ’ਤੇ ਵਾਪਸ ਜਾਓ। ਸਭ ਤੋਂ ਵੱਧ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਝਲਕ ਵਿਖਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਗ਼ਲਤੀ ਆ ਗਈ। ਹੋਰ ਸਮਾਂ ਨਵੀਂ ਤਬਦੀਲੀ → ਇਹਦਾ ਇਤਬਾਰੀ ਮੈਂਬਰ: ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ! ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ ਠੀਕ-ਠਾਕ ($1) ਸੋਧਾਂ ਵਾਪਸ ਮੋੜੋ ਇਸ ਬਾਰੇ translatewiki.net ਅਨੁਵਾਦਕ ਤੁਹਾਡਾ ਡੋਮੇਨ: ਨਵਾਂ ਸਿਰਲੇਖ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1 ਮਿਤੀ ਨਾਲ ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ : ਚਾਹੀਦੀਆਂ ਕੈਟੇਗਰੀਆਂ ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ ਲਾਤੀਨੀ ਬੋਲੀ (ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ) ਵਰਜਨ {{PLURAL:$1|ਹਟਾਈ ਸੋਧ|$1 ਹਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ ਝਲਕ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ। ਖੋਜ ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ ਲੁਕਵਾਂ ਫ਼ਾਈਲ ਦਾ ਸਰੋਤ ਅਗਲਾ ਸਫ਼ਾ → ਅਣਉਮੀਦਿਆ ਮੁੱਲ: \"$1\"=\"$2\"। ਬਣਾਓ ਜਦੋਂ ਮੈਂ ਅਣ-ਸਾਂਭੀਆਂ ਸੋਧਾਂ ਵਾਲਾ ਸਫ਼ਾ ਛੱਡਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰ ਦਿਉ ਵਿਕੀ ਮੂਲ ($1) ਵਰਤੋ ਕਿਰਪਾ ਕਰਕੇ ਹੇਠ ਦਿੱਤਾ ਫ਼ਾਈਲ ਵੇਰਵਾ ਬਦਲੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
- "pal": "",
- "peo": "",
- "pl": " Strony bez linków wewnętrznych Uwaga: Strona, którą chcesz usunąć, ma {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}: Ktoś zmienił treść strony w trakcie Twojej edycji.\nGórne pole zawiera tekst strony aktualnie zapisany w bazie danych.\nTwoje zmiany znajdują się w dolnym polu.\nBy wprowadzić swoje zmiany, musisz zmodyfikować tekst z górnego pola.\n'''Tylko''' tekst z górnego pola zostanie zapisany w bazie, gdy wciśniesz „{{int:savearticle}}”. Poniżej znajduje się lista wszystkich stron znajdujących się w przestrzeni nazw {{ns:template}}, które nie są używane przez inne strony.\nSprawdź inne linki do szablonów, zanim usuniesz tę stronę. Ten plik znajduje się w $1 i może być używany w innych projektach.\nPoniżej znajdują się informacje ze [$2 strony opisu] tego pliku. Nazwa właściwości: marca Uwaga: Nie jesteś zalogowany. Jeśli wykonasz jakąkolwiek zmianę, Twój adres IP będzie widoczny publicznie. Jeśli [$1 zalogujesz się] lub [$2 utworzysz konto], Twoje zmiany zostaną przypisane do konta, wraz z innymi korzyściami.",
- "pt": " Alterações relacionadas com \"$1\" Não está autorizado a marcar as suas próprias edições como edições patrulhadas. Já foi enviada um email de recuperação de palavra-passe {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-passe pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}. Não foi possível restaurar a versão do ficheiro de $1: já não existia antes da eliminação. Créditos de autoria da extensão $1 Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas Versão de Flashpix suportada Ficheiro em falta: $1 A conta de utilizador \"$1\" não está registada. Está a ver uma versão desta página guardada na cache há pelo menos $1. $1 (página não existe) Erro desconhecido Bom ($1) Bem-vindo, $1! Informações da página Mostrar Palavra-passe anterior: Dados do utilizador Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].\nCaso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de utilizador e o navegador que está a usar.",
- "sa": " संस्करणानि विलीनीकरोतु । मुख्यपृष्ठं गम्यताम् विशिष्टपृष्ठम् स्वस्य व्यक्तिगसूचना दृश्यताम् स्वसदस्यता प्राप्यताम् निम्नोल्लिखित{{PLURAL:$1|पृष्ठं|$1 पृष्ठानि}} वर्गेऽस्मिन् {{PLURAL:$1|अस्ति|$1 सन्ति}} \"$1\" इत्यस्माद् पुनः प्राप्तिः विभागशीर्षकाणामुपरि दक्षिणक्लिक्-करणेन विभागः सम्पाद्यताम् । तन्त्रांशः अनुस्थापितः । अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।\nनूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति: फरवरी $1 आधेयपुटानि । योजकाभिज्ञापकम् अपर्यापानुमतिकारणेन अथवा निदेशिकायाः /आधानस्य अभावात् \"$1\" सञ्चिकां लेखितुं न शक्यते । भागशः । $1 इति स्रोतपृष्ठं न विद्यते । अस्य पुटस्य अपमर्जितेतिहासम् अवलोकयतु । अयोग्यलक्ष्यस्य संस्करणम् प्रदत्तांशस्य (metadata) स्वरूपं यदा लघु भविष्यति, तदा एतस्मिन् सन्देशे आवलिकृतस्य EXIA प्रदत्तांशस्य (metadata) सूचनाः चित्रप्रदर्शनेन सह द्रष्टुं शक्यन्ते ।\nयदभावे अन्याः सूचनाः निगूढाः भविष्यन्ति ।",
- "saz": " ꢮꢾꢒ꣄ꢒꢶ ꢔꢸꢪ꣄ꢦꢸ ꢞꢶꢱ ꢙꢹꢭꣀ ꢓꣁꢨ꣄ꢨꢶꢪ꣄-ꢓꢵꢭꢸꢔꢶꢡꣁ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢙꢹꢥ꣄ ꢲꢾꢣꢶ ꢡꢵꢫ꣄ ꢂꢱ꣄ꢒꢶ ꢨꢾꢱ꣄ꢡꢵꢬ꣄ꢣꢶ ꢂꢒ꣄ꢜꣁꢨꢬ꣄ ꢙꢥꢮꢬꢶ ꢱꢾꢥ꣄ꢪꢵꢬ꣄ꢣꢶ ꢂꢣ꣄ꢣꢶꢥ꣄ꢥꢵꢥ꣄ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢥꢵꢮ꣄ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢥꢵꢮ꣄ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢂꢱ꣄ꢒꢶ ꢪꢵꢬ꣄ ꢱꣁ ꢩꢵꢰꣁ: ꢱꢾ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢨꢸ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢱꢾꢦ꣄ꢜꢪ꣄ꢨꢬ꣄ ꢪꢿ ꢂꢱ꣄ꢒꢶ ꢦꣁꢜ꣄ꢜꢵꢥ꣄ ꢨꢸꢣꢶꢫꢵꢬ꣄ꢣꢶ ꢚꢵꢫꢶ ꢩꢵꢰꣁ: $1 ꢨꢾ ꢍꢦ꣄ ꢎꢡꢵꢬ꣄ꢣꢶ ꢪꣁꢥ꣄ꢔꢸꢭꢵꢬ꣄ꢣꢶ ꢱꢸ ꢥꢶꢪ꣄ꢦꢶ ꢪꢴꢣꣁ ꢃꢔꢱ꣄ꢜꢸ ꢭꢾꢔꢸꢡ꣄ꢡꢵꢪ꣄ ꢪꢬ꣄ꢗꢾꢫꣁ ꢥꢮ ꢲꢸꢣꣁꢕꢵꢭ꣄ ꢏꢬ꣄ꢱꢸ ꢍꢦ꣄ꢬꢭ꣄ ꢙꢹꢥ꣄ ꢂꢒ꣄ ꢥꢵꢮꢸ ꢢꢵꢪ꣄ ꢱꣁꢪꢵꢬ꣄ꢣꢶ ꢓꢵꢭꢸꢔꢶꢡꣁ-ꢓꣁꢨ꣄ꢨꢶꢪ꣄ ꢥꣁꢒ꣄ꢒꣁ ꢪꢿ ꢥꣁꢮꣁ ꢦꣁꢜ꣄ꢜꣁ ꢮꢿꢫ꣄ ꢞꢶꢱꢪ꣄ꢨꢬ꣄ ꢣꢾꢒ꣄ꢒꢵꢞꢶ/ꢚꢵꢫꢶ ꢪꢵꢬ꣄ꢗꢸ ꢱꢾꢦ꣄ ꢲꢵꢡꢒ꣄ꢰꢬ꣄ ꢪꣁ ꢪꢬ꣄ꢗꢶ ꢲꢿꢡꢸ ꢣꢾꢒ꣄ꢒꢶꢬꢶꢫꣁ ꢙꢹꢭꣀ ꢧꢶꢨ꣄ꢬꢮꢬꢶ ꢲꢶꢖ꣄ꢔꢵꢞ꣄ ꢥꢴꢥ꣄ꢥꢶ ꢚꢵꢫ꣄ ꢎ \"$1\" ꢬꢴꢷ ꢓꢳ꣄ꢳꢶ ꢃꢮ꣄ ꢂꢱ꣄ꢒꢶ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢥꢮꢪ꣄ꢨꢬ꣄ ꢱꢵ ꢃꢔ ꢣꢾꢒ꣄ꢒꢞ꣄ꢥꢒꣁ ꢮꢾꢒ꣄ꢒꢶ ꢙꢥ ꢧꢶꢦ꣄ ꢥꣁꢮꣁ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢲꢿꢜ꣄ ꢱꢸꢒ꣄ꢬꢵꢬ꣄ꢣꢶ ꢚꢵꢫꢶ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢱꢿꢡ꣄ꢡꢾ ꢦꣁꢜ꣄ꢜꣁ ꢓꢵꢭꢸ ꢔꢶꢡꣁ",
- "si": " පිටුව: සැම විටම ඇතුළු වීමේදී ආරක්ෂාකාරී ජාලයක් භාවිතා කරන්න යටපත් කිරීම ගොනු ඉතිහාසය \"$1\" පරිශීලක ගිණුම ලියාපදිංචි කර නොමැත. පුරුෂ සංස්කරණයන් සිදුකර ඇති පරිශීලකයන් පමණක් පෙන්වන්න අයැද ඇති පිටු ශීර්ෂය වලංගු නොවන UTF-8 වෙත අනුක්රමය අඩංගු වේ. විස්තීරණය කරන ලද විස්තර පෙන්වන්න උදවු පිටුව නැවත සකස් කිරීමට කිසිදු ටෝකන් පත් වේ. පරිශීලක නාමය හෝ IP ලිපිනය: අනෙකුන්ගෙන් මෙන්ම පරිපාලකයන්ගෙන්ද දත්ත යටපත් කරන්න අනෙකුත් හේතුව සටහන: හේතුවෙන් තාක්ෂණික සීමාවන් නිසා, මෙවැනි එකක් ලෙස ඉහළ විභේදනයක් GIF ගොණු රූප සිඟිති සජීවිකරණ නොවේ කිරීම . විද්‍යුත්-තැපෑල වාරණය කෙරිණි {{GENDER:$1|රොබෝවරයා}} පෙර අවවාදය නොසලකා හැර කෙසේ හෝ ගොනුව සුරකින්න මෙම පිටුව කියවන්න හඳුනා නොගත් දෝෂයක් ඇතිවිය. සබැඳි ශීර්ෂය අනන්‍යාංක $1 දරණ අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය දත්ත ගබඩාවෙන් අස්ථානගතවී ඇත! අනෙකුත් පරිශීලකයන්ගෙන් විද්‍යුත්-තැපෑල ලැබීම සක්‍රීය කරන්න ආරෝහණ සංශෝධනයන් ප්‍රතිෂ්ඨාපනය කරන්න වෙනස් කරන ලද ගොනු විස්තරය ඉදිරිපත් කරන්න ජූනි ප්‍රාදේශීය වේලාව: මුර-නොකෙරෙන පිටු ලැයිස්තුව නරඹන්න තහවුරුකිරීමකින් තොරව, පිටුවක් සඳහා අඩවි පූර්වාපේක්‍ෂි සංචිතය (කෑෂය) විමෝචනය කරන්න",
- "sq": " Kjo faqe speciale tregon skedat e ngarkuara së fundmi. Stampa të papërdorura Burimi i medias Gjuha $1 përfshirjet Flashi nuk u ndez redakto Një kod vërtetimi ju është dërguar më parë. Nëse sapo hapët llogarinë tuaj prisni disa minuta deri sa t'iu arrijë mesazhi përpara se të kërkoni një kod të ri. Titull i pavlefshëm në vendosjen e rezultateve: $1 Kjo adresë IP është e bllokuar aktualisht.\nBllokimi i funditë është më poshtë për referencë: Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's. Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin. kohë tjetër Shënoje këtë redaktim të vogël Kjo faqe është shikuar {{PLURAL:$1|një|$1 herë}} . Jeni i/e sigurt se dëshironi të shikoni një version të grisur të skedës \"$1\" nga $2 tek $3? Zona e sensorit two-chip kolor $1 pa mbështetje të kërkimit me teskt të plotë Burimi i skedës Kodi për shtetin ku është marrë fotografia",
- "su": "Hobbes mangaruhan sakabéh widang pangajaran moral di Inggris sarta falsafah pulitik, utamana liwat bukuna anu miboga judul \"Leviathan\".",
- "sux": "",
- "sv": " Version {{GENDER:$1|bekräftad användare}} Icke-kalibrerad {{GENDER:$1|byråkrat}} Skicka modifierad filbeskrivning Det är inte tillåtet att skriva över en befintlig fil. Nya sidor $1 {{PLURAL:$1|ändring|ändringar}} Ett nytt lösenord har skickats till den e-postadress som användaren \"$1\" har registrerat. När du får meddelandet, var god logga in igen. Upplösning i fokalplan x *Vanliga motiv till blockering\n** Infogar falsk information\n** Tar bort sidinnehåll\n** Länkspam till externa sajter\n** Lägger till nonsens på sidor\n** Hotfullt beteende/trakasserier\n** Missbruk av flera användarkonton\n** Oacceptabelt användarnamn Prioritet för slutare Flytta root-användarsidor HTTP-begäran avbröts. Ta bort kommentarer Fel: Redigeringen misslyckades jan Uppdateringar för den här sidan är för närvarande inaktiverade.\nData kommer i nuläget inte att uppdateras. Mall {{PLURAL:$1|Vald filversion|Valda filversioner}} av [[:$2]]: Skrivskydda denna sida '''[[Media:$1|$1]]''' har återställts till [$4 versionen från $2 kl. $3].",
- "sw": " Onyesha mada '''Ilani''': Ukurasa huu ulifutwa ulipokwisha kuanza huuhariri! Maslahi ya binadamu Jambo lisilotegemewa: \"$1\"=\"$2\". URL batili: $1 Mada: (hana) Kiarabu kilichoongezwa Jina la ukurasa ni batili au linatumia kiambishi awali cha mradi mwingine.\nInaweza kuwa na herufi isiyoweza kutumiwa ndani ya majina ya kurasa. '''Kubadilisha uwezo wa kuona pitio hakufaulu:'''\n$1 Chanzo: Kuna mtu amesajili akaunti kwa kutumia anwani ya barua pepe yako kwenye {{SITENAME}} ($4) anaitwa \"$2\", yenye neno la siri \"$3\".\nInabidi uingie na kisha ubadilishe neno la siri lako sasa.\n\nUnaweza kupuuza ujumbe huu, endapo akaunti hii ilianzishwa kimakosa. Mwanzo Vichwa vya habari vijipange namba-vyenyewe hariri Jamii {{PLURAL:$1|inayofuata ina|zinazofuata zina}} kurasa au mafaili ya picha au sauti.\n[[Special:UnusedCategories|Jamii zisizotumiwa]] hazitandazwi hapa.\nTazama pia [[Special:WantedCategories|jamii zinazohitajika]]. ukubwa wa faili: $1, aina ya MIME: $2 Jamii zinazoungwa kuliko zote Mada ya ukurasa ulioombwa unaashiria ukurasa wa mazungumzi ambao hauko.",
- "syc": "",
- "ta": " புகுபதிகை அளவு IPTC காட்சியின் குறியீடு தாங்கள் குறிப்பிட்ட கோப்புக்கள் இங்கில்லை. பலநோக்கு இணைய அஞ்சல் நீட்சி வகை: பிளாஷ் பளிச்சிட்டது. பல்புள்ளி முன்நிலையாக்கு ஆம் படிம அடையாள எண் காப்பை உறுதிப்படுத்து இலக்கு ஏதேனும் ஓர் பெயர்வெளிக்கு இறக்குமதி செய்யவும்: $1 $3-ஐ வேறு விக்கியிலிருந்து {{GENDER:$2|இறக்குமதி செய்தார்}} மாற்றுக்கள்\n\nமாற்றுருவங்கள் '''நீங்கள் மட்டுமே இந்த CSS. இன் முன் தோற்றத்தை காண்கிறீர்கள் என்பதை நினைவில் கொள்ளவும்.'''\n'''இது இன்னமும் சேமிக்கப்படவில்லை!''' அறியப்படாதது பேச்சுப் பக்கங்களை தனியே கணக்கிடுவதைத் தவிர்த்து, உங்கள் கவனிப்புப் பட்டியலில் {{PLURAL:$1|$1 பக்கம் உள்ளது.|$1 பக்கங்கள் உள்ளன.}} நீங்கள் உங்கள் விருப்பத்தேர்வுகளில் செய்த மாற்றங்கள் சேமிக்கப்படவில்லை. நீங்கள் $1 இதனை அழுத்தாமல் இப்பக்கத்தை விட்டுச் சென்றால் உங்கள் விருப்பத் தேர்வுகள் புதுப்பிக்கப்படாது. அடுத்த பக்கம் தவறு: தடை இலக்கம் $1 காணப்படவில்லை. இதற்கான தடை ஏற்கனவே நீக்கப்பட்டிருக்கலாம். இக்காரணிகளுடன் காக்கப்பட்டப் தலைப்புகள் எதுவும் கிடையாது. உங்களுக்கு $1 {{PLURAL:$3|வேறொரு பயனரிடம்|$3 பயனர்களிடம்}} இருந்து உள்ளது ($2).",
- "tcn": "",
- "tcy": " ಡೇಟಬೇಸ್ ಮುಚ್ಚುನ ಕಾರಣೊನು ಬೊಕ್ಕೊ ನಾನೊರೊ ಅಯಿನ್ ದೆಪ್ಪುನ ಅಂದಾಜಿದ ಪೊರ್ತುನು ತೆರಿಪಾಲೆ $1 (ಈ ಪುಟೊ ನನಲ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ) ಸಹಾಯೊ ಸಮುದಾಯೊ ಪುಟೊ ಮಾಹಿತಿ ಪುಟೊ ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ \"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು ಪೆಬ್ರವರಿ ಅಡೆಂಗಾವು ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ ದಿಂಜಾವೊಡ್ಚಿ ಲಾಗಿನ್ ಆಲೆ ಪುಟೊಲೆನ್ ಕಡಪುಡ್ಲೆ ಮಾಹಿತಿ ಸ್ರಿಸ್ಟಿಸಯಿನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು $1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3 ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ \"$1\" ಫೈಲ್ ನ್ \"$2\"ಗ್ ಪುನರ್ನಾಮಕರಣ ಮಲ್ಪೆರೆ ಆಯಿಜಿ. ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ ಫೈಲ್ ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}: ಈ ಸಂದೇಸೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರೊ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲೊ ಸ್ಥಿತಿಟ್ ಅಡೆಂಗ್‍ದುಂಡು.\n*ಮಲ್ಪುಲೆ\n*ಮಾದರಿ\n*ದಿನೊ ಪೊರ್ತು ಮೂಲೊ\n*ಮಾನಾದಿಗೆದ ಸಮಯೊ\n*ಫ್‍ಸಂಖ್ಯೆ\n*ಐಎಸ್ಒ ವೇಗೊದ ರೇಟಿಂಗ್\n*ತೂಪಿನ ಜಾಗೆದ ದೂರ\n*ಕಲಾವಿದೆ\n*ಕೃತಿಸ್ವಾಮ್ಯೊ\n*ಚಿತ್ರೊ ವಿವರಣೆ\n*ಜಿಪಿಎಸ್ ಅಕ್ಷಾಂಸೊ\n*ಜಿಪಿಎಸ್ ರೇಖಾಂಸೊ\n*ಜಿಪಿಎಸ್ ಎತ್ತರೊ ಆಫ್ರಿಕ ಕಡೆತ ವಜಾ ಮಲ್ಪುಲೆ ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್) ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ $1 ನ್ ತೂವೊಡೆ? ಫೈಲ್ ಅಪ್ಲೋಡ್ ಲಾಗಿನ್ ದೋಷ",
- "te": " మీకు ఖాతా లేదా? (కొనసాగింపు) ఈ-మెయిలు చిరునామా: అంతర్గత లింకు తాత్కాలిక సంకేతపదం: ఇంకా చేర్చు $1, పేజీ $3 ను $4 కు దారిమార్పు ద్వారా దారిమార్పును ఉంచకుండా {{GENDER:$2|తరలించారు}} ఇతర {{PLURAL:$1|నిరోధం|నిరోధాలు}} నిరవధికం అనుమతిని నిరాకరించారు ఇతర (భేదాన్ని ఇవ్వండి) జాబితాలో ఆదిపదాన్ని తీసివేయి సూర్యకాంతి ఇతర కారణం ఎక్కింపు డైరెక్టరీ ($1), వెబ్‌సర్వరు రాసేందుకు అనుకూలంగా లేదు. {{PLURAL:$2|గుంపుని|గుంపులను}} చేర్చగలరు: $1 మీ ఖాతాకు అనుబంధంగా ఉన్న గోపనీయ డేటాను చూపించే టోకెన్లను మీరు ఇక్కడ రీసెట్ చెయ్యవచ్చు.\n\nమీరా టోకెన్లను పొరపాటున ఎవరికైనా ఇచ్చి ఉన్నా, లేక మీ ఖాతా వివరాలు మరెవరికైనా తెలిసిపోయినా మీరీ పని చెయ్యాలి. ప్రస్తుత పాఠ్యం ఈ క్రింది దస్త్రాలను వాడారు కానీ అవి లేనే లేవు. ఫైలుపేరులో ఓ ఎక్స్టెన్షను లేదు. సరే {{SITENAME}} $1 పేజీని $PAGEEDITDATE న $2 {{GENDER:$2|సృష్టించారు}}, ప్రస్తుత కూర్పు కోసం $3 చూడండి. ఆసియా '''[[Media:$1|$1]]''' యొక్క $3, $2 నాటి కూర్పును తొలగించాం. ప్రస్తుతం ఈ పేజీకి తాజాకరణలని అచేతనం చేసారు.\nఇక్కడున్న డేటా కూడా ప్రస్తుతం తాజాకరించబడదు. $2 పాఠ్యపు మోడల్, పాఠ్యపు ఆకృతి $1 కి మద్దతు ఇవ్వదు",
- "thw": "",
- "ti": " ረብዓ ሽም ቀዳም ምስሊ ኣቐምጥ ድሉይ ድሉይ ጁን ናይ ፅሑፍ ፕሮጀክት ሰንበት ጃንዩ ናይ ኣባል ሽም: ምስሊ ሽም ኣይትግበሩ ድሉይ ድሉይ ምስሊ ጥራይ ጥቅምቲ ግንቦት ሰሉስ ድሉይ ኣማረጽቲ ትሪ ፅሑፋተይ ሜታዳታ ነሓሰ ናይ ፅሑፍ ኣባል ነዋሕቲ ፅሑፋት ኪድ ቀዳም ሚያዝያ ናይ ኣባል ሽም: ኢ-መይል: $1 {{PLURAL:$1|ባይት|ባይታት}} ዝቕጽል ፅሑፍ → (ባይታት) ታሪኽ ሲሶፓት ኣባላት ረቡዕ መጋቢት ብዛዕባ ብጠቅላላ (ሓዳስ) ሜይ ፍንጪ ሓደሽቲ ዛዕባታት ኃሙስ ናይ ፅሑፍ ታሪኽ ሓዳስ ፅሑፍ ምስሊ ኅዳር ኣቐምጥ ቋንቋ: ብሓበር: ዝቕጽል ታኅሣሥ ለካቲት ሰኑይ ሰንበ ሰኑይ ሠሉስ ታሪኽ ድሉይ ቋንቋ: $1 ናይ ቀደም ፅሑፍ ($1) ኵሎም ፅሑፋት መበገሲ ገጽ ዝቕጽል ፅሑፍ ዘቕረብኩሞ መርኣይ ብትክክል ተቀሚጡ ኣሎ። ዝቕጽል {{PLURAL:$1|$1}} ኤፕረ ፅሑፍ ኣቐምጥ ምስልታት ማርች ድሉይ ኣባል መበገሲ ገጽ ሓምለ መስከረም ምስልታት ኪድ ናይ ቀደም {{PLURAL:$1|$1}} ዓርቢ ($1 {{PLURAL:$1|ባይታት|ባይታት}}) ብዛዕባ ዊኪፒዲያ ብጠቅላላ ሓ ፌብሩ ሰነ ናይ ቀደም ፅሑፍ ዓርቢ ኢ-መይል ፅሑፍዚ ዝቕጽል ፅሑፍ ($1) ፅሑፍ ኃሙስ ድሉይ ← ናይ ቀደም ፅሑፍ",
- "tig": "",
- "tl": " Mga midya sa kategoryang \"$1\" Hindi matatanggap ang direksiyong e-liham na ito dahil tila mayroon itong maling anyo.\nPakipasok ang isang may mahusay na anyong adres o paki-iwang walang laman na lang ang lagayan. Isinapanahon ang iyong talaan ng mga binabantayan. Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).\nMaaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat. Walang pagbabagong nakita sa binigay na kondisyon. Mga karaniwang itinatanong (''FAQ'') Rebisyon 2 Baguhin ang password Komento iba pa Palagiang kawing Itago ang isahang mga paghadlang sa IP Petsa at oras ng paglikha ng mga dato Nag-iiwan ng mensaheng pangsistema. Paumanhin! Dumaranas ng mga kahirapang teknikal ang sityong ito. Wala sa {{SITENAME}} ang espasyo ng pangalang \"$1\". Bagong pahina Hindi isang nilalamang pahina $1 ang mga pagbabago ko patungan itong pahinang umiiral",
- "tr": " Giriş yap Dosya değişiklik tarihi ve zamanı Sayfayı taşı değişiklik özeti gizlenmiş Böyle bir özel sayfa yok Yönlendirmeleri gizle Dosya yükle \"$1\" dosyası, \"$2\" dosyasına kopyalanamadı. $1 daha eski $1 dosyanın silinmesinde hata oldu $1 Mart E-posta adresini değiştir veya çıkar * Normal özel sayfalar.\n* Kısıtlı özel sayfalar. Yönlendirme sayfası Maksimum açıklık değeri Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısına (örneğin #ifexist) sahiptir. Lütfen bakınız: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] {{PLURAL:$1|Gizli kategori|Gizli kategoriler}} Bu sayfayı izle Hedef sayfanın geçerli bir ismi olmalı. {{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6 Mesaj Aşağıdaki dosyalar kullanılıyor ama mevcut değil. Yabancı depolardaki dosyalar, varolsalar bile gösterilebilir. Böyle yanlış pozitiflerin üstü çizilecektir. İptal Dosyaları yükle $1 değiştiriliyor (yeni bölüm) Ayır",
- "tsk": "",
- "ur": " آپ یہ بھی منتخب کرسکتے ہیں کہ دوسرے صارفین آپ کے تبادلۂ خیال صفحہ پر ایک ربط کے ذریعے آپ کو برقی ڈاک بھیجیں.\nجب دوسرے صارفین آپ سے رابطہ کرتے ہیں تو آپ کا برقی ڈاک کا پتہ افشا نہیں کیا جاتا۔ سانچہ دیکھئے نظرثانیاں ضم کرو عارضی پارلفظ: اس آئی پی پتہ کا تبادلۂ خیال صارف برقی پتہ غیر فعال ہے نوشتۂ محفوظ شدگی یہ دیکھنے کیلئے کہ کسی خاص وقت پر ملف کس طرح ظاہر ہوتا تھا اُس تاریخ یا وقت پر طق کیجئے۔ سادہ متن اجازہ کاری حذف شدہ صفحات میں ایسا کوئی صفحہ نہیں ملا پچھلے $1 {{PLURAL:$1|نتیجہ|نتائج}} جون آپ کا کھاتا بنائیں دو صفحات کی نظرثانیوں کا انضمام: اِس پیش منظر میں مستعمل {{PLURAL:$1|سانچہ|سانچے}}: مطالعہ رجوع مکرر تخلیق کر دیا گیا۔ صفیں: آپ کی تحریر گمنام صارفین حالیہ {{PLURAL:$1|شرکت کرنے والا|شرکت کرنے والے}} خارج ہوجائیں {{PLURAL:$1|$1ہفتہ| $1 ہفتے}} خودساختہ JS صفحہ میرے ترمیم شدہ صفحات اور فائلوں کو میری زیر نظر فہرست میں شامل کریں تخلیق کم نظرِ ثانی شدہ مضامین حذف نوشتۂ منتقلی کوئی بھی منتخب وجہ فنکشن: $ 1 صفحہ: جمعہ {{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔ پوشیدہ زمرہ جات",
- "wa": " Bloker on no d' uzeu, tot catchant s' no ås ôtes [[$1]] displaecî viè [[$2]] Tecse di tite Sorlon l' betchete: Mi copinaedje djanvî djournås Catchî Sourdant nén cnoxhou pol ristitchaedje Vos avoz des noveas messaedjes so $1 Voste adresse emile a stî acertinêye. Ene råjhon diferinne ou di pus: Prévey l' årtike å dzeu del boesse d' aspougnaedje on depot pårtaedjî Disfacer ôtes loyéns Rivni al pådje d' eberwetaedje. Mimbe implicite di: Èn nén mostrer les categorijhaedjes des pådjes Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}. Sitatistikes des uzeus Marké come ricoridjî Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints. dif. Mimbe di: S' i vs plait ricopyîz l' fitchî foû do sourdant wiki avou l' [[Special:Export|usteye di rcopiaedje foû]].\nEt s' el schaper so voste éndjole, et poy li ristitchî droci. Imådjete Cisse modêye ci del pådje a stî '''disfacêye'''.\nVos ploz vey les ca et les ma sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].",
- "xct": "",
- "yi": " הייך אינערלעכער פעלער $1 {{PLURAL:$1|סעקונדע|סעקונדעס}} אויסגעשטעלטע ארגאניזאציע דער געזוכטער IP אַדרעס אָדער באַניצער נאמען איז ניט פֿאַרשפאַרט. GPS דאטע אימפארטירן בלעטער פֿון אַן אַנדער וויקי באהאלטן ציל און פאראמעטערס זײַט מבטל ווערסיע $1 פון א באהאלטענעם באניצער דער געזוכטער בלאט־קעפל אנטהאלט אומגילטיקע צייכענען: \"$1\". אוועקגענומען באגרעניצונגען פאר סיסאפן אַנולירן ספעם באשיצונג פילטער עס זענען פֿאַראַן פּראָבלעמען מיט א טייל פון ​​אייער אַרייַנוואַרג בלאט גרייס געענדערט מיט דער צאל בייטן הייך צופֿעליגער אַרטיקל ספעציעלע בלעטער אנדער אורזאך ענדיגן אויפֿפאַסן בלאט אינהאלט שפראך רעדאַקטירן ארײַנלאגירן / שאַפֿן קאנטע מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע. דער טיפ טעקע איז געאַסרט בלאט נומער א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס. (באשיצט) באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען",
- "zau": ""
+ "adx": "",
+ "af": " Verander wagwoord Vee bladsye uit Daar is geen bladsye wat skakel na hierdie lêer nie. Sinhala Verskuiwing het geslaag Gereedskap Medewerkers Die bestemming bestaan nie Vlak 2-opskrif Donderdag Voorkom dat die gebruiker tydens die blokkade sy eie besprekingsblad kan wysig Fout met herstel van lêer: $1 Aantal subkategorieë Nooit Terugplasing was onsuksesvol:\n$1 Die bladsy is laas op $1 om $2 bygewerk. Onbekende laai fout Gesondheid Arabies Veranderlikes Onveranderd Gebruikersregtelogboek Blaaie met 'n bladsy-eienskap Geen voorkeur planar dataformat Die e-pos bevestiging is gekanselleer. klein wysigings Verskil tussen weergawes van \"$1\" Moontlike uitbreidings Spieëlbeeld van linksonder-regsbo Fout met verwydering van lêer: $1 Stelselboodskappe anonieme gebruiker $1 meld aan Verkeerde protokol Vertoon wysigings vanaf $3 $2 Ongeldige inhoud skrap Die lêer wat u probeer oplaai is te groot. $1 {{PLURAL:$1|week|weke}} Rekening geskep Iemand, waarskynlik u vanaf IP-adres $1\nhet die e-posadres van rekening \"$2\" na hierdie adres op {{SITENAME}} verander.\n\nOm te bevestig dat hierdie adres werklik aan u behoort, en die e-pos-funksies op {{SITENAME}} te aktiveer, maak hierdie skakel in u blaaier oop:\n\n$3\n\nIndien die rekening *nie* aan u behoort nie, volg hierdie skakel om die bevestiging te kanselleer:\n\n$5\n\nDie bevestigingskode sal om $4 verval.",
+ "ahr": " भाषा: $1 भाषा: भाषा: भाषा",
+ "akk": "𒀝𒂵𒌈",
+ "am": " MediaWiki የስፓም ማፅዳት በዚሁ ዊኪ መግቢያ ቃል መቀይር አልተቻለም የአባልነት መዝገብ (user log) ይዞታውን ሁሉ (ከነውይይት ገጾች) ለመፈለግ ይህን ገጽ ሰርዝ አዲስ ገጽ የፋይሎች መዝገብ የ1 አባል ማዕረግ ለማስተዳደር የአባል ገጾች የሚቀጥለው ገጽ → የውስጥ ስህተት: የእርስዎን ፋይል ለመላክ ሲሞከር ችግር ተፈጠረ። በመጣጥፎች ይዘት ለመፈልግ... ያው ገጽ አይኖርም ፌብሩ. የዊኪ-ሥርአተ ቋንቋን ቸል ለማድረግ ክፍሉን «$1» ለማስተካከል ፊርማ የታገዱት ተጠቃሚዎች ፎቶው የተነሣበት ከተማ ለMedia ፋይል ስም ፍለጋ፦ የፋይሉ ስም የተፈቀደ አይደለም። ተዛማጅ ስራዎች የየክፍለ ነገሩ ትርጉም ሥርዓቱ እንዲህ ነው፦\n\nበ* የሚጀምሩ መስመሮች ብቻ ይቆጠራል። በመስመሩ መጀመርያው መያያዣ የመጥፎ ስዕል መያያዣ መሆን አለበት። ከዚያ ቀጥሎ በዚያው በመስመር መያያዣ ቢገኝ ግን ስዕሉ እንደ ተፈቀደበት ገጽ ይቆጠራል። የኢ-ሜል ማረጋገጫ የመላክ ማስጠንቀቂያ ፋይሉ ለመቆጠብ «$1» የሚባል ፋይል አሁን ይኖራል። ምንም መነሻ አድራሻ የለም ገጾች ሁሉ በሙሉ ኢ-ሜል ተልኳል። ያልገቡት የቁ. አድራሻዎች ብቻ የምከታተላቸው ለውጦች የመጨረሻው ዕትም ቀን ኖቬምበር የጉዳዩ ሥፍራ ከቅርብ አስተያየት ቀጥሎ (ተቀጥሏል) ምሥራቅ ኬንትሮስ ምክንያት: ROLLBACK የመጨረሻውን አዛጋጅ ለውጦች በፍጥነት ይገልበጣል። ሌላ ይህ ገጽ ጠፍቷል። የመጥፋቱ ምክንያት ከዚህ በታች ይታያል። ደግሞ ከጠፋ በፊት ያዘጋጁት ተጠቃሚዎች ይዘረዘራሉ። የተደለዙት ዕትሞች ጽሕፈት ለመጋቢዎች ብቻ ሊታይ ይችላል። ዋናውን ገጽ ተመልከት ኅብረተሠባዊ ጉዳይ መነሻ ጥሩ ($1) ቀጥሎ ገጽ ማውጫ ዝርያ በዚህ የሚዘረዘሩ EXIF መረጃ አይነቶች በፋይል ገጽ ላይ በቀጥታ ይታያሉ። ሌሎቹ 'ተጨማሪ መረጃ ይታይ' ካልተጫነ በቀር ይደበቃሉ።",
+ "ang": " Þīn þafungword sceal wesan ungelīc þīnum brūcendes naman. Nīwe þafungword: Manigfeald sēcung ← Ieldre adihtung [URL is tō lang] Warnung: Se tramet þe þū wilt forlēosan hafaþ stǣr mid $1 {{PLURAL:$1|fadunge|fadunga}}: Cyrillisc Adihtunge wiþdǣd: $1 Mīne trametas Inbringan Nān Eall Gerȳman Sēcan Ūtmeldian Hafast þū reccinge ǣr? $1. Wrītan spearcǣrend þissum brūcende ieldeste Cȳþþu Fruman for $1 sēon Þū scealt $1 to adihtenne trametas. Gewilnode floccas Nāht tō sēonne. Bemetan gecorena ednīwunga Scieppan {{PLURAL:$1|āne adihtunge|$1 adihtunga}} eft (fornōm adihtunge sceortnesse) Īwan gehȳdede floccas $1 fadung of MediaWiki is behēfe Sifan Sēcan {{SITENAME}} Solmōnþes Ūtmǣlan Ōðre syndrige trametas Scieppan þisne tramet {{GENDER:$1|brūcend|brūcicge}} Inweard wōh $1 {{PLURAL:$1|bita|bitena}} Hȳdan þurhfōr Scorte trametas Ne cūðe findan ymelan \"$1\". Wæccgetæl Ǣrendgewrit: Þīn selfmearc mid tīdmearce Þū hæfst $1 ($2). Gehæftes emnet: Īwan þæt rīm behealdendra brūcenda Spearcǣrenda nama (ungenēdedlic)",
+ "ar": " لا يمكن إجراء هذا الفعل على هذه الصفحة. غير متأثر بحدود المعدل تدوير الصورة {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة صفحات تصنيف «$1» مضمن الأولوية محددة من قبل المستخدم ($1) تحكم أعلى منخفض أكثر الملفات ارتباطا تصحيح GPS التفاضلي محددات التصغير غير صحيحة إنشاء «$1» ميدياويكي برنامج حر، يحق لك توزيعه و/أو تعديله وفقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (وفقا لاختيارك أنت) أي إصدار لاحق.\n\nهذا البرنامج يوزع على أمل أن يكون مفيداً، ولكن '''دون أية ضمانات'''، بما في ذلك ضمانات '''التسويق''' أو '''الملاءمة لغرض معين'''. انظر رخصة غنو العمومية لمزيد من التفاصيل.\n\nينبغي أن تكون قد تلقيت نسخة من رخصة غنو العمومية إذا لم يتم ذلك، اكتب إلى: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA أو [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اقرأ على الإنترنت]. مؤلفون تنتهي في: إنشاء الحسابات ممنوع صباحا ومساء صباحا ابحث عن الملفات المكررة بناء على قيم الهاش. إنشاء صفحات النقاش تعديل $1",
+ "arb": "",
+ "arc": " ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ ܫܢܝܬܐ ܕܗܢܐ ܠܦܦܐ ܛܪ ܠܗܕܐ ܦܐܬܐ ܙܠ $1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܐܣܘܪ̈ܐ ܐܚܪ̈ܢܐ {{GENDER:$1|ܡܦܠܚܢܐ ܡܫܪܪܐ ܝܬܐܝܬ|ܡܦܠܚܢܬܐ ܡܫܪܪܬܐ ܝܬܐܝܬ}} ܠܝܬܝܟ ܥܠܝܠܐ ܒܨܝ ܒܚܩܠܬ̈ܐ: ܪܟܝܟܐ ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' ܡܢܘ {{SITENAME}} ܫܘܡܗܐ ܕܠܦܦܐ \"$1\" ܛܥܝܡܘܬܐ ܕܐܛܘܡ ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ \"ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ. ܠܒܟܬܐ ܕܦܐܬܐ ܢܬܟܬܒ ܐܝ ܦܝ (IP) ܕܝܠܟ ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ.\" ܢܩܕܘܬܐ ܐܘܦܩܝܬܐ ܒܪܝ ܚܘܫܒܢ̈ܐ ܕܡܦܠܚܢܐ ܚܕܬܐ ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ: ܕܠܐ ܢܘܦܐ ܣܪܛܐ $1: ܥܠܬܐ: ܦܚܘܡ ܒܝܢܝ ܦܐܬܬ̈ܐ ܬܫܥܝܬܐ ܫܝܦܬܐ ܚܒܝܫܘܬ ܡܢܝܢܐ ܐܚܪܢܐ ܡܦܐܬ ܨܚܚ̈ܐ ܦܘܕܐ ܒܫܟܚܐ ܕURL: $1 {{PLURAL:$1|$1 ܝܘܡܐ|$1 ܝܘܡܬ̈ܐ}} ܚܪܘܡ ܡܦܠܚܢܐ ܚܘܝ ܣܕܪ̈ܐ ܕܫܪܝܢ ܒ: ܟܠ ܦܐܬܬ̈ܐ ܢܛܪ \"[[$1]]\" ܚܙܝ ܦܐܬܐ ܕܣܕܪܐ ܚܙܝ ܡܒܘܥܐ ܟܘܢܝܐ ܠܐ ܛܒܐ ܡܠܬܐ ܕܥܠܠܐ ܠܐ ܬܪܝܨܬܐ ܐܥܠܬ.\nܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ. ܡܢܝܢܐ ܕܪ̈ܗܝܐ ܡܠܬܐ ܕܥܠܠܐ ܕܐܥܠܬ ܣܦܝܩܬܐ ܐܝܬܝܗ.\nܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ. $1 ܐܣܘܪ̈ܐ ܡܢ: ܠܝܬ ܦܐܬܬ̈ܐ ܠܡܥܠܢܘܬܐ. ܛܪ ܠܗܕܐ ܦܐܬܐ [[$1]] ܐܬܫܢܝܬ ܠ [[$2]] ܟܠ ܡܕܡ ܠܝܬܝܟ ܥܠܝܠܐ ܒܛܘܠ ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ {{PLURAL:$1|ܫܘܬܦܢܐ ܚܕܬܐ|ܫܘܬܦܢ̈ܐ ܚܕ̈ܬܐ}} ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܝܢ ܒ: ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܦܐܬ ܬܫܥܝܬܐ ܡܠܬܐ ܕܥܠܠܐ ܚܕܬܐ: ܫܪܪ ܢܘܛܪܐ ܫܡܐ ܕܡܦܠܚܢܐ:",
+ "as": " শুদ্ধ শিৰোনাম প্ৰদৰ্শন কৰক কিটিপ: টেব্‌ তালিকাত থকা টেবসমূহৰ মাজত বিচৰণ কৰিবলৈ সোঁ আৰু বাঁও কাঁড়চিনৰ কী টিপিব পাৰে। হয়, পৃষ্ঠাটো বিলোপ কৰক এই সদস্যনাম আৰু গুপ্তশব্দৰ ব্যৱহাৰ নিষিদ্ধ কৰা হৈছে । $3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা $1 (পৃষ্ঠাটো নাই) বৰ্তমানৰ ম্যাদ উকলা সময়: $3, $2 এই পৃষ্ঠাত নিৰ্বাচিত দুটা সংশোধনৰ মাজত পাৰ্থক্য দেখুৱাওক $1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল কিয়নো ইয়াৰ আকাৰ {{PLURAL:$2|এক বাইটতকৈ|$2 বাইটতকৈ}} বেছি। পুনঃনিৰ্দেশ কৰা হৈছে: ৯০° CCW ঘুৰিলে আৰু উলম্ভভাৱে লুটি খালে ব্যৱহাৰ কৰাৰ চৰ্ত্ত প্ৰতি পৃষ্ঠাত $1 টা বিষয়বস্তু দেখুৱাওক উপসৰ্গ ($1 namespace) -ৰ সৈতে সকলো পৃষ্ঠা প্ৰৱেশ বাৰণ কৰা সফল হ'ল স্পাম সা-সঁজুলি আপুনি কৰিব বিচৰা পৰিৱৰ্তনটো এটা এক্সটেনচন হুকৰ দ্বাৰা বাতিল কৰা হৈছে । অবিচল '''সতৰ্কবাণী: এই পৃষ্ঠা বন্ধ ৰখা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে সম্পাদনা কৰিব পাৰিব ।'''\nআপোনাৰ সুবিধাৰ বাবে পৃষ্ঠাৰ সাম্প্ৰতিক ল'গ সংৰক্ষণ তলত দিয়া হ'ল । এই ৱিকি '''[https://www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দ্বাৰা প্ৰচলিত , কপিৰাইট © ২০০১-$1 $2.",
+ "bbc": "",
+ "bh": "",
+ "bho": " बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।\nई पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।\nई पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इन्तजार करीं।\n\n$1 श्रेणी: हटावल लॉग घटना सब लॉग की इतिहास में जरूर लउकी बाकी उन्हन के सामग्री जनता खातिर पहुँच से बाहर रही। सदस्य लोग जे पछिला {{PLURAL:$1|दिन|$1 दिन}} में कौनों काम कइले बाटे खाता में प्रवेश नइखे पन्ना देखाई जे शुरू होत बा: २ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite प्रबंधक निरस्त श्रेणी चाहत बा रउआँ एह पन्ना के स्रोत देख सकत बानी आ एकर नकल उतार सकत बानी: याद रहे की आप अपनी सदस्य CSS के खाली नमूना भर देखत बानी।\nई अबहिन ले सहेजल ना गइल बाटे। बुधवार अगर पन्ना मौजूद होखे त ठीक एही नाँव की पन्ना पर जाईं याद रहे की आप ए जावास्क्रिप्ट कोड क खाली नमूना देखत बानी।\nई अबहिन ले सहेजल ना गइल बा! सभसे ढेर ट्रांसक्लूजन वाला पन्ना ए फाइल में एक्स्ट्रा जानकारी उपलब्ध बा, हो सकत बा कि ई डिजिटल कैमरा या स्कैनर से लेवल गइल होखे। अगर ई वर्तमान फाइल एकरी ओरिजनल फाइल से सुधार के बनल बा त हो सकेला कुछ जानकारी ना लउके।",
+ "bk": "",
+ "bn": " রোলব্যাকের পরে পার্থক্য দেখিও না মেয়াদোত্তীর্ণ সময় অবৈধ। দল যা আপনি পরিবর্তন করতে পারেন আসল নাম (ঐচ্ছিক) এটি যাচাইকৃত রিভিশনের তালিকা। GPS গ্রাহকের দ্রুতি মঙ্গলবার এই পাতার বিষয়বস্তুর মডেল পরিবর্তন করা যাবে না। অ্যাকাউন্ট তৈরি করুন ফাইলের বর্ণনা পাতা এখনো বিদ্যমান নয় প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক সাধারণ প্রোগ্রাম পাতার ইতিহাসগুলি একত্র করা হোক আপনার জমাকৃত ফাইলটি অনেক বড়। {{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি। ছাকনী $1 {{PLURAL:$4|ফাইল ধরনটি অনুমোদিত নয়|ফাইল ধরনগুলো অনুমোদিত নয়}}। অনুমোদিত {{PLURAL:$3|ফাইলের ধরন|ফাইলের ধরনগুলো}} হল $2। বিষয়বস্তুর অবস্থান বাতির উৎস অনুমতি ত্রুটিসমূহ ফরম্যাটটি এরকম:\n\nকেবল তালিকা আইটেমগুলি (* দিয়ে শুরু হওয়া লাইনগুলি) গণ্য করা হবে। কোন লাইনের প্রথম সংযোগটিকে অবশ্যই কোন অচল ফাইলের প্রতি সংযোগ হতে হবে।\nএকই লাইনের পরবর্তী সমস্ত সংযোগ ব্যতিক্রম হিসেবে গণ্য করা হবে, অর্থাৎ যেসমস্ত পাতায় ফাইলটি ইনলাইন হিসেবে বিদ্যমান। '''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে''' আদর্শ আলো C সক্রিয় ব্যবহারকারী তালিকা ইমেইল করো অন্য উইকি থেকে পাতা আমদানী করো",
+ "bo": " $1 རང་འགུལ་འཕྲུལ་ཆས། ཡིག་ཆ་ཡར་འཇུག་ལས་ནང་འདྲེན་བྱེད་པའི་ཤོག་ངོས། \"$1\" ཤོག་ངོས་འདིར་བསྐྱར་བཅོས་གསར་སྐྲུན་བྱེད་ཐུབ་མ་སོང། ཤོག་ངོས་ཚང་མ་བལྟས་ཟིན་དུ་རྟགས་རྒྱོབ། མཐའ་མ། གནས་སྐབས་ལམ་ཡིག ངོས་མ་ཟིན་པའི་དྲ་འབུ། ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད། ཤོག་ངོས་འདི་མི་སུབ་རོགས། མེད། ཟླ་བ་བརྒྱད་པ། $1 མཉམ་འཇོག་ཐོར་ལྟ་བ་དང་བསྒྱུར་བཅོས་བྱེད་པ། ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ། {{SITENAME}}ཡི་སྐོར། མ་བལྟས་ཤོག་ངོས་ཀྱི་ཐོ་ལ་ལྟ་བ། $1 ཁ་ཕྱོགས་བསྐྱར་སྟོན། སྔོན་མ་{{PLURAL:$1|$1}} མིང་མེད་སྤྱོད་མི $1 ལོ་རྒྱུས། འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན། རྩོམ་སྒྲིག གཤམ་གྱི་{{PLURAL:$1|ཡིག་ཆ་འདི་|$1ཡིག་ཆ་རྣམས་}}ད་གནས་སྡེ་ཚན་འདི་ནང་ཡོད། དཔེ་པང་ཤོག་ངོས་ལ་ལྟ་བ། འཚོལ་འདྲི། $1 བཀོལ་སྤྱོད་མཁན་ལ་ནོར་འཁྲུལ། $1 དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཤོག་ངོས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། \nཤོག་ངོས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་རིང་སྒུག་རོགས་གནང། $1 དཀར་ཆག་མེད་པའི་ཤོག་ངོས། ཡིག་ཆ་བརྗེ་ལེན། གང་དུ་འཚོལ་བའི་གནས། ཉེ་བའི་བཟོ་བཅོས། ཁྱེད་ཀྱི་རེ་ཞུ་བྱས་པའི་བྱ་བ་འདི་ཁྱེད་ཉིད་ནས་ལག་ལེན་བསྟར་མི་ཆོག། སྡེ་ཚན་གསར་བ་ཞིག་འགོ་འཛུགས་པ།",
+ "bod": "",
+ "bpy": " আটলান্টিক মহাসাগর ফাইল আপলোড কর আগস্ট বারোইতুকর একাউন্টহান হঙকরানি ইল [[User:$1|$1]]-রে এরে চিঙনাঙর পাতা হঙকরানিত্ত থেত করিয়া থনা ইসে। কারণ: $2। ইরে তরতা একাউন্টহান নেই থাং? $1 পতানি নাউচা... থেপকরানির log শিংলুপ অক্টো শিংহলী পাতাএহান লুকর ফাইলগ খিয়ালে থ '''তর আতাকুরা নাঙহান নাইলেউ আইপি ঠিকানাহানরে থেপকরানি অসে।'''\n\nথেপকরিসেতাই: $1\nএহানর কারণহান অসেতাইঃ: ''$2''\n\n* থেপকরানি অকরিসিতা: $8\n* থেপকরানিহান লমিতইতা: $6\n* থেপকরানি মনাসিলাতা: $7\n\nতি $1 নাইলেউ [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকর]] মা যে কোন আগর লগে বিষয় এহান্ন য়্যারি পরি দে পারর। বিশেষ মাতিলতাঃ তর ই-মেইল ঠিকানাহান যদি [[Special:Preferences|তর পছন তালিকাত]] বরিয়া নাথার, অতা ইলে তি উইকিপিডিয়াত হের আতাকুরারে ই-মেইল করানি নুৱারবে। তর আইপি ঠিকানাহান ইলতাই $3 বারো থেপকরিসি আইপিগ ইলতাই #$5।\nকৃপা করিয়া যে কোন যোগাযোগর সময়ত এরে আইপি ঠিকানাহানি যেসাদেউ বরিস। পাতাহান থেইকর কোন কারণ দেনা নাইসে আরাক পতাহাত পুসিসি মডেলর জর থা পরসেগা পছন করাতা নেই থাম্বনেইল হংকরানিত লেইলেক অসে: $1 তরতা $2 -ত য়্যাথাং নেই, অহানর {{PLURAL:$1|কারণ|কারণহানি}}:",
+ "btk": "",
+ "bug": " Leppa Indoë Mapadécéŋ $1 Leppa papaké Link risaliweŋ (jangan lupa awalan http:// ) Kamisi' Accalinruŋi Judul dek essa (sininna) Pranala permanen pakitaï/tapo' Ita leppa panginriŋ Ita leppa proyék Leppa média Leppa séuwani Désémber Sappa Désémber séuwani Log maessu Fébruari Berowoso Misc E-mail Méi Lao ri Leppa Indoë Maré' E-mail: File-file nalise menré Tenriampi Puŋgawa Paŋinriŋ (Riredirect polé $1) Iyé', peddé iyaro leppa Maré' Mapeddé berkas Paŋinriŋ mapadécéŋ Éro internal Lao ri leppa aseŋna pappada iyyé rekko eŋkaï Jum Padécéŋ kajuru: $1 Asenéŋ Lontara Januari (kapa) Luppe lao: Assapparaŋ Antivirus dé' riisseŋ: Rapang Pasewodo matoa: Teks totok Ita lontara Rusa Déppa log attama Masappa Oktober Lao ri leppa $1 Polé {{SITENAME}} [[$1]] ésuk ri [[$2]] Salasa Aseŋ papaké: Log Papaké sibawa hak-hak Project:FAQ Tool sialé-alé Leppa kosoŋë Juni Leppa baru ←Revisi riolo Lao September September Leppana iya' Paleccé Leppa béla ida pile ni ujuk, a dek essa.\nSilakan pile aseng laing. $1 bot Ita pribiu",
+ "ca": " La base de dades està temporalment bloquejada a noves entrades i altres tasques de manteniment, segurament per tasques rutinàries de manteniment, després de les quals es tornarà a la normalitat.\n\nL'administrador que l'ha bloquejada ha donat aquesta explicació: $1 En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, l'última entrada del registre es mostra a continuació: Text per defecte de juliol Una o més referències recursives en el valor per ser codificat {{PLURAL:$1|anterior|$1 anteriors}} $1 {{PLURAL:$1|des de la darrera visita}} $1 {{GENDER:$2|ha canviat}} el model de contingut de la pàgina $3 de «$4» a «$5» $1 de març Octets per component Llista d'usuaris $1 {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3 Envia la descripció del fitxer modificat {{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}} Amaga el contingut de la pàgina davall de la taula de diferències $1 edicions pròpies Tractar la signatura com a text wiki (sense enllaç automàtic)",
+ "cdo": " 敆擴展監視單單臺中顯示所有其更改,伓啻最近其更改 1點鐘:1 hour,1 日:1 day,1禮拜:1 week,2禮拜:2 weeks,1間月日:1 month,3間月日:3 months,6間月日:6 months,1年:1 year,永遠:infinite 敆汝開始修改茲蜀頁之前,已經有其他人改變茲蜀頁去了。懸頂文本區域包括原底存在其頁面文本。汝其改變敆下底文本區域顯示。汝必須合併汝其改變遘已經存在其文本。敆汝擪「{{int:savearticle}}」以後,'''囇有'''敆懸頂文本區域其文本會保存。 無頁鏈接遘'''[[:$1]]'''。 過濾器 用戶名: 伓是 「$1」共「$2」臺中𣍐蜀樣其地方 防止開賬戶 刪除 下蜀頁 → 茲蜀萆標題共[[User:$1|$1]]保護其咯。\n原因是$2。 改變賬戶其密碼 修改茲頁 (敆新窗口打開) 關於 確定密碼 我其討論頁有變其辰候,寄電批乞我 用戶 過幼修改 汝著指定蜀萆用戶名。 這般其改變 顯示$2日以內產生其$1回改變$3 *普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名 操作失敗 茲頁無修改歷史。 所有乇 尋討 相關其改變 ({{PLURAL:$1|$1字節}}) 去 茲蜀頁其會拍印其版本 總結預覽: 每頁顯示$1{{PLURAL:$1|萆結果}} 頭𡅏無 汝其設定已經乞保存了。 管理員 亞洲 密碼 茲蜀頁 添加我編輯其頁面共文件遘我其監視單 ←加舊其版本 http://www.example.com 鏈接標題 框定其等級: '''記定茲若是蜀萆預覽。'''\n汝其改變固𡅏未保存! 茲蜀段使其{{PLURAL:$1|模板}}: 綻去:𣍐使提交表單。 轉去$1。 警告:茲蜀頁敆汝編輯以前已經乞刪唻了! 覷蜀覷內容頁面 一月$1號 印度洋 確認 $1 文件鏈接 內部錯誤:$1 敆$1𡅏尋討 修改數量: 修改封鎖原因 原因: 嵌入其文件 敆嚽塊拍入汝其用戶名 永久鏈接 非洲 覷蜀覷頭頁 加入{{SITENAME}} 𣍐使趁「$1」𡅏複製文件遘「$2」。 汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。 看分類頁 封鎖茲用戶 (繼續前斗) 是",
+ "ckb": " تایلەندی دەتوانیت دەق و مێژووی دەستکاریی پەڕەیەکی دەستنیشان کراو یان کۆمەڵێک پەڕە کە ناو پەڕگەیەکی XML دا پێچراونەتەوە، هەناردە بکەیت.\nدەکرێت ئەمە لە ویکییەکی دیکەدا ھاوردە بکرێت بە کەڵک وەرگرتن لە ئامرازی [[Special:Import|ھاوردە کردنی پەڕە]]ی MediaWiki.\n\nبۆ هەناردە کردنی پەڕەکان، سەرناوەکانیان لە چوارچێوەی خوارەوەدا بنووسە، هەر سەرناوێک لە هێڵێکدا. و هەڵبژێرە کە پێداچوونەوەی ئێستا و ھەموو پێداچوونەوە کۆنەکانت دەوێت یان تەنھا پێداچوونەوەی ئێستا و زانیاریی سەبارەت بە دوایین دەستکاری.\n\nئەگەر تەنھا پێداچوونەوەی ئێستات دەوێت، دەتوانیت بەستەرێکیش بە کار بھێنیت، بۆ نموونە [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] بۆ پەڕەی «[[{{MediaWiki:Mainpage}}]]». ئەمە لۆگێکی دروستکردنی بەکارھێنەرە. ئەم پەڕەیە لە لیستی چاودێریت لاببە بۆشاییی ناوی پەیوەندیدار نیشان بدە/بشارەوە $1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}. بچیتە ژوورەوە نیشانکردنی دەستکاریەکانی کەسانی تر وەک پاس دراو لاپەڕەی DjVu لەدەرۆی ڕیز ئەم ماڵپەڕە ناتوانێ ئیمەیل بنێرێ. ئایا دڵنیایت دەتەوێ پێداچوونەوەی سڕاوەی پەڕگەی \"$1\" لە $2، لە $3دا ببیینی؟",
+ "cr": " ᓃᔥᑕᒻᐹᔅᑌᒋᓂᑲᓐ ᓃᔥᑕᒻᐹᔅᑌᒋᓂᑲᓐ",
+ "cu": "Хрⷭ҇то́съ воскре́се и҆з̾ ме́ртвыхъ, сме́ртїю сме́рть попра́въ, и҆ сꙋ́щымъ во гробѣ́хъ живо́тъ дарова́въ.",
+ "cy": " Dyma'r tocyn cudd i borthiant gwe eich rhestr wylio.\nBydd unrhyw un sy'n gwybod hwn yn gallu darllen eich rhestr wylio, felly peidiwch a'i roi i neb.\n[[Special:ResetTokens|Cliciwch fan hyn os oes angen ailosod y tocyn]]. gweld/adfer Tudalen defnyddiwr $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}} Rydych wedi ceisio golygu adran nad ydy'n bod.\nEfallai bod yr adran wedi cael ei symud neu ei dileu ers i chi agor y dudalen. Rhagolwg pwnc: Cyfeiriad IP neu enw defnyddiwr: Cyfraniadau hyd at y flwyddyn (ac yn gynharach): Categori '$1' Erthyglau yn nhrefn nifer eu categorïau Gwall gweld hanes dilëedig y dudalen hon Ydw, rydw i wir am ddatgloi'r gronfa ddata. Ni ellir symud ffeil i barth arall {{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}} Mae cyfrinair newydd wedi'i ddanfon at gyfeiriad e-bost cofrestredig \"$1\". Mewngofnodwch eto ar ôl i chi dderbyn y cyfrinair, os gwelwch yn dda. '''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
+ "da": " Følgende tekst udløste vores spamfilter: $1 '''Kunne ikke ændre logsynligheden.'''\n$1 Syntaksen i signaturen er ugyldig; kontroller venligst den brugte HTML. RSS-feed for denne side Se en liste over uovervågede sider Ugyldig eller fejlbehæftet JSON $1 {{PLURAL:$1|meter|meter}} over havets overflade Om projektet, hvad du kan gøre, hvor tingene findes Kreativprogram med tendens til stor skarphedsdybde januar {{PLURAL:$1|$1 dag|$1 dage}} Kun aften Anvendes ikke længere E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet. mandag '''\".$1\"''' er {{PLURAL:$4|en uønsket filtype|uønskede filtyper}}. {{PLURAL:$3|Den tilladte filtype|De tilladte filtyper}} er $2. {{PLURAL:$1|Anonym bruger|Anonyme brugere}} på {{SITENAME}} Geografisk bredde $1 {{PLURAL:$1|byte|bytes}} Ja Angiv et gyldigt sidenavn som destinationsside. Fra år (og tidligere): Fjern fra overvågningsliste mar $1 med $2 Søg APEX lysstyrke",
+ "de": " Filter Datei speichern Gesundheit $1 und $2: Unterschied zwischen den Seiten Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert. Seite nicht vorhanden Mit diesem Formular kannst du eine IP-Adresse oder einen Benutzer freigeben. Art des Mediums Diese Datei hat die Dateiprüfung nicht bestanden. RSS-Feed für „$1“ {{PLURAL:$1|vorheriger|vorherige $1}} High gain up Eine neue Markierung erstellen '''Logbuchsichtbarkeit kann nicht geändert werden:'''\n$1 Fehler bei der Anmeldung Seite Dateien hochladen {{PLURAL:$2|Diese Kategorie enthält folgende Unterkategorie:|{{PLURAL:$1|Folgende Unterkategorie ist eine von insgesamt $2 Unterkategorien in dieser Kategorie:|Es werden $1 von insgesamt $2 Unterkategorien in dieser Kategorie angezeigt:}}}} Falscher Interwiki-Link Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2 {{PLURAL:$4|Du hast}} $1 von {{PLURAL:$3|einem anderen Benutzer|$3 Benutzern}} ($2). Suche Zeitautomatik Navigation Seite 1 Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
+ "dre": "",
+ "dv": " ފައިލު މަޒުމޫނު މަސްދަރު ބައްލަވާ \"ކުރީގެ ނުސްހާ އަކަށް ބަދަލުކުރައްވާ\" އިން މި ޞަފްޙާއަށް އެންމެ ފަހުން އުނިއިތުރު ގެންނެވި މެމްބަރުގެ އުނިއިތުރު(އުނިއިތުރުތައް) ފޮހެލެވޭނެއެވެ. ބަހުސް ބައްލަވާ މި ވިކީ އަށް ތިބޭފުޅާގެ އައިޕީ އެޑްރެސް އިން ފާއިތުވެދިޔަ 24 ގަޑިއިރު ތެރޭ {{PLURAL:$1|1 އެކައުންޓް|$1 އެކައުންޓްތައް}} ހައްދަވާފައިވެއެވެ. އެއީ މި މުއްދަތު ތެރޭގައި ހެއްދެވޭނެ އެންމެ ގިނަ ޢަދަދެވެ.\nއެހެންކަމުން މި ވަގުތު އިތުރު އެކައުންޓެއް ނުހެއްދެވޭނެއެވެ. އެހެން ވަގުތެއްގައި އަދި މަސައްކަތް ކޮށްލައްވާށެވެ. ބޭރަށް ވަޑައިގަންނަވާ ގުޅުންހުރި ބަދަލުތައް މަގޭ ނަޒަރުން ވަދެފައިވާ މެމްބަރުންގެ އުނިއުތުރުތައް ފޮރުއްވާ ޞަފްޙާގެ ތަފާސްހިސާބު ތިޔަ ލިޔުއްވި ނަން މިހާރުވެސް ދަނީ ބޭނުން ކުރެވެމުންނެވެ.\nއައު ނަމެއް އިހުތިޔާރު ކުރައްވާށެވެ. ވަދެވަޑައިގަތުމުގެ ސިއްރު ބަހާއި މެމްބަރު ނަން ހަނދާންނެތުނީތޯ؟ ހޯއްދަވާ މޮނޯސްޕޭސްޑް ފޮންޓް ޞަފްޙާތައް ފާއިތުވެދިޔަ {{PLURAL:$1|ދުވަސް|$1 ދުވަސްތައް}} ތެރޭގައި ކޮންމެވެސް ކަމެއް ކޮށްފައިވާ މެމްބަރުން ޚާއްސަ ޞަފްޙާ އިއާދަ ކުރޭ! ބައްލަވާ މި ޞަފްޙާ ވަނީ {{PLURAL:$1|އެއްފަހަރު|$1 ފަހަރު}} ބައްލަވާފައެވެ.",
+ "dz": " $1 ཨེ་ཊོམ་ འབྱུང་ས། ཤོག་ལེབ་འདི་ལྟ། འདི་ གལ་གནད་ཆུང་བའི་ཞུན་དག་ཅིག་ཨིན། སྦ། གྲོགས་རམ། འབྲེལ་ལམ་མགོ་མིང་། འབྲུག་གཟའ་སྤེནཔ་ ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད། འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས། འོག་གི་ཤོག་ལེབ་ཚུ་ '''[[:$1]]''' ལུ་ འབྲེལ་མཐུད་འབད་ཨིན: (གཙོ་བོ།) བཀག་བཤོལ་ ཡིག་སྣོད་དེ་དང་འབྲེལ་བ་ཡོད་པའི་ཤོག་ལེབ་མིན་འདུག། སྤྱི་ཟླ་ ༨ པའི་ འཕྲོ་མཐུད་འགྱོ་: ཕུརཔ། '''ད་འབདན་ཁྱོད་ {{SITENAME}} ནང་ \"$1\" སྦེ་ ནང་བསྐྱོད་འབད་ཡོདཔ།''' ཝི་ཀི་ནང་གི་ཕྲལ་གྱི་བསྒྱུར་བཅོས་ཐོ་ཡིག། ཟླ་༡༡ པ། སྐད་ཡིག་འབྲེལ་ལམ་མེད་པའི་ཤོག་ལེབ། གང་འབྱུང་སླར་ལོག། ཟླ་༢ པ། དུས་བཀོད་དང་གཅིག་ཁར་ ཁྱོད་རའི་མིང་རྟགས། ཤོག་ལེབ་འདི་གྲོས་བསྡུར་འབད། དབྱེ་རིམ་མ་བཟོ་བའི་ཡིག་སྣོད། ཟླ་༡༠ པ། རྩིས་ཐོ་གསརཔ་བཟོ། དབྱེ་རིམ་ \"$1\" ནང་གི་ཤོག་ལེབ་ཚུ། རིམ་ལུགས་འཕྲིན་དོན། བཅུད་དོན།: ལོག་སྤོ་བཤུད་འབད། ཤོག་ལེབ་བཀྲམ་སྟོན་འགོ་བཙུགས་: གྲོས་བསྡུར། ནང་བསྐྱོད། ལག་ལེན་པ་ལུ་ གློག་འཕྲིན་གཏང་ འབྲེལ་བ་ཡོད་པའི་བསྒྱུར་བཅོས་ཚུ་སྟོན། ཆ་མཉམ། མཐེ་གཟེར་གསར་བཟོའི་སྐབས་ལུ་འཛོལ་བ་: $1 ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས། Project: སྤྱིར་བཏང་ཁས་མི་ལེན་པ། སྤྱོད་ཤུལ ད་ལྟོའི་བསྐྱར་ཞིབ།",
+ "en": " Sorry! We could not process your edit due to a loss of session data.\n\nBecause {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.\n\nIf this is a legitimate edit attempt, please try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site. Uploading by URL is disabled on this server. Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden. Error: Block ID $1 not found. It may have been unblocked already. The following consists of deleted revisions of [[:$1|$1]]. Invalid title in result set: $1 Pattern You need to provide a valid email address. Page length (in bytes) {{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}} Ignore warning and save file anyway Edit pages protected as \"{{int:protect-level-autoconfirmed}}\" Password sent",
+ "es": " Incluir páginas enlazadas a una profundidad de: Su dirección IP está listada como proxy abierto en DNSBL. cont. Contribuciones No tienes ninguna página en tu lista de seguimiento. $1 {{GENDER:$2|combinó}} $3 en $4 (revisiones hasta el $5) Trasladar páginas raíz de usuario {{ns:project}}:Administradores Al mencionarte, el software usará palabras de género neutro siempre que sea posible El título de la página solicitada apunta a una página de discusión imposible. confirmación de la dirección de correo de {{SITENAME}} Ayuda Se ha fusionado [[:$1]] en [[:$2]] Usuarios activos Motivo: Software instalado Para completar el inicio de sesión debes definir una contraseña nueva. Páginas sin categorizar Línea $1: Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.\nPara evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}. Versión para imprimir No se puede realizar la fusión de historiales, por favor revisa la página y los parámetros de tiempo.",
+ "et": " Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist. Resümee: Digisuumi tegur Särituse meetod Vigased pisipildi parameetrid Tühi objekt Tihendatud vormingud Siin loetletud pildi metaandmete välju näidatakse pildi kirjelduslehel vähemdetailse metaandmete vaate korral.\nÜlejäänud andmed on vaikimisi peidetud.",
+ "fa": " پرونده‌های استفاده‌نشده ذخیرهٔ پرونده ایجاد صفحه (در مورد صفحه‌های غیر بحث) شما اجازهٔ اجرای عملی که درخواست کرده‌اید را ندارید. این صفحات پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند: نشان‌دادن تصویرهای جدید از $2، $1 به بعد به طور پیش‌فرض، تگ‌های تازه ایجاد شده برای استفاده کاربران و ربات‌ها در دسترس قرار می‌گیرند. نظرهای نوشته‌شده در صفحهٔ بحث باید با «~~~~» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد. بارگذاری تصاویر و پرونده‌های دیگر [بدون نام] تعداد پیش‌فرض ویرایش‌های نمایش یافته: برای ذخیرهٔ فایل استش خطایی رخ داده است. سیاههٔ گشت نهفتن متغییرها و هدف شرمنده! این تارنما از مشکلات فنی رنج می‌برد. تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند: $1 (صفحه وجود ندارد) زمان جی‌پی‌اس (ساعت اتمی) قطب شمالی زمان سرور: هدف ''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.'' این صفحه محافظت‌شده‌است.\nمی‌توانید متن مبدأ آن را ببینید $1 آوریل ویرایش دلایل حذف نام تگ باید مشخص شود. $1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
+ "fi": " Tiedostoa ei voi poistaa Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. \nTässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus. Näytä sähköpostiosoitteeni muille lähetetyissä ilmoituksissa Sinun täytyy kirjautua sisään, jos haluat nähdä oman tarkkailulistasi. Sivua $1 ei voi poistaa URL-lähde Tekstitiedostot Muokata olemassa olevia sivuja Varoitus: Olet muokkaamassa sivua, joka sisältää ohjelmiston käyttöliittymän tekstiä.\nMuutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymään tässä wikissä. Ei määritelty IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa Näytä lista {{GENDER:$1|tämän käyttäjän}} muokkauksista ← Vanhempi versio Torstaina klo $1 Kaikki sivut Nämä luokat ovat olemassa, mutta niitä ei käytetä. Objektiivi Läntistä pituutta Googlen indeksi ei välttämättä ole ajan tasalla. Virheellinen asetus: Tuntematon virustorjuntaohjelma: ''$1''",
+ "fo": " Ein feilur hendi, meðan tú royndi at broyta innstillingarnar fyri tín eftirlitslista fyri \"$1\". Brúkarasíða '''$1 er endurstovnað'''\n\nSí [[Special:Log/delete|slettingarloggin]] fyri at síggja seinastu strikingar og endurstovningar. Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi. marka hesa rætting sum lítla {{SITENAME}} síðan $1 er blivin {{GENDER:$2|flutt}} hin $PAGEEDITDATE av $2, sí $3 fyri at síggja nýggjastu versjónina. Rætningur Teksturin ið tú ynskti at goyma varð sperraður av spammfilturinum. Orsøkin til hetta er nokk ein leinkja til eina eksterna heimasíðu, sum er á svartalista. Set avmarkinga fyri sjónligheit T-post Ongin fíla við hesum navninum finst. Upplótan av avritum ber ikki til frá hesum domeninum. (Nýggj) $1 síðan Friða Sperrað sjálvvirkandi tað seinastu IP adressuna, sum hesin brúkari brúkti og allar fylgjandi IP adressur, sum viðkomandi roynir at rætta/skriva frá Tað ber ikki til at upprætta konto Gomul $1 {{PLURAL:$1|úrslit|úrslit}} Tilset t-post frá øðrum brúkarum",
+ "fr": " Manuelle Une erreur interne est survenue en voulant créer un fichier temporaire sur le serveur. Veuillez contacter un [[Special:ListUsers/sysop|administrateur]]. {{GENDER:$1|utilisateur autoconfirmé|utilisatrice autoconfirmée}} Erreur : la modification a échoué Les restrictions de mot de passe de robots empêchent cette connexion. Confirmer {{PLURAL:$1|Événement de journal sélectionné|Événements de journal sélectionnés}} : Autres langues Cette page dépasse le nombre maximal de nœuds. Pages sans liens inter-langues Page 1 Écraser localement un fichier présent sur un dépôt partagé La page cible contient un lien interwiki ne pouvant être utilisé dans les titres. Fusionner les versions de deux pages : Ne pas être affecté par les limitations de débit liées aux adresses IP {{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}} Vous pouvez voir et copier le contenu de vos modifications à cette page. (tous) Date de la prise originelle Prévisualisation La base de données n'est pas verrouillée.",
+ "fy": " Trochstrings tal bewurkings per side Trochferwizings himmelje Brûkersnamme: \n$1\n\nTydlik wachtwurd: \n$2 Oanbied-warskôging $1 tekstwizigings feroarje nivo fan skoatteljen Oaren {{PLURAL:$1|1 âlder|$1 âlder}} Skiednis fan kombinearjen Triem Gjin meidoggers fûn. (ferzjenûmer: $1) {{PLURAL:$1|$1 jier|$1 jierren}} Brûkersnamme: Annulearje Proefbyld Ferburgen Tydlik wachtwurd: Yndyske Oseaan Symboalen Samar in side sjen litte. E-mailadres alle nivo's Auteur ferzje: Oanmelde Ynterne fout: $1 Underwiis Lettertype mei skreven Werom nei oanbied-side. \"$1\" RSS-feed '''\".$1\"''' is in net winske triem-type.\n{{PLURAL:$3|Oanwiisd triem-type is|Oanwiisde triem-typen binne}} $2. De ferzje fan '''[[Media:$1|$1]]''' fan $2, $3 is fuorthelle. Gau de lêste bewurking(s) fan in brûker fan in side tebekdraaie Opmerkings E-mailadres ynfiere blokkade feroarje Dy meidoggersnamme wurdt al brûkt. \nBesykje in oarenien. Gjin brûker fûn. Side skoattelje Klik op in tiid om de ferzje fan de triem op dat stuit te sjen. Tichtby",
+ "ga": " Tharlaigh earráid leis an seoladh: $1 Cuir na leagain roghnaithe i gcomparáid {{GENDER:|Do}} chuid sainroghanna Féach ar fhoinse Focal faire reatha: Deimhniú do ríomhsheoladh ar an {{SITENAME}} Leagain stairiúla den leathanach seo. Comhadainm Dréachtaí úsáideora scriosta Iompaigh rogha bunoscionn athúsáid Iúil Cló iodálach {{PLURAL:$1|Teimpléad|Teimpléid}} a úsáidtear sa réamhamharc seo: Liosta is ea seo thíos de leathanaigh athainmnithe. Ag athrú $1 (mir) Sábháil comhad Glasáil Folaigh athruithe de chuid róbat ón liosta faire Ainm comhaid: Sábháil do chuid athruithe Cuir cóip chugam de gach teactaireacht r-phoist a chuirim chuig úsáideoirí eile Gach leathanach '''Aire''': scriosadh an leathanach seo nuair a bhí tu ag athrú é! Fáth: Tá comhad eile leis an ainm seo ann fós, agus ní féidie é a forscríobh.\nMá theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid ainm nua, le do thoil. [[File:$1|thumb|center|$1]] Teanga: $1 Bánchothromaíocht uathoibríoch Theip ar an cuntas a chruthú: $1",
+ "gd": " A làimh Dìon na duilleige ID fa leth na sgrìobhainn tùsail Cliù airson na duilleige Dh'fhàillig leis an iarrtas HTTP ri linn mearachd neo-aithnichte. Cead càch a bhacadh o dheasachadh Chaidh an cleachdaiche seo a chasgadh. Chan eil logadh a-steach ceadaichte dhaibh. Chaidh $1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}} ion-phortachadh $1 gus an seòladh puist-d agad a dhearbhadh. Tùs $1 {{PLURAL:$1|roinn-seòrsa|roinn-seòrsa|roinnean-seòrsa|roinn-seòrsa}} Cuir post-d gu cleachdaiche dhen t-Samhain Dèan ceangal buan gu mùthadh seo na duilleige Obair air a sguabadh às Chaidh $1 a bhacadh mar-thà. A bheil thu airson na roghainnean atharrachadh? Seall is deasaich mo chlàr-faire Iuch Modh portraid (airson dealbhan faisg gun fhòcas air a' chùlaibh) Log a-steach Cuir am fiosrachadh a bharrachd am falach Faidhlichean a thathar 'gan iarraidh Seo liosta nam faidhlichean 's an tionndadh as ùire dhiubh 'na dhùblachadh aig an tionndadh as ùire de dh'fhaidhle air choireigin eile. Chan fhaic thu ach faidhlichean ionadail.",
+ "gez": "",
+ "gl": " Buscar un usuario bloqueado Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios. contribucións Rexeitado Novo título: \"[[:$1]]\" xa existe nun repositorio compartido. Ao mover un ficheiro a este título sobrescribirase o ficheiro compartido. Altitude Utilizar unha conexión segura sempre que acceda ao sistema Non especificou a páxina ou o usuario no cal levar a cabo esta función. Non existe ningún ficheiro con este nome, pero pode [$1 cargalo]. O nome do ficheiro que está cargando comeza con '''\"$1\"''', que é un típico nome non descritivo asignado automaticamente polas cámaras dixitais.\nPor favor, escolla un nome máis descritivo para o seu ficheiro. Ningunha páxina para importar! Redirección aleatoria Non hai ningunha descrición dispoñible. {{PLURAL:$1|anterior|$1 anteriores}} Non ten os permisos necesarios para desbloquearse a si mesmo Os grupos que pode cambiar",
+ "goe": "",
+ "gom": " Tujea fatle bhette san bodol'lean tim panam '''datt''' dakhoileant. Panachi mahiti Sod",
+ "got": " 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍅𐌰𐌿𐍂𐌳𐌰 l 𐍆𐌴𐌹𐌻𐌰 Habiþ þu niutandis? '''$1''' 𐌻𐌰𐌿𐍆𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄. 𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰): 𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐍆𐌹𐌽𐌸𐌰𐌽 Sokeiþ 𐌽𐌿 𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉 [[Special:Tags|𐍄𐌰𐌹𐌺𐌽𐍉𐍃]] 𐍆𐌹𐌻𐌷𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌰𐌽𐌰𐍃𐌹𐌿𐌽𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍃 𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰 𐍅𐌹𐌸𐍂𐌰 𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌼𐌰𐌹𐌳𐌾𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉 Melja 𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉 $1 {{PLURAL:$1|máidein|máideins}} 𐌰𐍆𐌲𐌰𐌲𐌲𐌰𐌽 $1 lietila máideins 𐍃𐍉𐌺𐌴𐌹 𐍅𐌹𐍄𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐍃𐌺𐌰𐍀𐌴𐌹 𐌽𐌹𐌿𐌾𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 𐌲𐍂𐌰 𐌽𐌿 Sinteino 𐌳𐍂𐌹𐌿𐍃𐍉 𐌱𐍉𐌺𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃 𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽. 𐌾𐌰 Sokeiþ 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐍄𐌰𐌹𐍂𐌰𐌽 {{ns:project}}:𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃 𐍄𐌰𐌹𐌺𐌽𐌹𐌳𐌰 𐌸𐌿: $1 Gaírnedum seidam 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌻𐌹𐌴𐌺𐍃 𐌹𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}} (halb-gabaírgjan) 𐍃𐌰 𐌳𐌰𐍄𐌰𐌱𐌿𐍃 𐌽𐌹 𐌲𐌰𐌽𐌰𐌼 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽 𐌴𐌹 𐌹𐍄𐌰 𐍃𐌺𐌰𐌻 𐌱𐌹𐌲𐌹𐍄𐌰𐌽: \"$1\" $2\n\n(The data base did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.)",
+ "grc": " Βεβασισμένον τῷ ἔργῳ τοῦ/τῶν $1. Κατάστασις φωτομέτρου Κανονική Πείρασον ἀναμένειν ὀλίγα λεπτὰ τῆς ὥρας καὶ ὕστερον ἐπιφόρτισον πάλιν. Οὐδεμία δέλτος ἐν {{PLURAL:$2|τῷ ὀνοματείῳ|τοῖς ὀνοματείοις}} \"$1\". Στόχος Οὐδὲν ἐν τῇδε τῇ δέλτῳ γεγραμμένον. \nἜξεστί σοι [[Special:Search/{{PAGENAME}}|δέλτον τινὰ οὕτως ὀνόματι ζητήσειν]] ἐν ἔτερες δέλτους, ἤ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ζητήσειν τα συγγενή αρχεία καταγραφών],\nὄμως οὔ δύνασαι τήνδε τὴν δέλτον δημιουργήσειν. Ἐκκινεῖν ἐπιφόρτωσιν Χρῆμα: Δε Δεῖ σε ἐπιλέξειν σύνθημα δίαφορον τοῦ σοῦ ὀνόματος χρωμένου. Ἐπιλογαὶ ἠλ-ταχυδρομείου Κατάλογος τῶν ἐνθάδε ἀγόντων Αἱ τῆς δέλτου πρότεραι Στοιχεῖα χρωμένου μὴ δυναμένη ἡ μεταγραφή τῆς δέλτου σου ἐστίν Ἀγνοεῖν βικι-μορφοποιίαν Κατάλογοι δέλτων Βέβαιος εἶ περὶ τῆς προβολῆς διαγεγραμμένης ἀναθεωρήσεως τινὸς τοῦ ἀρχείου \"$1\" ἐκ τῆς $2 ἐν τῇ $3; Οὐκ ἔστι καταγεγραμμένη ἔκδοσις τοῦ '''$1''' μετὰ τῶν καθωρισμένων χαρακτηριστικῶν. Διεύθυνσις ἠλ-ταχυδρομείου προαπαιτεῖται. Αὐξάνειν Οὐκ ἔξεστί σοι μετακινήσειν δέλτον τινὰ πρὸς δέλτον χρωμένου (πλὴν μόνον πρὸς ὑποδέλτον χρωμένου).",
+ "gu": " ઈ-મેલ મોકલો ગુપ્તસંજ્ઞા બદલો \"$1\" અજ્ઞાત ક્રિયા. તમે દર્શાવેલ સમય વખતની મૂળ ફાઇલ સ્થાનિક સ્વરુપે પ્રાપ્ય નથી. હા, આ પાનું હટાવો આપેલ ISBN વૈધ નથી લાગતો; મૂળ સ્રોતને ચકાસી, ભૂલ શોધી, ખરી માહિતી આપો. જમા કરો સાયન્સ અને ટેકનોલોજી $1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} માહિતી સંબંધી ચેતવણી ઉલટાવવું નિષ્ફળ પુષ્ટિકરણ ન થયેલ પાનાની સાઇટ સંબંધી માહિતી મીટાવો. ISO સ્ટુડીયો ટંગસ્ટન /* $1 */ નવો વિભાગ સમુદ્ર સપાટી ઉપર $1 {{PLURAL:$1|મીટર|મીટર}} બધાં પાનાઓ નિકાસ કરો/પાના અન્યત્ર મોકલો આ પાનું ફરી પુનર્જીવીત કરો અન્ય મારા ઈ-મેલની પ્રત મને મોકલો પૂર્વાવલોકન સમાપ્તિ શુક્ર [$1 માટે ઢાંચો ખેંચી લાવવામાં અસફળ ] સરખાવો છુપાવો આપ આ પાનું તેના ઇતિહાસ (બધાજ પૂર્વ ફેરફારો) સાથે હટાવી રહ્યાં છો.\nકૃપા કરી ખાત્રી કરો કે આપ આમ કરવા ઇચ્છો છો, આપ આના સારા-નરસા પરિણામોથી વાકેફ છો, અને આપ આ કાર્ય [[{{MediaWiki:Policy-url}}|નીતિ]]ને અનુરૂપ જ કરી રહ્યાં છો. ઓગસ્ટ આ પાનાં પર દિશાનિર્દેશનોની સંખ્યા આ શબ્દ ધરાવતા... ઢાંચો સંરક્ષિત પાનું સર્વર પર હંગામી ફાઇલ રચતા કોઇ આંતરીક ત્રુટિ નિર્માણ થઇ.\nકૃપયા [[Special:ListUsers/sysop|administrator]]નો સંપર્ક કરો.",
+ "hbo": "",
+ "he": " קישור בינוויקי שגוי ההרשאה או ההרשאות המאפשרות למשתמשים לערוך גרסה שנמחקה מהדף $1 (מ־$5, $4) מאת $3: התוכן בדף [[:$1]] אינו יכול להיות מומר לסוג של $2. עריכת התגיות של רשומות היומן שנבחרו {{ns:project}}:זכויות יוצרים גרסה $1 סיווג דפים לקטגוריות משתמשים אנונימיים בלבד '''\".$1\"''' הוא סוג קובץ בלתי מומלץ.\n{{PLURAL:$3|סוג הקובץ המומלץ הוא|סוגי הקבצים המומלצים הם}} $2. השחזור לא יבוצע אם הגרסה הנוכחית של הדף מחוקה בחלקה. במקרה כזה, עליכם לבטל את ההסתרה של הגרסאות המחוקות החדשות ביותר. קובץ שמע מקושר (הפניה $1) עריכת סיבות המחיקה בפברואר עריכת התיאור המקומי שם עקיפת הגבלת קצב העריכות המבוססת על כתובת IP סימון כל פעולת עריכה כמשנית כברירת מחדל בשימוש {{PLURAL:$1|בדף אחד|ב־$1 דפים}} לא ניתן להוסיף את התגית \"$1\" ידנית. '''לתשומת לבך: בשל מגבלות טכניות, תמונות ממוזערות של הקובץ הזה לא תהיינה מונפשות.''' קוד אימות דוא\"ל כבר נשלח אליכם; אם יצרתם את החשבון לאחרונה, ייתכן שתרצו לחכות מספר דקות עד שיגיע לפני שתנסו לבקש קוד חדש. הזמן ביום שהמדיה מיועדת אליו כתובת האתר עבור רישיון זכויות יוצרים סיומת הקובץ החדשה אינה מתאימה לסוג הקובץ",
+ "hi": " फ़ाइल विवरण अन्य सदस्यों के जावास्क्रिप्ट पृष्ठ सम्पादित करें उप पृष्ठ भी ले जाएँ ($1 तक) आप बाधित होने की स्थिति में सुरक्षा स्थर में परिवर्तन नहीं कर सकते।\nपृष्ठ '''$1''' की वर्तमान स्थिति यह है: इस समय इन नियमों द्वारा कोई पृष्ठ सुरक्षित नहीं हैं। सद्य जब मैं किसी सम्पादन पृष्ठ को बिना सहेजे बदलावों के साथ छोड़ूँ तो मुझे सूचित करें। फ़ाइल पुनर्स्थापन में त्रुटि: $1 श्रम ...से युक्त $1 पृष्ठ $2 नाम पर स्थानांतरित कर दिया गया है। ध्यानसूची सब्जेक्टका स्थान अपरिवर्तनीय रूप से इस टैग को हटाएँ लॉग इन $1 के फ़ाइल के हटाये गये अवतरण को पुनर्स्थापित नहीं किया जा सकता: फ़ाइल का नाम मेल नहीं खाता पृष्ठ हटाएँ कस्टम इमेज प्रोसेसिंग सपोर्टेड फ्लॅशपीक्स अवतरण विकि प्रारूपण नज़रंदाज़ करें खोजें ध्यानसूची यू॰आर॰एल से इस फ़ाइल को चढ़ाने $1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} किया एक पुनर्निर्देशन भी निर्मित किया गया है। भाषा चुनें श्रेणी $1 पर आपके लिए नया संदेश है छोटे परिवर्तनों के लिए भी मुझे ईमेल भेजें \"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें। टिप्पणी हटायें मार्च दो घंटे:2 hours,एक दिन:1 day,तीन दिन:3 days,एक सप्ताह:1 week,दो सप्ताह:2 weeks,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक साल:1 year,हमेशा के लिये:infinite",
+ "hu": " talpatlan (sans-serif) betűtípus A fájlban történő mentés felkínálása Lap figyelése Színkép érzékenysége Az összes sablon hozzáadása Telugu Megjelenítési beállítások A(z) „$1” kategóriába tartozó lapok Expozíciós program Aláírás: Fióklétrehozási hiba hét Be kell jelentkezned a fájl feltöltéséhez. Szélességi fok Nem változtathatod meg a védelmi szinteket, amíg blokkolnak. Itt vannak a(z)\n'''$1''' lap jelenlegi beállításai: Ábrázolt helyszín Az ideiglenes kóddal jelentkeztél be. A bejelentkezés befejezéséhez meg kell adnod egy új jelszót: A megadott jelszavak nem egyeznek. a lap utolsó szerkesztésének gyors visszaállítása Pipáld ki a dobozt, ha el szeretnéd rejteni a kiválasztott névterekben található hivatkozásokat. Botok elrejtése CCITT Group 3 1 dimenziós módosított Huffman kódolás Védett lap Valaki (vélhetően te, a(z) $1 IP-címről) új jelszót kért a(z)\n{{SITENAME}} wikis ($4) felhasználói fiókjához.\n\"$2\" számára most egy ideiglenes jelszót készítettünk: \"$3\".\nHa te kértél új jelszót, lépj be, és változtasd meg.\nAz ideiglenes jelszó {{PLURAL:$5|egy nap|$5 nap}} múlva érvényét veszti.\n\nHa nem te küldted a kérést, vagy közben eszedbe jutott a régi, és már nem akarod megváltoztatni, hagyd figyelmen kívül ezt az üzenetet, és használd továbbra is a régi jelszavadat.",
+ "hut": "",
+ "id": " Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Catatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan. membuat akun pengguna ini menggunakan API penulisan",
+ "ii": " ꀨꏾꌠ",
+ "is": " Tæma listann Dagsljós flúrlýsing (D 5700 - 7100K) Streymi: Skrá með nafninu \"$1\" er þegar til og ekki er hægt að yfirskrifa hana. Eftirfarandi skrár eru í notkun en eru ekki til. Þar að auki, eru síður sem innihalda skrár sem eru ekki til, taldar upp á [[:$1]]. raða í stafrófsröð Þetta er afritað eintak af umbeðinni síðu og gæti verið úreld. Athugasemdir: Ef farið er af þessari síðu gætu þær breytingar sem þú hefur gert tapast.\nEf þú ert skráður inn, þá getur þú gert þessi skilaboð óvirk í „{{int:prefs-editing}}\"-hluta kjörstillinganna þinna. Banna {{GENDER:$1|notanda}} $1 {{PLURAL:$1|sekúndu|sekúndum}} Senda þessum notanda tölvupóst Hreinsun á MediaWiki amasendingum [vefslóðin er of löng] Færa þessa síðu GIF athugasemd skv. vafrastillingu Gildi: Þú verður að taka fram notandanafn. Læsa gagnagrunni Handahófsvalin rótarsíða {{SITENAME}} {{PLURAL:$2|nafnlaus notandi|nafnlausir notendur}} $1 Sérstök myndvinnsla (endurbeining $1) Breytingar tengdar \"$1\" Project:Samfélagsgátt Leita í eyddum síðum",
+ "it": " Legenda Questo è un registro delle modifiche alla lingua delle pagine. Versione attuale Miglia orarie Vai Ci sono problemi con i dati inseriti Non è possibile modificare le password Oceano Indiano Australia (si apre in una nuova finestra) Cerca Salva le preferenze Spostamenti Distanza del soggetto Hai cercato di inviare una e-mail senza un indirizzo. È stato fornito un valore di un tipo che non può essere codificato [[$1]] è stata spostato.\nÈ stato automaticamente aggiornato e ora è un redirect a [[$2]]. Errore sconosciuto nella funzione PHP mail() Confronta Non riuscita apertura del file di blocco per \"$1\". Non puoi cancellare questa pagina perché è stata protetta. Dati e strumenti correlati Nuovi utenti Caricamento del file per l'importazione non riuscito. Il file supera le dimensioni massime consentite per l'upload. La modifica è stata salvata. Aiuto Errore Importazione delle pagine in corso... Posizione dei dati immagine Linea orizzontale (usare con giudizio) Si è tentato di modificare una sezione inesistente.\nPotrebbe essere stata spostata o eliminata mentre si stava visionando la pagina.",
+ "iu": "",
+ "jv": " Jeneng panganggo: Riwayat suntingan Tèks baku Balèkna Nyunting kaca-kaca Astamiwa Bayangan samb. urutna miturut angka Jeneng berkas kacendhèken. ninjo lan mbalèkaké revisi sing didhelikaké iki Kasalahan: Asil ora dikenal saka API Daftar pamblokiran kosong. Pariwara Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2. ID unik gambar Berkas kuwi berkas ZIP sing kaisi berkas .class Java.\nNgungga berkas Java ora dililakaké amarga bisa nyebabaké ngluwèhaké wates kamanan. Pindhahna kaca iki Kapusat (Aja diowahi) Patroli owah-owahan pungkasan dipatèni Pranala interwiki rusak Tuduhna Opsional: Dipigunakaké kanggo panyebutan jinis kelamin sing bener déning piranti alus.\nInformasi iki bakal kabuka kanggo publik. $1 {{GENDER:$2|mindhahaké}} kaca $3 nèng $4 nindesi pangalihan liyane Alamat layang èlèktronik Sunting hak-hak para panganggo ing situs-situs wiki liya Nambahaké kaca saka bilik jeneng: Tanggal Singidaken '''Pènget''': Kaca iki wis kabusak sawisé panjenengan miwiti nyunting!",
+ "jv-java": "",
+ "kbg": "",
+ "khg": "",
+ "km": " លក្ខខណ្ឌប្រើប្រាស់ គ្មានទំព័រដែលអ្នកចង់រកនៅក្នុងឃ្លាំងផ្ទុកទំព័រលុបចោលទេ។ ប្រៀបធៀបទំព័រ បន្ទាប់ {{PLURAL:$1|$1}} '''ឈ្មោះគណនីឬអាសយដ្ឋានIPរបស់អ្នកស្ថិតក្រោមការហាមឃាត់ហើយ។'''\n\nការហាមឃាត់ត្រូវបានធ្វើដោយ $1\n\nដោយសំអាងលើហេតុផល ''$2''។\n\n\n* ចាប់ផ្ដើមការហាមឃាត់ ៖ $8\n* ផុតកំណត់ការហាមឃាត់ ៖ $6\n* គណនីហាមឃាត់់ ៖ $7\n\n\nអ្នកអាចទាក់ទងទៅ $1 ឬ [[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ដទៃទៀតដើម្បីពិភាក្សាពីការហាមឃាត់នេះ ។\n\nអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលទៅអ្នកប្រើប្រាស់នេះ\" បានទេ លើកលែងតែអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ​ត្រូវបានផ្ដល់អោយក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]​របស់លោកអ្នកហើយលោកអ្នកមិនត្រូវបានគេហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់លោកអ្នកគឺ $3 និងអត្តលេខហាមឃាត់គឺ #$5 ។\n\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។ ដាក់ស្នើ ស្វែងរកក្នុងប្រវត្តិ ផ្ញើអ៊ីមែល​មកខ្ញុំ​កាលបើ​មានបន្លាស់ប្ដូរ​នៅ​ក្នុងទំព័រពិភាក្សា​របស់ខ្ញុំ '''គន្លឹះ ៖ ''' សូមប្រើប្រាស់ប៊ូតុង\"{{int:showpreview}}\"ដើម្បី​ធ្វើតេស្ត​សន្លឹក CSS ថ្មីរបស់អ្នក​មុននឹង​រក្សាទុកវា ។ អក្សរឡាវ គណនីរបស់លោកអ្នកត្រូវបានបង្កើតហើយ",
+ "kn": " $1{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಗಳು}} ಕಾರ್ಯ: $1 ಕೇವಲ ಇತ್ತೀಚಿನ ಪರಿಷ್ಕರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಸಂಪಾದನೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು ಸಿಂಧುವಲ್ಲದ ಪ್ರಕಾರದ ಫೀಡು. ಇತರ ವಿಶೇಷ ಪುಟಗಳು [[$1]] - [[$2]] ಪುಟಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ \"[[$1]]\" ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ವಿವರವಾದ ನೋಟ ಇಲ್ಲ. ಬೇರೆ ಸದಸ್ಯರಿಂದ ಈ-ಮೈಲ್‍ಗಳನ್ನು ಸ್ವೀಕರಿಸು ಹಳೆಯ \"ವಜಾ ಮಾಡಿ\" ಈ ಸಂಪಾದನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯ ಗೊಳಿಸಿ ಸಂಪಾದನಾ ಪುಟವನ್ನು ಮುನ್ನೋಟದೊಂದಿಗೆ ತೆರೆಯುತ್ತದೆ.\nಇಲ್ಲಿ ಸಾರಾಂಶದಲ್ಲಿ ಕಾರಣವನ್ನು ಸೇರಿಸುವ ಅನುಮತಿ ಇದೆ. ಮುಕ್ತಾಯ ಎಲ್ಲವನ್ನೂ ಅಳಿಸು ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ ಖಾಲಿ ಪುಟ (ವಿಭಾಗ $1) {{PLURAL:$1|೧ ಶೀರ್ಷಿಕೆಯನ್ನು|$1 ಶೀರ್ಷಿಕೆಗಳನ್ನು}} ಸೇರಿಸಲಾಯಿತು: ಬೇರೆ ಭಾಷೆಗಳಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರದ ಪುಟಗಳು $1 (ಹೊಸ ವಿಭಾಗ) ಸಂಪಾದಿಸಲಾಗುತ್ತಿದೆ [[:$1]] ಪುಟದ ಈ ಕೆಳಗಿನ ಬದಲಾವಣೆಗಳನ್ನು [[:$2]] ಒಳಗೆ ಸೇರ್ಪಡೆ ಮಾಡಬಹುದು.\nರೇಡಿಯೊ ಗುಂಡಿಗಳ ಸಾಲನ್ನು ಉಪಯೋಗಿಸಿ ತೋರಿಸಲಾಗಿರುವ ಕಾಲದ ಮುಂಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಮಾತ್ರ ಸೇರ್ಪಡೆ ಮಾಡಿ.\nಗಮನಿಸಿ: ಸಂಚರಣೆ ಕೊಂಡಿಗಳನ್ನು ಉಪಯೋಗಿಸಿದಲ್ಲಿ ಈ ಸಾಲು ವಸ್ತುಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗುತ್ತದೆ. $1 ({{PLURAL:$2|೧ ಪದ|$2 ಪದಗಳು}}) ಚಿತ್ರಬಿಂದು ರಚನೆ ಸಂರಕ್ಷಿಸು ಹುಡುಕು ಮರೆ ಮಾಡಿ ಬದಲಾಯಿಸಿ ಕೊಕ್ಕೆ ಸ್ಥಗಿತಗೊಳಿಸಲಾಗಿದೆ ಸಂಪಾದಿಸಿ .\nಇದು ಯಾವುದೇ ವಿವರಣೆ ನೀಡಿದರು .",
+ "kok": "",
+ "kte": "",
+ "lb": " Lëscht vun {{GENDER:|Äre}} Kontributiounen Benotzer Dës Ännerung gouf vun engem Bot gemaacht Son De Fichier $1 konnt net op $2 geréckelt ginn. Aloggen Jul. Iwwerwaachungslëscht eidelmaachen De Fichier $1 konnt net op $2 kopéiert ginn. Säiten, op denen d'maximal Gréist vun agebonnene Schablounen iwwerschratt ass Dir gesitt eng Versioun vun dëser Säit aus dem Tëschespäicher (cache), déi eventuell net méi aktuell ass. Sichen däerf seng Diskussiounssäiten net änneren Extern sichen D'Markéierung (tag) ''$1'' gëtt et schonn. D'URL muss mat http:// oder ftp:// ufänken. Verhënneren datt ageloggte Benotzer vun dëser IP-Adress aus Ännerunge maache kënnen Member vun: Geläscht Versioun vu(n) $1 (Versioun vum $4 um $5 Auer) vum $3: Skin E Fichier mam Numm \"$1\" gëtt et schonn am gedeelte Repertoire an e kann net iwwerschriwwe ginn. Benotzernumm op Lëschten a bei Ännerunge verstoppen Dir hutt rezent zevill dacks versicht Iech anzeloggen.\nWaart w.e.g. $1 ier Dir et nach eng Kéier probéiert. Feeler beim Schécke vun der E-Mail: $1",
+ "lbj": "",
+ "lhm": "",
+ "li": " Zwaal 's óchtes es 's aoves Wit fluorescerend (WW 3200 - 3700K) Botbewirkinge op mien volglies verberge Jao [URL is te lank] Wèt se zeker det se 'n gewösjdje versie ven 't bestandj \"$1\" ven $2 óm $3 wils bekieke? d'r is geine vörge lokale versie van dit bestand mit 't opgegaeve tiejdstip. Doorverwiezinge opsjone Gank Datum en momènt van digitizing Wachwaord opnuuj intype De bewerking kon neet ongedaan gemaak waere, omdat die neet besteet of is verwijderd. Betrach pazjena's mit 't veurvoogsel: Veurvoegsel Hulp bie bewirke Spórt Blokkeerlogbook Kan gebroekers oet deze {{PLURAL:$2|groep|groepe}} wisse: $1 Biedraag ven nuuj gebroekers Tusseköpske (hoogste niveau) Kopië oplajen is neet besjikbaar in dit domein. Ruumdjelik of temporeel scoop vanne media D'r sjtit niks op dien volglies. Aan volglies toeveuge Hieonger staon de $1 {{PLURAL:$1|resultaat|resultaat}}, vanaaf #$2. Sjuunsen tèks {{PLURAL:$1|Sjabloon|Sjablone}} gebroek in dees veurvertuining: Reeje veur beveiliging bewèrke blokkaasj verangere",
+ "lo": " ລາຍການໜ້າທີ່ທ່ານຕິດຕາມການປ່ຽນແປງ ມັງກອນ ໂອນໜ້າ 2 ຄັ້ງ ສະແດງ ໜ້າ ຂຶ້ນຕົ້ນດ້ວຍ: ຕຸລາ $1 Atom ຟີດ (ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ ) ໜ້ານີ້ຖືກປົກປ້ອງ. ທ່ານສາມາດເບິ່ງຊອສ. ໄຟລ໌ $1 × $2 ປິກເຊລ, ຂະໜາດໄຟລ໌: $3, MIME type: $4 ດັດແກ້ ໝົດອາຍຸ $1 (UTC) ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1 ແມ່ແບບ ມີ ບັນຊີແລ້ວບໍ? '''$1'''. ສະແດງ ຜົນການດັດແກ້ ໃນ ເວລາດັດແກ້ເທື່ອທຳອິດ ສ້າງໜ້ານີ້ ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ. ຄວາມສູງ ເບິ່ງຊອສ໌ ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ ສິງຫາ ເຊົາຕິດຕາມ ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ການດັດແກ້ຫຼ້າສຸດ ກ່ຽວຂ້ອງ ປະຫວັດ ຄຳອະທິບາຍໂດຍຫຍໍ້: ສະຫຼຸບ {{PLURAL:$2|ໝວດນີ້ມີໜ້າຢູ່ພຽງໜ້າດຽວ|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້ ເຕັມ $2}} ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ {{PLURAL:$1|$1}} ຕໍ່ໄປ ດັດແກ້ ພາກ: $1 ການສ້າງບັນຊີ ຈາກ IP ນີ້ ($1) ໄດ້ຖືກຫ້າມ ໂດຍ [[User:$3|$3]].\n\nເຫດຜົນ ໃຫ້ໄວ້ ໂດຍ $3 ແມ່ນ ''$2'' ບໍ່ຂີດ ໜ້າບໍ່ມີໜ້າໃດເຊື່ອມຕໍ່ຫາ ບັນທຶກ ການລຶບ ນີ້ແມ່ນ ບັນທຶກການສ້າງ ບັນຊີຜູ້ໃຊ້ໃໝ່ ການດັດແກ້ ໝ້າພິເສດ ພວມດັດແກ້ $1 ໜ້ານີ້ ບໍ່ສາມາດສ້າງ ບັນຊີ ໄດ້ ເນື້ອໃນ ບໍ່ສະແດງເນື້ອໃນຂອງບົດຄວາມ ຢູ່ທາງລຸ່ມ ສ່ວນຕ່າງ",
+ "loy": "",
+ "luk": "",
+ "lya": "",
+ "mai": " कोनो और विकि सँ आयात करी {{जालस्थल}} ई-पत्र संकेत सत्यापन नवीनतम सम्पादन तिथि दुखी छी, वितरक सभ एखन व्यस्त अछि।\nबड्ड बेशी लोक ऐ पन्नाकेँ देखबामे लागल छथि।\nऐ पन्नाकेँ फेरसँ देखबा लेल कनी बिलमू। \n$1 दोसर कारण दोसर कारण कोनो पुरान संशोधन नै भेटल। प्रयोक्तानाम इ ट्यागसभ हटाबी: \"$1\" केँ नै ब्याकअप क सकल। रद्द करु विषयमे निकालू {{PLURAL:$2|वर्ग|वर्ग}}: $1 अस्वीकृत ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ '''टिप्पणी:''' संरक्षणक बाद, अहाँकेँ परिवर्तन देखबा लेल अपन गवेषकक उपस्मृतिकेँ हटबए पड़त।\n''' मोजिल्ला/ फायरफॉक्स/ सफारी:''' दाबि कऽ राखू ''शिफ्ट'' केँ ''पुनर्भारित'' क्लिक करबाक समए, वा दाबू चाहे ''Ctrl-F5'' वा ''Ctrl-R'' (''Command-R'' मैकिनटोशपर);\n'''कन्करर: ''' क्लिक करू ''पुनर्भारित करू'' वा दाबू''F5'';\n'''ओपेरा:''' उपस्मृति खतम करू ''Tools → Preferences'';\n'''इन्टरनेट एक्सप्लोरर:''' दाबि कऽ राखू ''Ctrl'' क्लिक करबा काल ''नवीकरण,'' वा दाबू ''Ctrl-F5'' । $1 {{GENDER:$2|आयात केल गेल}} $3 कोनो और विकि सँ $1 {{PLURAL:$1|खाका |खाका सभ }} एकटा अबूझ भ्रम आएल मदति हटाउ सभसँ बेसी लागिबला पन्ना सभ दिसंबर",
+ "mak": "",
+ "mi": " Mo {{SITENAME}} hunaia Whārangi motuhake Rāhina Ngā hononga mai Huringa pūtahi Whakaaturia Rāapa Mahuru Hōngongoi Poutū-te-rangi Hau Kāinga Paenga-whāwhā Tiro rerekētanga Here-turi-kōkā Kōrerohia Rārangi kōrero Haratua Haere Tipihaere Pānui pūnaha Whakakore Haere papa tauira Hunaia Tomokanga hapori Project:Kōrero Kōrero nehe Kawepūrongo Wāhanga Pipiri Tāia Rāmere Hononga toitū Kōrerorero Hui-tanguru Kōwhiringa Huarahi Whakamārama Rārangi mātaki Kohi-tātea Rārangi mātaki Project:Tikanga tūmataiti Reo kē Huringa pūtahi - pouaka utauta Whiringa-ā-nuku Āwhina Hakihea Rātū Rāpare Project:Tomokanga hapori Huringa hou Tuku atu Rātapu kāti te mātaki Whiringa-ā-rangi whakakite Tiaki Whakatika tangohia Nekehia Hau Kāinga Ka whakaaturia i raro iho nei ngā '''huringa hou''' o tēnei Wiki. Rerekētanga pū tahi Whakarere Mātaki tuhi pānui Ngā whārangi katoa Tuhinga/kaituhi Tikanga tūmataiti Rāhoroi Whakangungua Rapua",
+ "ml": " കാണുക ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം. '''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.\n\n{{PLURAL:$2|ഒരു വിളി|$2 വിളികൾ}} മാത്രമുണ്ടാകേണ്ടയിടത്ത്, ഇപ്പോൾ {{PLURAL:$1|ഒരു വിളി|$1 വിളികൾ}} ഉണ്ട്. പ്രമാണത്തിന്റെ പേര്: ഈ താളിന്റെ പതിപ്പുകൾ '''മായ്ച്ചിരിക്കുന്നു'''.\n\nതാങ്കൾക്ക് അവ കാണാവുന്നതാണ്; കൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] ഉണ്ട്. പുറകോട്ട് കൊളുത്തുകൾ ഒരു അനുബന്ധം നിർവ്വചിച്ചിരിക്കുന്നത് പ്രകാരം കളർ സ്പേസ് ഈ താളിന്റെ നാൾവഴി ലയിപ്പിക്കുക പ്രമാണത്തിന്റെ പേര് വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ തിരുത്ത് മുമ്പേ തന്നെ ഒഴിവാക്കിയതായി കാണുന്നു. താളുകൾ സം‌യോജിപ്പിച്ചതിന്റെ രേഖകൾ തന്നിരിക്കുന്ന സമയത്തിനുള്ളിൽ ഇതുമായി പൊരുത്തപ്പെടുന്ന മാറ്റങ്ങൾ ഒന്നുമില്ല. പകർപ്പവകാശത്തിന്റെ സ്ഥിതി: അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ. ഔട്ട്പുട്ട് ആന്തരിക പിഴവ്: അപ്‌ലോഡ് ഘടകം സജ്ജമാക്കിയിട്ടില്ല. താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ പ്രവേശിച്ചിരിക്കുമ്പോൾ എപ്പോഴും സുരക്ഷിതമായ കണൿഷൻ ഉപയോഗിക്കുക മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് നടത്തിയ തിരുത്തലുകൾ {{GENDER:$1|[[User:$1|$1]]}} സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു",
+ "mr": " वैयक्तिक साधने प्रकल्प पान पहा माफ करा,हे पान अलीकडेच (मागील २४ तासात) वगळल्या गेले आहे.हा पानाच्या वगळण्याचा व हलविण्याचा लॉग संदर्भासाठी खाली दिला आहे. तुम्ही या पानाची सुरक्षा पातळी बदलू शकत नाही कारण तुम्हाला तसे करण्याची परवानगी नाही. अज्ञात झलक प्रगत पर्याय विपत्र अवरूद्ध केले ({{GENDER:$1|$1}} द्वारे $2 ला $3 वाजता) मापन अचूकता सुस्पष्ट लेखकांची सध्या असलेली संख्या {{PLURAL:$1|एक वगळलेले संपादन|$1 वगळलेली संपादने}} पहा. \"$1\" ला मोकळे करता आले नाही;ते कुलूपबंद नाही. एकूण संपादने सनोंद-प्रवेश करा जा एकही सदस्य सापडला नाही. {{SITENAME}} वरील अनामी {{PLURAL:$2|सदस्य|सदस्य}} $1 विशेष पृष्ठ चित्राचे / फोटोचे सामान्य नाव बदल सुचीवर कसे दिसेल रूपरेषा खालीलप्रमाणे आहे:\n\nफक्त सूचीमधील संचिका (ज्यांच्यापुढे * हे चिन्ह आहे, अशा ओळी) लक्षात घेतल्या आहेत. ओळीवरील पहिला दुवा हा चुकीच्या संचिकेचा असल्याची खात्री करा.\nत्याच ओळीवरील पुढील दुवे हे अपवाद मानावेत, अर्थात ती अशी पाने आहेत, ज्यांत ही संचिका मिळू शकते. वाईट ($1) वगळण्याची क्रिया रद्द करा प्रकाश दर्जा A वगळलेला इतिहास प्रत्येक पानासाठी योगदात्यांच्या पूर्ण सूचीचा(यादीचा) समावेश करावा",
+ "ms": " Dibalikkan secara menegak Project:Hal semasa Semakan semasa Lain-lain (nyatakan imbangan) '''Ingat bahawa anda hanya menguji/melihat pralihat JavaScript anda, ia belum lagi disimpan!''' Fail import tidak dapat dimuat naik kerana melebihi had muat naik yang dibenarkan. $1 hari E-mel: Nisbah zum digital Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan. Fungsi img_auth.php ialah mengoutput fail-fail daripada wiki peribadi.\nWiki ini telah dikonfigurasikan sebagai wiki awam.\nUntuk keselamatan optimum, img_auth.php telah dilumpuhkan. Lihat laman pengguna Ralat log masuk Dihapuskan untuk membuka laluan untuk pemindahan dari \"[[$1]]\" mencari laman-laman yang telah dihapuskan Birokrat $1 telah {{GENDER:$2|menyekat}} {{GENDER:$4|$3}} selama $5 $6 Tajuk ringkas Nyahsekat pengguna Ralat pertanyaan pangkalan data telah terjadi. Terdapat beberapa masalah dengan input anda \"$1\" sedang disalurkan. Tarikh dan waktu pendigitan Maaf, laman ini baru-baru sahaja dihapuskan (dalam 24 jam yang lepas).\nLog penghapusan dan pemindahan untuk laman ini dinyatakan di bawah sebagai rujukan.",
+ "muk": "",
+ "mul": "",
+ "my": " စာမျက်နှာ \"$1\" နှင့် \"$2\" အကြား ကွဲပြားမှု ဤအမည်ဖြင့် မည်သည့်ဖိုင်မှ မရှိပါ။ သိုရာတွင် ယင်းကို [$1 upload တင်]နိုင်သည်။ မူပိုင်ခွင့် အခြေအနေ - စီမံခန့်ခွဲသူများသာ {{GENDER:|သင်၏ အသုံးပြုသူ}} စာမျက်နှာ ဖိုင်စာမျက်နှာကိုကြည့်ရန် ဤစာမျက်နှာတွင် ဝီကီ၏ လတ်တလောပြောင်းလဲမှုများကို နောက်ကြောင်းခံလိုက်ရန် ဗားရှင်း နေ ခေါင်းစဉ်များအား အလိုအလျောက် နံပါတ်စဉ်ရန် $3 $2 မှစသော အပြောင်းအလဲအသစ်များကို ပြရန် ပရင့်ထုတ်ရန် အလိုရှိသော ဖိုင်များ နိုဝင်ဘာ စာမျက်နှာများကို တည်းဖြတ်ရန် စောင့်ကြည့်ခြင်းကို ရပ်တန့်ရန် စာမျက်နှာအားလုံး ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။ ($1 မှ ပြန်ညွှန်းထားသည်) အောက်တိုဘာ ဤစာမျက်နှာကို မဖျက်တော့ရန် မသတ်မှတ်ထားသော ဤကဏ္ဍသည် လက်ရှိတွင် စာမျက်နှာများ သို့မဟုတ် မီဒီယာများ မရှိပါ။ အကူအညီ စာမျက်နှာ အနောက်လောင်ဂျီကျု ဘာသာ - Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန် အသုံးပြုထားသော ဆော့ဝဲ ဖိုင်​တင်​ရန်​ စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန် လက်မှတ် ဝမ်းနည်းပါသည်။ ဤဆိုက်သည် နည်းပညာပိုင်းဆိုင်ရာ အခက်အခဲများ ကြုံတွေ့နေရပါသည်။ ← ပြီးခဲ့သော စာမျက်နှာ",
+ "nan": " Khoàⁿ chit ia̍h ê logs Tī chit--ê wiki, lí boē-tàng kái bi̍t-bé. Só͘-ū gōa-phôe kong-ke ê CSS/JavaScript Hó ah Ko·-ia̍h kàm-sī 記錄 Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té Ia̍h le̍k-sú 無提供系統服務總數的統計。 Tó-ūi liân kàu chia Chit ia̍h tī $1, $2 ū kái--koè 名空間編號 $1(毋知名)的\"$2\"文字標題袂使用。 {{PLURAL:$1|chêng|chêng $1 ê}} Iáⁿ-siōng ê miâ í-keng kái chò \"$1\". Í-keng uì lí ê kám-sī-toaⁿ soá {{PLURAL:$1|ia̍h}} cháu: Siu-kái chit ia̍h Choán-ia̍h Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3) 這个編輯抑無巡視過 Teng-ji̍p / khui sin kháu-chō Lí-iû: ''Chit-má chit ê lūi-pia̍t bô ia̍h ia̍h-sī mûi-thé.'' Tò-tńg khì $1. Chhú-siau Kî-thaⁿ--ê {{PLURAL:$2|kái-sek-tō͘ }}: $1. It Lí-iû: Ká bē tńg khì Iōng-chiá thóng-kè sò·-ba̍k Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng. {{PLURAL:$1|āu|āu $1 ê}} Sì Khu̍t-thâu-ia̍h Só·-ū ê ia̍h ($1 miâ-khong-kan) Bô chit-khoán tōng-chok Khoàⁿ lōe-iông sī: '$1' Teng-chhut kái pó-hō· Se̍h chām 開另外一个口座 Hit ê URL só͘ chí-tēng ê tōng-chok bô-hāu.\nLí khó-lêng phah m̄-tio̍h URL, ia̍h sī ji̍h tio̍h chhò-ngō͘ ê liân-kiat.\nChe mā khó-lêng sī {{SITENAME}} só͘ sú-iōng ê nńg-thé chhut būn-tê.",
+ "nb": " Side: Å låse opp databasen vil si at alle brukere igjen\nkan redigere sider, endre sine innstillinger, redigere sin\novervåkningsliste, og andre ting som krever endringer i databasen.\nBekreft at du har til hensikt å gjøre dette. merke andre brukeres redigeringer som patruljert Legg denne siden til overvåkningslisten din Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider. Antall underkategorier Slett denne taggen '''Husk at du bare forhåndsviser denne JavaScript-koden.'''\n'''Den har ikke blitt lagret ennå!''' Logg inn for å kunne se siden eller utføre denne handlingen. Fjerner fra overvåkningsliste… Databasen er nå låst Aktiver taggen Avkjenningsmetode Tegninger (vektor-bilder) Tilpasset bildebehandling Tilfeldig side innenfor kategorien Oppgi en e-postadresse for at disse funksjonene skal fungere. Vis nye filer fra og med $2 $1 Denne lista er ufullstendig. Fjern redigeringer Underkategorier Kunne ikke hente filnumre for sammenligning. En ukjent feil har oppstått Fjerne blokkering av seg selv",
+ "ne": " \"[[$2]]\" बाट \"[[$1]]\"मा सुरक्षा व्यवस्था सारियो एक्सएमएल पार्स रूख देखाउने $1 ले ट्याग $4 {{GENDER:$2|तयार गरेको छ}} $1 पंक्ति $2 , हरफ $3 (बाइट $4): $5 मिडिया तथ्याङ्कहरू यो पृष्ठ ती पृष्ठहरूको सूची दिन्छ जुन अन्य पुनर्निर्देशित पृष्ठहरू तिर पुनर्निर्देशित छ। प्रत्येक पङ्क्तिमा पहिलो र दोश्रो पुनर्निर्देशनको लिङ्कहरू, तथा दोश्रो पुनर्निर्देशनको लक्ष्य पनि छ, सामान्यत यहि \"वास्तविक\" लक्ष्यित पृष्ठ हुनेछ, र पहिलो पुनर्देशन वास्तवमा यसैको लक्षित हुनु पर्नेछ। काटिएको प्रविष्टिहरू समाधान गरिएको छ। प्रयोगकर्ता श्रृजना लग प्रवेश विन्दु युआरयलहरू योगदानकर्ताहरु त्यस गन्तव्य शिर्षकमा सार्न सकिन्न। {{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो सबैभन्दा बढि ट्रान्सक्ल्युडेड पृष्ठहरू देखाई रहेको छ{{PLURAL:$1|1 result|$1 परिणाम}} सम्म पहुँच #$2 देखि #$3 मा। उदाहरण अमान्य सामग्री डेटा डाउनलोड स्वत: स्वेत वचत *सामान्य सुरक्षाका कारणहरु\n** अत्यधिक बर्बरता\n** अत्यधिक अचाहिंदा सन्देश\n** जवाबी सम्पादन-झगडा\n** अधिकतम खोलिने पृष्ठ तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
+ "nl": " Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.\nDeze versie kan niet verborgen worden. U hebt geen rechten om bestanden te hernoemen. Cyrillisch U kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''. De verschillen tussen de geselecteerde versies van deze pagina bekijken. U hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk. Nadat u begonnen bent met uw wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina {{GENDER:$1|verwijderd}}. Bevestig dat u de pagina opnieuw wilt aanmaken. Bronnen en gegevens over een boek zoeken Ongeldige titel met naamruimte \"$2\" en tekst \"$3\" Versie door {{GENDER:$6|$2}} op $4 om $5$7 '''Let op: u test nu uw persoonlijke JavaScript.'''\n'''De pagina is niet opgeslagen!''' Tokens opnieuw instellen De pagina \"$1\" is aan uw volglijst toegevoegd. Gebeurtenissen rond het inhoudsmodel van een pagina Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
+ "oc": " Connexion Dimg $1 jorn{{PLURAL:$1||s}} Afichar Precision de la mesura Edicion dels istorics fusionables (void) Confirmacion de l’adreça de corrièr electronic anullada Africa tornar nomenar las paginas de l’utilizaire de banca. Valor imprevista : « $1 » = « $2 ». indefinit I a pas d’entresenhas d’atribucion disponiblas per aquesta pagina. Pòt levar $2 {{PLURAL:$2|gropa|gropes}} : $1 Tornar nomenar las sospaginas (fins a $1 paginas) Programa normal Opcions de telecargament {{PLURAL:$1|Lo fichièr seguent es un duplicata|Los fichièrs seguents son de duplicatas}} d'aqueste fichièr ([[Special:FileDuplicateSearch/$2|mai de detalhs]]): Còde del luòc representat &#32;e Nombre de foncions d’analisi costosas Tipe de flux invalid. pagina seguenta → Setembre Error : la modificacion a fracassat actu Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment Importar un fichièr dempuèi una adreça URL Picatz un senhal Adreça de corrièr electronic : Gujarati La modificacion qu'avètz ensajat de realizar es estada anullada per una extension.",
+ "ola": "",
+ "or": " ଇଣ୍ଟରଉଇକି ଲିଙ୍କ ପୃଷ୍ଠା ଘୁଞ୍ଚାଇବା ନିମନ୍ତେ ଏକ ବୈଧ ଲକ୍ଷସ୍ଥଳ ନୁହେଁ । ସଙ୍କଳନସବୁକୁ ମିଶାଇଦେବେ $1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ ମାନକ ଆଲୁଅ A {{SITENAME}} ସହିତ ଯୋଡ଼ା ମିଳୁଥିବା ଲଗସବୁ ।\nଆପଣ ଲଗର ପ୍ରକାର ଅନୁସାରେ ବି ସେସବୁକୁ ବାଛି ପାରିବେ । ଇଉଜରନାଆଁଟି ଛୋଟ ଓ ବଡ଼ ଅକ୍ଷର ଅନୁସାରେ ଅଲଗା ହୋଇଥାଏ, ପୃଷ୍ଠାର ନାଆଁ ସବୁ ବି ଛୋଟ ଓ ବଡ଼ ଇଂରାଜି ଅକ୍ଷର ଅନୁସାରେ ଅଲଗା ହୋଇଥାଏ । '''ଜାଣିବା କଥା:''' ଆପଣା ନୂଆ ଜାଭାସ୍କ୍ରିପ୍ଟ (JavaScript) ସାଇତିବା ଆଗରୁ \"{{int:showpreview}}\" ବ୍ୟବହାର କରି ପରଖି ନିଅନ୍ତୁ । ନିଜର ପସନ୍ଦ ସମ୍ପାଦନା କରନ୍ତୁ '''ଚେତାବନୀ:''' ଆପଣ ସଫ୍ଟୱେରର ଇଣ୍ଟରଫେସ ଲେଖା ଯୋଗାଇବା ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଉଥିବା ଏକ ପୃଷ୍ଠାର ସମ୍ପାଦନା କରୁଅଛନ୍ତି ।\nଏହି ଉଇକିପୃଷ୍ଠାର କିଛି ବି ବଦଳ ବାକି ସଭ୍ୟମାନଙ୍କ ଇଣ୍ଟରଫେସର ଦେଖଣାକୁ ପ୍ରଭାବିତ କରିବ । $1 ଗୋପନ ଭାବେ $3 ପୃଷ୍ଠାରେ {{PLURAL:$5|ସଂସ୍କରଣଟିଏର|$5 ଗୋଟି ସଂସ୍କରଣର}} ଦେଖଣା {{GENDER:$2|ବଦଳାଇଦେଲେ}}: $4 ଏହି ପୃଷ୍ଠାଟି କିଛି ଜଟିଳ ପାର୍ସ ଫଙ୍କସନ ବ୍ୟବହାର କରେ (ଯଥା #ifexist) । [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] ଦେଖନ୍ତୁ । ଭିତରର ଭୁଲ \"$1\" ପ୍ରକାରର ତ୍ରୁଟି ।",
+ "otb": "",
+ "pa": " ਬਾਹਰੀ ਲਿੰਕ ਖੋਜ ਹੋਰ {{PLURAL:$2|ਰੈਜ਼ੋਲਿਊਸ਼ਨ|ਰੈਜ਼ੋਲਿਊਸ਼ਨਜ਼}}: $1. ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ ਫ਼ਾਈਲ ਮੰਗਾਈ ਨਾ ਜਾ ਸਕੀ ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ‘ਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ। ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ $1 ’ਤੇ ਵਾਪਸ ਜਾਓ। ਸਭ ਤੋਂ ਵੱਧ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਫ਼ਾਈਲ ਦਾ ਨਾਂ: ਤੁਹਾਡੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਝਲਕ ਵਿਖਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਗ਼ਲਤੀ ਆ ਗਈ। ਹੋਰ ਸਮਾਂ ਨਵੀਂ ਤਬਦੀਲੀ → ਇਹਦਾ ਇਤਬਾਰੀ ਮੈਂਬਰ: ਆਪਣੀ ਤਬਦੀਲੀ ਦੀ ਝਲਕ ਵੇਖੋ, ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ! ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ ਠੀਕ-ਠਾਕ ($1) ਸੋਧਾਂ ਵਾਪਸ ਮੋੜੋ ਇਸ ਬਾਰੇ translatewiki.net ਅਨੁਵਾਦਕ ਤੁਹਾਡਾ ਡੋਮੇਨ: ਨਵਾਂ ਸਿਰਲੇਖ: ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ: $1 ਮਿਤੀ ਨਾਲ ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ : ਚਾਹੀਦੀਆਂ ਕੈਟੇਗਰੀਆਂ ਅਣਜਾਣ ਨਾਂ-ਸਥਾਨ ਗਿਣਤੀ $1 ਅਤੇ ਲਿਖਤ $2 ਵਾਲ਼ਾ ਗ਼ਲਤ ਸਿਰਲੇਖ ਲਾਤੀਨੀ ਬੋਲੀ (ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ) ਵਰਜਨ {{PLURAL:$1|ਹਟਾਈ ਸੋਧ|$1 ਹਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ ਝਲਕ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ। ਖੋਜ ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ ਲੁਕਵਾਂ ਫ਼ਾਈਲ ਦਾ ਸਰੋਤ ਅਗਲਾ ਸਫ਼ਾ → ਅਣਉਮੀਦਿਆ ਮੁੱਲ: \"$1\"=\"$2\"। ਬਣਾਓ ਜਦੋਂ ਮੈਂ ਅਣ-ਸਾਂਭੀਆਂ ਸੋਧਾਂ ਵਾਲਾ ਸਫ਼ਾ ਛੱਡਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰ ਦਿਉ ਵਿਕੀ ਮੂਲ ($1) ਵਰਤੋ ਕਿਰਪਾ ਕਰਕੇ ਹੇਠ ਦਿੱਤਾ ਫ਼ਾਈਲ ਵੇਰਵਾ ਬਦਲੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
+ "pal": "",
+ "peo": "",
+ "pl": " Strony bez linków wewnętrznych Uwaga: Strona, którą chcesz usunąć, ma {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}: Ktoś zmienił treść strony w trakcie Twojej edycji.\nGórne pole zawiera tekst strony aktualnie zapisany w bazie danych.\nTwoje zmiany znajdują się w dolnym polu.\nBy wprowadzić swoje zmiany, musisz zmodyfikować tekst z górnego pola.\n'''Tylko''' tekst z górnego pola zostanie zapisany w bazie, gdy wciśniesz „{{int:savearticle}}”. Poniżej znajduje się lista wszystkich stron znajdujących się w przestrzeni nazw {{ns:template}}, które nie są używane przez inne strony.\nSprawdź inne linki do szablonów, zanim usuniesz tę stronę. Ten plik znajduje się w $1 i może być używany w innych projektach.\nPoniżej znajdują się informacje ze [$2 strony opisu] tego pliku. Nazwa właściwości: marca Uwaga: Nie jesteś zalogowany. Jeśli wykonasz jakąkolwiek zmianę, Twój adres IP będzie widoczny publicznie. Jeśli [$1 zalogujesz się] lub [$2 utworzysz konto], Twoje zmiany zostaną przypisane do konta, wraz z innymi korzyściami.",
+ "pt": " Alterações relacionadas com \"$1\" Não está autorizado a marcar as suas próprias edições como edições patrulhadas. Já foi enviada um email de recuperação de palavra-passe {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-passe pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}. Não foi possível restaurar a versão do ficheiro de $1: já não existia antes da eliminação. Créditos de autoria da extensão $1 Adicionar as páginas e ficheiros que eu editar às minhas páginas vigiadas Versão de Flashpix suportada Ficheiro em falta: $1 A conta de utilizador \"$1\" não está registada. Está a ver uma versão desta página guardada na cache há pelo menos $1. $1 (página não existe) Erro desconhecido Bom ($1) Bem-vindo, $1! Informações da página Mostrar Palavra-passe anterior: Dados do utilizador Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].\nCaso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página \"[$3 $2]\", junto com o seu nome de utilizador e o navegador que está a usar.",
+ "sa": " संस्करणानि विलीनीकरोतु । मुख्यपृष्ठं गम्यताम् विशिष्टपृष्ठम् स्वस्य व्यक्तिगसूचना दृश्यताम् स्वसदस्यता प्राप्यताम् निम्नोल्लिखित{{PLURAL:$1|पृष्ठं|$1 पृष्ठानि}} वर्गेऽस्मिन् {{PLURAL:$1|अस्ति|$1 सन्ति}} \"$1\" इत्यस्माद् पुनः प्राप्तिः विभागशीर्षकाणामुपरि दक्षिणक्लिक्-करणेन विभागः सम्पाद्यताम् । तन्त्रांशः अनुस्थापितः । अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।\nनूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति: फरवरी $1 आधेयपुटानि । योजकाभिज्ञापकम् अपर्यापानुमतिकारणेन अथवा निदेशिकायाः /आधानस्य अभावात् \"$1\" सञ्चिकां लेखितुं न शक्यते । भागशः । $1 इति स्रोतपृष्ठं न विद्यते । अस्य पुटस्य अपमर्जितेतिहासम् अवलोकयतु । अयोग्यलक्ष्यस्य संस्करणम् प्रदत्तांशस्य (metadata) स्वरूपं यदा लघु भविष्यति, तदा एतस्मिन् सन्देशे आवलिकृतस्य EXIA प्रदत्तांशस्य (metadata) सूचनाः चित्रप्रदर्शनेन सह द्रष्टुं शक्यन्ते ।\nयदभावे अन्याः सूचनाः निगूढाः भविष्यन्ति ।",
+ "saz": " ꢮꢾꢒ꣄ꢒꢶ ꢔꢸꢪ꣄ꢦꢸ ꢞꢶꢱ ꢙꢹꢭꣀ ꢓꣁꢨ꣄ꢨꢶꢪ꣄-ꢓꢵꢭꢸꢔꢶꢡꣁ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢙꢹꢥ꣄ ꢲꢾꢣꢶ ꢡꢵꢫ꣄ ꢂꢱ꣄ꢒꢶ ꢨꢾꢱ꣄ꢡꢵꢬ꣄ꢣꢶ ꢂꢒ꣄ꢜꣁꢨꢬ꣄ ꢙꢥꢮꢬꢶ ꢱꢾꢥ꣄ꢪꢵꢬ꣄ꢣꢶ ꢂꢣ꣄ꢣꢶꢥ꣄ꢥꢵꢥ꣄ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢥꢵꢮ꣄ ꢮꢮ꣄ꢬꢸꢥꢵꢬ꣄ ꢥꢵꢮ꣄ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢂꢱ꣄ꢒꢶ ꢪꢵꢬ꣄ ꢱꣁ ꢩꢵꢰꣁ: ꢱꢾ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢨꢸ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢱꢾꢦ꣄ꢜꢪ꣄ꢨꢬ꣄ ꢪꢿ ꢂꢱ꣄ꢒꢶ ꢦꣁꢜ꣄ꢜꢵꢥ꣄ ꢨꢸꢣꢶꢫꢵꢬ꣄ꢣꢶ ꢚꢵꢫꢶ ꢩꢵꢰꣁ: $1 ꢨꢾ ꢍꢦ꣄ ꢎꢡꢵꢬ꣄ꢣꢶ ꢪꣁꢥ꣄ꢔꢸꢭꢵꢬ꣄ꢣꢶ ꢱꢸ ꢥꢶꢪ꣄ꢦꢶ ꢪꢴꢣꣁ ꢃꢔꢱ꣄ꢜꢸ ꢭꢾꢔꢸꢡ꣄ꢡꢵꢪ꣄ ꢪꢬ꣄ꢗꢾꢫꣁ ꢥꢮ ꢲꢸꢣꣁꢕꢵꢭ꣄ ꢏꢬ꣄ꢱꢸ ꢍꢦ꣄ꢬꢭ꣄ ꢙꢹꢥ꣄ ꢂꢒ꣄ ꢥꢵꢮꢸ ꢢꢵꢪ꣄ ꢱꣁꢪꢵꢬ꣄ꢣꢶ ꢓꢵꢭꢸꢔꢶꢡꣁ-ꢓꣁꢨ꣄ꢨꢶꢪ꣄ ꢥꣁꢒ꣄ꢒꣁ ꢪꢿ ꢥꣁꢮꣁ ꢦꣁꢜ꣄ꢜꣁ ꢮꢿꢫ꣄ ꢞꢶꢱꢪ꣄ꢨꢬ꣄ ꢣꢾꢒ꣄ꢒꢵꢞꢶ/ꢚꢵꢫꢶ ꢪꢵꢬ꣄ꢗꢸ ꢱꢾꢦ꣄ ꢲꢵꢡꢒ꣄ꢰꢬ꣄ ꢪꣁ ꢪꢬ꣄ꢗꢶ ꢲꢿꢡꢸ ꢣꢾꢒ꣄ꢒꢶꢬꢶꢫꣁ ꢙꢹꢭꣀ ꢧꢶꢨ꣄ꢬꢮꢬꢶ ꢲꢶꢖ꣄ꢔꢵꢞ꣄ ꢥꢴꢥ꣄ꢥꢶ ꢚꢵꢫ꣄ ꢎ \"$1\" ꢬꢴꢷ ꢓꢳ꣄ꢳꢶ ꢃꢮ꣄ ꢂꢱ꣄ꢒꢶ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢥꢮꢪ꣄ꢨꢬ꣄ ꢱꢵ ꢃꢔ ꢣꢾꢒ꣄ꢒꢞ꣄ꢥꢒꣁ ꢮꢾꢒ꣄ꢒꢶ ꢙꢥ ꢧꢶꢦ꣄ ꢥꣁꢮꣁ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢲꢿꢜ꣄ ꢱꢸꢒ꣄ꢬꢵꢬ꣄ꢣꢶ ꢚꢵꢫꢶ ꢣꢾꢒ꣄ꢒꢵꢞꢶ ꢭꢶꢒ꣄ꢒꢶꢥꢶ ꢱꢿꢡ꣄ꢡꢾ ꢦꣁꢜ꣄ꢜꣁ ꢓꢵꢭꢸ ꢔꢶꢡꣁ",
+ "si": " පිටුව: සැම විටම ඇතුළු වීමේදී ආරක්ෂාකාරී ජාලයක් භාවිතා කරන්න යටපත් කිරීම ගොනු ඉතිහාසය \"$1\" පරිශීලක ගිණුම ලියාපදිංචි කර නොමැත. පුරුෂ සංස්කරණයන් සිදුකර ඇති පරිශීලකයන් පමණක් පෙන්වන්න අයැද ඇති පිටු ශීර්ෂය වලංගු නොවන UTF-8 වෙත අනුක්රමය අඩංගු වේ. විස්තීරණය කරන ලද විස්තර පෙන්වන්න උදවු පිටුව නැවත සකස් කිරීමට කිසිදු ටෝකන් පත් වේ. පරිශීලක නාමය හෝ IP ලිපිනය: අනෙකුන්ගෙන් මෙන්ම පරිපාලකයන්ගෙන්ද දත්ත යටපත් කරන්න අනෙකුත් හේතුව සටහන: හේතුවෙන් තාක්ෂණික සීමාවන් නිසා, මෙවැනි එකක් ලෙස ඉහළ විභේදනයක් GIF ගොණු රූප සිඟිති සජීවිකරණ නොවේ කිරීම . විද්‍යුත්-තැපෑල වාරණය කෙරිණි {{GENDER:$1|රොබෝවරයා}} පෙර අවවාදය නොසලකා හැර කෙසේ හෝ ගොනුව සුරකින්න මෙම පිටුව කියවන්න හඳුනා නොගත් දෝෂයක් ඇතිවිය. සබැඳි ශීර්ෂය අනන්‍යාංක $1 දරණ අයිතමය වෙනස් කිරීමෙහිදී දෝෂයක් ඇතිවී ඇත: එය දත්ත ගබඩාවෙන් අස්ථානගතවී ඇත! අනෙකුත් පරිශීලකයන්ගෙන් විද්‍යුත්-තැපෑල ලැබීම සක්‍රීය කරන්න ආරෝහණ සංශෝධනයන් ප්‍රතිෂ්ඨාපනය කරන්න වෙනස් කරන ලද ගොනු විස්තරය ඉදිරිපත් කරන්න ජූනි ප්‍රාදේශීය වේලාව: මුර-නොකෙරෙන පිටු ලැයිස්තුව නරඹන්න තහවුරුකිරීමකින් තොරව, පිටුවක් සඳහා අඩවි පූර්වාපේක්‍ෂි සංචිතය (කෑෂය) විමෝචනය කරන්න",
+ "sq": " Kjo faqe speciale tregon skedat e ngarkuara së fundmi. Stampa të papërdorura Burimi i medias Gjuha $1 përfshirjet Flashi nuk u ndez redakto Një kod vërtetimi ju është dërguar më parë. Nëse sapo hapët llogarinë tuaj prisni disa minuta deri sa t'iu arrijë mesazhi përpara se të kërkoni një kod të ri. Titull i pavlefshëm në vendosjen e rezultateve: $1 Kjo adresë IP është e bllokuar aktualisht.\nBllokimi i funditë është më poshtë për referencë: Ju nuk keni leje për të redaktuar këtë faqe JavaScript, sepse ai përmban cilësimet personale tjetër user's. Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin. kohë tjetër Shënoje këtë redaktim të vogël Kjo faqe është shikuar {{PLURAL:$1|një|$1 herë}} . Jeni i/e sigurt se dëshironi të shikoni një version të grisur të skedës \"$1\" nga $2 tek $3? Zona e sensorit two-chip kolor $1 pa mbështetje të kërkimit me teskt të plotë Burimi i skedës Kodi për shtetin ku është marrë fotografia",
+ "su": "Hobbes mangaruhan sakabéh widang pangajaran moral di Inggris sarta falsafah pulitik, utamana liwat bukuna anu miboga judul \"Leviathan\".",
+ "sux": "",
+ "sv": " Version {{GENDER:$1|bekräftad användare}} Icke-kalibrerad {{GENDER:$1|byråkrat}} Skicka modifierad filbeskrivning Det är inte tillåtet att skriva över en befintlig fil. Nya sidor $1 {{PLURAL:$1|ändring|ändringar}} Ett nytt lösenord har skickats till den e-postadress som användaren \"$1\" har registrerat. När du får meddelandet, var god logga in igen. Upplösning i fokalplan x *Vanliga motiv till blockering\n** Infogar falsk information\n** Tar bort sidinnehåll\n** Länkspam till externa sajter\n** Lägger till nonsens på sidor\n** Hotfullt beteende/trakasserier\n** Missbruk av flera användarkonton\n** Oacceptabelt användarnamn Prioritet för slutare Flytta root-användarsidor HTTP-begäran avbröts. Ta bort kommentarer Fel: Redigeringen misslyckades jan Uppdateringar för den här sidan är för närvarande inaktiverade.\nData kommer i nuläget inte att uppdateras. Mall {{PLURAL:$1|Vald filversion|Valda filversioner}} av [[:$2]]: Skrivskydda denna sida '''[[Media:$1|$1]]''' har återställts till [$4 versionen från $2 kl. $3].",
+ "sw": " Onyesha mada '''Ilani''': Ukurasa huu ulifutwa ulipokwisha kuanza huuhariri! Maslahi ya binadamu Jambo lisilotegemewa: \"$1\"=\"$2\". URL batili: $1 Mada: (hana) Kiarabu kilichoongezwa Jina la ukurasa ni batili au linatumia kiambishi awali cha mradi mwingine.\nInaweza kuwa na herufi isiyoweza kutumiwa ndani ya majina ya kurasa. '''Kubadilisha uwezo wa kuona pitio hakufaulu:'''\n$1 Chanzo: Kuna mtu amesajili akaunti kwa kutumia anwani ya barua pepe yako kwenye {{SITENAME}} ($4) anaitwa \"$2\", yenye neno la siri \"$3\".\nInabidi uingie na kisha ubadilishe neno la siri lako sasa.\n\nUnaweza kupuuza ujumbe huu, endapo akaunti hii ilianzishwa kimakosa. Mwanzo Vichwa vya habari vijipange namba-vyenyewe hariri Jamii {{PLURAL:$1|inayofuata ina|zinazofuata zina}} kurasa au mafaili ya picha au sauti.\n[[Special:UnusedCategories|Jamii zisizotumiwa]] hazitandazwi hapa.\nTazama pia [[Special:WantedCategories|jamii zinazohitajika]]. ukubwa wa faili: $1, aina ya MIME: $2 Jamii zinazoungwa kuliko zote Mada ya ukurasa ulioombwa unaashiria ukurasa wa mazungumzi ambao hauko.",
+ "syc": "",
+ "ta": " புகுபதிகை அளவு IPTC காட்சியின் குறியீடு தாங்கள் குறிப்பிட்ட கோப்புக்கள் இங்கில்லை. பலநோக்கு இணைய அஞ்சல் நீட்சி வகை: பிளாஷ் பளிச்சிட்டது. பல்புள்ளி முன்நிலையாக்கு ஆம் படிம அடையாள எண் காப்பை உறுதிப்படுத்து இலக்கு ஏதேனும் ஓர் பெயர்வெளிக்கு இறக்குமதி செய்யவும்: $1 $3-ஐ வேறு விக்கியிலிருந்து {{GENDER:$2|இறக்குமதி செய்தார்}} மாற்றுக்கள்\n\nமாற்றுருவங்கள் '''நீங்கள் மட்டுமே இந்த CSS. இன் முன் தோற்றத்தை காண்கிறீர்கள் என்பதை நினைவில் கொள்ளவும்.'''\n'''இது இன்னமும் சேமிக்கப்படவில்லை!''' அறியப்படாதது பேச்சுப் பக்கங்களை தனியே கணக்கிடுவதைத் தவிர்த்து, உங்கள் கவனிப்புப் பட்டியலில் {{PLURAL:$1|$1 பக்கம் உள்ளது.|$1 பக்கங்கள் உள்ளன.}} நீங்கள் உங்கள் விருப்பத்தேர்வுகளில் செய்த மாற்றங்கள் சேமிக்கப்படவில்லை. நீங்கள் $1 இதனை அழுத்தாமல் இப்பக்கத்தை விட்டுச் சென்றால் உங்கள் விருப்பத் தேர்வுகள் புதுப்பிக்கப்படாது. அடுத்த பக்கம் தவறு: தடை இலக்கம் $1 காணப்படவில்லை. இதற்கான தடை ஏற்கனவே நீக்கப்பட்டிருக்கலாம். இக்காரணிகளுடன் காக்கப்பட்டப் தலைப்புகள் எதுவும் கிடையாது. உங்களுக்கு $1 {{PLURAL:$3|வேறொரு பயனரிடம்|$3 பயனர்களிடம்}} இருந்து உள்ளது ($2).",
+ "tcn": "",
+ "tcy": " ಡೇಟಬೇಸ್ ಮುಚ್ಚುನ ಕಾರಣೊನು ಬೊಕ್ಕೊ ನಾನೊರೊ ಅಯಿನ್ ದೆಪ್ಪುನ ಅಂದಾಜಿದ ಪೊರ್ತುನು ತೆರಿಪಾಲೆ $1 (ಈ ಪುಟೊ ನನಲ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ) ಸಹಾಯೊ ಸಮುದಾಯೊ ಪುಟೊ ಮಾಹಿತಿ ಪುಟೊ ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ \"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು ಪೆಬ್ರವರಿ ಅಡೆಂಗಾವು ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ ದಿಂಜಾವೊಡ್ಚಿ ಲಾಗಿನ್ ಆಲೆ ಪುಟೊಲೆನ್ ಕಡಪುಡ್ಲೆ ಮಾಹಿತಿ ಸ್ರಿಸ್ಟಿಸಯಿನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು $1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3 ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ \"$1\" ಫೈಲ್ ನ್ \"$2\"ಗ್ ಪುನರ್ನಾಮಕರಣ ಮಲ್ಪೆರೆ ಆಯಿಜಿ. ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ ಫೈಲ್ ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}: ಈ ಸಂದೇಸೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರೊ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲೊ ಸ್ಥಿತಿಟ್ ಅಡೆಂಗ್‍ದುಂಡು.\n*ಮಲ್ಪುಲೆ\n*ಮಾದರಿ\n*ದಿನೊ ಪೊರ್ತು ಮೂಲೊ\n*ಮಾನಾದಿಗೆದ ಸಮಯೊ\n*ಫ್‍ಸಂಖ್ಯೆ\n*ಐಎಸ್ಒ ವೇಗೊದ ರೇಟಿಂಗ್\n*ತೂಪಿನ ಜಾಗೆದ ದೂರ\n*ಕಲಾವಿದೆ\n*ಕೃತಿಸ್ವಾಮ್ಯೊ\n*ಚಿತ್ರೊ ವಿವರಣೆ\n*ಜಿಪಿಎಸ್ ಅಕ್ಷಾಂಸೊ\n*ಜಿಪಿಎಸ್ ರೇಖಾಂಸೊ\n*ಜಿಪಿಎಸ್ ಎತ್ತರೊ ಆಫ್ರಿಕ ಕಡೆತ ವಜಾ ಮಲ್ಪುಲೆ ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್) ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ $1 ನ್ ತೂವೊಡೆ? ಫೈಲ್ ಅಪ್ಲೋಡ್ ಲಾಗಿನ್ ದೋಷ",
+ "te": " మీకు ఖాతా లేదా? (కొనసాగింపు) ఈ-మెయిలు చిరునామా: అంతర్గత లింకు తాత్కాలిక సంకేతపదం: ఇంకా చేర్చు $1, పేజీ $3 ను $4 కు దారిమార్పు ద్వారా దారిమార్పును ఉంచకుండా {{GENDER:$2|తరలించారు}} ఇతర {{PLURAL:$1|నిరోధం|నిరోధాలు}} నిరవధికం అనుమతిని నిరాకరించారు ఇతర (భేదాన్ని ఇవ్వండి) జాబితాలో ఆదిపదాన్ని తీసివేయి సూర్యకాంతి ఇతర కారణం ఎక్కింపు డైరెక్టరీ ($1), వెబ్‌సర్వరు రాసేందుకు అనుకూలంగా లేదు. {{PLURAL:$2|గుంపుని|గుంపులను}} చేర్చగలరు: $1 మీ ఖాతాకు అనుబంధంగా ఉన్న గోపనీయ డేటాను చూపించే టోకెన్లను మీరు ఇక్కడ రీసెట్ చెయ్యవచ్చు.\n\nమీరా టోకెన్లను పొరపాటున ఎవరికైనా ఇచ్చి ఉన్నా, లేక మీ ఖాతా వివరాలు మరెవరికైనా తెలిసిపోయినా మీరీ పని చెయ్యాలి. ప్రస్తుత పాఠ్యం ఈ క్రింది దస్త్రాలను వాడారు కానీ అవి లేనే లేవు. ఫైలుపేరులో ఓ ఎక్స్టెన్షను లేదు. సరే {{SITENAME}} $1 పేజీని $PAGEEDITDATE న $2 {{GENDER:$2|సృష్టించారు}}, ప్రస్తుత కూర్పు కోసం $3 చూడండి. ఆసియా '''[[Media:$1|$1]]''' యొక్క $3, $2 నాటి కూర్పును తొలగించాం. ప్రస్తుతం ఈ పేజీకి తాజాకరణలని అచేతనం చేసారు.\nఇక్కడున్న డేటా కూడా ప్రస్తుతం తాజాకరించబడదు. $2 పాఠ్యపు మోడల్, పాఠ్యపు ఆకృతి $1 కి మద్దతు ఇవ్వదు",
+ "thw": "",
+ "ti": " ረብዓ ሽም ቀዳም ምስሊ ኣቐምጥ ድሉይ ድሉይ ጁን ናይ ፅሑፍ ፕሮጀክት ሰንበት ጃንዩ ናይ ኣባል ሽም: ምስሊ ሽም ኣይትግበሩ ድሉይ ድሉይ ምስሊ ጥራይ ጥቅምቲ ግንቦት ሰሉስ ድሉይ ኣማረጽቲ ትሪ ፅሑፋተይ ሜታዳታ ነሓሰ ናይ ፅሑፍ ኣባል ነዋሕቲ ፅሑፋት ኪድ ቀዳም ሚያዝያ ናይ ኣባል ሽም: ኢ-መይል: $1 {{PLURAL:$1|ባይት|ባይታት}} ዝቕጽል ፅሑፍ → (ባይታት) ታሪኽ ሲሶፓት ኣባላት ረቡዕ መጋቢት ብዛዕባ ብጠቅላላ (ሓዳስ) ሜይ ፍንጪ ሓደሽቲ ዛዕባታት ኃሙስ ናይ ፅሑፍ ታሪኽ ሓዳስ ፅሑፍ ምስሊ ኅዳር ኣቐምጥ ቋንቋ: ብሓበር: ዝቕጽል ታኅሣሥ ለካቲት ሰኑይ ሰንበ ሰኑይ ሠሉስ ታሪኽ ድሉይ ቋንቋ: $1 ናይ ቀደም ፅሑፍ ($1) ኵሎም ፅሑፋት መበገሲ ገጽ ዝቕጽል ፅሑፍ ዘቕረብኩሞ መርኣይ ብትክክል ተቀሚጡ ኣሎ። ዝቕጽል {{PLURAL:$1|$1}} ኤፕረ ፅሑፍ ኣቐምጥ ምስልታት ማርች ድሉይ ኣባል መበገሲ ገጽ ሓምለ መስከረም ምስልታት ኪድ ናይ ቀደም {{PLURAL:$1|$1}} ዓርቢ ($1 {{PLURAL:$1|ባይታት|ባይታት}}) ብዛዕባ ዊኪፒዲያ ብጠቅላላ ሓ ፌብሩ ሰነ ናይ ቀደም ፅሑፍ ዓርቢ ኢ-መይል ፅሑፍዚ ዝቕጽል ፅሑፍ ($1) ፅሑፍ ኃሙስ ድሉይ ← ናይ ቀደም ፅሑፍ",
+ "tig": "",
+ "tl": " Mga midya sa kategoryang \"$1\" Hindi matatanggap ang direksiyong e-liham na ito dahil tila mayroon itong maling anyo.\nPakipasok ang isang may mahusay na anyong adres o paki-iwang walang laman na lang ang lagayan. Isinapanahon ang iyong talaan ng mga binabantayan. Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).\nMaaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat. Walang pagbabagong nakita sa binigay na kondisyon. Mga karaniwang itinatanong (''FAQ'') Rebisyon 2 Baguhin ang password Komento iba pa Palagiang kawing Itago ang isahang mga paghadlang sa IP Petsa at oras ng paglikha ng mga dato Nag-iiwan ng mensaheng pangsistema. Paumanhin! Dumaranas ng mga kahirapang teknikal ang sityong ito. Wala sa {{SITENAME}} ang espasyo ng pangalang \"$1\". Bagong pahina Hindi isang nilalamang pahina $1 ang mga pagbabago ko patungan itong pahinang umiiral",
+ "tr": " Giriş yap Dosya değişiklik tarihi ve zamanı Sayfayı taşı değişiklik özeti gizlenmiş Böyle bir özel sayfa yok Yönlendirmeleri gizle Dosya yükle \"$1\" dosyası, \"$2\" dosyasına kopyalanamadı. $1 daha eski $1 dosyanın silinmesinde hata oldu $1 Mart E-posta adresini değiştir veya çıkar * Normal özel sayfalar.\n* Kısıtlı özel sayfalar. Yönlendirme sayfası Maksimum açıklık değeri Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısına (örneğin #ifexist) sahiptir. Lütfen bakınız: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] {{PLURAL:$1|Gizli kategori|Gizli kategoriler}} Bu sayfayı izle Hedef sayfanın geçerli bir ismi olmalı. {{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6 Mesaj Aşağıdaki dosyalar kullanılıyor ama mevcut değil. Yabancı depolardaki dosyalar, varolsalar bile gösterilebilir. Böyle yanlış pozitiflerin üstü çizilecektir. İptal Dosyaları yükle $1 değiştiriliyor (yeni bölüm) Ayır",
+ "tsk": "",
+ "ur": " آپ یہ بھی منتخب کرسکتے ہیں کہ دوسرے صارفین آپ کے تبادلۂ خیال صفحہ پر ایک ربط کے ذریعے آپ کو برقی ڈاک بھیجیں.\nجب دوسرے صارفین آپ سے رابطہ کرتے ہیں تو آپ کا برقی ڈاک کا پتہ افشا نہیں کیا جاتا۔ سانچہ دیکھئے نظرثانیاں ضم کرو عارضی پارلفظ: اس آئی پی پتہ کا تبادلۂ خیال صارف برقی پتہ غیر فعال ہے نوشتۂ محفوظ شدگی یہ دیکھنے کیلئے کہ کسی خاص وقت پر ملف کس طرح ظاہر ہوتا تھا اُس تاریخ یا وقت پر طق کیجئے۔ سادہ متن اجازہ کاری حذف شدہ صفحات میں ایسا کوئی صفحہ نہیں ملا پچھلے $1 {{PLURAL:$1|نتیجہ|نتائج}} جون آپ کا کھاتا بنائیں دو صفحات کی نظرثانیوں کا انضمام: اِس پیش منظر میں مستعمل {{PLURAL:$1|سانچہ|سانچے}}: مطالعہ رجوع مکرر تخلیق کر دیا گیا۔ صفیں: آپ کی تحریر گمنام صارفین حالیہ {{PLURAL:$1|شرکت کرنے والا|شرکت کرنے والے}} خارج ہوجائیں {{PLURAL:$1|$1ہفتہ| $1 ہفتے}} خودساختہ JS صفحہ میرے ترمیم شدہ صفحات اور فائلوں کو میری زیر نظر فہرست میں شامل کریں تخلیق کم نظرِ ثانی شدہ مضامین حذف نوشتۂ منتقلی کوئی بھی منتخب وجہ فنکشن: $ 1 صفحہ: جمعہ {{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔ پوشیدہ زمرہ جات",
+ "wa": " Bloker on no d' uzeu, tot catchant s' no ås ôtes [[$1]] displaecî viè [[$2]] Tecse di tite Sorlon l' betchete: Mi copinaedje djanvî djournås Catchî Sourdant nén cnoxhou pol ristitchaedje Vos avoz des noveas messaedjes so $1 Voste adresse emile a stî acertinêye. Ene råjhon diferinne ou di pus: Prévey l' årtike å dzeu del boesse d' aspougnaedje on depot pårtaedjî Disfacer ôtes loyéns Rivni al pådje d' eberwetaedje. Mimbe implicite di: Èn nén mostrer les categorijhaedjes des pådjes Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}. Sitatistikes des uzeus Marké come ricoridjî Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints. dif. Mimbe di: S' i vs plait ricopyîz l' fitchî foû do sourdant wiki avou l' [[Special:Export|usteye di rcopiaedje foû]].\nEt s' el schaper so voste éndjole, et poy li ristitchî droci. Imådjete Cisse modêye ci del pådje a stî '''disfacêye'''.\nVos ploz vey les ca et les ma sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].",
+ "xct": "",
+ "yi": " הייך אינערלעכער פעלער $1 {{PLURAL:$1|סעקונדע|סעקונדעס}} אויסגעשטעלטע ארגאניזאציע דער געזוכטער IP אַדרעס אָדער באַניצער נאמען איז ניט פֿאַרשפאַרט. GPS דאטע אימפארטירן בלעטער פֿון אַן אַנדער וויקי באהאלטן ציל און פאראמעטערס זײַט מבטל ווערסיע $1 פון א באהאלטענעם באניצער דער געזוכטער בלאט־קעפל אנטהאלט אומגילטיקע צייכענען: \"$1\". אוועקגענומען באגרעניצונגען פאר סיסאפן אַנולירן ספעם באשיצונג פילטער עס זענען פֿאַראַן פּראָבלעמען מיט א טייל פון ​​אייער אַרייַנוואַרג בלאט גרייס געענדערט מיט דער צאל בייטן הייך צופֿעליגער אַרטיקל ספעציעלע בלעטער אנדער אורזאך ענדיגן אויפֿפאַסן בלאט אינהאלט שפראך רעדאַקטירן ארײַנלאגירן / שאַפֿן קאנטע מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע. דער טיפ טעקע איז געאַסרט בלאט נומער א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס. (באשיצט) באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען",
+ "zau": ""
}
diff --git a/MLEB/UniversalLanguageSelector/extension.json b/MLEB/UniversalLanguageSelector/extension.json
index 5c8d8532..10a9e481 100644
--- a/MLEB/UniversalLanguageSelector/extension.json
+++ b/MLEB/UniversalLanguageSelector/extension.json
@@ -1,6 +1,6 @@
{
"name": "UniversalLanguageSelector",
- "version": "2020-07-20 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "2021-06-01 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"author": [
"Alolita Sharma",
"Amir Aharoni",
@@ -17,14 +17,13 @@
"descriptionmsg": "uls-desc",
"license-name": "GPL-2.0-or-later OR MIT",
"requires": {
- "MediaWiki": ">= 1.33.0"
+ "MediaWiki": ">= 1.34.0"
},
"Hooks": {
"BeforePageDisplay": "UniversalLanguageSelectorHooks::addModules",
"EnterMobileMode": "UniversalLanguageSelectorHooks::onEnterMobileMode",
"GetBetaFeaturePreferences": "UniversalLanguageSelectorHooks::onGetBetaFeaturePreferences",
"GetPreferences": "UniversalLanguageSelectorHooks::onGetPreferences",
- "LocalUserCreated": "UniversalLanguageSelectorHooks::onLocalUserCreated",
"MakeGlobalVariablesScript": "UniversalLanguageSelectorHooks::addVariables",
"PersonalUrls": "UniversalLanguageSelectorHooks::addPersonalBarTrigger",
"ResourceLoaderGetConfigVars": "UniversalLanguageSelectorHooks::addConfig",
@@ -95,10 +94,6 @@
"description": "The location and the form of the language selection trigger. The possible values are: (a) \"personal\"- as a link near the username or the log in link in the personal toolbar (default). (b) \"interlanguage\": as an icon near the header of the list of interlanguage links in the sidebar.",
"value": "personal"
},
- "ULSEventLogging": {
- "description": "Whether to use EventLogging. The EventLogging extension must be installed if this option is enabled. @since 2013.06",
- "value": false
- },
"ULSImeSelectors": {
"description": "Array of jQuery selectors of elements on which IME should be enabled. @since 2013.11",
"value": [
@@ -130,14 +125,6 @@
"ULSCompactLanguageLinksBetaFeature": {
"description": "Set compact interlanguage links as beta feature or not. If set false, compact interlanguage links will be available by default to all users.",
"value": true
- },
- "ULSCompactLinksForNewAccounts": {
- "description": "Enable compact interlanguage links for new user accounts.",
- "value": false
- },
- "ULSCompactLinksEnableAnon": {
- "description": "Enable compact interlanguage links for anonymous users.",
- "value": false
}
},
"callback": "UniversalLanguageSelectorHooks::setVersionConstant",
@@ -148,7 +135,6 @@
"mobile"
],
"scripts": [
- "js/ext.uls.eventlogger.js",
"js/ext.uls.common.js"
],
"styles": "css/ext.uls.less",
@@ -167,13 +153,15 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.compactlinks": {
- "scripts": "js/ext.uls.compactlinks.js",
+ "packageFiles": [
+ "js/ext.uls.compactlinks.js"
+ ],
"styles": "css/ext.uls.compactlinks.less",
"dependencies": [
"mediawiki.jqueryMsg",
"mediawiki.language",
- "mediawiki.ui.button",
- "ext.uls.init"
+ "ext.uls.common",
+ "mediawiki.ui.button"
],
"messages": [
"ext-uls-compact-link-count",
@@ -184,13 +172,22 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.displaysettings": {
- "scripts": "js/ext.uls.displaysettings.js",
- "styles": "css/ext.uls.displaysettings.less",
+ "scripts": [
+ "js/ext.uls.inputsettings.js",
+ "js/ext.uls.displaysettings.js"
+ ],
+ "styles": [
+ "css/ext.uls.inputsettings.less",
+ "css/ext.uls.displaysettings.less"
+ ],
"dependencies": [
+ "ext.uls.ime",
+ "jquery.ime",
"ext.uls.languagesettings",
"ext.uls.mediawiki",
"ext.uls.webfonts",
"mediawiki.api",
+ "mediawiki.ui.radio",
"mediawiki.ui.checkbox",
"mediawiki.ui.button",
"mediawiki.user"
@@ -219,33 +216,17 @@
"localBasePath": "resources",
"remoteExtPath": "UniversalLanguageSelector/resources"
},
- "ext.uls.init": {
+ "ext.uls.interface": {
"targets": [
- "desktop"
+ "desktop",
+ "mobile"
],
- "dependencies": [
- "ext.uls.common"
- ]
- },
- "ext.uls.inputsettings": {
- "scripts": "js/ext.uls.inputsettings.js",
- "styles": "css/ext.uls.inputsettings.less",
- "dependencies": [
- "ext.uls.ime",
- "ext.uls.languagesettings",
- "ext.uls.mediawiki",
- "jquery.ime",
- "mediawiki.ui.button",
- "mediawiki.ui.radio"
+ "packageFiles": [
+ "js/ext.uls.interface.js",
+ "js/ext.uls.launch.js"
],
- "localBasePath": "resources",
- "remoteExtPath": "UniversalLanguageSelector/resources"
- },
- "ext.uls.interface": {
- "scripts": "js/ext.uls.interface.js",
"styles": "css/ext.uls.interface.less",
"dependencies": [
- "ext.uls.common",
"mediawiki.jqueryMsg",
"mediawiki.storage",
"mediawiki.user",
@@ -261,6 +242,10 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.interlanguage": {
+ "targets": [
+ "desktop",
+ "mobile"
+ ],
"styles": "css/ext.uls.interlanguage.less",
"localBasePath": "resources",
"remoteExtPath": "UniversalLanguageSelector/resources"
@@ -291,6 +276,7 @@
"ext.uls.languagenames",
"ext.uls.messages",
"jquery.uls",
+ "ext.uls.webfonts",
"jquery.uls.grid",
"mediawiki.util"
],
@@ -304,10 +290,15 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.preferences": {
+ "targets": [
+ "desktop",
+ "mobile"
+ ],
"scripts": "js/ext.uls.preferences.js",
"dependencies": [
+ "mediawiki.api",
"mediawiki.user",
- "mediawiki.api"
+ "mediawiki.storage"
],
"localBasePath": "resources",
"remoteExtPath": "UniversalLanguageSelector/resources"
@@ -318,6 +309,10 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.pt": {
+ "targets": [
+ "desktop",
+ "mobile"
+ ],
"styles": "css/ext.uls.pt.less",
"localBasePath": "resources",
"skinStyles": {
@@ -326,9 +321,12 @@
"remoteExtPath": "UniversalLanguageSelector/resources"
},
"ext.uls.webfonts": {
+ "targets": [
+ "desktop",
+ "mobile"
+ ],
"scripts": "js/ext.uls.webfonts.js",
"dependencies": [
- "ext.uls.common",
"ext.uls.preferences",
"jquery.client"
],
@@ -436,16 +434,9 @@
],
"dependencies": [
"jquery.uls",
- "ext.uls.init",
+ "ext.uls.common",
"ext.uls.preferences"
]
},
- "attributes": {
- "EventLogging": {
- "Schemas": {
- "UniversalLanguageSelector": 17799034
- }
- }
- },
"manifest_version": 2
} \ No newline at end of file
diff --git a/MLEB/UniversalLanguageSelector/i18n/alt.json b/MLEB/UniversalLanguageSelector/i18n/alt.json
index 3c0e53f6..eb68d9fb 100644
--- a/MLEB/UniversalLanguageSelector/i18n/alt.json
+++ b/MLEB/UniversalLanguageSelector/i18n/alt.json
@@ -1,12 +1,14 @@
{
"@metadata": {
"authors": [
- "Altai uul"
+ "Altai uul",
+ "Батыр Комдошев"
]
},
"ext-uls-select-language-settings-icon-tooltip": "Тилдиҥ јазалталары",
"ext-uls-undo-language-tooltip-text": "$1 тилдеҥ тил солынды",
"ext-uls-language-settings-title": "Тилдиҥ јазалталары",
"ext-uls-language-settings-apply": "Јазалталарды бӱдӱрер",
- "ext-uls-language-settings-cancel": "Токтоду"
+ "ext-uls-language-settings-cancel": "Токтоду",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Бирдеҥ кӧп|$1 кӧп}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/an.json b/MLEB/UniversalLanguageSelector/i18n/an.json
index cba4d814..8309d2fd 100644
--- a/MLEB/UniversalLanguageSelector/i18n/an.json
+++ b/MLEB/UniversalLanguageSelector/i18n/an.json
@@ -2,9 +2,11 @@
"@metadata": {
"authors": [
"Fitoschido",
+ "Willtron",
"Xð"
]
},
"uls-plang-title-languages": "Idiomas",
- "jquery-ime-help": "Aduya"
+ "jquery-ime-help": "Aduya",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Uno más|$1 más}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ang.json b/MLEB/UniversalLanguageSelector/i18n/ang.json
index bf1f9a60..deac57b3 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ang.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ang.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Gott wisst",
+ "Heahwrita",
"Xð"
]
},
@@ -20,7 +21,7 @@
"ext-uls-display-settings-font-settings": "Stæfcynna setednessa",
"ext-uls-display-settings-ui-language": "Īwunge sprǣc",
"ext-uls-display-settings-anon-label": "Īwunge sprǣc:",
- "ext-uls-display-settings-anon-same-as-content": "Englisc (gelīc þǣre innunge)",
+ "ext-uls-display-settings-anon-same-as-content": "$1 (gelic þære innunge)",
"ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Inmelda]] to cēosenne ōðre sprǣce on getalum.",
"ext-uls-webfonts-select-for": "Cēos stæfcynn for $1",
"ext-uls-webfonts-select-for-ui-info": "Stæfcynn þe bēo gebrocen on gewealdes andwlitan",
diff --git a/MLEB/UniversalLanguageSelector/i18n/api/bn.json b/MLEB/UniversalLanguageSelector/i18n/api/bn.json
index f75633a2..b2cc8af6 100644
--- a/MLEB/UniversalLanguageSelector/i18n/api/bn.json
+++ b/MLEB/UniversalLanguageSelector/i18n/api/bn.json
@@ -3,17 +3,24 @@
"authors": [
"Aftabuzzaman",
"Nasir8891",
+ "Tanayb",
"আফতাবুজ্জামান"
]
},
- "apihelp-languagesearch-description": "যে কোনো স্ক্রিপ্টে ভাষার নাম অনুসন্ধান করুন।",
+ "apihelp-languagesearch-description": "যে কোনো লিপিতে ভাষার নাম অনুসন্ধান করুন।",
+ "apihelp-languagesearch-summary": "যে কোনো লিপিতে ভাষার নাম অনুসন্ধান করুন।",
"apihelp-languagesearch-param-search": "বাক্য অনুসন্ধান।",
"apihelp-languagesearch-param-typos": "বাক্য অনুসন্ধানে গ্রহনযোগ্য বানান ভুলের সংখ্যা ।",
"apihelp-languagesearch-example-1": "\"Te\" এর জন্য অনুসন্ধান",
"apihelp-languagesearch-example-2": "\"ഫി\" এর জন্য অনুসন্ধান",
"apihelp-languagesearch-example-3": "\"ഫി\" এর জন্য অনুসন্ধান, একটি বানান ভুল গ্রহনযোগ্য",
- "apihelp-ulslocalization-description": "ইউএলএস এর এই ভাষায় ব্যবহার করুন।",
+ "apihelp-ulslocalization-description": "প্রদত্ত ভাষায় ইউএলএসের স্থানীয়করণ পান।",
+ "apihelp-ulslocalization-summary": "প্রদত্ত ভাষায় ইউএলএসের স্থানীয়করণ পান।",
"apihelp-ulslocalization-param-language": "ভাষা কোড।",
"apihelp-ulslocalization-example-1": "তামিল ভাষায় ব্যবহার",
- "apihelp-ulslocalization-example-2": "হিন্দি ভাষায় ব্যবহার"
+ "apihelp-ulslocalization-example-2": "হিন্দি ভাষায় ব্যবহার",
+ "apihelp-ulssetlang-description": "ব্যবহারকারীর পছন্দের ইন্টারফেস ভাষা হালনাগাদ করুন।",
+ "apihelp-ulssetlang-summary": "ব্যবহারকারীর পছন্দের ইন্টারফেস ভাষা হালনাগাদ করুন।",
+ "apihelp-ulssetlang-param-languagecode": "পছন্দসই ভাষা কোড।",
+ "apierror-ulssetlang-anon-notallowed": "বেনামী ব্যবহারকারীদের ইন্টারফেসের ভাষা পরিবর্তন করার অনুমতি নেই।"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/api/lv.json b/MLEB/UniversalLanguageSelector/i18n/api/lv.json
index 6db7e345..2fadced8 100644
--- a/MLEB/UniversalLanguageSelector/i18n/api/lv.json
+++ b/MLEB/UniversalLanguageSelector/i18n/api/lv.json
@@ -4,5 +4,16 @@
"Papuass"
]
},
- "apihelp-ulslocalization-param-language": "Valodas kods."
+ "apihelp-languagesearch-description": "Meklē valodu nosaukumus jebkurā rakstībā.",
+ "apihelp-languagesearch-summary": "Meklē valodu nosaukumus jebkurā rakstībā.",
+ "apihelp-languagesearch-example-1": "Meklēt \"Te\"",
+ "apihelp-languagesearch-example-2": "Meklēt \"ഫി\"",
+ "apihelp-languagesearch-example-3": "Meklēt \"ഫി\", atļaujot vienu kļūdu",
+ "apihelp-ulslocalization-param-language": "Valodas kods.",
+ "apihelp-ulslocalization-example-1": "Iegūt tamilu lokalizāciju",
+ "apihelp-ulslocalization-example-2": "Iegūt hindi lokalizāciju",
+ "apihelp-ulssetlang-description": "Mainīt dalībnieka vēlamo saskarnes valodu.",
+ "apihelp-ulssetlang-summary": "Mainīt dalībnieka vēlamo saskarnes valodu.",
+ "apihelp-ulssetlang-param-languagecode": "Vēlamās valodas kods.",
+ "apierror-ulssetlang-anon-notallowed": "Anonīmiem dalībniekiem nav atļauts mainīt saskarnes valodu."
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/api/pt-br.json b/MLEB/UniversalLanguageSelector/i18n/api/pt-br.json
index f7b318d4..f3a1242a 100644
--- a/MLEB/UniversalLanguageSelector/i18n/api/pt-br.json
+++ b/MLEB/UniversalLanguageSelector/i18n/api/pt-br.json
@@ -3,6 +3,7 @@
"authors": [
"Dianakc",
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Felipe L. Ewald"
]
},
diff --git a/MLEB/UniversalLanguageSelector/i18n/api/ro.json b/MLEB/UniversalLanguageSelector/i18n/api/ro.json
new file mode 100644
index 00000000..e11216fd
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/api/ro.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "NGC 54"
+ ]
+ },
+ "apihelp-languagesearch-description": "Căutați după nume de limbi în orice script.",
+ "apihelp-languagesearch-summary": "Căutați după nume de limbi în orice script.",
+ "apihelp-languagesearch-param-search": "Șir de căutare.",
+ "apihelp-languagesearch-param-typos": "Numărul de greșeli de scriere permise în șirul de căutare.",
+ "apihelp-languagesearch-example-1": "Căutați după „Te”",
+ "apihelp-languagesearch-example-2": "Căutați după „ഫി”",
+ "apihelp-languagesearch-example-3": "Căutați după „ഫി”, permițând o greșeală de scriere",
+ "apihelp-ulslocalization-description": "Obțineți localizare extensiei ULS în limba dată.",
+ "apihelp-ulslocalization-summary": "Obțineți localizare extensiei ULS în limba dată.",
+ "apihelp-ulslocalization-param-language": "Codul limbii.",
+ "apihelp-ulslocalization-example-1": "Obțineți localizarea în tamilă",
+ "apihelp-ulslocalization-example-2": "Obțineți localizarea în hindi",
+ "apihelp-ulssetlang-description": "Actualizează limba preferată a interfeței a utilizatorului.",
+ "apihelp-ulssetlang-summary": "Actualizează limba preferată a interfeței a utilizatorului.",
+ "apihelp-ulssetlang-param-languagecode": "Codul limbii preferate.",
+ "apierror-ulssetlang-anon-notallowed": "Utilizatorii anonimi nu au voie să schimbe limba interfeței."
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/arz.json b/MLEB/UniversalLanguageSelector/i18n/arz.json
index 5c71f4c2..cc453c14 100644
--- a/MLEB/UniversalLanguageSelector/i18n/arz.json
+++ b/MLEB/UniversalLanguageSelector/i18n/arz.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Ghaly",
"Xð"
]
},
- "uls-plang-title-languages": "اللغات"
+ "uls-plang-title-languages": "اللغات",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|لينك|$1 اكتر}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/as.json b/MLEB/UniversalLanguageSelector/i18n/as.json
index 6b2a06de..3067e0e6 100644
--- a/MLEB/UniversalLanguageSelector/i18n/as.json
+++ b/MLEB/UniversalLanguageSelector/i18n/as.json
@@ -8,5 +8,6 @@
"uls-desc": "ব্যৱহাৰকাৰীক ভাষা নিৰ্বাচন কৰিবলৈ আৰু ভাষাৰ ছেটিং সলাবলৈ বিভিন্ন উপায় দিয়ে",
"uls-plang-title-languages": "ভাষাসমূহ",
"ext-uls-select-language-settings-icon-tooltip": "ভাষাৰ ছেটিংসমূহ",
- "ext-uls-language-settings-preferences-link": "অধিক ভাষাৰ ছেটিংসমূহ"
+ "ext-uls-language-settings-preferences-link": "অধিক ভাষাৰ ছেটিংসমূহ",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|এটা অধিক|$1টা অধিক}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ban.json b/MLEB/UniversalLanguageSelector/i18n/ban.json
index 7ae929a2..30e1b4c0 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ban.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ban.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Chinamoonroll",
"NoiX180"
]
},
@@ -10,5 +11,6 @@
"ext-uls-webfonts-settings-info-link": "Pidarta lianan",
"jquery-ime-other-languages": "Basa tiosan",
"jquery-ime-help": "Wantuan",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Asiki malih|$1 malih}}",
"prefs-languages": "Basa"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bbc-latn.json b/MLEB/UniversalLanguageSelector/i18n/bbc-latn.json
new file mode 100644
index 00000000..04f4cf5e
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/bbc-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Salomo Christian Hutajulu"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Sada nai|$1 nai}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bci.json b/MLEB/UniversalLanguageSelector/i18n/bci.json
new file mode 100644
index 00000000..5181a4fa
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/bci.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kjeanclaude"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Oukassou|$1}} koun"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bcl.json b/MLEB/UniversalLanguageSelector/i18n/bcl.json
index 92a2fa7f..29739925 100644
--- a/MLEB/UniversalLanguageSelector/i18n/bcl.json
+++ b/MLEB/UniversalLanguageSelector/i18n/bcl.json
@@ -2,8 +2,10 @@
"@metadata": {
"authors": [
"Geopoet",
+ "Kunokuno",
"Xð"
]
},
- "uls-plang-title-languages": "Mga Lengguwahe"
+ "uls-plang-title-languages": "Mga Lengguwahe",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Saro pa|$1 saro pa}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bdr.json b/MLEB/UniversalLanguageSelector/i18n/bdr.json
new file mode 100644
index 00000000..cd790c17
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/bdr.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tofeiku"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Dikau' lagi|$1 lagi}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bjn.json b/MLEB/UniversalLanguageSelector/i18n/bjn.json
index b6856ea2..96506e36 100644
--- a/MLEB/UniversalLanguageSelector/i18n/bjn.json
+++ b/MLEB/UniversalLanguageSelector/i18n/bjn.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Mnam23",
"Xð"
]
},
- "uls-plang-title-languages": "Bahasa"
+ "uls-plang-title-languages": "Bahasa",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Sabuting lagi|$1 lagi}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bn.json b/MLEB/UniversalLanguageSelector/i18n/bn.json
index 95fd1dad..e9fa965d 100644
--- a/MLEB/UniversalLanguageSelector/i18n/bn.json
+++ b/MLEB/UniversalLanguageSelector/i18n/bn.json
@@ -5,6 +5,7 @@
"Aftabuzzaman",
"Bellayet",
"Nasir8891",
+ "Tanayb",
"আফতাবুজ্জামান"
]
},
@@ -63,5 +64,12 @@
"ext-uls-compact-link-info": "সব ভাষাসমূহ (আপনার ও অন্যদের দ্বারা সাধারণ পছন্দ থেকে প্রাথমিক নির্বাচন)",
"prefs-languages": "ভাষাসমূহ",
"ext-uls-compact-language-links-preference": "আপনার কাছে প্রাসঙ্গিক মনে হয় এমন ভাষাসহ, [[$1|ভাষার একটি ছোট তালিকা]] ব্যবহার করে।",
- "ext-uls-compact-no-results": "এই পৃষ্ঠাটি আপনার অনুসন্ধান করা ভাষাতে নেই।"
+ "ext-uls-compact-no-results": "এই পৃষ্ঠাটি আপনার অনুসন্ধান করা ভাষাতে নেই।",
+ "ext-uls-setlang-error": "আপনার পছন্দসই ভাষা হালনাগাদ করার সময় একটি ত্রুটি হয়েছিল। ত্রুটি: $1",
+ "ext-uls-setlang-unknown-error": "অজানা ত্রুটি",
+ "ext-uls-setlang-message": "আপনার অনুসরণ করা লিঙ্কটি ইন্টারফেসকে <strong>$1 ($2)</strong> ভাষায় দেখানোর অনুরোধ করেছিল।",
+ "ext-uls-setlang-heading": "ইন্টারফেসের ভাষা পরিবর্তন করবেন?",
+ "ext-uls-setlang-accept": "পরিবর্তন গ্রহণ করুন",
+ "ext-uls-setlang-loading": "প্রয়োগ হচ্ছে...",
+ "ext-uls-setlang-cancel": "পরিবর্তন করবেন না"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/bpy.json b/MLEB/UniversalLanguageSelector/i18n/bpy.json
index 000b5250..97215d49 100644
--- a/MLEB/UniversalLanguageSelector/i18n/bpy.json
+++ b/MLEB/UniversalLanguageSelector/i18n/bpy.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Usingha",
"Xð"
]
},
- "uls-plang-title-languages": "ঠার"
+ "uls-plang-title-languages": "ঠার",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|আরকউ আহান|আরকউ $1হান}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ce.json b/MLEB/UniversalLanguageSelector/i18n/ce.json
index 0c987114..f8a7f0bb 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ce.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ce.json
@@ -32,7 +32,7 @@
"ext-uls-webfonts-select-for": "Шрифт харжар цу $1",
"ext-uls-webfonts-select-for-ui-info": "Декъашхочун интерфейсан шрифт",
"ext-uls-webfonts-select-for-content-info": "Йозан шрифт",
- "ext-uls-webfonts-system-font": "Системан шрифт",
+ "ext-uls-webfonts-system-font": "Системин шрифт",
"ext-uls-back-to-display-settings": "Юха гӀо",
"ext-uls-input-settings-title": "Яздаран гӀирс къастор",
"ext-uls-input-settings-title-short": "Яздар",
diff --git a/MLEB/UniversalLanguageSelector/i18n/da.json b/MLEB/UniversalLanguageSelector/i18n/da.json
index 6f8a2c84..7615f315 100644
--- a/MLEB/UniversalLanguageSelector/i18n/da.json
+++ b/MLEB/UniversalLanguageSelector/i18n/da.json
@@ -62,8 +62,10 @@
"ext-uls-language-settings-applying": "Anvender...",
"ext-uls-compact-link-count": "{{PLURAL:$1|Et mere|$1 mere}}",
"prefs-languages": "Sprog",
- "ext-uls-compact-language-links-preference": "Brug en kompakt sprogliste med sprog, der er relevante for dig.",
+ "ext-uls-compact-language-links-preference": "Brug en [[$1|kompakt sprogliste]] med sprog, der er relevante for dig.",
"ext-uls-setlang-unknown-error": "Ukendt fejl",
+ "ext-uls-setlang-heading": "Skift brugerfladesprog?",
"ext-uls-setlang-accept": "Accepter ændring",
+ "ext-uls-setlang-loading": "Anvender...",
"ext-uls-setlang-cancel": "Ændre ikke"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/dag.json b/MLEB/UniversalLanguageSelector/i18n/dag.json
new file mode 100644
index 00000000..47c5d23b
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/dag.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hidrash",
+ "Sir Amugi"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|n gari zaɣ'yini|$1 bɔbgu}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/diq.json b/MLEB/UniversalLanguageSelector/i18n/diq.json
index 7ac94c7f..5b15b793 100644
--- a/MLEB/UniversalLanguageSelector/i18n/diq.json
+++ b/MLEB/UniversalLanguageSelector/i18n/diq.json
@@ -61,7 +61,7 @@
"ext-uls-input-disable-notification-info-personal": "Eyaranê zıwani şıma çı wext ke wazenê, şıma şenê hacetanê cıkewtışi ra feal kerê.",
"ext-uls-input-disable-notification-info-interlanguage": "Eyaranê zıwani şıma şenê, hacetanê ke leweyê lista zıwani derê, feal kerê.",
"ext-uls-language-settings-applying": "Dezgeyeno...",
- "ext-uls-compact-link-count": "{{PLURAL:$1|vêşêr|$1 vêşêr}}",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Yew zêde|$1 zêde}}",
"ext-uls-compact-link-info": "Zıwani pêro (hetê to û ê binan ra ke kamcin yeno hesab wa ey weçine)",
"prefs-languages": "Zıwani",
"ext-uls-compact-language-links-preference": "Teyna zıwanê ke to aleqedar kenê [[$1|a lista zıwani]] bıkarne.",
diff --git a/MLEB/UniversalLanguageSelector/i18n/el.json b/MLEB/UniversalLanguageSelector/i18n/el.json
index 8409615c..aa87e396 100644
--- a/MLEB/UniversalLanguageSelector/i18n/el.json
+++ b/MLEB/UniversalLanguageSelector/i18n/el.json
@@ -52,6 +52,7 @@
"ext-uls-input-disable-notification-info-personal": "Μπορείτε να ενεργοποιήσετε τα εργαλεία εισαγωγής, ανά πάσα στιγμή από τις ρυθμίσεις γλώσσας.",
"ext-uls-input-disable-notification-info-interlanguage": "Μπορείτε να ενεργοποιήσετε τα εργαλεία εισαγωγής, ανά πάσα στιγμή από τις ρυθμίσεις γλώσσας δίπλα από τη λίστα γλωσσών.",
"ext-uls-language-settings-applying": "Εφαρμογή...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Μία ακόμη|$1 ακόμη}}",
"prefs-languages": "Γλώσσες",
"ext-uls-compact-language-links-preference": "Χρήση μιας συμπαγούς λίστας γλωσσών, με γλώσσες που είναι σχετικές με εσάς."
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/en.json b/MLEB/UniversalLanguageSelector/i18n/en.json
index 7b15892b..75bc21f7 100644
--- a/MLEB/UniversalLanguageSelector/i18n/en.json
+++ b/MLEB/UniversalLanguageSelector/i18n/en.json
@@ -64,7 +64,7 @@
"ext-uls-compact-link-count": "{{PLURAL:$1|One more|$1 more}}",
"ext-uls-compact-link-info": "All languages (initial selection from common choices by you and others)",
"prefs-languages": "Languages",
- "ext-uls-compact-language-links-preference": "Use a [[$1|compact language list]], with languages relevant to you.",
+ "ext-uls-compact-language-links-preference": "Use a [[$1|compact language list]], with languages relevant to you.",
"ext-uls-compact-no-results": "This page is not available in the language you searched for.",
"ext-uls-setlang-error": "There was an error while updating your preferred language. Error: $1",
"ext-uls-setlang-unknown-error": "Unknown error",
diff --git a/MLEB/UniversalLanguageSelector/i18n/eo.json b/MLEB/UniversalLanguageSelector/i18n/eo.json
index 4cedfe84..27a0ce3a 100644
--- a/MLEB/UniversalLanguageSelector/i18n/eo.json
+++ b/MLEB/UniversalLanguageSelector/i18n/eo.json
@@ -6,6 +6,7 @@
"KuboF",
"Macofe",
"Mirin",
+ "NMaia",
"Robin van der Vliet"
]
},
@@ -64,5 +65,6 @@
"ext-uls-compact-link-info": "Ĉiuj lingvoj (komenca elekto de kutimaj opcioj de vi kaj aliaj)",
"prefs-languages": "Lingvoj",
"ext-uls-compact-language-links-preference": "Uzi [[$1|kompaktan liston de lingvoj]], kun lingvoj konvenaj por vi.",
- "ext-uls-compact-no-results": "Ĉi tiu paĝo ne estas havebla en la lingvo kiun vi serĉis."
+ "ext-uls-compact-no-results": "Ĉi tiu paĝo ne estas havebla en la lingvo kiun vi serĉis.",
+ "ext-uls-setlang-heading": "Ĉu ŝanĝi la fasadan lingvon?"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/frp.json b/MLEB/UniversalLanguageSelector/i18n/frp.json
index 299c5192..be880224 100644
--- a/MLEB/UniversalLanguageSelector/i18n/frp.json
+++ b/MLEB/UniversalLanguageSelector/i18n/frp.json
@@ -35,5 +35,6 @@
"ext-uls-input-disable": "Dèsactivar los outils de mètoda d’entrâ",
"ext-uls-input-enable": "Activar los outils de mètoda d’entrâ",
"ext-uls-input-disable-info": "Los outils de mètoda d’entrâ sont dèsactivâs.",
- "ext-uls-input-settings-noime": "Niona mètoda d’entrâ est disponibla por ceta lengoua."
+ "ext-uls-input-settings-noime": "Niona mètoda d’entrâ est disponibla por ceta lengoua.",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Yona|$1}} de més"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/gld.json b/MLEB/UniversalLanguageSelector/i18n/gld.json
new file mode 100644
index 00000000..e6de46fe
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/gld.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "RFScott"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Гучи $1}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/gor.json b/MLEB/UniversalLanguageSelector/i18n/gor.json
index b6856ea2..d6cd328d 100644
--- a/MLEB/UniversalLanguageSelector/i18n/gor.json
+++ b/MLEB/UniversalLanguageSelector/i18n/gor.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Marwan Mohamad",
"Xð"
]
},
- "uls-plang-title-languages": "Bahasa"
+ "uls-plang-title-languages": "Bahasa",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Tuwawupo |$1 pe'eentapo}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/guc.json b/MLEB/UniversalLanguageSelector/i18n/guc.json
new file mode 100644
index 00000000..c590a78a
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/guc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Leonfd1992"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Wane soo'omüin|$1 more}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/he.json b/MLEB/UniversalLanguageSelector/i18n/he.json
index 4e3fc8af..599b5c01 100644
--- a/MLEB/UniversalLanguageSelector/i18n/he.json
+++ b/MLEB/UniversalLanguageSelector/i18n/he.json
@@ -7,7 +7,7 @@
"Yona b"
]
},
- "uls-desc": "נותן למשתמשים מספר דרכים לבחור שפה ולכוונן את הגדרות השפה",
+ "uls-desc": "נותן למשתמשים כמה דרכים לבחור שפה ולכוונן את הגדרות השפה",
"uls-plang-title-languages": "שפות",
"ext-uls-select-language-settings-icon-tooltip": "הגדרות שפה",
"ext-uls-undo-language-tooltip-text": "השפה השתנתה. השפה הקודמת הייתה $1",
@@ -66,7 +66,7 @@
"ext-uls-setlang-error": "אירעה שגיאה בעת עדכון השפה המועדפת שלך. שגיאה: $1",
"ext-uls-setlang-unknown-error": "שגיאה בלתי־ידועה",
"ext-uls-setlang-message": "הקישור שלחצת עליו ביקש שהממשק יוצג בשפה <strong>$1 ($2)</strong>",
- "ext-uls-setlang-heading": "שלנות את שפת הממשק?",
+ "ext-uls-setlang-heading": "לשנות את שפת הממשק?",
"ext-uls-setlang-accept": "לקבל את השינויים",
"ext-uls-setlang-loading": "החלה...",
"ext-uls-setlang-cancel": "לא לשנות"
diff --git a/MLEB/UniversalLanguageSelector/i18n/hif-latn.json b/MLEB/UniversalLanguageSelector/i18n/hif-latn.json
index 172c4c70..27e211b9 100644
--- a/MLEB/UniversalLanguageSelector/i18n/hif-latn.json
+++ b/MLEB/UniversalLanguageSelector/i18n/hif-latn.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Girmitya",
"Xð"
]
},
- "uls-plang-title-languages": "Bhasa"
+ "uls-plang-title-languages": "Bhasa",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Ek aur|$1 Aur}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/hrx.json b/MLEB/UniversalLanguageSelector/i18n/hrx.json
new file mode 100644
index 00000000..dbadf00e
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/hrx.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iohanen"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Een weidere|$1 weidere}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ie.json b/MLEB/UniversalLanguageSelector/i18n/ie.json
index 540956a1..5da724ba 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ie.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ie.json
@@ -1,8 +1,12 @@
{
"@metadata": {
"authors": [
+ "Mithridates",
+ "Renan",
"Xð"
]
},
- "uls-plang-title-languages": "Lingues"
+ "uls-plang-title-languages": "Lingues",
+ "ext-uls-input-disable-notification-undo": "Anullar",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Un plu|$1 plu}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ja.json b/MLEB/UniversalLanguageSelector/i18n/ja.json
index 47ab0399..49e4d469 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ja.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ja.json
@@ -4,6 +4,7 @@
"Afaz",
"Fryed-peach",
"Kusurija",
+ "LaMagiaaa",
"Omotecho",
"Otokoume",
"Shirayuki",
@@ -63,7 +64,7 @@
"ext-uls-input-disable-notification-info-personal": "言語の設定で、いつでも入力ツールを有効にできます。",
"ext-uls-input-disable-notification-info-interlanguage": "言語一覧にある言語の設定(歯車のアイコン)で、いつでも入力ツールを有効にできます。",
"ext-uls-language-settings-applying": "適用しています...",
- "ext-uls-compact-link-count": "{{PLURAL:$1|もう一つ|他 $1}}",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|他 $1 言語}}",
"ext-uls-compact-link-info": "すべての言語(共通の選択肢からユーザーにより選ばれた第1候補)",
"prefs-languages": "言語",
"ext-uls-compact-language-links-preference": "[[$1|折りたたんだコンパクトな言語間リンク]]を使い、自分に関係のあるもののみ表示。",
diff --git a/MLEB/UniversalLanguageSelector/i18n/kcg.json b/MLEB/UniversalLanguageSelector/i18n/kcg.json
new file mode 100644
index 00000000..5787bc23
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/kcg.json
@@ -0,0 +1,71 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "uls-desc": "Ku ni̱ nwuak a̱tyuta̱m wu nvak nkhai a̱lyem ma̱ a̱di̱di̱t a̱di̱t a̱ghwon a̱ ba̱ jhyuk a̱yaaseti a̱lyem ba",
+ "uls-plang-title-languages": "Lilyem",
+ "ext-uls-select-language-settings-icon-tooltip": "A̱yaaseti lilyem",
+ "ext-uls-undo-language-tooltip-text": "Á̱ shai a̱lyem neet $1",
+ "ext-uls-undo-language-tooltip-text-local": "Á̱ shai wiki huni ndyo a̱lyem ka. Di [[Special:GlobalPreferences|lan-cat a̱mgba̱m swanta]] ang hu a shai a̱lyem a̱mgba̱m a̱yaawiki ba.",
+ "ext-uls-language-settings-preferences-link": "Á̱ghyang a̱yaaseti a̱lyem",
+ "uls-betafeature-label": "A̱cyuang a̱ka̱fwop a̱lyem",
+ "uls-betafeature-desc": "Tsa kpak hu ku laai yet a̱kum si̱ lis a̱lyem hu, di̱ lilyem nang a lyen hwa ma̱nyin.",
+ "ext-uls-display-settings-title": "Tsa a̱yaaseti",
+ "ext-uls-display-settings-language-tab": "A̱lyem",
+ "ext-uls-display-settings-fonts-tab": "A̱yaaga̱lyuut",
+ "ext-uls-display-settings-title-short": "Tsa",
+ "ext-uls-display-settings-desc": "Nyia̱ seti a̱lyem a̱yaameniu ma̱ng a̱yaaga̱lyuut ka.",
+ "ext-uls-language-settings-title": "A̱yaaseti a̱lyem",
+ "ext-uls-language-settings-apply": "Tyia̱ a̱yaaseti di̱ nta̱m",
+ "ext-uls-language-settings-cancel": "Lyang",
+ "ext-uls-language-buttons-help": "Shai a̱lyem a̱yaameniu ka. Á̱ na la a̱lyem kyangmami ka bah.",
+ "ext-uls-display-settings-font-settings": "A̱yaaseti ga̱lyuut",
+ "ext-uls-display-settings-ui-language": "A̱lyem tsa",
+ "ext-uls-display-settings-anon-label": "A̱lyem tsa:",
+ "ext-uls-display-settings-anon-same-as-content": "$1 (yet kyang nyiung hwa ma̱ng kyangmami)",
+ "ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Nwuo mami]] a nkhai a̱lyem a̱ghyang mat a̱yaameniu.",
+ "ext-uls-webfonts-settings-title": "Cyok ma̱ng a̱yaaga̱lyuut di̱n jen ji nang á̱ ncat",
+ "ext-uls-webfonts-settings-info": "Cyok ma̱ng a̱yaaga̱lyuut ba̱ nwai shyia̱ a̱ni di̱ mi̱n tyimbwak a ki nnwuak khai a̱yaaga̱lyuut lan-cat hu shim.",
+ "ext-uls-webfonts-settings-info-link": "Á̱ghyang nkhang",
+ "ext-uls-webfonts-select-for": "Khai ga̱lyuut mat $1",
+ "ext-uls-webfonts-select-for-ui-info": "Lyuut nang á̱ nnyia̱ ta̱m di̱ tyannwuan a̱tyuta̱m",
+ "ext-uls-webfonts-select-for-content-info": "Ga̱lyuut mat kyangmami",
+ "ext-uls-webfonts-system-font": "Ga̱lyuut sistem",
+ "ext-uls-back-to-display-settings": "Bwuok a̱ nat a̱yaaseti tsa",
+ "ext-uls-input-settings-title": "A̱yaaseti nwuai",
+ "ext-uls-input-settings-title-short": "Nwuai",
+ "ext-uls-input-settings-desc": "A shyia̱ di̱ lyuut da̱ a̱lyem a̱ghyang kya ke?",
+ "ext-uls-input-settings-ime-settings": "Nvak nwuai mat $1",
+ "ext-uls-input-settings-ui-language": "A̱lyem lyuut",
+ "ext-uls-back-to-input-settings": "Bwuok a̱ bai a̱yaaseti nwuai",
+ "ext-uls-ime-help": "Si̱sak nang á̱ nnyia̱ ta̱m ma̱ng",
+ "ext-uls-disable-input-method": "Nyia̱ ta̱m ma̱ng kibwot byina̱byin",
+ "ext-uls-input-settings-more-languages-tooltip": "Lilyem ghyáng",
+ "jquery-ime-other-languages": "Lilyem ghyáng",
+ "jquery-ime-disable-text": "Nyia̱ ta̱m ma̱ng kibwot byina̱byin",
+ "jquery-ime-help": "Beang",
+ "ext-uls-input-disable": "Hyat nkyangta̱m nwuai",
+ "ext-uls-input-enable": "Khwuk nkyangta̱m nwuai",
+ "ext-uls-input-disable-info": "Á̱ hyat nkyangta̱m nwuai",
+ "ext-uls-input-settings-noime": "Vak nwuai nshyia̱ mat a̱lyem kani bah.",
+ "ext-uls-input-disable-notification": "Á̱ ka̱n hyat nkyangta̱m nwuai na",
+ "ext-uls-input-disable-notification-undo": "Bwuok ndyo",
+ "ext-uls-input-disable-notification-info-personal": "A maai khwuk nkyangta̱m nwuai na kuzang jen neet a̱yaaseti a̱lyem ba.",
+ "ext-uls-input-disable-notification-info-interlanguage": "A maai khwuk nkyangta̱m nwuai na kuzang jen neet a̱yaaseti a̱lyem ba ba̱ shyia̱ kpa̱mkpaan lis a̱lyem hu.",
+ "ext-uls-language-settings-applying": "Á̱ tyei di̱n ta̱m...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|A̱nyiung bwat|$1 mbwat}}",
+ "ext-uls-compact-link-info": "A̱mgba̱m lilyem (khai a̱tsan neet a̱yaakhai nci̱ri̱ng ang na ma̱ng si̱ á̱ghyang á̱niet)",
+ "prefs-languages": "Lilyem",
+ "ext-uls-compact-language-links-preference": "Nyia̱ ta̱m ma̱ng [[$1|a̱bada̱dei lis a̱lyem]], ma̱ng lilyem nang a lyen a̱ni.",
+ "ext-uls-compact-no-results": "Peji huni nwai shyia̱ da̱ a̱lyem ka nang a zop a̱ni.",
+ "ext-uls-setlang-error": "Ghyuap zama nshyia̱ ma̱nang a tyei a̱lyem lan-cat ang ka fai. Ghyuap: $1",
+ "ext-uls-setlang-unknown-error": "A̱kang ghyuap",
+ "ext-uls-setlang-message": "A̱fwop wu nang a ku khwi a̱ni cat á̱ ntyaat tyannwuan ji mami <strong>$1 ($2)</strong>",
+ "ext-uls-setlang-heading": "Shai a̱lyem tyannwuan kaa?",
+ "ext-uls-setlang-accept": "Shim a̱shai",
+ "ext-uls-setlang-loading": "Á̱ tyei di̱n ta̱m...",
+ "ext-uls-setlang-cancel": "Yok shai bah"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ku-latn.json b/MLEB/UniversalLanguageSelector/i18n/ku-latn.json
index 88b4bd1b..c915279a 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ku-latn.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ku-latn.json
@@ -1,14 +1,16 @@
{
"@metadata": {
"authors": [
+ "Balyozxane",
"Bikarhêner",
"George Animal",
- "Ghybu"
+ "Ghybu",
+ "Guherto"
]
},
"uls-plang-title-languages": "Ziman",
"ext-uls-select-language-settings-icon-tooltip": "Eyarên ziman",
- "ext-uls-undo-language-tooltip-text": "Ziman hate guherandin ji $1",
+ "ext-uls-undo-language-tooltip-text": "Ziman ji $1 hat guhartin",
"ext-uls-display-settings-title": "Hevyazên ekranê",
"ext-uls-display-settings-language-tab": "Ziman",
"ext-uls-display-settings-fonts-tab": "Tîp",
@@ -16,7 +18,7 @@
"ext-uls-display-settings-desc": "Zimanê ku bo menu û nivîsan tê bikaranîn",
"ext-uls-language-settings-title": "Eyarên ziman",
"ext-uls-language-settings-cancel": "Betal bike",
- "ext-uls-language-buttons-help": "Zimanê menuyan biguherîne. Zimanê naverokê dê neyê guherandin.",
+ "ext-uls-language-buttons-help": "Zimanê menuyan biguhêre. Zimanê naverokê dê neyê guhartin.",
"ext-uls-display-settings-font-settings": "Eyarên nivîsê",
"ext-uls-display-settings-ui-language": "Zimanê ekranê",
"ext-uls-display-settings-anon-label": "Zimanê ekranê:",
@@ -41,5 +43,6 @@
"ext-uls-input-disable": "Amûrên têxistinê bêçalakî bike",
"ext-uls-input-enable": "Amûrên têxistinê çalak bike",
"ext-uls-input-disable-notification-undo": "Betal bike",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Yek zêdetir|$1 zêdetir}}",
"prefs-languages": "Ziman"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/kw.json b/MLEB/UniversalLanguageSelector/i18n/kw.json
index ff273ace..42ede521 100644
--- a/MLEB/UniversalLanguageSelector/i18n/kw.json
+++ b/MLEB/UniversalLanguageSelector/i18n/kw.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "GwikorFrank",
"Nrowe",
"Xð"
]
@@ -43,7 +44,7 @@
"ext-uls-input-disable": "Dialosegi toulys ynworra",
"ext-uls-input-enable": "Galosegi toulys ynworra",
"ext-uls-input-disable-info": "Dialosegys yw toulys ynworra",
- "ext-uls-input-settings-noime": "Nyns eus fordh ynworra vyth kavadow rag an yeth-ma.",
+ "ext-uls-input-settings-noime": "Nyns eus fordh-ynworra vyth kavadow rag an yeth ma.",
"ext-uls-input-disable-notification": "Dialosegys re beu toulys ynworra",
"ext-uls-input-disable-notification-undo": "Diswul",
"ext-uls-input-disable-notification-info-personal": "Hwi a yll galosegi an toulys ynworra orth termyn vyth y'n settyansow yeth.",
diff --git a/MLEB/UniversalLanguageSelector/i18n/lez.json b/MLEB/UniversalLanguageSelector/i18n/lez.json
index 0a59c0a9..97ea53b3 100644
--- a/MLEB/UniversalLanguageSelector/i18n/lez.json
+++ b/MLEB/UniversalLanguageSelector/i18n/lez.json
@@ -5,5 +5,6 @@
"Xð"
]
},
- "uls-plang-title-languages": "ЧӀалар"
+ "uls-plang-title-languages": "ЧӀалар",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Мад $1}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/lld.json b/MLEB/UniversalLanguageSelector/i18n/lld.json
new file mode 100644
index 00000000..229e4e1b
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/lld.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fierodelveneto",
+ "Starladin"
+ ]
+ },
+ "uls-plang-title-languages": "Lingac",
+ "jquery-ime-other-languages": "Atres lingac"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/lmo.json b/MLEB/UniversalLanguageSelector/i18n/lmo.json
index 085467b9..80f19c18 100644
--- a/MLEB/UniversalLanguageSelector/i18n/lmo.json
+++ b/MLEB/UniversalLanguageSelector/i18n/lmo.json
@@ -1,8 +1,71 @@
{
"@metadata": {
"authors": [
+ "Salvemm el lombard",
"Xð"
]
},
- "uls-plang-title-languages": "Lèngue"
+ "uls-desc": "L'ofriss a l'utent di manere diverse per selezionà una lengua e per regolà i impostazzion de la lengua.",
+ "uls-plang-title-languages": "Lengove",
+ "ext-uls-select-language-settings-icon-tooltip": "Impostazzion per la lengua",
+ "ext-uls-undo-language-tooltip-text": "Lengua cambiada de $1",
+ "ext-uls-undo-language-tooltip-text-local": "Lengua cambiada per quell wiki chì. Controla i to [[Special:GlobalPreferences|preferenza globai]] per cambià la lengua a tut i wiki.",
+ "ext-uls-language-settings-preferences-link": "Di alter impostazzion per la lengua",
+ "uls-betafeature-label": "Conligament interwiki compat",
+ "uls-betafeature-desc": "Mostra una version ridotta de la lista di interwiki, o ben i conligament ai lengove in di quai una pagina l'è disponibil, limitada a chì pussée important per ti.",
+ "ext-uls-display-settings-title": "Impostazzion de virualizazzion",
+ "ext-uls-display-settings-language-tab": "Lengua",
+ "ext-uls-display-settings-fonts-tab": "Tipi de carater",
+ "ext-uls-display-settings-title-short": "Aspet",
+ "ext-uls-display-settings-desc": "Imposta la lengua drovada per el menù e i carater",
+ "ext-uls-language-settings-title": "Impostazzion per la lengua",
+ "ext-uls-language-settings-apply": "Aplica i impostazzion",
+ "ext-uls-language-settings-cancel": "Anula",
+ "ext-uls-language-buttons-help": "Cambia la lengua di menù. La lengua di contegnud la vegnarà minga modificada.",
+ "ext-uls-display-settings-font-settings": "Impostazzion per tipo de carater",
+ "ext-uls-display-settings-ui-language": "Lengua de visualizzazion",
+ "ext-uls-display-settings-anon-label": "Lengua de visualizzazionː",
+ "ext-uls-display-settings-anon-same-as-content": "$1 (compagn del contegnud)",
+ "ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Accedi]] per catà foeura una lengua diversa per i menù.",
+ "ext-uls-webfonts-settings-title": "Descarega i tipi de carater quand che gh'è besogn",
+ "ext-uls-webfonts-settings-info": "El descarega in automatich i tipi de carater che manchen e 'l permet la selezzion di tipi de carater preferid.",
+ "ext-uls-webfonts-settings-info-link": "Alter informazzion",
+ "ext-uls-webfonts-select-for": "Scerniss foeura el tipo de carater per $1",
+ "ext-uls-webfonts-select-for-ui-info": "Tipo de carater drovad per l'interfacia de l'utent",
+ "ext-uls-webfonts-select-for-content-info": "Tipo de carater drovad per el contegnud",
+ "ext-uls-webfonts-system-font": "Carater de sistema",
+ "ext-uls-back-to-display-settings": "Torna ai impostazzion de visualizzazion",
+ "ext-uls-input-settings-title": "Impostazzion de scritura",
+ "ext-uls-input-settings-title-short": "Scritura",
+ "ext-uls-input-settings-desc": "Te scrivet in un'altra lengua?",
+ "ext-uls-input-settings-ime-settings": "Metod de scritura per $1",
+ "ext-uls-input-settings-ui-language": "Lengove drovade per scriver",
+ "ext-uls-back-to-input-settings": "Torna indree ai impostazzion de scritura",
+ "ext-uls-ime-help": "Come drovall",
+ "ext-uls-disable-input-method": "Drova i impostazzion de la tastera del dispositiv",
+ "ext-uls-input-settings-more-languages-tooltip": "Alter lengove",
+ "jquery-ime-other-languages": "Alter lengove",
+ "jquery-ime-disable-text": "Drova i impostazzion de la tastera del dispositiv",
+ "jquery-ime-help": "Ajut",
+ "ext-uls-input-disable": "Desativa i istrument de scritura",
+ "ext-uls-input-enable": "Ativa i istrument de scritura",
+ "ext-uls-input-disable-info": "I strument de scritura a inn disativad",
+ "ext-uls-input-settings-noime": "Nissun metod de scritura l'è disponibil per questa lengua chì.",
+ "ext-uls-input-disable-notification": "I istrument de scritura a inn stad disativad",
+ "ext-uls-input-disable-notification-undo": "Torna a 'me che l'era inanz",
+ "ext-uls-input-disable-notification-info-personal": "Te podet ativà quand che te voeuret i istrument de scritura infra i impostazzion de la lengua",
+ "ext-uls-input-disable-notification-info-interlanguage": "Te podet ativà quand che te voeuret i istrument de scritura infra i impostazzion de la lengua, arent a la lista di lengove.",
+ "ext-uls-language-settings-applying": "Adree a aplicà",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|un'altra|$1 anmò}}",
+ "ext-uls-compact-link-info": "Tute i lengove (la selezzion inzial infra i scelte comune to e di alter)",
+ "prefs-languages": "Lengove",
+ "ext-uls-compact-language-links-preference": "Drova [[$1|un alista ridotta de lengove]], con i lengove importante per ti.",
+ "ext-uls-compact-no-results": "Questa pagina chì l'è minga disponibil in la lengua che t'hee cercad.",
+ "ext-uls-setlang-error": "A gh'è stad un eror in del cors de l'asgionament di lengove preferide. Eror: $1",
+ "ext-uls-setlang-unknown-error": "Eror conossud de nissun",
+ "ext-uls-setlang-message": "El conligament che te seet andà adrée el domanda che l'interfacia la sia mostrada in <strong>$1 ($2)</strong>",
+ "ext-uls-setlang-heading": "Cambia la lengua de l'interfacia?",
+ "ext-uls-setlang-accept": "Aceta el cambiament",
+ "ext-uls-setlang-loading": "Adree a aplicà...",
+ "ext-uls-setlang-cancel": "Modifica minga"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/luz.json b/MLEB/UniversalLanguageSelector/i18n/luz.json
new file mode 100644
index 00000000..89f12791
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/luz.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bluehamed"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|یٱکی مٱئلیتٱر|$1 مٱئلیتٱر}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/lv.json b/MLEB/UniversalLanguageSelector/i18n/lv.json
index 3eb5200a..f17441dd 100644
--- a/MLEB/UniversalLanguageSelector/i18n/lv.json
+++ b/MLEB/UniversalLanguageSelector/i18n/lv.json
@@ -57,6 +57,7 @@
"ext-uls-compact-no-results": "Šī lapa nav pieejama tevis atrastajā valodā.",
"ext-uls-setlang-error": "Iestatot tavu izvēlēto valodu, notika kļūda: $1",
"ext-uls-setlang-unknown-error": "Nezināma kļūda",
+ "ext-uls-setlang-message": "Izmantotā saite pieprasīja saskarni rādīt <strong>$1 ($2)</strong> valodā",
"ext-uls-setlang-heading": "Mainīt saskarnes valodu?",
"ext-uls-setlang-accept": "Pieņemt izmaiņas",
"ext-uls-setlang-loading": "Pielieto...",
diff --git a/MLEB/UniversalLanguageSelector/i18n/mad.json b/MLEB/UniversalLanguageSelector/i18n/mad.json
new file mode 100644
index 00000000..bb515870
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/mad.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Boesenbergia"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Sèttong egghi'|$1 egghi'}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/mnc.json b/MLEB/UniversalLanguageSelector/i18n/mnc.json
new file mode 100644
index 00000000..3eeda109
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/mnc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Foavi33"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|emu ele|$1 ele}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/mni.json b/MLEB/UniversalLanguageSelector/i18n/mni.json
index ca2919ea..5009d6f4 100644
--- a/MLEB/UniversalLanguageSelector/i18n/mni.json
+++ b/MLEB/UniversalLanguageSelector/i18n/mni.json
@@ -1,24 +1,50 @@
{
"@metadata": {
"authors": [
- "Awangba Mangang"
+ "Awangba Mangang",
+ "꯴꯰꯴"
]
},
+ "uls-desc": "ꯂꯣꯟ ꯑꯃꯁꯨꯡ ꯂꯣꯟ ꯁꯦꯝꯐꯝ ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯡꯅ ꯈꯟꯅꯕ ꯂꯝꯕꯤ ꯀꯌꯥꯃꯔꯨꯝ ꯄꯤꯔꯦ",
"uls-plang-title-languages": "ꯂꯣꯟꯁꯤꯡ",
"ext-uls-select-language-settings-icon-tooltip": "ꯂꯣꯟ ꯁꯦꯝꯐꯝꯁꯤꯡ",
"ext-uls-undo-language-tooltip-text": "$1 ꯗꯒꯤ ꯍꯣꯡꯉꯛꯄ ꯂꯣꯟ",
+ "ext-uls-undo-language-tooltip-text-local": "ꯃꯁꯤꯒꯤ ꯋꯤꯀꯤꯁꯤꯒꯤ ꯂꯣꯟ ꯍꯣꯡꯗꯣꯛꯂꯦ ꯫ ꯌꯦꯡꯉꯨ ꯅꯪꯒꯤ [[Special:GlobalPreferences|ꯀꯔꯝꯕꯗ ꯈꯟꯒꯅꯤ]] ꯍꯥꯏꯕꯗꯨ ꯋꯤꯀꯤ ꯑꯄꯨꯟꯕꯒꯤ ꯂꯣꯟ ꯍꯣꯡꯗꯣꯛꯅꯕ ꯫",
"ext-uls-language-settings-preferences-link": "ꯂꯣꯟ ꯁꯦꯝꯐꯝꯁꯤꯡ ꯋꯥꯠꯂꯤ",
"uls-betafeature-label": "ꯁꯨꯞꯆꯤꯟꯕ ꯂꯣꯟ ꯁꯝꯅꯕꯁꯤꯡ",
+ "ext-uls-display-settings-title": "ꯁꯦꯝꯐꯝ ꯎꯠꯂꯨ",
"ext-uls-display-settings-language-tab": "ꯂꯣꯟ",
"ext-uls-display-settings-fonts-tab": "ꯃꯌꯦꯛ",
"ext-uls-display-settings-title-short": "ꯎꯨꯠꯄ",
"ext-uls-language-settings-title": "ꯂꯣꯟ ꯁꯦꯝꯐꯝꯁꯤꯡ",
"ext-uls-language-settings-apply": "ꯁꯦꯝꯐꯝꯁꯤꯡ ꯅ ꯇꯧꯍꯟꯕ",
"ext-uls-language-settings-cancel": "ꯇꯣꯛꯄ",
+ "ext-uls-display-settings-font-settings": "ꯃꯌꯦꯛ ꯁꯦꯝꯐꯝ",
+ "ext-uls-display-settings-ui-language": "ꯂꯣꯟ ꯎꯠꯂꯨ",
"ext-uls-display-settings-anon-label": "ꯂꯣꯟ ꯎꯨꯠꯄ:",
"ext-uls-display-settings-anon-same-as-content": "$1(ꯑꯌꯥꯎꯕꯗꯨ ꯆꯞ ꯃꯥꯅꯅ)",
+ "ext-uls-webfonts-settings-title": "ꯆꯪꯒꯗꯕ ꯃꯇꯝꯗ ꯃꯌꯦꯛꯁꯤꯡꯗꯨ ꯆꯤꯡꯊꯧ",
+ "ext-uls-webfonts-settings-info-link": "ꯑꯍꯦꯟꯕ ꯑꯀꯨꯞꯄ ꯃꯔꯣꯜ",
+ "ext-uls-webfonts-select-for": "$1ꯒꯤ ꯃꯌꯦꯛ ꯈꯟꯂꯨ",
+ "ext-uls-input-settings-title-short": "ꯃꯅꯨꯡ ꯍꯥꯞꯆꯤꯟꯕ",
+ "ext-uls-input-settings-desc": "ꯃꯥꯟꯅꯗꯕ ꯂꯣꯟ ꯱ꯗ ꯏꯕ",
+ "ext-uls-input-settings-ui-language": "ꯏꯕꯗ ꯁꯑꯖꯤꯟꯅꯕ ꯂꯣꯟ",
+ "ext-uls-back-to-input-settings": "ꯏꯟꯄꯨꯠ ꯁꯦꯇꯤꯡꯗ ꯍꯟꯂꯨ",
"ext-uls-ime-help": "ꯀꯃꯥꯏꯅ ꯁꯤꯖꯤꯟꯅꯒꯅꯤ",
+ "ext-uls-disable-input-method": "ꯌꯦꯜꯍꯧ ꯀꯤꯕꯣꯔ꯭ꯗ ꯁꯤꯖꯤꯟꯅꯧ",
+ "ext-uls-input-settings-more-languages-tooltip": "ꯂꯣꯟ ꯈꯔꯥ ꯋꯥꯠꯂꯤ",
+ "jquery-ime-other-languages": "ꯑꯇꯩ ꯂꯣꯟꯁꯤꯡ",
+ "jquery-ime-disable-text": "ꯌꯦꯜꯍꯧ ꯀꯤꯕꯣꯔꯗ ꯁꯤꯖꯤꯟꯅꯧ",
"jquery-ime-help": "ꯃꯇꯦꯡ",
+ "ext-uls-input-disable": "ꯍꯥꯞꯆꯤꯟꯅꯕ ꯈꯨꯠꯂꯥꯏꯁꯤꯡ ꯌꯥꯍꯟꯒꯅꯨ",
+ "ext-uls-input-enable": "ꯍꯥꯞꯆꯤꯟꯅꯕ ꯈꯨꯠꯂꯥꯏꯁꯤꯡ ꯌꯥꯍꯟꯂꯨ",
"ext-uls-input-disable-notification-undo": "ꯇꯧꯗꯕ",
- "prefs-languages": "ꯂꯣꯟꯁꯤꯁ"
+ "ext-uls-language-settings-applying": "ꯊꯥꯖꯤꯟꯂꯤ...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|꯱ ꯋꯥꯠꯂꯤ|$1 ꯋꯥꯠꯂꯤ}}",
+ "prefs-languages": "ꯂꯣꯟꯁꯤꯁ",
+ "ext-uls-setlang-unknown-error": "ꯃꯁꯛ ꯈꯪꯗꯕ ꯑꯔꯥꯟꯕ",
+ "ext-uls-setlang-heading": "ꯃꯔꯛꯀꯤ ꯂꯣꯟꯗꯨ ꯍꯣꯡꯉꯨ?",
+ "ext-uls-setlang-accept": "ꯑꯍꯣꯡꯕꯗꯨ ꯌꯥꯔꯦ",
+ "ext-uls-setlang-loading": "ꯊꯥꯖꯤꯟꯂꯤ...",
+ "ext-uls-setlang-cancel": "ꯍꯣꯡꯗꯣꯛꯀꯅꯨ"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/mnw.json b/MLEB/UniversalLanguageSelector/i18n/mnw.json
new file mode 100644
index 00000000..17deda62
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/mnw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Htawmonzel"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ထပ် မွဲပၠန်|$1 more}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ms.json b/MLEB/UniversalLanguageSelector/i18n/ms.json
index dbbd7a81..35ffa498 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ms.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ms.json
@@ -10,7 +10,10 @@
"uls-plang-title-languages": "Bahasa",
"ext-uls-select-language-settings-icon-tooltip": "Tetapan bahasa",
"ext-uls-undo-language-tooltip-text": "Bahasa ditukar dari $1",
+ "ext-uls-undo-language-tooltip-text-local": "Bahasa selesai diubah untuk wiki ini. Periksa [[Special:GlobalPreferences|keutamaan global anda]] untuk menukar bahasa bagi kesemua wiki.",
"ext-uls-language-settings-preferences-link": "Tetapan bahasa lanjutan",
+ "uls-betafeature-label": "Pautan bahasa yang ringkas",
+ "uls-betafeature-desc": "Menampilkan versi yang lebih pendek dari senarai bahasa, dengan hanya menampilkan bahasa yang lebih relevan dengan anda.",
"ext-uls-display-settings-title": "Tetapan paparan",
"ext-uls-display-settings-language-tab": "Bahasa",
"ext-uls-display-settings-fonts-tab": "Fon",
@@ -55,6 +58,8 @@
"ext-uls-input-disable-notification-info-interlanguage": "Anda boleh menghidupkan peralatan input pada bila-bila masa dari tetapan bahasa dekat dengan senarai bahasa.",
"ext-uls-language-settings-applying": "Tetapan sedang ditukar...",
"ext-uls-compact-link-count": "{{PLURAL:$1|Satu lagi|$1 lagi}}",
+ "ext-uls-compact-link-info": "Semua bahasa (pilihan awal berdasarkan oleh pilihan umum oleh anda dan orang lain)",
+ "prefs-languages": "Bahasa",
"ext-uls-setlang-error": "Terdapat ralat semasa mengemas kini bahasa pilihan anda. Ralat: $1",
"ext-uls-setlang-unknown-error": "Ralat tidak diketahui",
"ext-uls-setlang-heading": "Ubah bahasa antara muka?",
diff --git a/MLEB/UniversalLanguageSelector/i18n/nds-nl.json b/MLEB/UniversalLanguageSelector/i18n/nds-nl.json
index 17a5d6d8..61407632 100644
--- a/MLEB/UniversalLanguageSelector/i18n/nds-nl.json
+++ b/MLEB/UniversalLanguageSelector/i18n/nds-nl.json
@@ -11,7 +11,7 @@
"ext-uls-undo-language-tooltip-text-local": "Språke vöär disse wiki is wysigd. Gå nå [[Special:GlobalPreferences|globale instellingen]] üm de språke vöär alle wikis te wysigen.",
"ext-uls-language-settings-preferences-link": "Meyr språkinstellingen",
"uls-betafeature-label": "Kompakte språkverwysingen",
- "uls-betafeature-desc": "Låt een kortere versy van de språkenlyste seen, mid allinnig de språken dee vöär ju et meyst van topassing binnet.",
+ "uls-betafeature-desc": "Låt en kortere versy van de språkenlyste seen, mid allinnig de språken dee vöär ju et meyst van topassing bint.",
"ext-uls-display-settings-title": "Weadergåve-instellingen",
"ext-uls-display-settings-language-tab": "Språke",
"ext-uls-display-settings-fonts-tab": "Lettertypen",
@@ -48,9 +48,9 @@
"jquery-ime-help": "Hülpe",
"ext-uls-input-disable": "Invoormetoden uutsetten",
"ext-uls-input-enable": "Invoormetoden ansetten",
- "ext-uls-input-disable-info": "Invoormetoden binnet uutsetted.",
+ "ext-uls-input-disable-info": "Invoormetoden bint uutsetted.",
"ext-uls-input-settings-noime": "Der bint geen invoormetoden beskikbår vöär disse språke.",
- "ext-uls-input-disable-notification": "Invoormetoden binnet uutsetted",
+ "ext-uls-input-disable-notification": "Invoormetoden bint uutsetted",
"ext-uls-input-disable-notification-undo": "Weaderümmedraien",
"ext-uls-input-disable-notification-info-personal": "Jy künnet de invoormetoden weader ansetten via de språkinstellingen.",
"ext-uls-input-disable-notification-info-interlanguage": "Jy künnet de invoormetoden weader ansetten via de språkinstellingen nåst de språkenlyste.",
diff --git a/MLEB/UniversalLanguageSelector/i18n/nia.json b/MLEB/UniversalLanguageSelector/i18n/nia.json
new file mode 100644
index 00000000..2b3a9131
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/nia.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Slaia"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Sambua tö|$1 nasa}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/nqo.json b/MLEB/UniversalLanguageSelector/i18n/nqo.json
index 163472ca..64f8c2b1 100644
--- a/MLEB/UniversalLanguageSelector/i18n/nqo.json
+++ b/MLEB/UniversalLanguageSelector/i18n/nqo.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Lancine.kounfantoh.fofana",
"Youssoufkadialy"
]
},
@@ -8,7 +9,10 @@
"uls-plang-title-languages": "ߞߊ߲ ߠߎ߬",
"ext-uls-select-language-settings-icon-tooltip": "ߞߊ߲ ߟߊ߬ߓߍ߲߬ߢߐ߰ߡߦߊ߬ߘߊ ߟߎ߬",
"ext-uls-undo-language-tooltip-text": "ߞߊ߲ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬ ߞߊ߬ ߓߐ߫ $1 ߘߐ߫",
+ "ext-uls-undo-language-tooltip-text-local": "ߞߊ߲ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬ ߥߞߌ ߣߌ߲߬ ߠߊ߫.ߌ ߟߊ߫ [[Special:GlobalPreferences|global preferences]] ߟߎ߬ ߝߛߍ߬ߝߛߍ߫ ߞߊ߬ ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߥߞߌ ߟߎ߬ ߓߍ߯ ߟߊ߫.",
"ext-uls-language-settings-preferences-link": "ߞߊ߲ ߟߊ߬ߓߍ߲߬ߢߐ߰ߡߦߊ߬ߘߊ ߡߊߞߊ߬ߝߏ߬",
+ "uls-betafeature-label": "ߞߊ߲ ߛߘߌ߬ߜߋ߲߬ ߘߐߜߙߐ߬ߣߍ߲ ߠߎ߬",
+ "uls-betafeature-desc": "ߞߊ߲ ߦߌߟߡߊ߫ ߛߎߘߎ߲ ߠߎ߬ ߛߙߍߘߍ ߦߌ߬ߘߊ߬߸ ߌ ߟߊ߫ ߞߊ߲߫ ߠߊߓߊ߯ߙߕߊ ߟߎ߬ ߘߌ߫ ߓߘߍߞߍ߭.",
"ext-uls-display-settings-title": "ߟߊ߬ߓߍ߲߬ߢߐ߰ߡߦߊ߬ߘߊ ߟߎ߫ ߦߌ߬ߘߊ߬",
"ext-uls-display-settings-language-tab": "ߞߊ߲",
"ext-uls-display-settings-fonts-tab": "ߛߓߍߛߋ߲ ߠߎ߬",
@@ -24,8 +28,10 @@
"ext-uls-display-settings-anon-same-as-content": "$1( ߦߴߊ߬ ߦߋ߫ ߞߣߐߘߐ ߘߐ߫ ߢߊ ߡߍ߲)",
"ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ]] ߞߊ߲߫ ߜߘߍ߫ ߛߎߥߊ߲ߘߌ ߦߌ߬ߘߊ߬ߥߟߊ ߦߋ߫.",
"ext-uls-webfonts-settings-title": "ߛߓߍߛߋ߲ ߠߎ߬ ߟߊߖߌ߰ ߣߴߌ ߡߊ߬ߞߏ߬ ߦߴߊ߬ ߟߊ߫",
+ "ext-uls-webfonts-settings-info": "ߞߟߏ߫ ߞߐߢߌ߬ߣߊ߬ߣߍ߲ ߠߎ߬ ߟߊߖߌ߰ ߌ ߞߎ߲߬ ߞߍߒߖߘߍߦߋߓߟߏߡߊ߬߸ ߊ߬ ߣߌ߫ ߞߊ߬ ߛߓߍߟߌ߫ ߝߌ߬ߛߊ߬ߡߊ߲߬ߕߋ ߟߎ߬ ߓߊߕߐ߬ߡߐ߲ ߠߊߘߌ߬ߢߍ߬.",
"ext-uls-webfonts-settings-info-link": "ߞߟߊ߬ ߡߊߞߊ߬ߝߏ߬ߟߌ",
"ext-uls-webfonts-select-for": "ߛߓߍߛߋ߲߫ ߛߎߥߊ߲ߘߌ߫ $1 ߦߋ߫",
+ "ext-uls-webfonts-select-for-ui-info": "ߛߓߍߟߌ߫ ߟߊߓߊ߯ߙߊߣߍ߲ ߠߎ߬ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߢߐ߲߯ߕߍߞߣߍ ߘߐ߫",
"ext-uls-webfonts-select-for-content-info": "ߛߓߍߛߋ߲߫ ߠߊߓߊ߯ߙߊߣߍ߲ ߞߣߐߘߐ ߦߋ߫",
"ext-uls-webfonts-system-font": "ߛߓߍߛߋ߲߫ ߞߊ߲ߞߋ",
"ext-uls-back-to-display-settings": "ߞߐߛߊߦߌ߲ߠߌ ߞߊߕߙߍ߬ ߦߌ߬ߘߊ߬ߗߏ߮ ߟߊ߬ߓߍ߲߬ߢߐ߰ߡߦߊ߬ߘߊ ߡߊ߬",
@@ -48,7 +54,18 @@
"ext-uls-input-disable-notification": "ߟߊ߬ߘߏ߲߬ߠߌ߬ ߖߐ߯ߙߊ߲ ߠߎ߫ ߣߌߒߕߊ߲ߧߊ߫ ߘߊ߫ ߞߊ߬ ߓߊ߲߫",
"ext-uls-input-disable-notification-undo": "ߘߐ߬ߛߊ߬ߟߌ",
"ext-uls-input-disable-notification-info-personal": "ߌ ߘߴߛߋ߫ ߞߊ߬ ߟߊ߬ߘߏ߲߬ߠߌ߬ ߖߐ߯ߙߊ߲ ߠߎ߬ ߣߌߞߎߣߎ߲ߦߊ߫ ߞߊ߲ ߟߊ߬ߓߍ߲߬ߢߐ߰ߡߦߊ߬ߘߊ ߞߣߐ߫ ߕߎ߬ߡߊ߬ ߓߍ߯.",
+ "ext-uls-input-disable-notification-info-interlanguage": "ߌ ߘߌ߫ ߛߋ߫ ߝߙߊ߬ߒ߬ߞߊ߲߬ߠߌ߲߬ ߖߐ߯ߙߊ߲ ߠߊߞߎߣߎ߲߫ ߠߊ߫ ߥߊ߯ߕߌ ߓߍ߯ ߟߊ߫ ߞߊ߲ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߦߊ߬ߘߊ ߞߣߐ߫߸ ߊ߬ ߣߴߏ߬ ߞߐ߫ ߞߊ߲ ߛߙߍߘߍ ߘߐ߫.",
"ext-uls-language-settings-applying": "ߟߥߊߟߌߟߌ ߦߋ߫ ߛߋ߲߬ߠߊ߫...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ߘߏ߫ ߜߘߍ߫|$1 ߜߘߍ߫}}",
+ "ext-uls-compact-link-info": "ߞߊ߲ ߡߍ߲ ߠߎ߬ ߓߍ߯ (ߟߊߞߊ߬ߝߏ߬ߣߍ߲߬ ߦߋ߫ ߓߊߕߐߡߐ߲ߠߌ߲߫ ߓߟߏߡߊ߬ ߖߊ߬ߡߊ ߟߊ߫ ߛߎߥߊ߲ߘߟߌ ߘߐ߫ ߌߟߋ ߣߌ߫ ߡߐ߰ ߜߘߍ ߟߎ߬ ߓߟߏ߫)",
"prefs-languages": "ߞߊ߲ ߠߎ߬",
- "ext-uls-compact-no-results": "ߞߐߜߍ ߣߌ߲߬ ߕߴߦߋ߲߬ ߌ ߟߊ߫ ߢߌߣߌ߲ߣߌ߲߫ ߞߊ߲ ߘߐ߫."
+ "ext-uls-compact-language-links-preference": "[[$1|ߞߊ߲ ߛߘߌ߬ߜߋ߲߬ ߘߐߜߙߐ߬ߣߍ߲]] ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߌ ߟߊ߫ ߞߊ߲߫ ߠߊߓߊ߯ߙߕߊ ߟߎ߬ ߘߐ߫ ߓߘߍߞߍ߭.",
+ "ext-uls-compact-no-results": "ߞߐߜߍ ߣߌ߲߬ ߕߴߦߋ߲߬ ߌ ߟߊ߫ ߢߌߣߌ߲ߣߌ߲߫ ߞߊ߲ ߘߐ߫.",
+ "ext-uls-setlang-error": "ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߕߎ߲߬ ߦߴߊ߬ ߘߐ߫ ߌ ߟߊ߫ ߞߊ߲ ߝߌ߬ߛߊ߬ߡߊ߲߬ߕߋ ߟߎ߬ ߟߏ߲ߘߐߦߊ߫ ߕߎߡߊ ߟߊ߫. ߝߎ߬ߕߎ߲߬ߕߌ: $1",
+ "ext-uls-setlang-unknown-error": "ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ",
+ "ext-uls-setlang-message": "ߛߘߌ߬ߜߋ߲ ߡߍ߲ ߠߊߓߊ߬ߕߏ߬ߣߍ߲߬ ߌ ߓߟߏ߫߸ ߏ߬ ߦߴߊ߬ ߢߌߣߌ߲߫ ߠߊ߫ ߞߏ߫ ߞߊ߬ ߢߐ߲߯ߕߍߞߣߍ ߦߌ߬ߘߊ߬ <strong>$1 ($2)</strong> ߘߐ߫",
+ "ext-uls-setlang-heading": "ߞߊ߬ ߢߐ߲߯ߕߍߞߣߍ ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬؟",
+ "ext-uls-setlang-accept": "ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߟߊߡߌ߬ߘߊ߬",
+ "ext-uls-setlang-loading": "ߟߥߊߟߌߟߌ ߦߋ߫ ߛߋ߲߬ߠߊ߫...",
+ "ext-uls-setlang-cancel": "ߊ߬ ߞߊ߫ ߡߊߝߊ߬ߟߋ߲߫ ߘߋ߬"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ojb.json b/MLEB/UniversalLanguageSelector/i18n/ojb.json
new file mode 100644
index 00000000..f25c826c
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/ojb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aandeginini"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Bezhigwan nawaj|$1 nawaj}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/om.json b/MLEB/UniversalLanguageSelector/i18n/om.json
index 15f105f0..aa48f1ea 100644
--- a/MLEB/UniversalLanguageSelector/i18n/om.json
+++ b/MLEB/UniversalLanguageSelector/i18n/om.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Maammee",
"Xð"
]
},
- "uls-plang-title-languages": "Afaan"
+ "uls-plang-title-languages": "Afaan",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Kan biroo tokko|Kanneen biroo $1}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/or.json b/MLEB/UniversalLanguageSelector/i18n/or.json
index 236cc322..c3682fd2 100644
--- a/MLEB/UniversalLanguageSelector/i18n/or.json
+++ b/MLEB/UniversalLanguageSelector/i18n/or.json
@@ -47,5 +47,6 @@
"ext-uls-input-disable-notification": "ଇନପୁଟ ଟୁଲ ଅଚଳ କରାଯାଇଛି",
"ext-uls-input-disable-notification-undo": "ପଛକୁ ଫେରିବା",
"ext-uls-input-disable-notification-info-personal": "ଭାଷା ସେଟିଙ୍ଗରୁ ଇନପୁଟ ଟୁଲ ସବୁବେଳେ ସଚଳ କରିପାରିବେ ।",
- "ext-uls-input-disable-notification-info-interlanguage": "ଭାଷା ସେଟିଙ୍ଗରୁ ଇନପୁଟ ଟୁଲ ସବୁବେଳେ ସଚଳ କରିପାରିବେ ଓ ଭାଷା ବାଛିପାରିବେ ।"
+ "ext-uls-input-disable-notification-info-interlanguage": "ଭାଷା ସେଟିଙ୍ଗରୁ ଇନପୁଟ ଟୁଲ ସବୁବେଳେ ସଚଳ କରିପାରିବେ ଓ ଭାଷା ବାଛିପାରିବେ ।",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ଆଉ ଗୋଟେ|$1 ଅଧିକ}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/pap.json b/MLEB/UniversalLanguageSelector/i18n/pap.json
new file mode 100644
index 00000000..db97ece7
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/pap.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ObaTango"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Un mas|$1 mas}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/pms.json b/MLEB/UniversalLanguageSelector/i18n/pms.json
index 7f07eff8..d5983b8b 100644
--- a/MLEB/UniversalLanguageSelector/i18n/pms.json
+++ b/MLEB/UniversalLanguageSelector/i18n/pms.json
@@ -52,5 +52,6 @@
"ext-uls-input-disable-notification-undo": "Buté 'me ch'a l'era",
"ext-uls-input-disable-notification-info-personal": "A peul ativé j'utiss d'imission an qualsëssìa moment an soe ampostassion ëd lenga.",
"ext-uls-input-disable-notification-info-interlanguage": "A peul ativé j'utiss d'imission an qualsëssìa moment ant j'ampostassion ëd lenga da banda dla lista dle lenghe.",
- "ext-uls-language-settings-applying": "Ativassion an cors..."
+ "ext-uls-language-settings-applying": "Ativassion an cors...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|un ëd pi|$1 ëd pi}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/pnb.json b/MLEB/UniversalLanguageSelector/i18n/pnb.json
index f2bfaaf7..d8ab1cf9 100644
--- a/MLEB/UniversalLanguageSelector/i18n/pnb.json
+++ b/MLEB/UniversalLanguageSelector/i18n/pnb.json
@@ -1,8 +1,30 @@
{
"@metadata": {
"authors": [
+ "Abbas dhothar",
"Xð"
]
},
- "uls-plang-title-languages": "بولیاں"
+ "uls-desc": "بولی ترتیباں",
+ "uls-plang-title-languages": "بولیاں",
+ "ext-uls-select-language-settings-icon-tooltip": "بولی ترتیباں",
+ "ext-uls-language-settings-preferences-link": "ہور بولی ترتیباں",
+ "ext-uls-display-settings-title": "ڈسپلے ترتیباں",
+ "ext-uls-display-settings-language-tab": "بولی",
+ "ext-uls-display-settings-fonts-tab": "لپیاں",
+ "ext-uls-display-settings-title-short": "ڈسپلے",
+ "ext-uls-display-settings-desc": "مینوز تے فونٹس دے لئی استعمال شدہ بولی نو‏‏ں مرتب کرو",
+ "ext-uls-language-settings-title": "بولی ترتیباں",
+ "ext-uls-language-settings-cancel": "ختم",
+ "ext-uls-display-settings-font-settings": "لپی ترتیباں",
+ "ext-uls-display-settings-ui-language": "ڈسپلے بولی",
+ "ext-uls-display-settings-anon-label": "ڈسپلے بولی:",
+ "ext-uls-webfonts-settings-info-link": "ہور جانکاری",
+ "ext-uls-input-settings-more-languages-tooltip": "ہور بولیاں",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ہور $1 بولیاں}}",
+ "prefs-languages": "بولیاں",
+ "ext-uls-setlang-unknown-error": "انجان غلطی",
+ "ext-uls-setlang-heading": "انٹرفیس بولی بدلو؟",
+ "ext-uls-setlang-accept": "تبدیلی قبول",
+ "ext-uls-setlang-cancel": "نا بدلو"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/pt-br.json b/MLEB/UniversalLanguageSelector/i18n/pt-br.json
index 80b14ebf..e35aa7af 100644
--- a/MLEB/UniversalLanguageSelector/i18n/pt-br.json
+++ b/MLEB/UniversalLanguageSelector/i18n/pt-br.json
@@ -4,6 +4,7 @@
"Caio1478",
"Dianakc",
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"Felipe L. Ewald",
"Helder.wiki",
"Jaideraf",
diff --git a/MLEB/UniversalLanguageSelector/i18n/qqq.json b/MLEB/UniversalLanguageSelector/i18n/qqq.json
index 1c0f02da..cd424842 100644
--- a/MLEB/UniversalLanguageSelector/i18n/qqq.json
+++ b/MLEB/UniversalLanguageSelector/i18n/qqq.json
@@ -15,7 +15,7 @@
},
"uls-desc": "{{desc|name=UniversalLanguageSelector|url=https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector}}",
"uls-plang-title-languages": "A title for the are in the sidebar in which the interlanguage links are supposed to appear.\nThis title is shown when there are no interlanguage links there, but an icon that enables the ULS is shown.\n{{Identical|Language}}",
- "uls-ime-helppage": "Target page for ime helps. Parameters:\n* $1 - ime id. Intended for wiki local customization. e.g. cyrl-palochka",
+ "uls-ime-helppage": "{{notranslate}}\nTarget page for ime helps. Parameters:\n* $1 - ime id. Intended for wiki local customization. e.g. cyrl-palochka",
"ext-uls-select-language-settings-icon-tooltip": "A tooltip for the icon that shows the language selector.\n{{Identical|Language settings}}",
"ext-uls-undo-language-tooltip-text": "Text for the tooltip appearing when language is changed. Parameters:\n* $1 - the previous language autonym",
"ext-uls-undo-language-tooltip-text-local": "Text for the tooltip appearing when language is changed locally for one wiki when global language setting is in use. Parameters:\n* $1 - the previous language autonym",
diff --git a/MLEB/UniversalLanguageSelector/i18n/rmc.json b/MLEB/UniversalLanguageSelector/i18n/rmc.json
new file mode 100644
index 00000000..7fe12279
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/rmc.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Adehertogh"
+ ]
+ },
+ "ext-uls-display-settings-language-tab": "Čhib",
+ "ext-uls-input-settings-more-languages-tooltip": "Buter čhiba",
+ "jquery-ime-other-languages": "Aver čhiba",
+ "jquery-ime-help": "Ažutipen",
+ "ext-uls-compact-link-count": "$1 {{PLURAL:$1|aver}}",
+ "prefs-languages": "Čhiba"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ro.json b/MLEB/UniversalLanguageSelector/i18n/ro.json
index 35aca946..1091af5a 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ro.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ro.json
@@ -3,6 +3,7 @@
"authors": [
"Adrianbblk",
"Minisarm",
+ "NGC 54",
"Strainu"
]
},
@@ -10,6 +11,7 @@
"uls-plang-title-languages": "Limbi",
"ext-uls-select-language-settings-icon-tooltip": "Setări de limbă",
"ext-uls-undo-language-tooltip-text": "Limba schimbată din $1",
+ "ext-uls-undo-language-tooltip-text-local": "Limba schimbată pentru acest wiki. Verificați-vă [[Special:GlobalPreferences|preferințele globale]] pentru a schimba limba pentru toate wiki-urile.",
"ext-uls-language-settings-preferences-link": "Mai multe setări de limbă",
"uls-betafeature-label": "Legături interlinguale compacte",
"uls-betafeature-desc": "Afișează o versiune trunchiată a listei de legături interlinguale, care conține doar limbile relevante pentru dumneavoastră.",
@@ -23,7 +25,7 @@
"ext-uls-language-settings-cancel": "Revocare",
"ext-uls-language-buttons-help": "Modifică limba meniurilor. Limba conținutului nu va fi afectată.",
"ext-uls-display-settings-font-settings": "Setări font",
- "ext-uls-display-settings-ui-language": "Limbă afișare",
+ "ext-uls-display-settings-ui-language": "Limbă care să fie afișată",
"ext-uls-display-settings-anon-label": "Limba interfeței:",
"ext-uls-display-settings-anon-same-as-content": "$1 (asemenea conținutului)",
"ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Autentificați-vă]] pentru a alege o altă limbă pentru meniuri.",
@@ -59,5 +61,13 @@
"ext-uls-compact-link-count": "{{PLURAL:$1|Încă una|Încă $1}}",
"ext-uls-compact-link-info": "Toate limbile (selecție inițială cu alegerile obișnuite ale dumneavoastră și ale altor utilizatori)",
"prefs-languages": "Limbi",
- "ext-uls-compact-language-links-preference": "Folosiți o [[$1|listă compactă de limbi]], ce conține doar limbile relevante pentru dumneavoastră."
+ "ext-uls-compact-language-links-preference": "Folosiți o [[$1|listă compactă de limbi]], ce conține doar limbile relevante pentru dumneavoastră.",
+ "ext-uls-compact-no-results": "Această pagină nu este disponibilă în limba pe care ați căutat-o.",
+ "ext-uls-setlang-error": "A apărut o eroare la actualizare limbii dvs. preferate. Eroare: $1",
+ "ext-uls-setlang-unknown-error": "Eroare necunoscută",
+ "ext-uls-setlang-message": "legătura pe care ați urmat-o a solicitat interfeței să fie afișată în <strong>$1 ($2)</strong>",
+ "ext-uls-setlang-heading": "Schimbați limba interfeței?",
+ "ext-uls-setlang-accept": "Acceptați schimbarea",
+ "ext-uls-setlang-loading": "Se aplică...",
+ "ext-uls-setlang-cancel": "Nu schimbați"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/roa-tara.json b/MLEB/UniversalLanguageSelector/i18n/roa-tara.json
index 5e81d50b..1d8f99f1 100644
--- a/MLEB/UniversalLanguageSelector/i18n/roa-tara.json
+++ b/MLEB/UniversalLanguageSelector/i18n/roa-tara.json
@@ -59,5 +59,12 @@
"ext-uls-compact-link-info": "Tutte le lènghe ('u scacchiamende iniziale avène 'mbrà le scacchiaminde comune tue e de l'otre)",
"prefs-languages": "Lènghe",
"ext-uls-compact-language-links-preference": "Ause 'n'[[$1|elenghe ridotte de lènghe]], cu le lènghe ca so 'mbortande pe te.",
- "ext-uls-compact-no-results": "Sta pàgene non g'è disponibbile jndr'à lènghe ca ste cirche."
+ "ext-uls-compact-no-results": "Sta pàgene non g'è disponibbile jndr'à lènghe ca ste cirche.",
+ "ext-uls-setlang-error": "Ha assute 'n'errore mendre ste carecave 'a lènga preferita toje. Errore: $1",
+ "ext-uls-setlang-unknown-error": "Errore scanusciute",
+ "ext-uls-setlang-message": "'U colelgamende ca ste seguive ave cercate 'u 'ndrucamende de l'inderfacce jndr'à <strong>$1 ($2)</strong>",
+ "ext-uls-setlang-heading": "Cange 'a ènghe de l'inderfacce?",
+ "ext-uls-setlang-accept": "Accette 'u cangiamende",
+ "ext-uls-setlang-loading": "Stoche a appleche...",
+ "ext-uls-setlang-cancel": "Nò cangià"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ru.json b/MLEB/UniversalLanguageSelector/i18n/ru.json
index 26a5a5e2..07f6b193 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ru.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ru.json
@@ -75,6 +75,7 @@
"prefs-languages": "Языки",
"ext-uls-compact-language-links-preference": "Использовать [[$1|компактный список языков]] с подходящими вам языками.",
"ext-uls-compact-no-results": "Эта страница недоступна на выбранном вами языке.",
+ "ext-uls-setlang-unknown-error": "Неизвестная ошибка",
"ext-uls-setlang-accept": "Подтвердить изменение",
"ext-uls-setlang-loading": "Применение…"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/rue.json b/MLEB/UniversalLanguageSelector/i18n/rue.json
index 528287b9..3ac22eaf 100644
--- a/MLEB/UniversalLanguageSelector/i18n/rue.json
+++ b/MLEB/UniversalLanguageSelector/i18n/rue.json
@@ -6,5 +6,6 @@
},
"uls-plang-title-languages": "Языкы",
"ext-uls-select-language-settings-icon-tooltip": "Языковы наставлїня",
+ "ext-uls-language-settings-preferences-link": "Далшы языковы наставлїня",
"ext-uls-language-settings-title": "Языковы наставлїня"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sah.json b/MLEB/UniversalLanguageSelector/i18n/sah.json
index a5b91114..b18c44d9 100644
--- a/MLEB/UniversalLanguageSelector/i18n/sah.json
+++ b/MLEB/UniversalLanguageSelector/i18n/sah.json
@@ -9,5 +9,6 @@
"uls-plang-title-languages": "Тыллар",
"ext-uls-select-language-settings-icon-tooltip": "Тылы туруоруу",
"ext-uls-undo-language-tooltip-text": "Инники тыл: $1",
- "ext-uls-language-settings-preferences-link": "Тыл эбии туруоруулара"
+ "ext-uls-language-settings-preferences-link": "Тыл эбии туруоруулара",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Эбии $1}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/se.json b/MLEB/UniversalLanguageSelector/i18n/se.json
index f32f1ebc..39d7bb5d 100644
--- a/MLEB/UniversalLanguageSelector/i18n/se.json
+++ b/MLEB/UniversalLanguageSelector/i18n/se.json
@@ -1,10 +1,13 @@
{
"@metadata": {
- "authors": []
+ "authors": [
+ "Yupik"
+ ]
},
"uls-plang-title-languages": "Gielat",
"ext-uls-display-settings-language-tab": "Giella",
"ext-uls-display-settings-fonts-tab": "Fonttat",
+ "jquery-ime-other-languages": "Eará gielat",
"jquery-ime-help": "Veahkki",
"prefs-languages": "Gielat"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/shi.json b/MLEB/UniversalLanguageSelector/i18n/shi.json
new file mode 100644
index 00000000..542d2812
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/shi.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ayour2002"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Yan yaḍn|$1 uggar}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/skr-arab.json b/MLEB/UniversalLanguageSelector/i18n/skr-arab.json
index 1e903c60..09698c33 100644
--- a/MLEB/UniversalLanguageSelector/i18n/skr-arab.json
+++ b/MLEB/UniversalLanguageSelector/i18n/skr-arab.json
@@ -19,5 +19,6 @@
"jquery-ime-other-languages": "ٻیاں زباناں",
"jquery-ime-help": "مدد",
"ext-uls-input-disable-notification-undo": "واپس",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ہک ٻئی|$1 ٻیاں}}",
"prefs-languages": "زباناں"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sl.json b/MLEB/UniversalLanguageSelector/i18n/sl.json
index 72e35d4a..0793cd80 100644
--- a/MLEB/UniversalLanguageSelector/i18n/sl.json
+++ b/MLEB/UniversalLanguageSelector/i18n/sl.json
@@ -9,7 +9,7 @@
},
"uls-desc": "Daje uporabniku več načinov izbire jezika in prilagoditve jezikovnih nastavitev",
"uls-plang-title-languages": "Jeziki",
- "ext-uls-select-language-settings-icon-tooltip": "Nastavitve jezika",
+ "ext-uls-select-language-settings-icon-tooltip": "Jezikovne nastavitve",
"ext-uls-undo-language-tooltip-text": "Sprememba jezika iz $1.",
"ext-uls-language-settings-preferences-link": "Več jezikovnih nastavitev",
"uls-betafeature-label": "Strnjene jezikovne povezave",
@@ -22,14 +22,14 @@
"ext-uls-language-settings-title": "Jezikovne nastavitve",
"ext-uls-language-settings-apply": "Uporabi nastavitve",
"ext-uls-language-settings-cancel": "Prekliči",
- "ext-uls-language-buttons-help": "Spremeni jezik menijev. Na jezik vsebine to ne bo vplivalo.",
+ "ext-uls-language-buttons-help": "Jezik menijev lahko spremenite. Na jezik vsebine to ne bo vplivalo.",
"ext-uls-display-settings-font-settings": "Nastavitve pisav",
"ext-uls-display-settings-ui-language": "Jezik prikaza",
"ext-uls-display-settings-anon-label": "Jezik prikaza:",
"ext-uls-display-settings-anon-same-as-content": "$1 (enako kot vsebina)",
- "ext-uls-display-settings-anon-log-in-cta": "Za izbiro drugačnega jezika za menije se [[Special:UserLogin|prijavite]].",
- "ext-uls-webfonts-settings-title": "Prenesi pisave, ko je to potrebno",
- "ext-uls-webfonts-settings-info": "Samodejno prenesi manjkajoče povezave in omogoči izbor želenih pisav.",
+ "ext-uls-display-settings-anon-log-in-cta": "Za prikaz menijev v drugem jeziku se [[Special:UserLogin|prijavite]].",
+ "ext-uls-webfonts-settings-title": "Prenos potrebnih pisav",
+ "ext-uls-webfonts-settings-info": "Samodejno prenese manjkajoče povezave in omogoči izbiro želenih pisav.",
"ext-uls-webfonts-settings-info-link": "Več o tem",
"ext-uls-webfonts-select-for": "Izberite pisavo za $1",
"ext-uls-webfonts-select-for-ui-info": "Pisava, uporabljena za uporabniški vmesnik",
@@ -51,7 +51,7 @@
"ext-uls-input-disable": "Onemogoči orodja za vnos",
"ext-uls-input-enable": "Omogoči orodja za vnos",
"ext-uls-input-disable-info": "Orodja za vnos so onemogočena.",
- "ext-uls-input-settings-noime": "Za ta jezik ni na razpolago noben način vnosa.",
+ "ext-uls-input-settings-noime": "Za ta jezik ni na voljo noben način vnosa.",
"ext-uls-input-disable-notification": "Orodja za vnos so onemogočena",
"ext-uls-input-disable-notification-undo": "Razveljavi",
"ext-uls-input-disable-notification-info-personal": "Orodja za vnos lahko v jezikovnih nastavitvah omogočite kadarkoli.",
@@ -60,6 +60,6 @@
"ext-uls-compact-link-count": "{{PLURAL:$1|1=Še en|Še $1}}",
"ext-uls-compact-link-info": "Vsi jeziki (izbor na podlagi tvojih odločitev in odločitev drugih)",
"prefs-languages": "Jeziki",
- "ext-uls-compact-language-links-preference": "Uporabi [[$1|kompakten seznam jezikov]] z jeziki, ki so zate pomembni.",
+ "ext-uls-compact-language-links-preference": "Uporaba [[$1|kompaktnega seznama jezikov]], ki so relevantni za vas.",
"ext-uls-compact-no-results": "Ta stran ni na voljo v jeziku, ki si ga iskal."
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sli.json b/MLEB/UniversalLanguageSelector/i18n/sli.json
index 07f1f3db..35e229a9 100644
--- a/MLEB/UniversalLanguageSelector/i18n/sli.json
+++ b/MLEB/UniversalLanguageSelector/i18n/sli.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
- "Xð"
+ "Xð",
+ "Äberlausitzer"
]
},
- "uls-plang-title-languages": "Sproache"
+ "uls-plang-title-languages": "Sproache",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Anne weitere|$1 weitere}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/smn.json b/MLEB/UniversalLanguageSelector/i18n/smn.json
new file mode 100644
index 00000000..1cf37f36
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/smn.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "ext-uls-select-language-settings-icon-tooltip": "Kielâasâttâsah",
+ "ext-uls-display-settings-language-tab": "Kielâ",
+ "ext-uls-language-settings-title": "Kielâasâttâsah",
+ "jquery-ime-other-languages": "Eres kielah",
+ "prefs-languages": "Kielah"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sms.json b/MLEB/UniversalLanguageSelector/i18n/sms.json
new file mode 100644
index 00000000..a38bdadb
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/sms.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yupik"
+ ]
+ },
+ "jquery-ime-other-languages": "Jeeʹres ǩiõl"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/so.json b/MLEB/UniversalLanguageSelector/i18n/so.json
index 033117aa..c1da4e11 100644
--- a/MLEB/UniversalLanguageSelector/i18n/so.json
+++ b/MLEB/UniversalLanguageSelector/i18n/so.json
@@ -1,11 +1,13 @@
{
"@metadata": {
"authors": [
+ "Abdullahi",
"Abshirdheere",
"Xð"
]
},
"uls-plang-title-languages": "Afafka",
"ext-uls-language-settings-preferences-link": "Dooqyo dheeraad ah e luqada",
- "uls-betafeature-label": "Linkiyada af isku dhegan"
+ "uls-betafeature-label": "Linkiyada af isku dhegan",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Hal kale|$1 dheeraad}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sr-ec.json b/MLEB/UniversalLanguageSelector/i18n/sr-ec.json
index 79c9fecf..f6c7e73f 100644
--- a/MLEB/UniversalLanguageSelector/i18n/sr-ec.json
+++ b/MLEB/UniversalLanguageSelector/i18n/sr-ec.json
@@ -62,6 +62,6 @@
"ext-uls-compact-link-count": "Још {{PLURAL:$1|1=један|$1}} {{PLURAL:$1|језик|језика}}",
"ext-uls-compact-link-info": "Сви језици (првобитан избор је заснован на најчешћим одабирима вас и других)",
"prefs-languages": "Језици",
- "ext-uls-compact-language-links-preference": "Користи [[$1|компактан списак језика]], с језицима који су вама релевантни.",
+ "ext-uls-compact-language-links-preference": "Користи [[$1|сажети списак језика]], с језицима који су Вам важни.",
"ext-uls-compact-no-results": "Ова страница није доступна на језику који тражите."
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/su.json b/MLEB/UniversalLanguageSelector/i18n/su.json
index 08f74c69..2316f361 100644
--- a/MLEB/UniversalLanguageSelector/i18n/su.json
+++ b/MLEB/UniversalLanguageSelector/i18n/su.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Kandar",
"Uchup19"
]
},
- "ext-uls-language-settings-cancel": "Bolay"
+ "ext-uls-language-settings-cancel": "Bolay",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Hiji deui|$1 deui}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/sv.json b/MLEB/UniversalLanguageSelector/i18n/sv.json
index 19126777..74591420 100644
--- a/MLEB/UniversalLanguageSelector/i18n/sv.json
+++ b/MLEB/UniversalLanguageSelector/i18n/sv.json
@@ -5,14 +5,15 @@
"Albinomamba",
"Jopparn",
"Lokal Profil",
+ "Sabelöga",
"WikiPhoenix"
]
},
"uls-desc": "Ger användaren flera sätt att välja ett språk och justera språkinställningar",
"uls-plang-title-languages": "Språk",
"ext-uls-select-language-settings-icon-tooltip": "Språkinställningar",
- "ext-uls-undo-language-tooltip-text": "Språk ändrades från $1",
- "ext-uls-undo-language-tooltip-text-local": "Språket ändrades för denna wiki. Kontrollera dina [[Special:GlobalPreferences|globala inställningar]] för att ändra språket för alla wikis.",
+ "ext-uls-undo-language-tooltip-text": "Språket ändrades från $1",
+ "ext-uls-undo-language-tooltip-text-local": "Språket ändrades för denna wiki. Kontrollera dina [[Special:GlobalPreferences|globala inställningar]] för att ändra språket för alla wikier.",
"ext-uls-language-settings-preferences-link": "Fler språkinställningar",
"uls-betafeature-label": "Kompakta språklänkar",
"uls-betafeature-desc": "Visa en kortare version av språklistan, med bara de språk som är mer relevanta för dig.",
@@ -59,11 +60,12 @@
"ext-uls-input-disable-notification-info-personal": "Du kan aktivera verktygen för indata när som helst från språkinställningarna.",
"ext-uls-input-disable-notification-info-interlanguage": "Du kan aktivera verktygen för indata när som helst från språkinställningarna bredvid språklistan.",
"ext-uls-language-settings-applying": "Tillämpar...",
- "ext-uls-compact-link-count": "{{PLURAL:$1|Ett till|$1 fler}}",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Ett till|$1 till}}",
"ext-uls-compact-link-info": "Alla språk (urval baserat på vanliga val av dig och andra)",
"prefs-languages": "Språk",
"ext-uls-compact-language-links-preference": "Använd en [[$1|kompakt språklista]] med språk som är relevanta för dig.",
"ext-uls-compact-no-results": "Denna sida finns inte tillgänglig på språket du sökte efter.",
+ "ext-uls-setlang-error": "Det uppstod ett fel vid uppdateringen av ditt föredraga språk. Fel: $1",
"ext-uls-setlang-unknown-error": "Okänt fel",
"ext-uls-setlang-message": "Länken du följde begärde gränssnittet att visas på <strong>$1 ($2)</strong>",
"ext-uls-setlang-heading": "Ändra gränssnittsspråk?",
diff --git a/MLEB/UniversalLanguageSelector/i18n/syl.json b/MLEB/UniversalLanguageSelector/i18n/syl.json
new file mode 100644
index 00000000..e0f4968f
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/i18n/syl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "এম আবু সাঈদ"
+ ]
+ },
+ "ext-uls-compact-link-count": "{{PLURAL:$1|One more|$1 more}}"
+}
diff --git a/MLEB/UniversalLanguageSelector/i18n/tay.json b/MLEB/UniversalLanguageSelector/i18n/tay.json
index 7dbe741a..cb70c879 100644
--- a/MLEB/UniversalLanguageSelector/i18n/tay.json
+++ b/MLEB/UniversalLanguageSelector/i18n/tay.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Akamycoco",
"Hitaypayan"
]
},
@@ -31,5 +32,6 @@
"ext-uls-input-enable": "Gyahiy qayqaya’ na bbiru’ sa qsahuy",
"ext-uls-input-disable-notification-undo": "Psbzih",
"ext-uls-language-settings-applying": "Siy galiy...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|kya na’ $1 gluw na ini’ ptnaq kay’}}",
"prefs-languages": "Kay’"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/th.json b/MLEB/UniversalLanguageSelector/i18n/th.json
index 5ae066c3..2b3d6b79 100644
--- a/MLEB/UniversalLanguageSelector/i18n/th.json
+++ b/MLEB/UniversalLanguageSelector/i18n/th.json
@@ -4,6 +4,7 @@
"Aefgh39622",
"Ans",
"Nitisart Jungtrakungrat",
+ "Patsagorn Y.",
"Xð"
]
},
@@ -58,10 +59,16 @@
"ext-uls-input-disable-notification-info-personal": "คุณสามารถเปิดใช้งานเครื่องมือป้อนข้อมูลได้ทุกเมื่อจากการตั้งค่าภาษา",
"ext-uls-input-disable-notification-info-interlanguage": "คุณสามารถเปิดใช้งานเครื่องมือป้อนข้อมูลได้ทุกเมื่อจากการตั้งค่าภาษาถัดจากรายการภาษา",
"ext-uls-language-settings-applying": "กำลังใช้...",
- "ext-uls-compact-link-count": "{{PLURAL:$1|เพิ่มเติมอีกหนึ่งภาษา|เพิ่มเติมอีก $1 ภาษา}}",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|อีก 1 ภาษา|อีก $1 ภาษา}}",
"ext-uls-compact-link-info": "ภาษาทั้งหมด (ที่เลือกไว้ตั้งแต่แรกจากตัวเลือกธรรมดาโดยคุณและคนอื่นๆ)",
"prefs-languages": "ภาษา",
"ext-uls-compact-language-links-preference": "ใช้ [[$1|รายการภาษาแบบกระชับ]] โดยมีภาษาที่เกี่ยวข้องกับคุณ",
"ext-uls-compact-no-results": "หน้านี้ไม่มีในภาษาที่คุณค้นหา",
- "ext-uls-setlang-unknown-error": "เกิดข้อผิดพลาดโดยไม่ทราบสาเหตุ"
+ "ext-uls-setlang-error": "เกิดข้อผิดพลาดกับการอัปเดตตามภาษาที่คุณเลือก ข้อผิดพลาด: $1",
+ "ext-uls-setlang-unknown-error": "เกิดข้อผิดพลาดโดยไม่ทราบสาเหตุ",
+ "ext-uls-setlang-message": "ลิงก์ที่คุณตามมามีคำขอเปลี่ยนภาษาอินเตอร์เฟซให้เป็นภาษา <strong>$1 ($2)</strong>",
+ "ext-uls-setlang-heading": "เปลี่ยนภาษาของอินเตอร์เฟซหรือไม่?",
+ "ext-uls-setlang-accept": "ยอมรับการเปลี่ยนแปลง",
+ "ext-uls-setlang-loading": "กำลังปรับใช้...",
+ "ext-uls-setlang-cancel": "ไม่ต้องเปลี่ยนตาม"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/ti.json b/MLEB/UniversalLanguageSelector/i18n/ti.json
index 4bfeea36..7370ed32 100644
--- a/MLEB/UniversalLanguageSelector/i18n/ti.json
+++ b/MLEB/UniversalLanguageSelector/i18n/ti.json
@@ -15,14 +15,24 @@
"ext-uls-language-settings-apply": "ኣቀማምጣታት ኣተግብር",
"ext-uls-language-settings-cancel": "ኣትርፍ",
"ext-uls-display-settings-font-settings": "ቅርጺ ፈደላት ኣቀማምጣታት",
+ "ext-uls-display-settings-ui-language": "ቋንቋ መርኣዪ",
+ "ext-uls-display-settings-anon-label": "ቋንቋ መርኣዪ፦",
"ext-uls-webfonts-settings-info-link": "ተወሳኺ ሓበሬታ",
"ext-uls-input-settings-title": "መእተዊ ኣቀማምጣታት",
"ext-uls-input-settings-title-short": "መእተዊ",
+ "ext-uls-input-settings-desc": "ብካልእ ቋንቋ ዲኻ ትጽሕፍ?",
+ "ext-uls-input-settings-ui-language": "ንምጽሓፍ ዝተጠቀመ ቋንቋ",
"ext-uls-input-settings-more-languages-tooltip": "ተወሳኺ ቋንቋታት",
"jquery-ime-other-languages": "ካልኦት ቋንቋታት",
"jquery-ime-help": "ሓገዝ",
- "ext-uls-input-disable-notification-undo": "ፈትሐ",
- "ext-uls-compact-link-count": "{{PLURAL:$1|ሓደ ተወሳኺ|$1 ተወሳኺ}}",
+ "ext-uls-input-disable": "መእተዊ መሳርሒታት ኣሰንክል",
+ "ext-uls-input-enable": "መእተዊ መሳርሒታት ኣኽእል",
+ "ext-uls-input-disable-notification-undo": "ምለስ",
+ "ext-uls-language-settings-applying": "የተግብር ኣሎ...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ሓደ ተወሳኺ|$1 ተወሰኽቲ}}",
"prefs-languages": "ቋንቋታት",
- "ext-uls-setlang-unknown-error": "ዘይፍሉጥ ጌገ"
+ "ext-uls-setlang-unknown-error": "ዘይተፈልጠ ጌጋ",
+ "ext-uls-setlang-accept": "ለውጢ ተቐበል",
+ "ext-uls-setlang-loading": "የተግብር ኣሎ...",
+ "ext-uls-setlang-cancel": "ኣይትለወጥ"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/tl.json b/MLEB/UniversalLanguageSelector/i18n/tl.json
index 5b0d7bc0..1ce5517a 100644
--- a/MLEB/UniversalLanguageSelector/i18n/tl.json
+++ b/MLEB/UniversalLanguageSelector/i18n/tl.json
@@ -2,39 +2,57 @@
"@metadata": {
"authors": [
"AnakngAraw",
+ "GinawaSaHapon",
"Jojit fb",
"Sky Harbor",
"Xð"
]
},
- "uls-desc": "Nagbibigay sa tagagamit ng ilang mga paraan upang makapili ng isang wika at upang mabago ang mga katakdaan ng wika",
- "uls-plang-title-languages": "Mga wika",
- "ext-uls-select-language-settings-icon-tooltip": "Mga kagustuhan sa wika",
- "ext-uls-undo-language-tooltip-text": "Ipinalit ang wika mula sa $1",
- "ext-uls-language-settings-preferences-link": "Karagdagang kagustuhang pang-wika",
- "uls-betafeature-label": "Mga kompaktong kawing panwika",
- "uls-betafeature-desc": "Ipakita ang isang mas maigsing bersiyon ng talaan ng mga wika, kung saan makikita lamang ang mga wikang mas may kaugnayan sa inyo.",
+ "uls-desc": "Nagbibigay ng mga paraan sa tagagamit para makapili ng wika at para maisaayos ang wika",
+ "uls-plang-title-languages": "Wika",
+ "ext-uls-select-language-settings-icon-tooltip": "Pagsasaayos sa wika",
+ "ext-uls-undo-language-tooltip-text": "Ipinalit ang wika mula $1",
+ "ext-uls-undo-language-tooltip-text-local": "Pinalitan ang wika para sa wiki na ito. Tingnan mo ang iyong [[Special:GlobalPreferences|pandaigdigang pagsasaayos]] para palitan ang wika para sa lahat ng wiki.",
+ "ext-uls-language-settings-preferences-link": "Karagdagang pagsasaayos sa wika",
+ "uls-betafeature-label": "Siksik na link ng wika",
+ "uls-betafeature-desc": "Ipakita ang mas maiksing bersyon ng talaan ng wika, na umaayon sa mga wikang pinakamalaki ang kaugnayan sa'yo.",
+ "ext-uls-display-settings-title": "Pagpapakita",
"ext-uls-display-settings-language-tab": "Wika",
- "ext-uls-display-settings-fonts-tab": "Estilo ng titik",
- "ext-uls-display-settings-desc": "Itakda ang wikang ginagamit para sa mga menu at estilo ng titik.",
- "ext-uls-language-settings-title": "Mga kagustuhan sa wika",
- "ext-uls-language-settings-apply": "Ilapat ang mga kagustuhan",
- "ext-uls-language-settings-cancel": "Huwag ituloy",
- "ext-uls-language-buttons-help": "Palitan ang wika ng mga menu. Hindi maaapektuhan ang wika ng nilalaman.",
- "ext-uls-display-settings-anon-same-as-content": "$1 (pareho ng nilalaman)",
- "ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Mag-login]] upang mamili ng ibang wika para sa mga menu.",
+ "ext-uls-display-settings-fonts-tab": "Titik",
+ "ext-uls-display-settings-title-short": "Pagpapakita",
+ "ext-uls-display-settings-desc": "Itakda ang wikang gagamitin sa mga menu at titik.",
+ "ext-uls-language-settings-title": "Pagsasaayos sa wika",
+ "ext-uls-language-settings-apply": "Ilapat",
+ "ext-uls-language-settings-cancel": "Ikansela",
+ "ext-uls-language-buttons-help": "Palitan ang wika ng mga menu. Hindi nito maapektuhan ang wika ng nilalaman.",
+ "ext-uls-display-settings-font-settings": "Pagsasaayos sa titik",
+ "ext-uls-display-settings-ui-language": "Wikang ipapakita",
+ "ext-uls-display-settings-anon-label": "Wikang ipapakita:",
+ "ext-uls-display-settings-anon-same-as-content": "$1 (pareho sa nilalaman)",
+ "ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Mag-login]] upang makapili ng ibang wika ng menu.",
+ "ext-uls-webfonts-settings-title": "Mag-download ng titik (font) kung kailangan",
+ "ext-uls-webfonts-settings-info": "Agad na mag-download ng mga nawawalang font at payagan ang pagpili sa gustong gamiting font.",
"ext-uls-webfonts-settings-info-link": "Karagdagang impormasyon",
- "ext-uls-webfonts-select-for": "Mamili ng estilo ng titik para sa $1",
- "ext-uls-webfonts-select-for-content-info": "Estilo ng titik na ginagamit para sa nilalaman",
- "ext-uls-webfonts-system-font": "Estilo ng titik na gamit ng sistema",
- "ext-uls-input-settings-desc": "Nais mong magsulat gamit ng ibang wika?",
+ "ext-uls-webfonts-select-for": "Pumili ng font para sa $1",
+ "ext-uls-webfonts-select-for-ui-info": "Font na gagamitin sa user interface",
+ "ext-uls-webfonts-select-for-content-info": "Font na gagamitin sa nilalaman",
+ "ext-uls-webfonts-system-font": "Font ng sistema",
+ "ext-uls-back-to-display-settings": "Bumalik sa pagpapakita",
+ "ext-uls-input-settings-title": "Pag-input",
+ "ext-uls-input-settings-title-short": "Pag-input",
+ "ext-uls-input-settings-desc": "Nagsusulat sa ibang wika?",
+ "ext-uls-input-settings-ime-settings": "Paraan ng pag-input para sa $1",
"ext-uls-input-settings-ui-language": "Wikang ginagamit sa pagsulat",
+ "ext-uls-back-to-input-settings": "Bumalik sa pag-input",
"ext-uls-ime-help": "Paano gamitin",
- "ext-uls-disable-input-method": "Gamitin ang katutubong tipaan",
+ "ext-uls-disable-input-method": "Gamitin ang native keyboard",
"ext-uls-input-settings-more-languages-tooltip": "Karagdagang wika",
- "jquery-ime-other-languages": "Ibang mga wika",
- "jquery-ime-disable-text": "Gamitin ang katutubong tipaan",
+ "jquery-ime-other-languages": "Ibang wika",
+ "jquery-ime-disable-text": "Gamitin ang native keyboard",
"jquery-ime-help": "Tulong",
+ "ext-uls-input-disable": "Isara ang mga kagamitan sa pag-input",
+ "ext-uls-input-enable": "Buksan ang mga kagamitan sa pag-input",
+ "ext-uls-input-disable-info": "Nakasara ang mga kagamitan sa pag-input.",
"ext-uls-compact-link-count": "{{PLURAL:$1|Isa pa|$1 pa}}",
"ext-uls-compact-link-info": "Lahat ng wika (unang seleksiyon mula sa mga karaniwang pagpili mo at ng iba)",
"prefs-languages": "Mga wika",
diff --git a/MLEB/UniversalLanguageSelector/i18n/tly.json b/MLEB/UniversalLanguageSelector/i18n/tly.json
index ca131080..1f677686 100644
--- a/MLEB/UniversalLanguageSelector/i18n/tly.json
+++ b/MLEB/UniversalLanguageSelector/i18n/tly.json
@@ -2,9 +2,11 @@
"@metadata": {
"authors": [
"Patriot Kur",
- "Xð"
+ "Xð",
+ "Гусейн"
]
},
"uls-plang-title-languages": "Zıvonon",
- "ext-uls-language-settings-cancel": "Ləğv karde"
+ "ext-uls-language-settings-cancel": "Ləğv karde",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|İ gılən|$1 həniyən}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/trv.json b/MLEB/UniversalLanguageSelector/i18n/trv.json
index 3b2f1ca7..f690fd0f 100644
--- a/MLEB/UniversalLanguageSelector/i18n/trv.json
+++ b/MLEB/UniversalLanguageSelector/i18n/trv.json
@@ -1,10 +1,12 @@
{
"@metadata": {
"authors": [
+ "Akamycoco",
"Iyuqciyang"
]
},
"ext-uls-language-settings-cancel": "Pkungat",
"jquery-ime-help": "Pgkla",
- "ext-uls-input-disable-notification-undo": "pkbrih"
+ "ext-uls-input-disable-notification-undo": "pkbrih",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|$1 knlala}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/udm.json b/MLEB/UniversalLanguageSelector/i18n/udm.json
index 7074fe76..8ba10d76 100644
--- a/MLEB/UniversalLanguageSelector/i18n/udm.json
+++ b/MLEB/UniversalLanguageSelector/i18n/udm.json
@@ -1,11 +1,71 @@
{
"@metadata": {
"authors": [
- "Kaganer"
+ "Kaganer",
+ "Kotwys"
]
},
+ "uls-desc": "Юзчилы кыл бырйыны но кыл пуктэтъёсты тупатыны кӧня ке амалъёс сётэ",
"uls-plang-title-languages": "Кылъёс",
"ext-uls-select-language-settings-icon-tooltip": "Кылъёслы настройкаос",
+ "ext-uls-undo-language-tooltip-text": "Берло кыл: $1",
+ "ext-uls-undo-language-tooltip-text-local": "Та викилы кыл воштӥськиз. Ваньмысьтыз викиосысь кылэз воштыны вылысь [[Special:GlobalPreferences|огъя пуктэтъёстэс]] эскере.",
+ "ext-uls-language-settings-preferences-link": "Кылэз тросгес тупатон",
+ "uls-betafeature-label": "Кылъёс вылэ пичи чӧлсконъёс",
+ "uls-betafeature-desc": "Кылъёсын лыдметлэсь вакчиятэмзэ версизэ возьматоно, тӥледлы тужгес тупасьсэ кылъёсты гинэ пыртыса.",
+ "ext-uls-display-settings-title": "Возьматон пуктэтъёс",
+ "ext-uls-display-settings-language-tab": "Кыл",
+ "ext-uls-display-settings-fonts-tab": "Шрифтъёс",
+ "ext-uls-display-settings-title-short": "Возьматон",
+ "ext-uls-display-settings-desc": "Менюослэн но шрифтъёслэн кылзы",
"ext-uls-language-settings-title": "Кылъёслы настройкаос",
- "prefs-languages": "Кылъёс"
+ "ext-uls-language-settings-apply": "Пуктэтъёсты кутоно",
+ "ext-uls-language-settings-cancel": "Берытсконо",
+ "ext-uls-language-buttons-help": "Менюлэсь кылзэ воштоно. Пуштрослэн кылыз уз воштӥськы.",
+ "ext-uls-display-settings-font-settings": "Шрифт пуктэтъёс",
+ "ext-uls-display-settings-ui-language": "Возьматон кыл",
+ "ext-uls-display-settings-anon-label": "Возьматон кыл:",
+ "ext-uls-display-settings-anon-same-as-content": "$1 (пуштрослэн кадь ик)",
+ "ext-uls-display-settings-anon-log-in-cta": "[[Special:UserLogin|Пырелэ]] менюлы мукет кыл быръён понна.",
+ "ext-uls-webfonts-settings-title": "Кулэ луыку шрифтъёсты кысконо",
+ "ext-uls-webfonts-settings-info": "Ӧвӧлтэм луись шрифтъёсты асэрказ кысконо но умоен лыдъяно шрифтъёсты бырйыны лэзёно.",
+ "ext-uls-webfonts-settings-info-link": "Тросгес ивортодэт",
+ "ext-uls-webfonts-select-for": "$1лы шрифт быръён",
+ "ext-uls-webfonts-select-for-ui-info": "Юзчи интерфейсын уже кутэм шрифт",
+ "ext-uls-webfonts-select-for-content-info": "Пуштрослэн кылыз",
+ "ext-uls-webfonts-system-font": "Сӧзнэт шрифт",
+ "ext-uls-back-to-display-settings": "Берен возьматон пуктэтъёс доры",
+ "ext-uls-input-settings-title": "Пыртон пуктэтъёс",
+ "ext-uls-input-settings-title-short": "Пыртон",
+ "ext-uls-input-settings-desc": "Мукет кылын гожъяськоды-а?",
+ "ext-uls-input-settings-ime-settings": "$1лы пыртон амалъёс",
+ "ext-uls-input-settings-ui-language": "Гожъяськон кыл",
+ "ext-uls-back-to-input-settings": "Берен пыртон пуктэтъёс доры",
+ "ext-uls-ime-help": "Кызьы кутоно",
+ "ext-uls-disable-input-method": "Ас клавиатураме уже кутоно",
+ "ext-uls-input-settings-more-languages-tooltip": "Тросгес кыл",
+ "jquery-ime-other-languages": "Мукет кылъёс",
+ "jquery-ime-disable-text": "Ас клавиатураме уже кутоно",
+ "jquery-ime-help": "Юрттэт",
+ "ext-uls-input-disable": "Пыртон тӥрлыкез кысоно",
+ "ext-uls-input-enable": "Пыртон тӥрлыкез ӝуатоно",
+ "ext-uls-input-disable-info": "Пыртон тӥрлык кысэмын.",
+ "ext-uls-input-settings-noime": "Та кыллы уже кутымон пыртон амалъёс ӧвӧл.",
+ "ext-uls-input-disable-notification": "Пыртон тӥрлыкез кысӥды",
+ "ext-uls-input-disable-notification-undo": "Быдтоно",
+ "ext-uls-input-disable-notification-info-personal": "Пыртон тӥрлыкез котьку кыл пуктэтъёсын ӝуатэмды луэ.",
+ "ext-uls-input-disable-notification-info-interlanguage": "Пыртон тӥрлыкез котьку кылъёсын лыдмет вӧзысь кыл пуктэтъёсын ӝуатэмды луэ.",
+ "ext-uls-language-settings-applying": "Кутӥське...",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Эшшо огез|Эшшо $1-ез}}",
+ "ext-uls-compact-link-info": "Ваньмыз кыл (нырысез быръёс — тӥледын но мукетъёсын тужгес но кутэмъёсыз кылъёс)",
+ "prefs-languages": "Кылъёс",
+ "ext-uls-compact-language-links-preference": "Тӥледлы тупасьёсыныз кылъёсын [[$1|пичи лыдметэз]] уже кутоно.",
+ "ext-uls-compact-no-results": "Тӥледын утчам кылын та бам учконтэм.",
+ "ext-uls-setlang-error": "Умоен лыдъяно кылдэс выльдыку янгыш кылдэм. Янгыш: $1",
+ "ext-uls-setlang-unknown-error": "Тодмотэм янгыш",
+ "ext-uls-setlang-message": "Выжем чӧлсконды куре, интерфейсэз <strong>$1ын ($2)</strong> мед возьматомы шуыса.",
+ "ext-uls-setlang-heading": "Интерфейс кылэз воштоно-а?",
+ "ext-uls-setlang-accept": "Воштонэз юнматоно",
+ "ext-uls-setlang-loading": "Кутӥське...",
+ "ext-uls-setlang-cancel": "Воштоно ӧвӧл"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/vec.json b/MLEB/UniversalLanguageSelector/i18n/vec.json
index 743e30e1..a28548dd 100644
--- a/MLEB/UniversalLanguageSelector/i18n/vec.json
+++ b/MLEB/UniversalLanguageSelector/i18n/vec.json
@@ -9,6 +9,7 @@
"uls-plang-title-languages": "Lengue",
"ext-uls-select-language-settings-icon-tooltip": "Inpostasion par ła lengua",
"ext-uls-undo-language-tooltip-text": "Lengua canbià da $1",
+ "ext-uls-undo-language-tooltip-text-local": "Łéngua canbiada par sta wiki. Rivarda łe to [[Special:GlobalPreferences|prefarense globałi]] par canbiar ła łéngua de tute łe wiki.",
"ext-uls-language-settings-preferences-link": "Altre inpostasion par ła lengua",
"ext-uls-display-settings-title": "Inpostasion de vixuałixasion",
"ext-uls-display-settings-language-tab": "Lengua",
diff --git a/MLEB/UniversalLanguageSelector/i18n/vro.json b/MLEB/UniversalLanguageSelector/i18n/vro.json
index 2d390f43..1e1b05e6 100644
--- a/MLEB/UniversalLanguageSelector/i18n/vro.json
+++ b/MLEB/UniversalLanguageSelector/i18n/vro.json
@@ -1,8 +1,10 @@
{
"@metadata": {
"authors": [
+ "Adeliine",
"Xð"
]
},
- "uls-plang-title-languages": "Keeleq"
+ "uls-plang-title-languages": "Keeleq",
+ "ext-uls-compact-link-count": "Viil {{PLURAL:$1|üts kiil|$1 kiilt}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/wa.json b/MLEB/UniversalLanguageSelector/i18n/wa.json
index 1d692b1d..b3a88cca 100644
--- a/MLEB/UniversalLanguageSelector/i18n/wa.json
+++ b/MLEB/UniversalLanguageSelector/i18n/wa.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Reptilien.19831209BE1",
"Srtxg"
]
},
@@ -8,5 +9,6 @@
"ext-uls-select-language-settings-icon-tooltip": "Tchuzes di lingaedje",
"ext-uls-undo-language-tooltip-text": "Lingaedje candjî di $1",
"ext-uls-language-settings-preferences-link": "Co ds ôtes parametes di lingaedje",
- "ext-uls-language-settings-title": "Tchuzes di lingaedje"
+ "ext-uls-language-settings-title": "Tchuzes di lingaedje",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|Ene|$1}} di pus"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/xmf.json b/MLEB/UniversalLanguageSelector/i18n/xmf.json
index 75df0431..827a88fb 100644
--- a/MLEB/UniversalLanguageSelector/i18n/xmf.json
+++ b/MLEB/UniversalLanguageSelector/i18n/xmf.json
@@ -1,9 +1,11 @@
{
"@metadata": {
"authors": [
+ "Narazeni",
"Silovan",
"Xð"
]
},
- "uls-plang-title-languages": "ნინეფი"
+ "uls-plang-title-languages": "ნინეფი",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|ხოლო ართი|ხოლო $1}}"
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/yi.json b/MLEB/UniversalLanguageSelector/i18n/yi.json
index d70f4bd2..d03890fb 100644
--- a/MLEB/UniversalLanguageSelector/i18n/yi.json
+++ b/MLEB/UniversalLanguageSelector/i18n/yi.json
@@ -53,6 +53,7 @@
"ext-uls-input-disable-notification": "איינגאב געצייג זענען געווארן אומאקטיוויזירט",
"ext-uls-input-disable-notification-undo": "אַנולירן",
"ext-uls-input-disable-notification-info-personal": "איר קענט אקטיוויזירן די איינגאב געצייג אבי ווען פון די שפראך שטעלונגען.",
+ "ext-uls-compact-link-count": "{{PLURAL:$1|נאך איינס|$1 נאך}}",
"prefs-languages": "שפּראַכן",
"ext-uls-compact-language-links-preference": "ניצן א [[$1|קאמפאקטע שפראכן־ליסטע]], מיט שפראכן רעלעוואנט צו אייך."
}
diff --git a/MLEB/UniversalLanguageSelector/i18n/zgh.json b/MLEB/UniversalLanguageSelector/i18n/zgh.json
index a5394eda..444c1b7d 100644
--- a/MLEB/UniversalLanguageSelector/i18n/zgh.json
+++ b/MLEB/UniversalLanguageSelector/i18n/zgh.json
@@ -2,13 +2,16 @@
"@metadata": {
"authors": [
"Amara-Amaziɣ",
+ "Hakim1bal",
"ⵕⴰⵊⵉ"
]
},
"uls-plang-title-languages": "ⵜⵓⵜⵍⴰⵢⵉⵏ",
+ "ext-uls-select-language-settings-icon-tooltip": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵜⵓⵜⵍⴰⵢⵜ",
"ext-uls-display-settings-language-tab": "ⵜⵓⵜⵍⴰⵢⵜ",
"ext-uls-display-settings-fonts-tab": "ⵉⵙⵙⴽⵉⵍⵏ",
"ext-uls-display-settings-title-short": "ⵙⴽⵏ",
+ "ext-uls-language-settings-title": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵜⵓⵜⵍⴰⵢⵜ",
"ext-uls-language-settings-cancel": "ⴼⴼⵖ",
"ext-uls-webfonts-settings-info-link": "ⵓⴳⴳⴰⵔ ⵉⵏⵖⵎⵉⵙⵏ",
"ext-uls-input-settings-more-languages-tooltip": "ⵓⴳⴳⴰⵔ ⵏ ⵜⵓⵜⵍⴰⵢⵉⵏ",
diff --git a/MLEB/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php b/MLEB/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php
index 647a401d..3cbba070 100644
--- a/MLEB/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php
+++ b/MLEB/UniversalLanguageSelector/includes/UniversalLanguageSelectorHooks.php
@@ -27,7 +27,7 @@ class UniversalLanguageSelectorHooks {
*/
public static function setVersionConstant() {
global $wgHooks;
- define( 'ULS_VERSION', '2020-07-20' );
+ define( 'ULS_VERSION', '2021-06-01' );
// The SkinAfterPortlet hook was introduced in version >= 1.35.
// It is the same as BaseTemplateAfterPortlet with the exception of its parameters.
if ( interface_exists( MediaWiki\Skins\Hook\SkinAfterPortletHook::class ) ) {
@@ -64,7 +64,6 @@ class UniversalLanguageSelectorHooks {
*/
private static function isCompactLinksEnabled( User $user ) {
global $wgULSEnable, $wgInterwikiMagic,
- $wgULSCompactLinksEnableAnon,
$wgHideInterlanguageLinks, $wgULSCompactLanguageLinksBetaFeature;
// Whether any user visible features are enabled
@@ -72,10 +71,6 @@ class UniversalLanguageSelectorHooks {
return false;
}
- if ( $user->isAnon() && $wgULSCompactLinksEnableAnon ) {
- return true;
- }
-
if ( $wgULSCompactLanguageLinksBetaFeature === true &&
$wgInterwikiMagic === true &&
$wgHideInterlanguageLinks === false &&
@@ -90,39 +85,45 @@ class UniversalLanguageSelectorHooks {
if ( $wgULSCompactLanguageLinksBetaFeature === false ) {
// Compact language links is a default feature in this wiki.
// Check user preference
- return $user->getBoolOption( 'compact-language-links' );
+ $services = MediaWikiServices::getInstance();
+ if ( method_exists( $services, 'getUserOptionsLookup' ) ) {
+ // MW 1.35 +
+ return $services->getUserOptionsLookup()
+ ->getBoolOption( $user, 'compact-language-links' );
+ } else {
+ return $user->getBoolOption( 'compact-language-links' );
+ }
}
return false;
}
/**
- * Sets user preference to enable the Compact language links if the
- * user account is new.
- *
- * To be removed once no longer needed.
- * @param User $user
- * @param bool $autoCreate
- */
- public static function onLocalUserCreated( User $user, $autoCreate ) {
- if ( RequestContext::getMain()->getConfig()->get( 'ULSCompactLinksForNewAccounts' ) ) {
- $user->setOption( 'compact-language-links', 1 );
- $user->saveSettings();
- }
- }
-
- /**
* @param OutputPage $out
* @param Skin $skin
* Hook: BeforePageDisplay
*/
- public static function addModules( OutputPage $out, $skin ) {
+ public static function addModules( OutputPage $out, Skin $skin ) {
global $wgULSPosition, $wgULSGeoService;
-
+ $unsupportedSkins = [ 'minerva' ];
+ if ( in_array( $skin->getSkinName(), $unsupportedSkins ) ) {
+ return;
+ }
// Soft dependency to Wikibase client. Don't enable CLL if links are managed manually.
$excludedLinks = $out->getProperty( 'noexternallanglinks' );
$override = is_array( $excludedLinks ) && in_array( '*', $excludedLinks );
- if ( !$override && self::isCompactLinksEnabled( $out->getUser() ) ) {
+ $config = [
+ 'wgULSPosition' => $wgULSPosition,
+ ];
+
+ // Load compact links if no mw-interlanguage-selector element is present in the page HTML.
+ // We use the same mechanism as Skin::getDefaultModules and check the HTML for the presence in the HTML,
+ // using the class as the heuristic.
+ // Note if the element is rendered by the skin, its assumed that no collapsing is needed.
+ // See T264824 for more information.
+ if ( !$override && self::isCompactLinksEnabled( $out->getUser() ) &&
+ strpos( $out->getHTML(), 'mw-interlanguage-selector' ) === false
+ ) {
$out->addModules( 'ext.uls.compactlinks' );
}
@@ -137,7 +138,8 @@ class UniversalLanguageSelectorHooks {
// This is added here, and not in addConfig to allow skins and extensions to vary it
// For example, ContentTranslation special pages depend on being able to change it.
- $out->addJsConfigVars( 'wgULSPosition', $wgULSPosition );
+ $out->addJsConfigVars( $config );
+
if ( $wgULSPosition === 'personal' ) {
$out->addModuleStyles( 'ext.uls.pt' );
} else {
@@ -353,18 +355,20 @@ class UniversalLanguageSelectorHooks {
/**
* Hook: ResourceLoaderGetConfigVars
* @param array &$vars
+ * @param string $skin
*/
- public static function addConfig( array &$vars ) {
+ public static function addConfig( array &$vars, $skin ) {
global $wgULSGeoService,
$wgULSIMEEnabled, $wgULSWebfontsEnabled,
$wgULSNoWebfontsSelectors,
$wgULSAnonCanChangeLanguage,
- $wgULSEventLogging,
$wgULSImeSelectors, $wgULSNoImeSelectors,
$wgULSFontRepositoryBasePath,
$wgExtensionAssetsPath,
$wgInterwikiSortingSortPrepend;
+ $extRegistry = ExtensionRegistry::getInstance();
+ $skinConfig = $extRegistry->getAttribute( 'UniversalLanguageSelectorSkinConfig' )[ $skin ] ?? [];
// Place constant stuff here (not depending on request context)
if ( is_string( $wgULSGeoService ) ) {
@@ -374,11 +378,10 @@ class UniversalLanguageSelectorHooks {
$vars['wgULSIMEEnabled'] = $wgULSIMEEnabled;
$vars['wgULSWebfontsEnabled'] = $wgULSWebfontsEnabled;
$vars['wgULSAnonCanChangeLanguage'] = $wgULSAnonCanChangeLanguage;
- $vars['wgULSEventLogging'] = $wgULSEventLogging
- && ExtensionRegistry::getInstance()->isLoaded( 'EventLogging' );
$vars['wgULSImeSelectors'] = $wgULSImeSelectors;
$vars['wgULSNoImeSelectors'] = $wgULSNoImeSelectors;
$vars['wgULSNoWebfontsSelectors'] = $wgULSNoWebfontsSelectors;
+ $vars['wgULSDisplaySettingsInInterlanguage'] = $skinConfig['ULSDisplaySettingsInInterlanguage'] ?? false;
if ( is_string( $wgULSFontRepositoryBasePath ) ) {
$vars['wgULSFontRepositoryBasePath'] = $wgULSFontRepositoryBasePath;
@@ -400,7 +403,7 @@ class UniversalLanguageSelectorHooks {
public static function addVariables( array &$vars, OutputPage $out ) {
// Place request context dependent stuff here
$user = $out->getUser();
- $loggedIn = $user->isLoggedIn();
+ $loggedIn = $user->isRegistered();
// Do not output accept languages if there is risk it will get cached across requests
if ( $out->getConfig()->get( 'ULSAnonCanChangeLanguage' ) || $loggedIn ) {
@@ -433,6 +436,12 @@ class UniversalLanguageSelectorHooks {
public static function onGetPreferences( $user, array &$preferences ) {
global $wgULSCompactLanguageLinksBetaFeature;
+ // T259037: Does not work well on Minerva
+ $skin = RequestContext::getMain()->getSkin();
+ if ( $skin->getSkinName() === 'minerva' ) {
+ return;
+ }
+
$preferences['uls-preferences'] = [
'type' => 'api',
];
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js
index b4b8d8c0..ac5930e8 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/jquery.ime.js
@@ -1,17 +1,15 @@
-/*! jquery.ime - v0.2.0+20200614
+/*! jquery.ime - v0.2.0+20210414
* https://github.com/wikimedia/jquery.ime
-* Copyright (c) 2020 Santhosh Thottingal; License: (GPL-2.0-or-later OR MIT) */
+* Copyright (c) 2021 Santhosh Thottingal; License: (GPL-2.0-or-later OR MIT) */
( function ( $ ) {
'use strict';
var TextEntryFactory, TextEntry, FormWidgetEntry, ContentEditableEntry,
defaultInputMethod;
- // rangy is defined in the rangy library
- /* global rangy */
-
/**
* private function for debugging
+ *
* @param {jQuery} [$obj]
*/
function debug( $obj ) {
@@ -48,7 +46,7 @@
/**
* IME Class
*
- * @class
+ * @class IME
* @constructor
* @param {HTMLElement} element Element on which to listen for events
* @param {TextEntry} textEntry Text entry object to use to get/set text
@@ -75,6 +73,10 @@
this.language = null;
this.context = '';
if ( this.options.showSelector ) {
+ this.options.selectorInside = options.selectorInside !== undefined ?
+ options.selectorInside :
+ // eslint-disable-next-line no-jquery/no-class-state
+ this.$element.hasClass( 'ime-position-inside' );
this.selector = this.$element.imeselector( this.options );
}
this.listen();
@@ -405,7 +407,7 @@
/**
* TextEntry factory
*
- * @class
+ * @class TextEntryFactory
* @constructor
*/
TextEntryFactory = function IMETextEntryFactory() {
@@ -431,17 +433,21 @@
* Wrap an editable element with the appropriate TextEntry class
*
* @param {jQuery} $element The element to wrap
- * @return {TextEntry|undefined} A TextEntry, or undefined if no match
+ * @return {TextEntry|null} A TextEntry, or null if no match
*/
TextEntryFactory.prototype.wrap = function ( $element ) {
var i, len, TextEntryClass;
+ // eslint-disable-next-line no-jquery/no-class-state
+ if ( $element.hasClass( 'noime' ) ) {
+ return null;
+ }
for ( i = 0, len = this.TextEntryClasses.length; i < len; i++ ) {
TextEntryClass = this.TextEntryClasses[ i ];
if ( TextEntryClass.static.canWrap( $element ) ) {
return new TextEntryClass( $element );
}
}
- return undefined;
+ return null;
};
/* Initialization */
@@ -451,7 +457,7 @@
/**
* Generic text entry
*
- * @class
+ * @class TextEntry
* @abstract
*/
TextEntry = function IMETextEntry() {
@@ -496,7 +502,7 @@
/**
* TextEntry class for input/textarea widgets
*
- * @class
+ * @class FormWidgetEntry
* @constructor
* @param {jQuery} $element The element to wrap
*/
@@ -516,9 +522,7 @@
FormWidgetEntry.static.canWrap = function ( $element ) {
return $element.is( 'input:not([type]), input[type=text], input[type=search], textarea' ) &&
!$element.prop( 'readonly' ) &&
- !$element.prop( 'disabled' ) &&
- // eslint-disable-next-line no-jquery/no-class-state
- !$element.hasClass( 'noime' );
+ !$element.prop( 'disabled' );
};
/* Instance methods */
@@ -527,10 +531,10 @@
* @inheritdoc TextEntry
*/
FormWidgetEntry.prototype.getTextBeforeSelection = function ( maxLength ) {
- var pos = this.getCaretPosition();
+ var element = this.$element.get( 0 );
return this.$element.val().substring(
- Math.max( 0, pos.start - maxLength ),
- pos.start
+ Math.max( 0, element.selectionStart - maxLength ),
+ element.selectionStart
);
};
@@ -538,112 +542,24 @@
* @inheritdoc TextEntry
*/
FormWidgetEntry.prototype.replaceTextAtSelection = function ( precedingCharCount, newText ) {
- var selection,
- length,
- newLines,
- start,
- scrollTop,
- pos,
- element = this.$element.get( 0 );
-
- if ( typeof element.selectionStart === 'number' && typeof element.selectionEnd === 'number' ) {
- // IE9+ and all other browsers
- start = element.selectionStart;
+ var element = this.$element.get( 0 ),
+ start = element.selectionStart,
scrollTop = element.scrollTop;
- // Replace the whole text of the text area:
- // text before + newText + text after.
- // This could be made better if range selection worked on browsers.
- // But for complex scripts, browsers place cursor in unexpected places
- // and it's not possible to fix cursor programmatically.
- // Ref Bug https://bugs.webkit.org/show_bug.cgi?id=66630
- element.value = element.value.substring( 0, start - precedingCharCount ) +
- newText +
- element.value.substring( element.selectionEnd, element.value.length );
-
- // restore scroll
- element.scrollTop = scrollTop;
- // set selection
- element.selectionStart = element.selectionEnd = start - precedingCharCount + newText.length;
- } else {
- // IE8 and lower
- pos = this.getCaretPosition();
- selection = element.createTextRange();
- length = element.value.length;
- // IE doesn't count \n when computing the offset, so we won't either
- newLines = element.value.match( /\n/g );
-
- if ( newLines ) {
- length = length - newLines.length;
- }
-
- selection.moveStart( 'character', pos.start - precedingCharCount );
- selection.moveEnd( 'character', pos.end - length );
-
- selection.text = newText;
- selection.collapse( false );
- selection.select();
- }
- };
-
- /**
- * Get the current selection offsets inside the widget
- *
- * @return {Object} return Offsets in chars (0 means first offset *or* no selection in widget)
- * @return {number} return.start Selection start
- * @return {number} return.end Selection end
- */
- FormWidgetEntry.prototype.getCaretPosition = function () {
- var el = this.$element.get( 0 ),
- start = 0,
- end = 0,
- normalizedValue,
- range,
- textInputRange,
- len,
- newLines,
- endRange;
-
- if ( typeof el.selectionStart === 'number' && typeof el.selectionEnd === 'number' ) {
- start = el.selectionStart;
- end = el.selectionEnd;
- } else {
- // IE
- range = document.selection.createRange();
-
- if ( range && range.parentElement() === el ) {
- len = el.value.length;
- normalizedValue = el.value.replace( /\r\n/g, '\n' );
- newLines = normalizedValue.match( /\n/g );
-
- // Create a working TextRange that lives only in the input
- textInputRange = el.createTextRange();
- textInputRange.moveToBookmark( range.getBookmark() );
-
- // Check if the start and end of the selection are at the very end
- // of the input, since moveStart/moveEnd doesn't return what we want
- // in those cases
- endRange = el.createTextRange();
- endRange.collapse( false );
-
- if ( textInputRange.compareEndPoints( 'StartToEnd', endRange ) > -1 ) {
- if ( newLines ) {
- start = end = len - newLines.length;
- } else {
- start = end = len;
- }
- } else {
- start = -textInputRange.moveStart( 'character', -len );
-
- if ( textInputRange.compareEndPoints( 'EndToEnd', endRange ) > -1 ) {
- end = len;
- } else {
- end = -textInputRange.moveEnd( 'character', -len );
- }
- }
- }
- }
- return { start: start, end: end };
+ // Replace the whole text of the text area:
+ // text before + newText + text after.
+ // This could be made better if range selection worked on browsers.
+ // But for complex scripts, browsers place cursor in unexpected places
+ // and it's not possible to fix cursor programmatically.
+ // Ref Bug https://bugs.webkit.org/show_bug.cgi?id=66630
+ element.value = element.value.substring( 0, start - precedingCharCount ) +
+ newText +
+ element.value.substring( element.selectionEnd, element.value.length );
+
+ // restore scroll
+ element.scrollTop = scrollTop;
+ // set selection
+ element.selectionStart = element.selectionEnd = start - precedingCharCount + newText.length;
};
TextEntryFactory.static.singleton.register( FormWidgetEntry );
@@ -651,7 +567,7 @@
/**
* TextEntry class for ContentEditable
*
- * @class
+ * @class ContentEditableEntry
* @constructor
* @param {jQuery} $element The element to wrap
*/
@@ -669,8 +585,7 @@
* @inheritdoc TextEntry
*/
ContentEditableEntry.static.canWrap = function ( $element ) {
- // eslint-disable-next-line no-jquery/no-class-state
- return $element.is( '[contenteditable]' ) && !$element.hasClass( 'noime' );
+ return $element.is( '[contenteditable]' );
};
/* Instance methods */
@@ -693,9 +608,11 @@
* @inheritdoc SelectionWrapper
*/
ContentEditableEntry.prototype.replaceTextAtSelection = function ( precedingCharCount, newText ) {
- var range, textNode, textOffset, newOffset, newRange;
+ var textNode, textOffset, newOffset, newRange,
+ sel = window.getSelection(),
+ range = this.getSelectedRange();
- if ( !this.getSelectedRange() ) {
+ if ( !range ) {
return;
}
@@ -705,12 +622,11 @@
// browsers that do not support it.
this.$element.trigger( 'compositionstart' );
- range = this.getSelectedRange();
-
if ( !range.collapsed ) {
range.deleteContents();
}
+ newRange = document.createRange();
if ( range.startContainer.nodeType === Node.TEXT_NODE ) {
// Alter this text node's content and move the cursor
textNode = range.startContainer;
@@ -720,10 +636,8 @@
newText +
textNode.nodeValue.substr( textOffset );
newOffset = textOffset - precedingCharCount + newText.length;
- newRange = rangy.createRange();
newRange.setStart( range.startContainer, newOffset );
newRange.setEnd( range.startContainer, newOffset );
- rangy.getSelection().setSingleRange( newRange );
} else {
// XXX assert precedingCharCount === 0
// Insert a new text node with the new text
@@ -732,11 +646,11 @@
textNode,
range.startContainer.childNodes[ range.startOffset ]
);
- newRange = rangy.createRange();
newRange.setStart( textNode, textNode.length );
newRange.setEnd( textNode, textNode.length );
- rangy.getSelection().setSingleRange( newRange );
}
+ sel.removeAllRanges();
+ sel.addRange( newRange );
// Trigger any externally registered jQuery compositionend / input event listeners.
// TODO: Try node.dispatchEvent( new CompositionEvent(...) ) so listeners not
@@ -752,9 +666,9 @@
* @return {Range|null} The selection range
*/
ContentEditableEntry.prototype.getSelectedRange = function () {
- var sel, range;
- rangy.init();
- sel = rangy.getSelection();
+ var range,
+ sel = window.getSelection();
+
if ( sel.rangeCount === 0 ) {
return null;
}
@@ -784,7 +698,7 @@
data = $this.data( 'ime' );
if ( !data ) {
textEntry = TextEntryFactory.static.singleton.wrap( $this );
- if ( textEntry === undefined ) {
+ if ( !textEntry ) {
return;
}
data = new IME( this, textEntry, options );
@@ -804,7 +718,7 @@
$.ime.languages = {};
/**
- * @property {string} Relative/absolute path for the rules folder of jquery.ime
+ * @property {string} Relative or absolute path for the rules folder of jquery.ime
*/
$.ime.path = '../';
$.ime.textEntryFactory = TextEntryFactory.static.singleton;
@@ -877,7 +791,8 @@
$.ime.defaults = {
languages: [], // Languages to be used- by default all languages
helpHandler: null, // Called for each ime option in the menu
- showSelector: true
+ showSelector: true,
+ selectorInside: undefined // If not set will check if '.ime-position-inside' class is preset
};
}( jQuery ) );
@@ -1144,7 +1059,7 @@
/**
* Keydown event handler. Handles shortcut key presses
*
- * @context {HTMLElement}
+ * @this HTMLElement
* @param {jQuery.Event} e
* @return {boolean}
*/
@@ -1215,6 +1130,10 @@
this.$imeSetting.outerWidth();
}
+ if ( this.options.selectorInside ) {
+ top -= this.$imeSetting.outerHeight();
+ }
+
// While determining whether to place the selector above or below the input box,
// take into account the value of scrollTop, to avoid the selector from always
// getting placed above the input box since window.height would be less than top
@@ -1223,6 +1142,9 @@
if ( verticalRoom < this.$imeSetting.outerHeight() ) {
top = elementPosition.top - this.$imeSetting.outerHeight();
+ if ( this.options.selectorInside ) {
+ top += this.$imeSetting.outerHeight();
+ }
menuTop = this.$menu.outerHeight() +
this.$imeSetting.outerHeight();
@@ -1278,7 +1200,7 @@
* Select a language
*
* @param {string} languageCode
- * @return {string|bool} Selected input method id or false
+ * @return {string|boolean} Selected input method id or false
*/
selectLanguage: function ( languageCode ) {
var ime, imePref, language;
@@ -1341,6 +1263,7 @@
/**
* Decide on initial language to select
+ *
* @return {string}
*/
decideLanguage: function () {
@@ -1654,7 +1577,7 @@
},
getPreviousInputMethods: function () {
- return this.registry.previousInputMethods;
+ return this.registry.previousInputMethods || [];
},
// Set the given IM as the last used for the language
@@ -1722,6 +1645,10 @@
name: 'ትራንስልተራትዖን',
source: 'rules/am/am-transliteration.js'
},
+ 'ann-tilde': {
+ name: 'Obolo tilde',
+ source: 'rules/ann/ann-tilde.js'
+ },
'ar-kbd': {
name: 'لوحة المفاتيح العربية',
source: 'rules/ar/ar-kbd.js'
@@ -1758,6 +1685,10 @@
name: 'تۆرکجه',
source: 'rules/azb/azb-kbd.js'
},
+ 'bas-tilde': {
+ name: 'Ɓasaá tilde',
+ source: 'rules/bas/bas-tilde.js'
+ },
'batak-qwerty': {
name: 'Batak QWERTY',
source: 'rules/bbc/batak-qwerty.js'
@@ -1786,6 +1717,10 @@
name: 'روچ کپتین بلوچی',
source: 'rules/bgn/bgn-kbd.js'
},
+ 'bkm-tilde': {
+ name: 'Kom tilde',
+ source: 'rules/bkm/bkm-tilde.js'
+ },
'bm-alt': {
name: 'Bamanankan Alt',
source: 'rules/bm/bm-alt.js'
@@ -2078,6 +2013,10 @@
name: 'Kabɩyɛ tilde',
source: 'rules/kbp/kbp-tilde.js'
},
+ 'kcg-tilde': {
+ name: 'Tyap tilde',
+ source: 'rules/kcg/kcg-tilde.js'
+ },
'ki-tilde': {
name: 'Gĩkũyũ',
source: 'rules/ki/ki-tilde.js'
@@ -2154,6 +2093,10 @@
name: 'Lushootseed Tulalip',
source: 'rules/lut/lut-tulalip.js'
},
+ 'mad-tilde': {
+ name: 'Madhurâ tilde',
+ source: 'rules/mad/mad-tilde.js'
+ },
'mai-inscript': {
name: 'इनस्क्रिप्ट',
source: 'rules/mai/mai-inscript.js',
@@ -2268,6 +2211,10 @@
name: 'ट्रांस्लितेरेशन',
source: 'rules/ne/ne-transliteration.js'
},
+ 'nia-tilde': {
+ name: 'Li Niha tilde',
+ source: 'rules/nia/nia-tilde.js'
+ },
'nqo-standard-qwerty': {
name: "N'Ko standard QWERTY",
source: 'rules/nqo/nqo-standard-qwerty.js'
@@ -2280,6 +2227,10 @@
name: 'Sesotho sa Leboa tilde',
source: 'rules/nso/nso-tilde.js'
},
+ 'nus-tilde': {
+ name: 'Thok Naath tilde',
+ source: 'rules/nus/nus-tilde.js'
+ },
'or-inscript': {
name: 'ଇନସ୍କ୍ରିପ୍ଟ',
source: 'rules/or/or-inscript.js'
@@ -2568,6 +2519,10 @@
autonym: 'አማርኛ',
inputmethods: [ 'am-transliteration' ]
},
+ ann: {
+ autonym: 'Obolo',
+ inputmethods: [ 'ann-tilde' ]
+ },
ar: {
autonym: 'العربية',
inputmethods: [ 'ar-kbd' ]
@@ -2584,6 +2539,10 @@
autonym: 'تۆرکجه',
inputmethods: [ 'azb-kbd' ]
},
+ bas: {
+ autonym: 'ɓasaá',
+ inputmethods: [ 'bas-tilde' ]
+ },
bbc: {
autonym: 'Batak',
inputmethods: [ 'batak-qwerty' ]
@@ -2612,6 +2571,10 @@
autonym: 'भोजपुरी',
inputmethods: [ 'hi-transliteration' ]
},
+ bkm: {
+ autonym: 'Itaŋikom',
+ inputmethods: [ 'bkm-tilde' ]
+ },
bm: {
autonym: 'Bamanankan',
inputmethods: [ 'bm-alt', 'bm-tilde' ]
@@ -2652,6 +2615,10 @@
autonym: 'Dagbani',
inputmethods: [ 'dag-alt', 'dag-tilde' ]
},
+ dar: {
+ autonym: 'дарган',
+ inputmethods: [ 'cyrl-palochka' ]
+ },
de: {
autonym: 'Deutsch',
inputmethods: [ 'de-transliteration' ]
@@ -2784,6 +2751,10 @@
autonym: 'Kabɩyɛ',
inputmethods: [ 'kbp-tilde' ]
},
+ kcg: {
+ autonym: 'Tyap',
+ inputmethods: [ 'kcg-tilde' ]
+ },
ki: {
autonym: 'Gĩkũyũ',
inputmethods: [ 'ki-tilde' ]
@@ -2848,6 +2819,10 @@
autonym: 'मैथिली',
inputmethods: [ 'mai-inscript', 'mai-inscript2' ]
},
+ mad: {
+ autonym: 'madhurâ',
+ inputmethods: [ 'mad-tilde' ]
+ },
mg: {
autonym: 'Malagasy',
inputmethods: [ 'mg-tilde' ]
@@ -2892,6 +2867,10 @@
autonym: 'नेपाल भाषा',
inputmethods: [ 'hi-transliteration', 'hi-inscript' ]
},
+ nia: {
+ autonym: 'li niha',
+ inputmethods: [ 'nia-tilde' ]
+ },
nn: {
autonym: 'Norsk (nynorsk)',
inputmethods: [ 'nb-normforms', 'nb-tildeforms' ]
@@ -2904,6 +2883,10 @@
autonym: 'Sesotho sa Leboa',
inputmethods: [ 'nso-tilde' ]
},
+ nus: {
+ autonym: 'Thok Naath',
+ inputmethods: [ 'nus-tilde' ]
+ },
or: {
autonym: 'ଓଡ଼ିଆ',
inputmethods: [ 'or-phonetic', 'or-transliteration', 'or-inscript', 'or-inscript2', 'or-lekhani', 'or-OdiScript' ]
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js
new file mode 100644
index 00000000..b204356c
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ann/ann-tilde.js
@@ -0,0 +1,30 @@
+( function ( $ ) {
+ 'use strict';
+
+ var annTilde = {
+ id: 'ann-tilde',
+ name: 'ann-tilde',
+ description: 'Obolo input keyboard',
+ date: '2020-11-03',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~N', 'N̄' ],
+ [ '~n', 'n̄' ],
+ [ '~O', 'Ọ' ],
+ [ '~o', 'ọ' ],
+ [ '~S', 'Ṣ' ],
+ [ '~s', 'ṣ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ], // Combining caron
+ [ '~\\.', '\u0323' ] // Combining dot below
+ ]
+ };
+
+ $.ime.register( annTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js
new file mode 100644
index 00000000..cb5cfc0b
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bas/bas-tilde.js
@@ -0,0 +1,31 @@
+( function ( $ ) {
+ 'use strict';
+
+ var basTilde = {
+ id: 'bas-tilde',
+ name: 'bas-tilde',
+ description: 'Basaa tilde keyboard',
+ date: '2021-03-31',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~B', 'Ɓ' ],
+ [ '~b', 'ɓ' ],
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~\\^', '\u0302' ], // Combining circumflex accent
+ [ '~-', '\u0304' ], // Combining macron
+ [ '~v', '\u030C' ] // Combining caron
+ ]
+ };
+
+ $.ime.register( basTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js
new file mode 100644
index 00000000..920c59f2
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/bkm/bkm-tilde.js
@@ -0,0 +1,41 @@
+( function ( $ ) {
+ 'use strict';
+
+ var bkmTilde = {
+ id: 'bkm-tilde',
+ name: 'bkm-tilde',
+ description: 'Kom tilde keyboard',
+ date: '2021-03-31',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ maxKeyLength: 2,
+ patterns: [
+ [ 'AE', 'Æ' ],
+ [ 'Ae', 'Æ' ],
+ [ 'ae', 'æ' ],
+ [ 'A~E', 'AE' ],
+ [ 'A~e', 'Ae' ],
+ [ 'a~e', 'ae' ],
+ [ '~A', 'Æ' ],
+ [ '~a', 'æ' ],
+ [ '~I', 'Ɨ' ],
+ [ '~i', 'ɨ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ 'OE', 'Œ' ],
+ [ 'Oe', 'Œ' ],
+ [ 'oe', 'œ' ],
+ [ 'O~E', 'OE' ],
+ [ 'O~e', 'Oe' ],
+ [ 'o~e', 'oe' ],
+ [ '~O', 'Œ' ],
+ [ '~o', 'œ' ],
+ [ '~\\\\', '\u0300' ], // Combining grave accent
+ [ '~\\^', '\u0302' ] // Combining circumflex accent
+ ]
+ };
+
+ $.ime.register( bkmTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js
index f4e8d8e4..36046e99 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/cyrl/cyrl-palochka.js
@@ -6,17 +6,27 @@
*
* This layout assumes that the standard Russian keyboard layout is used. All the rules produce the
* same character palochka, and the characters used are the same that are often used by the speakers
- * of these languages online: 1. Latin small 'l'. 2. Latin capital 'I'. 3. Ukrainian capital 'І'. 4.
- * Alt-1 (the digit one). 5. Alt-д (Cyrillic small 'de', on the same key as Latin 'l'). 6. Alt-ш
- * (Cyrillic small 'sha', on the same key as Latin 'i'). 7. Alt-Ш (Cyrillic capital 'sha', on the
- * same key as Latin 'I').
+ * of these languages online:
+ * 1. Latin small 'l'.
+ * 2. Latin capital 'I'.
+ * 3. Ukrainian capital 'І'.
+ * 4. Alt-1 (the digit one).
+ * 5. Alt-д (Cyrillic small 'de', on the same key as Latin 'l').
+ * 6. Alt-ш (Cyrillic small 'sha', on the same key as Latin 'i').
+ * 7. Alt-Ш (Cyrillic capital 'sha', on the same key as Latin 'I').
*/
( function ( $ ) {
'use strict';
- // All the characters are very similar in appearance,
- // so it's better to give them names to avoid confusion.
- var cyrlPalochka;
+
+ var cyrlPalochka,
+ // All the characters are very similar in appearance,
+ // so it's better to give them names to avoid confusion.
+ latinSmallL = 'l',
+ latinCapitalI = 'I',
+ ukrainianCapitalI = 'І',
+ palochka = 'Ӏ',
+ digitOne = '1';
cyrlPalochka = {
id: 'cyrl-palochka',
@@ -26,16 +36,22 @@
URL: 'http://github.com/wikimedia/jquery.ime',
author: 'Amir E. Aharoni',
license: 'GPLv3',
- version: '1.0',
+ version: '1.1',
+ contextLength: 2,
+ maxKeyLength: 3,
patterns: [
- [ 'l', 'Ӏ' ],
- [ 'I', 'Ӏ' ],
- [ 'І', 'Ӏ' ] ],
+ [ '~~' + digitOne, '~~', '~1' ],
+ [ '~' + digitOne, palochka ],
+ [ latinSmallL, palochka ],
+ [ latinCapitalI, palochka ],
+ [ ukrainianCapitalI, palochka ]
+ ],
patterns_x: [
- [ '1', 'Ӏ' ],
- [ 'д', 'Ӏ' ],
- [ 'ш', 'Ӏ' ],
- [ 'Ш', 'Ӏ' ] ]
+ [ digitOne, palochka ],
+ [ 'д', palochka ],
+ [ 'ш', palochka ],
+ [ 'Ш', palochka ]
+ ]
};
$.ime.register( cyrlPalochka );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js
index bd0a4071..cef3986d 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/ig/ig-tilde.js
@@ -20,7 +20,8 @@
[ '~U', 'Ụ' ],
[ '~u', 'ụ' ],
[ '~\\\\', '\u0300' ], // Combining grave
- [ '~/', '\u0301' ] // Combining acute
+ [ '~/', '\u0301' ], // Combining acute
+ [ '~\\-', '\u0304' ] // Combining macron
]
};
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js
new file mode 100644
index 00000000..ec9bbaab
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/kcg/kcg-tilde.js
@@ -0,0 +1,24 @@
+( function ( $ ) {
+ 'use strict';
+
+ var kcgTilde = {
+ id: 'kcg-tilde',
+ name: 'kcg-tilde',
+ description: 'Tyap input keyboard',
+ date: '2020-12-04',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.1',
+ patterns: [
+ [ '~A', 'A\u0331' ],
+ [ '~a', 'a\u0331' ],
+ [ '~I', 'I\u0331' ],
+ [ '~i', 'i\u0331' ],
+ [ '~/', '\u0301' ], // Combining acute accent
+ [ '~_', '\u0331' ] // Combining macron below
+ ]
+ };
+
+ $.ime.register( kcgTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js
new file mode 100644
index 00000000..44bdd4d5
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/mad/mad-tilde.js
@@ -0,0 +1,26 @@
+( function ( $ ) {
+ 'use strict';
+
+ var madTilde = {
+ id: 'mad-tilde',
+ name: 'mad-tilde',
+ description: 'Madurese tilde keyboard',
+ date: '2020-12-06',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1',
+ patterns: [
+ [ '~A', 'Â' ],
+ [ '~a', 'â' ],
+ [ '~D', 'Ḍ' ],
+ [ '~d', 'ḍ' ],
+ [ '~E', 'È' ],
+ [ '~e', 'è' ],
+ [ '~T', 'Ṭ' ],
+ [ '~t', 'ṭ' ]
+ ]
+ };
+
+ $.ime.register( madTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js
new file mode 100644
index 00000000..1c717e05
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nia/nia-tilde.js
@@ -0,0 +1,22 @@
+( function ( $ ) {
+ 'use strict';
+
+ var niaTilde = {
+ id: 'nia-tilde',
+ name: 'nia-tilde',
+ description: 'Nias tilde keyboard',
+ date: '2021-01-13',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1',
+ patterns: [
+ [ '~O', 'Ö' ],
+ [ '~o', 'ö' ],
+ [ '~W', 'Ŵ' ],
+ [ '~w', 'ŵ' ]
+ ]
+ };
+
+ $.ime.register( niaTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js
new file mode 100644
index 00000000..e2c6e8fc
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/nus/nus-tilde.js
@@ -0,0 +1,28 @@
+( function ( $ ) {
+ 'use strict';
+
+ var nusTilde = {
+ id: 'nus-tilde',
+ name: 'nus-tilde',
+ description: 'Nuer input keyboard',
+ date: '2021-01-18',
+ URL: 'https://github.com/wikimedia/jquery.ime',
+ author: 'Amir E. Aharoni',
+ license: 'GPLv3',
+ version: '1.0',
+ patterns: [
+ [ '~E', 'Ɛ' ],
+ [ '~e', 'ɛ' ],
+ [ '~G', 'Ɣ' ],
+ [ '~g', 'ɣ' ],
+ [ '~N', 'Ŋ' ],
+ [ '~n', 'ŋ' ],
+ [ '~O', 'Ɔ' ],
+ [ '~o', 'ɔ' ],
+ [ '~:', '\u0308' ], // Combining diaeresis
+ [ '~_', '\u0331' ] // Combining macron below
+ ]
+ };
+
+ $.ime.register( nusTilde );
+}( jQuery ) );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js
index 04fc9fb8..dba733a8 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.ime/rules/or/or-inscript.js
@@ -70,7 +70,7 @@
[ 'q', '\u0B4C' ],
[ 'd', '\u0B4D' ],
[ '/', '\u0B5F' ],
- [ '\\>', '\u0B64' ],
+ [ '\\>', '\u0964' ],
[ '0', '\u0B66' ],
[ '1', '\u0B67' ],
[ '2', '\u0B68' ],
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css b/MLEB/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css
index 3564d9f6..ace031d4 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/css/jquery.uls.css
@@ -1,7 +1,5 @@
.uls-trigger {
- background: url( ../images/language.png ) no-repeat left center;
- /* @embed */
- background-image: linear-gradient( transparent, transparent ), url( ../images/language.svg );
+ background: url( ../images/language.svg ) no-repeat left center;
padding-left: 24px;
}
@@ -23,12 +21,10 @@
.uls-wide {
min-width: 715px;
- width: 45%;
}
.uls-medium {
min-width: 360px;
- width: 30%;
}
/* Override the grid */
@@ -38,7 +34,6 @@
.uls-narrow {
min-width: 180px;
- width: 20%;
}
/* Override the grid */
@@ -65,9 +60,7 @@
}
.uls-search-label {
- background: url( ../images/search.png ) no-repeat center center;
- /* @embed */
- background-image: linear-gradient( transparent, transparent ), url( ../images/search.svg );
+ background: url( ../images/search.svg ) no-repeat center center;
background-size: 20px;
height: 32px;
width: 44px;
@@ -110,9 +103,7 @@
}
.uls-languagefilter-clear {
- background: url( ../images/close.png ) no-repeat left center;
- /* @embed */
- background-image: linear-gradient( transparent, transparent ), url( ../images/close.svg );
+ background: url( ../images/close.svg ) no-repeat left center;
background-size: 15px;
cursor: pointer;
height: 15px;
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json
index 8a80c0de..42429b67 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/awa.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"1AnuraagPandey",
+ "1PandeyAnurag",
"Ajeetsinghawadh"
]
},
@@ -13,7 +14,7 @@
"uls-region-AS": "एशिया",
"uls-region-ME": "मध्य पुरुब",
"uls-region-PA": "प्रशांत",
- "uls-region-all": "सभी भाषाएँ",
+ "uls-region-all": "कुल भाषा",
"uls-no-results-found": "कवनो नतिजा नाई मिला",
"uls-common-languages": "सुझाई गय भाषा",
"uls-no-results-suggestion-title": "आप कय लिये संभवतः उपयोगी:",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json
index 007d5c25..74b606ce 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/az.json
@@ -3,7 +3,8 @@
"authors": [
"AZISS",
"Khan27",
- "Wertuose"
+ "Wertuose",
+ "Şeyx Şamil"
]
},
"uls-region-WW": "Dünya üzrə",
@@ -12,7 +13,7 @@
"uls-region-AF": "Afrika",
"uls-region-EU": "Avropa",
"uls-region-AS": "Asiya",
- "uls-region-ME": "Orta Şərq",
+ "uls-region-ME": "Yaxın Şərq",
"uls-region-PA": "Okeaniya",
"uls-region-all": "Bütün dillər",
"uls-no-results-found": "Nəticələr tapılmadı",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json
index 2684249f..1ca07673 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ban.json
@@ -1,14 +1,15 @@
{
"@metadata": {
"authors": [
+ "Chinamoonroll",
"Joseagush"
]
},
"uls-region-WW": "Gumi makejang",
"uls-region-SP": "Rahina",
- "uls-region-AM": "Amerika",
+ "uls-region-AM": "Amérika",
"uls-region-AF": "Afrika",
- "uls-region-EU": "Eropa",
+ "uls-region-EU": "Éropa",
"uls-region-AS": "Asia",
"uls-region-ME": "Timur Tengah",
"uls-region-PA": "Pasifik",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json
new file mode 100644
index 00000000..6e723131
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bci.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kjeanclaude"
+ ]
+ },
+ "uls-region-WW": "Mein oumouan nou",
+ "uls-region-SP": "Koungou liké",
+ "uls-region-AM": "Amériki",
+ "uls-region-AF": "Afriki",
+ "uls-region-EU": "Abloki",
+ "uls-region-AS": "Azi",
+ "uls-region-ME": "Wia afiliè lô mein i atôliè",
+ "uls-region-PA": "Pacifiki",
+ "uls-region-all": "Anien mou bé ngba",
+ "uls-no-results-found": "Ya woun man liké fi",
+ "uls-common-languages": "Anien nga bé fa klé mou",
+ "uls-no-results-suggestion-title": "Amoun kwla klo",
+ "uls-search-help": "Amoun kwla kounndè i anien douman sou, klèlè douman sou, anien ISO codi sou, anzè amoun kwla kounndè i akpassoua sou.",
+ "uls-search-placeholder": "Kounndè anien koun"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json
index 0d7386c0..9a0f152b 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/bs.json
@@ -3,7 +3,8 @@
"authors": [
"DzWiki",
"Edinwiki",
- "Srdjan m"
+ "Srdjan m",
+ "Srđan"
]
},
"uls-region-WW": "Svjetski",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json
index adac4651..cbe0493a 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/de-formal.json
@@ -5,7 +5,6 @@
"Purodha"
]
},
- "uls-select-language": "Wählen Sie eine Sprache",
"uls-region-SP": "Extras - kein Schprohche",
"uls-no-results-suggestion-title": "Dies könnte Sie interessieren:",
"uls-search-help": "Sie können nach dem Namen der Sprache suchen, dem Namen der Schrift, dem ISO-Code der Sprache oder aber die Suche über eine Region durchführen:",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json
index 5a1056c4..a207637e 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/fr.json
@@ -4,6 +4,7 @@
"Gomoko",
"Pols12",
"Ultimate",
+ "Verdy p",
"Wladek92"
]
},
@@ -18,7 +19,7 @@
"uls-region-all": "Toutes les langues",
"uls-no-results-found": "Aucun résultat trouvé",
"uls-common-languages": "Langues suggérées",
- "uls-no-results-suggestion-title": "Vous pouvez être intéressé par:",
- "uls-search-help": "Vous pouvez rechercher par nom de langue, par nom de l’écriture, par code ISO de la langue, ou vous pouvez naviguer par région.",
+ "uls-no-results-suggestion-title": "Vous pouvez être intéressé par :",
+ "uls-search-help": "Vous pouvez rechercher par nom de langue, par nom de l’écriture, par code ISO de langue, ou vous pouvez naviguer par région.",
"uls-search-placeholder": "Rechercher une langue"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json
new file mode 100644
index 00000000..0350237b
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/grc.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "PastelKos"
+ ]
+ },
+ "uls-region-WW": "Οἰκουμενικῶς",
+ "uls-region-AM": "Ἀμερική",
+ "uls-region-AF": "Λιβύη",
+ "uls-region-EU": "Εὐρώπη",
+ "uls-region-AS": "Ἀσία",
+ "uls-region-ME": "Ἐγγὺς Ἀνατολή",
+ "uls-region-PA": "Εἰρηνικός",
+ "uls-region-all": "Ἅπασαι αἱ γλῶσσαι",
+ "uls-no-results-found": "Οὐδὲν Ἀποτέλεσμα",
+ "uls-common-languages": "Εἰσηγούμεναι γλῶσσαι",
+ "uls-search-placeholder": "Ζητεῖν γλῶσσαν"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json
index 0e3f7854..cceadc62 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kab.json
@@ -6,7 +6,8 @@
"Mezgoug",
"Mmistmurt",
"Sayem AtVkm",
- "SlimaneAmiri"
+ "SlimaneAmiri",
+ "YouvaDjouadi"
]
},
"uls-region-WW": "Deg umaḍal meṛṛa",
@@ -15,12 +16,12 @@
"uls-region-AF": "Tafriqt",
"uls-region-EU": "Turuft",
"uls-region-AS": "Asya",
- "uls-region-ME": "Asamar Alemmas",
+ "uls-region-ME": "Asammar Alemmas",
"uls-region-PA": "Amelwi",
"uls-region-all": "Akk tutlayin",
- "uls-no-results-found": "Ulac d acu i d-yufa.",
- "uls-common-languages": "Tutlayin yettusumren",
- "uls-no-results-suggestion-title": "Ma tebɣiḍ ad tisineḍ ayen nniḍen ɣef :",
- "uls-search-help": "Tzemreḍ ad tnadiḍ s yisem n tutlayt, s uskript, s tengalt ISO n tutlayt neγ inig s temnaḍt.",
- "uls-search-placeholder": "Nadi γef tutlayt"
+ "uls-no-results-found": "Ur d-yufi kra seg unadi",
+ "uls-common-languages": "Tutlayin i d-yettwasumren",
+ "uls-no-results-suggestion-title": "Ahat ad tebɣuḍ:",
+ "uls-search-help": "Tzemreḍ ad tnadiḍ s yisem n tutlayt, s yisem n tira, s tengalt ISO n tutlayt neɣ tzemreḍ ad tinigeḍ tamnaḍt tamnaḍt.",
+ "uls-search-placeholder": "Nadi ɣef tutlayt"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json
new file mode 100644
index 00000000..26e0db69
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/kcg.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Kambai Akau"
+ ]
+ },
+ "uls-region-WW": "A̱mgba̱m ta̱cya̱",
+ "uls-region-SP": "A̱khapsak",
+ "uls-region-AM": "A̱merika",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Yurop",
+ "uls-region-AS": "A̱siya",
+ "uls-region-ME": "A̱tyia̱ka̱u A̱tyin",
+ "uls-region-PA": "Pa̱si̱fi̱k",
+ "uls-region-all": "A̱mgba̱m lilyem",
+ "uls-no-results-found": "Á̱ sang záng",
+ "uls-common-languages": "Nwuat shim lilyem",
+ "uls-no-results-suggestion-title": "A bye cat:",
+ "uls-search-help": "A maai zop di̱n vak a̱lyoot a̱lyem, a̱lyoot lyuut, zwunzwuo ISO si̱ a̱lyem ke a maai nyia̱ brauzin di̱n vak fam a̱byin.",
+ "uls-search-placeholder": "Zop a̱lyem"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json
index 18b3a014..c82e730a 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/lez.json
@@ -14,9 +14,7 @@
"uls-region-ME": "Юкьван РагъэкъечӀдай пад",
"uls-region-PA": "Океания",
"uls-region-all": "Вири чӀалар",
- "uls-no-results-found": "No results found",
"uls-common-languages": "Теклифнавай чӀалар",
- "uls-no-results-suggestion-title": "You may be interested in:",
"uls-search-help": "Вавай чӀалан дахьайтӀа кхьинвилин тӀварунай къекъвез жеда, чӀалан ISO-коддай дахьайтӀа региондай килигиз жеда.",
"uls-search-placeholder": "ЧӀал жагъурун"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json
index 852992e8..82141b94 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mn.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"Amire80",
+ "Saihanaaaa",
"Wisdom"
]
},
@@ -13,9 +14,10 @@
"uls-region-AS": "Ази",
"uls-region-ME": "Дундад Ази",
"uls-region-PA": "Номхон далай",
+ "uls-region-all": "Бүх хэл",
"uls-no-results-found": "Үр дүн олдсонгүй",
- "uls-common-languages": "Түгээмэл хэл",
- "uls-no-results-suggestion-title": "Таны сонихсон зүйл:",
+ "uls-common-languages": "Санал болгож буй хэл",
+ "uls-no-results-suggestion-title": "Санал болгох:",
"uls-search-help": "Та хэлээр, скриптийн нэрээр, хэлний ISO кодоор хайж болно, эсвэл газар нутгаар нь харж болно.",
"uls-search-placeholder": "Хэлний хайлт"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json
new file mode 100644
index 00000000..7a6693af
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mnc.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Moon0319",
+ "Араси"
+ ]
+ },
+ "uls-region-AM": "᠇ᠮᡝᡵᡳᡴᠠ",
+ "uls-region-EU": "ᠣᡵᠣᠪᠠ",
+ "uls-region-all": "ᡝᡳ᠌ᡨᡝᠨ ᡤᡳᠰᡠᠨ",
+ "uls-no-results-suggestion-title": "ᠠᡳ᠌ᠨᠴᡳ ᠰᡳᠨᡳ ᠠᠮᡠᡵᠠᠩᡤᡝ ᠈"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json
new file mode 100644
index 00000000..352d5d90
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/mni.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Awangba Mangang"
+ ]
+ },
+ "uls-region-WW": "ꯃꯂꯦꯝꯁꯤꯟꯕ ꯊꯨꯡꯅ",
+ "uls-region-SP": "ꯑꯈꯟꯅꯕ",
+ "uls-region-AM": "ꯑꯃꯦꯔꯤꯀꯥ",
+ "uls-region-AF": "ꯑꯐ꯭ꯔꯤꯀꯥ",
+ "uls-region-EU": "ꯏꯎꯔꯣꯞ",
+ "uls-region-AS": "ꯑꯦꯁꯤꯌꯥ",
+ "uls-region-ME": "ꯃꯌꯥꯏꯊꯪꯕ ꯅꯣꯡꯄꯣꯛ",
+ "uls-region-PA": "ꯄꯦꯁꯤꯐꯤꯛ",
+ "uls-region-all": "ꯂꯣꯟ ꯄꯨꯝꯅꯃꯛ",
+ "uls-no-results-found": "ꯃꯁꯤꯒ ꯆꯥꯟꯅꯕ ꯂꯩꯇꯦ",
+ "uls-common-languages": "ꯂꯣꯟꯁꯤꯡ ꯑꯁꯤ ꯍꯥꯏꯕ ꯌꯥꯏ",
+ "uls-no-results-suggestion-title": "ꯅꯪꯅ ꯃꯁꯤꯒꯨꯝꯕꯁꯤ ꯄꯥꯝꯃꯝꯕꯁꯨ ꯌꯥꯏ:",
+ "uls-search-help": "ꯅꯪꯅ ꯊꯤꯕꯥ ꯌꯥꯒꯅꯤ ꯂꯣꯟ ꯃꯃꯤꯡꯅ, ꯃꯌꯦꯛ ꯃꯃꯤꯡꯅ, ꯂꯣꯟꯒꯤ ꯑꯣꯏꯑꯦꯁꯑꯣ ꯀꯣꯗꯅ ꯅꯠꯇ꯭ꯔꯒ ꯅꯪꯅ ꯂꯩꯐꯝꯒꯤ ꯃꯇꯨꯡ ꯏꯟꯅ ꯊꯤꯕꯥ ꯌꯥꯒꯅꯤ ꯫",
+ "uls-search-placeholder": "ꯂꯣꯟ ꯱ ꯊꯤꯕꯥ"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json
index a4102b53..9af173f9 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nap.json
@@ -2,7 +2,8 @@
"@metadata": {
"authors": [
"C.R.",
- "Chelin"
+ "Chelin",
+ "Ruthven"
]
},
"uls-region-WW": "Munno intero",
@@ -17,6 +18,6 @@
"uls-no-results-found": "Nisciuno risultato",
"uls-common-languages": "Llèngue suggerite",
"uls-no-results-suggestion-title": "Puo essere interessato a:",
- "uls-search-help": "Puo cerca ppe nomme, nomme ddo script, codece ISO dda lengua o navigga tra e reggione.",
+ "uls-search-help": "Puo cercà pe nomme, nomme dd’’o script, codece ISO dd’’a lengua o naviggà nfra ’e reggiune.",
"uls-search-placeholder": "Tròva na lengua"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json
index a965bda7..da94cc69 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/nqo.json
@@ -5,7 +5,7 @@
"Youssoufkadialy"
]
},
- "uls-region-WW": "ߞߌߢߍ߫ ߝߊ߲߬ ߓߍ߯",
+ "uls-region-WW": "ߞߌߢߍ߲߫ ߝߊ߲߬ ߓߍ߯",
"uls-region-SP": "ߞߙߍߞߙߍߣߍ߲",
"uls-region-AM": "ߊߡߙߌߞߌ߬",
"uls-region-AF": "ߊߝߙߌߞߌ߬",
@@ -14,9 +14,9 @@
"uls-region-ME": "ߊߙߊߓߎ߫ ߕߌ߲ߡߎߣߎ߲",
"uls-region-PA": "ߖߐ߮ ߟߌ߲ߓߊ߲",
"uls-region-all": "ߞߊ߲ ߠߎ߬ ߓߍ߯",
- "uls-no-results-found": "ߞߐߝߟߌ߫ ߕߍ߫ ߦߋ߲߬",
+ "uls-no-results-found": "ߞߐߝߟߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬",
"uls-common-languages": "ߞߊ߲߫ ߞߏߝߐߣߍ߲ ߠߎ߬",
- "uls-no-results-suggestion-title": "ߣߌ߲߬ ߓߴߛߋ߫ ߌ ߤߣߍ߫ ߟߊ߫",
- "uls-search-help": "ߌ ߘߴߛߋ߫ ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߲߫ ߞߍ߫ ߞߊ߬ ߓߍ߲߬ ߞߊ߲ ߕߐ߮ ߡߊ߬ ߸ ߛߓߍߛߎ߲ ߕߐ߮ ߡߊ߬ ߸ ߞߊ߲ ߡߊ߲߬ߕߏ߲߬ߕߍ߬ߦߊ߫ ߝߙߍߕߍ ߡߊ߬ ߥߟߊ߫ ߌ ߘߴߛߋ߫ ߞߊ߬ ߕߌߙߌ߲ߠߌ߲ ߞߍ߫ ߞߊ߬ ߓߍ߲߬ ߕߌ߲߬ߞߎߘߎ߲ ߠߎ߫ ߕߐ߮ ߡߊ߬",
+ "uls-no-results-suggestion-title": "ߌ ߡߊ߬ߞߏ ߘߌ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌ߲߬ ߠߊ߫:",
+ "uls-search-help": "ߌ ߘߴߛߋ߫ ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߲߫ ߞߍ߫ ߞߊ߬ ߓߍ߲߬ ߞߊ߲ ߕߐ߮ ߡߊ߬ ߸ ߛߓߍߛߎ߲ ߕߐ߮ ߡߊ߬ ߸ ISO ߝߙߍߕߍ ߡߊ߬ ߥߟߊ߫ ߌ ߘߴߛߋ߫ ߛߏ߲߯ߓߊߟߌ ߞߍ߫ ߞߍ߫ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߕߌ߲߬ߞߎߘߎ߲ ߠߎ߫ ߕߐ߮ ߡߊ߬",
"uls-search-placeholder": "ߞߊ߲ ߘߏ߫ ߢߌߣߌ߲߫"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json
index 3bbec733..8f995879 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/om.json
@@ -1,6 +1,7 @@
{
"@metadata": {
"authors": [
+ "Ahrada2016",
"Oromoo",
"Tumsaa"
]
@@ -15,8 +16,8 @@
"uls-region-PA": "Paasifiik",
"uls-region-all": "Afaan hunda",
"uls-no-results-found": "Homtuu hin argamane",
- "uls-common-languages": "Afaan filannoo",
+ "uls-common-languages": "Qooqawwan dhiyaatan",
"uls-no-results-suggestion-title": "Kana barbaaduu dandeessa:",
- "uls-search-help": "Maqaa afaaniin, maqaa iskiriptiin, ykn ISO koodii afaaniin barbaaduu ykn naannodhaan sakatta'uu dandeessa.",
- "uls-search-placeholder": "Barbaacha Afaanii"
+ "uls-search-help": "Maqaa qooqaan barbaaduu dandeessa, maqaa qubeessaan, qooqa lakkaddaa ISO yookiis naannoo keen banuu dandeessa.",
+ "uls-search-placeholder": "Qooqa barbaadi"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json
index 59c77bf7..82932293 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pms.json
@@ -13,9 +13,10 @@
"uls-region-AS": "Asia",
"uls-region-ME": "Vzin Orient",
"uls-region-PA": "Passìfich",
+ "uls-region-all": "Tute le lenghe",
"uls-no-results-found": "Gnun arzultà trovà",
- "uls-common-languages": "Lenghe comun-e",
+ "uls-common-languages": "Lenghe sugerìe",
"uls-no-results-suggestion-title": "It peule esse anteressà a:",
"uls-search-help": "A peul sërché për nòm ëd lenga, nòm dl'alfabet, còdes ISO dla lenga o a peul navighé për region.",
- "uls-search-placeholder": "Arserca ëd lenga"
+ "uls-search-placeholder": "Serca na lenga"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json
new file mode 100644
index 00000000..3d0c3a56
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pnb.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Abbas dhothar"
+ ]
+ },
+ "uls-region-WW": "جگ بھر",
+ "uls-region-SP": "خاص",
+ "uls-region-AM": "امریکہ",
+ "uls-region-AF": "افریقہ",
+ "uls-region-EU": "یورپ",
+ "uls-region-AS": "ایشیاء",
+ "uls-region-ME": "مشرق وسطی",
+ "uls-region-PA": "بحر الکاہل",
+ "uls-region-all": "ساریاں بولیاں",
+ "uls-no-results-found": "کوئی نتیجے نئیں لبھے",
+ "uls-common-languages": "تجویز کردہ بولیاں",
+ "uls-no-results-suggestion-title": "توانوں اس وچ دلچسپی ہوسکدی اے:",
+ "uls-search-help": "تسیں بولی دے ناں ، اسکرپٹ دا ناں ، بولی دے آئی ایس او کوڈ دے ذریعہ تلاش کرسکدے نيں یا آپ علاقے دے ذریعہ براؤز کرسکدے او۔",
+ "uls-search-placeholder": "بولی دی کھوج"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json
index 53ea396f..5af62428 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt-br.json
@@ -4,6 +4,7 @@
"Amgauna",
"Cristofer Alves",
"Eduardo Addad de Oliveira",
+ "Eduardoaddad",
"TheEduGobi",
"Tuliouel",
"Webysther"
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json
index 9c5dce7a..df7dc253 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/pt.json
@@ -23,6 +23,6 @@
"uls-no-results-found": "Não foram encontrados resultados",
"uls-common-languages": "Idiomas sugeridos",
"uls-no-results-suggestion-title": "Você pode estar interessado em:",
- "uls-search-help": "Você pode pesquisar pelo nome do idioma, pelo tipo de alfabeto, código ISO do idioma, ou você pode navegar por região.",
+ "uls-search-help": "Pode pesquisar pelo nome da língua, pelo tipo de alfabeto, pelo código ISO da língua, ou pode navegar por região.",
"uls-search-placeholder": "Pesquisar uma língua"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json
index 788616fe..a04c0b6f 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sk.json
@@ -3,7 +3,8 @@
"authors": [
"Amire80",
"Jaroslav.micek",
- "Rudko"
+ "Rudko",
+ "Yardom78"
]
},
"uls-region-WW": "Po celom svete",
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json
index cb1bbf48..da5337e1 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/sl.json
@@ -3,6 +3,7 @@
"authors": [
"Amire80",
"Dbc334",
+ "Eleassar",
"Irena Plahuta",
"Mateju"
]
@@ -20,5 +21,5 @@
"uls-common-languages": "Predlagani jeziki",
"uls-no-results-suggestion-title": "Morda vas zanima:",
"uls-search-help": "Iščete lahko po imenu jezika, imenu pisave, jezikovni kodi ISO ali po področju.",
- "uls-search-placeholder": "Poiščite jezik"
+ "uls-search-placeholder": "Poišči jezik"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json
index 68e910a2..083b5b8a 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/ti.json
@@ -9,9 +9,11 @@
"uls-region-AM": "ኣመሪካ",
"uls-region-AF": "ኣፍሪቃ",
"uls-region-EU": "ኤውሮጳ",
- "uls-region-AS": "እስያ",
+ "uls-region-AS": "ኤስያ",
"uls-region-ME": "ማእከላይ ምብራቕ",
"uls-region-PA": "ሰላማዊ",
- "uls-region-all": "ኩሉ ቋንቋታት",
- "uls-no-results-found": "ውጺኢታት ኣይተረኸቡን"
+ "uls-region-all": "ኩሎም ቋንቋታት",
+ "uls-no-results-found": "ውጺኢታት ኣይተረኸቡን",
+ "uls-common-languages": "ዝምከሩ ቋንቋታት",
+ "uls-search-placeholder": "ቋንቋ ድለይ"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json
index 1a590c51..1f90e1f3 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tly.json
@@ -1,22 +1,24 @@
{
"@metadata": {
"authors": [
+ "Amire80",
"Erdemaslancan",
+ "Patriot Kur",
"Гусейн"
]
},
- "uls-region-WW": "Һәммәдынјо",
- "uls-region-SP": "Хысуси",
- "uls-region-AM": "Америкә",
- "uls-region-AF": "Африкә",
- "uls-region-EU": "Авропә",
- "uls-region-AS": "Асијә",
- "uls-region-ME": "Незә Шәрғ",
- "uls-region-PA": "Океанијә",
- "uls-region-all": "Һәммәј зывонон",
- "uls-no-results-found": "Һичи пәјдо быәни",
- "uls-common-languages": "Товсијә кардә быә зывонон",
- "uls-no-results-suggestion-title": "Бәзне бе ки бо шымә марағинин ын зывонон:",
+ "uls-region-WW": "Həmədınyo",
+ "uls-region-SP": "Xısusi",
+ "uls-region-AM": "Əmerikə",
+ "uls-region-AF": "Afrika",
+ "uls-region-EU": "Avropə",
+ "uls-region-AS": "Asiyə",
+ "uls-region-ME": "Miyonə Şərğ",
+ "uls-region-PA": "Pasifik",
+ "uls-region-all": "Həmə zıvonon",
+ "uls-no-results-found": "Hiçi pəydo bıəni",
+ "uls-common-languages": "Tovsiyə kardə bıə zıvonon",
+ "uls-no-results-suggestion-title": "Bəzne bə ki bo şımə marağinin ın zıvonon:",
"uls-search-help": "Шымә бәзнејон де зывони номи ја нывыштәј нәве, де зывони ISO-коди ја де вилојәти дијә карде.",
- "uls-search-placeholder": "Зывони ныве"
+ "uls-search-placeholder": "Bınəv zıvoni"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json
index 6345d755..53a650ef 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/tr.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"1917 Ekim Devrimi",
+ "BaRaN6161 TURK",
"Emperyan",
"Erdemaslancan",
"Kumkumuk",
@@ -23,5 +24,5 @@
"uls-common-languages": "Önerilen diller",
"uls-no-results-suggestion-title": "İlginizi çekebilir:",
"uls-search-help": "Dil adına, betik adına, dilin ISO koduna göre arama yapabilirsiniz ya da bölgeye göre tarayabilirsiniz.",
- "uls-search-placeholder": "Bu dilde ara"
+ "uls-search-placeholder": "Bir dil arayın"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json
index 25c47d2b..bc443677 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/udm.json
@@ -2,6 +2,7 @@
"@metadata": {
"authors": [
"AlnashPiyash2",
+ "Kotwys",
"Wadorgurt"
]
},
@@ -16,5 +17,7 @@
"uls-region-all": "Вань кылъёс",
"uls-no-results-found": "Шедьтэмын ӧвӧл",
"uls-common-languages": "Ӵектэм кылъёс",
+ "uls-no-results-suggestion-title": "Тӥледлы та кылъёс тунсыко луозы, дыр:",
+ "uls-search-help": "Кылэз нимызъя, гожъяськонэзъя, ISO кодэзъя утчамды луэ яке улосвылысь учкемды луэ.",
"uls-search-placeholder": "Кылэз утчан"
}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json
new file mode 100644
index 00000000..cf72d1c8
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/yue.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hello903hello",
+ "Moon0319",
+ "Roy17"
+ ]
+ },
+ "uls-region-WW": "全世界",
+ "uls-region-AF": "非洲",
+ "uls-region-EU": "歐洲",
+ "uls-region-AS": "亞洲",
+ "uls-region-ME": "中東",
+ "uls-region-PA": "太平洋",
+ "uls-region-all": "全部嘅話",
+ "uls-no-results-found": "搵唔到結果",
+ "uls-common-languages": "建議嘅話",
+ "uls-search-placeholder": "搵一種話"
+}
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json
index dc8f6f3e..8031d813 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/i18n/zgh.json
@@ -1,17 +1,19 @@
{
"@metadata": {
"authors": [
- "Aslmad mohamed belarhzali"
+ "Aslmad mohamed belarhzali",
+ "Hakim1bal"
]
},
"uls-region-WW": "ⴳ ⵓⵎⴰⴹⴰⵍ ⴰⴽⴽ",
+ "uls-region-SP": "ⴰⵎⵥⵍⵉ",
"uls-region-AM": "ⵜⴰⵎⵔⵉⴽⵜ",
"uls-region-AF": "ⵜⴰⴼⵔⵉⴽⵜ",
"uls-region-EU": "ⵜⵓⵔⵓⴼⵜ",
"uls-region-AS": "ⵜⴰⵣⵉⵜ",
"uls-region-ME": "ⴰⴳⵎⵓⴹ ⴰⵏⴰⵎⵎⴰⵙ",
"uls-region-PA": "ⴰⴳⴰⵔⴰⵡ ⵉⵎⵣⴳⵉ",
- "uls-region-all": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⴰⴽⴽ",
+ "uls-region-all": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⵎⴰⵕⵕⴰ",
"uls-no-results-found": "ⵓⵔ ⵜⵜⵢⴰⴼⴰⵏⵜ ⵜⵢⴰⴼⵓⵜⵉⵏ",
"uls-common-languages": "ⵜⵓⵜⵍⴰⵢⵉⵏ ⵉⵜⵜⵙⵓⵎⵔⵏ",
"uls-search-placeholder": "ⵔⵣⵓ ⵖⴼ ⴽⵔⴰ ⵏ ⵜⵓⵜⵍⴰⵢⵜ"
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/close.png b/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/close.png
deleted file mode 100644
index e320bfcf..00000000
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/close.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/language.png b/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/language.png
deleted file mode 100644
index 46cce713..00000000
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/language.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.png b/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.png
deleted file mode 100644
index 5c5d83df..00000000
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.png
+++ /dev/null
Binary files differ
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.svg b/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.svg
index 67d48b2f..61be6a40 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.svg
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/images/search.svg
@@ -3,5 +3,5 @@
<title>
search
</title>
- <path d="M19 17l-5.15-5.15a7 7 0 1 0-2 2L17 19zM3.5 8A4.5 4.5 0 1 1 8 12.5 4.5 4.5 0 0 1 3.5 8z"/>
+ <path fill-rule="evenodd" d="M12.2 13.6a7 7 0 111.4-1.4l5.4 5.4-1.4 1.4-5.4-5.4zM13 8A5 5 0 113 8a5 5 0 0110 0z"/>
</svg>
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js
index 86615788..fcf489d6 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.core.js
@@ -119,6 +119,11 @@
top = this.top,
left = this.left;
+ if ( this.options.onPosition ) {
+ return this.options.onPosition.call( this );
+ }
+
+ // Default implementation (middle of the screen under the trigger)
if ( top === undefined ) {
pos = $.extend( {}, this.$element.offset(), {
height: this.$element[ 0 ].offsetHeight
@@ -380,9 +385,9 @@
};
$.fn.uls.defaults = {
- // CSS top position for the dialog
+ // DEPRECATED: CSS top position for the dialog
top: undefined,
- // CSS left position for the dialog
+ // DEPRECATED: CSS left position for the dialog
left: undefined,
// Callback function when user selects a language
onSelect: undefined,
@@ -392,6 +397,8 @@
onReady: undefined,
// Callback function when ULS dialog is shown
onVisible: undefined,
+ // Callback function when ULS dialog is ready to be shown
+ onPosition: undefined,
// Languages to be used for ULS, default is all languages
languages: $.uls.data.getAutonyms(),
// The options are wide (4 columns), medium (2 columns), and narrow (1 column).
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js
index 84f5f0af..43899aaf 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.js
@@ -1,7 +1,9 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-module.exports=( function ( $ ) {
- $.uls = $.uls || {};
- $.uls.data = {
+( function () { function r( e, n, t ) { function o( i, f ) { if ( !n[ i ] ) { if ( !e[ i ] ) { var c = typeof require === 'function' && require; if ( !f && c ) { return c( i, !0 ); } if ( u ) { return u( i, !0 ); } var a = new Error( "Cannot find module '" + i + "'" ); throw a.code = 'MODULE_NOT_FOUND', a; } var p = n[ i ] = { exports: {} }; e[ i ][ 0 ].call( p.exports, function ( r ) { var n = e[ i ][ 1 ][ r ]; return o( n || r ); }, p, p.exports, r, e, n, t ); } return n[ i ].exports; } for ( var u = typeof require === 'function' && require, i = 0; i < t.length; i++ ) { o( t[ i ] ); } return o; } return r; }() )( {
+ 1: [ function ( require, module, exports ) {
+ module.exports = ( function ( $ ) {
+ $.uls = $.uls || {};
+ $.uls.data =
+{
"languages": {
"aa": [
"Latn",
@@ -117,6 +119,14 @@ module.exports=( function ( $ ) {
],
"Gegë"
],
+ "alt": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "алтай тил"
+ ],
"am": [
"Ethi",
[
@@ -145,6 +155,13 @@ module.exports=( function ( $ ) {
],
"Ænglisc"
],
+ "ann": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Obolo"
+ ],
"anp": [
"Deva",
[
@@ -244,6 +261,14 @@ module.exports=( function ( $ ) {
],
"atikamekw"
],
+ "atv": [
+ "Cyrl",
+ [
+ "EU",
+ "AS"
+ ],
+ "тÿндÿк алтай тил"
+ ],
"av": [
"Cyrl",
[
@@ -335,6 +360,13 @@ module.exports=( function ( $ ) {
],
"Boarisch"
],
+ "bas": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "ɓasaá"
+ ],
"bat-smg": [
"sgs"
],
@@ -363,6 +395,13 @@ module.exports=( function ( $ ) {
],
"جهلسری بلوچی"
],
+ "bci": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "wawle"
+ ],
"bcl": [
"Latn",
[
@@ -461,6 +500,20 @@ module.exports=( function ( $ ) {
],
"Banjar"
],
+ "bkm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Itaŋikom"
+ ],
+ "blc": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "ItNuxalkmc"
+ ],
"bm": [
"Latn",
[
@@ -568,6 +621,13 @@ module.exports=( function ( $ ) {
],
"ብሊን"
],
+ "bzj": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Bileez Kriol"
+ ],
"ca": [
"Latn",
[
@@ -582,13 +642,16 @@ module.exports=( function ( $ ) {
],
"Kaqchikel"
],
- "cbk-zam": [
+ "cbk": [
"Latn",
[
"AS"
],
"Chavacano de Zamboanga"
],
+ "cbk-zam": [
+ "cbk"
+ ],
"ccp": [
"Cakm",
[
@@ -603,6 +666,20 @@ module.exports=( function ( $ ) {
],
"Mìng-dĕ̤ng-ngṳ̄"
],
+ "cdo-latn": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mìng-dĕ̤ng-ngṳ̄ Bàng-uâ-cê"
+ ],
+ "cdo-hani": [
+ "Hani",
+ [
+ "AS"
+ ],
+ "閩東語(漢字)"
+ ],
"ce": [
"Cyrl",
[
@@ -660,7 +737,7 @@ module.exports=( function ( $ ) {
[
"AM"
],
- "Ojibwemowin"
+ "Anishinaabemowin"
],
"cjy": [
"cjy-hant"
@@ -670,7 +747,7 @@ module.exports=( function ( $ ) {
[
"AS"
],
- "晋语(简化字)"
+ "晋语(简化字)"
],
"cjy-hant": [
"Hant",
@@ -822,6 +899,13 @@ module.exports=( function ( $ ) {
],
"dagbanli"
],
+ "dar": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "дарган"
+ ],
"de-at": [
"Latn",
[
@@ -928,6 +1012,13 @@ module.exports=( function ( $ ) {
],
"Ελληνικά"
],
+ "elm": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Eleme"
+ ],
"eml": [
"Latn",
[
@@ -1270,6 +1361,13 @@ module.exports=( function ( $ ) {
],
"galego"
],
+ "gld": [
+ "Cyrl",
+ [
+ "AS"
+ ],
+ "на̄ни"
+ ],
"glk": [
"Arab",
[
@@ -1342,7 +1440,7 @@ module.exports=( function ( $ ) {
[
"AM"
],
- "Wayúu"
+ "wayuunaiki"
],
"gum": [
"Latn",
@@ -1358,6 +1456,13 @@ module.exports=( function ( $ ) {
],
"Gurenɛ"
],
+ "guw": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "gungbe"
+ ],
"gv": [
"Latn",
[
@@ -1644,6 +1749,13 @@ module.exports=( function ( $ ) {
"iu": [
"ike-cans"
],
+ "izh": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "ižoran keel"
+ ],
"ja": [
"Jpan",
[
@@ -1760,6 +1872,13 @@ module.exports=( function ( $ ) {
],
"Kabɩyɛ"
],
+ "kcg": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Tyap"
+ ],
"kea": [
"Latn",
[
@@ -1910,7 +2029,7 @@ module.exports=( function ( $ ) {
[
"EU"
],
- "Перем Коми"
+ "перем коми"
],
"koy": [
"Latn",
@@ -2258,7 +2377,7 @@ module.exports=( function ( $ ) {
[
"AS"
],
- "madhurâ"
+ "Madhurâ"
],
"mai": [
"Deva",
@@ -2415,6 +2534,13 @@ module.exports=( function ( $ ) {
],
"मराठी"
],
+ "mrh": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Mara"
+ ],
"mrj": [
"Cyrl",
[
@@ -2538,6 +2664,13 @@ module.exports=( function ( $ ) {
],
"Bân-lâm-gú"
],
+ "nan-hani": [
+ "Hani",
+ [
+ "AS"
+ ],
+ "閩南語(漢字)"
+ ],
"nap": [
"Latn",
[
@@ -2594,6 +2727,13 @@ module.exports=( function ( $ ) {
],
"Oshiwambo"
],
+ "nia": [
+ "Latn",
+ [
+ "AS"
+ ],
+ "Li Niha"
+ ],
"niu": [
"Latn",
[
@@ -2645,6 +2785,13 @@ module.exports=( function ( $ ) {
],
"คำเมือง"
],
+ "nog": [
+ "Cyrl",
+ [
+ "EU"
+ ],
+ "ногайша"
+ ],
"nov": [
"Latn",
[
@@ -2680,6 +2827,13 @@ module.exports=( function ( $ ) {
],
"Sesotho sa Leboa"
],
+ "nus": [
+ "Latn",
+ [
+ "AF"
+ ],
+ "Thok Naath"
+ ],
"nv": [
"Latn",
[
@@ -2708,6 +2862,13 @@ module.exports=( function ( $ ) {
],
"occitan"
],
+ "ojb": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Ojibwemowin"
+ ],
"oka": [
"Latn",
[
@@ -2721,7 +2882,7 @@ module.exports=( function ( $ ) {
"AS",
"EU"
],
- "Livvinkarjala"
+ "livvinkarjala"
],
"om": [
"Latn",
@@ -2804,6 +2965,13 @@ module.exports=( function ( $ ) {
],
"Papiamentu"
],
+ "pap-aw": [
+ "Latn",
+ [
+ "AM"
+ ],
+ "Papiamento"
+ ],
"pbb": [
"Latn",
[
@@ -3018,6 +3186,13 @@ module.exports=( function ( $ ) {
],
"Rumagnôl"
],
+ "rhg": [
+ "Rohg",
+ [
+ "AS"
+ ],
+ "𐴌𐴟𐴇𐴥𐴝𐴚𐴒𐴙𐴝"
+ ],
"rif": [
"Latn",
[
@@ -3039,6 +3214,13 @@ module.exports=( function ( $ ) {
],
"rumantsch"
],
+ "rmc": [
+ "Latn",
+ [
+ "EU"
+ ],
+ "romaňi čhib"
+ ],
"rmf": [
"Latn",
[
@@ -3277,7 +3459,7 @@ module.exports=( function ( $ ) {
[
"AF"
],
- "Tašlḥiyt"
+ "Taclḥit"
],
"shi-tfng": [
"Tfng",
@@ -3678,13 +3860,22 @@ module.exports=( function ( $ ) {
"Tagalog"
],
"tly": [
+ "Latn",
+ [
+ "EU",
+ "AS",
+ "ME"
+ ],
+ "tolışi"
+ ],
+ "tly-cyrl": [
"Cyrl",
[
"EU",
"AS",
"ME"
],
- "толышә зывон"
+ "толыши"
],
"tmr": [
"Hebr",
@@ -3969,7 +4160,7 @@ module.exports=( function ( $ ) {
[
"EU"
],
- "Võro"
+ "võro"
],
"wa": [
"Latn",
@@ -4179,6 +4370,9 @@ module.exports=( function ( $ ) {
"zh-yue": [
"yue"
],
+ "zh-cdo": [
+ "cdo"
+ ],
"zu": [
"Latn",
[
@@ -4231,6 +4425,7 @@ module.exports=( function ( $ ) {
"Mtei",
"Olck",
"Orya",
+ "Rohg",
"Saur",
"Sinh",
"Sylo",
@@ -4244,6 +4439,7 @@ module.exports=( function ( $ ) {
"Cyrl"
],
"CJK": [
+ "Hani",
"Hans",
"Hant",
"Kana",
@@ -4280,6 +4476,7 @@ module.exports=( function ( $ ) {
"Hebr",
"Syrc",
"Nkoo",
+ "Rohg",
"Thaa"
],
"regiongroups": {
@@ -4464,8 +4661,8 @@ module.exports=( function ( $ ) {
"it",
"ja",
"es",
- "ko",
"kgp",
+ "ko",
"yrl"
],
"BS": [
@@ -4533,7 +4730,8 @@ module.exports=( function ( $ ) {
"rm"
],
"CI": [
- "fr"
+ "fr",
+ "bci"
],
"CK": [
"en"
@@ -4547,6 +4745,8 @@ module.exports=( function ( $ ) {
"fr",
"en",
"ff",
+ "bkm",
+ "bas",
"ar",
"ksf",
"ha-arab",
@@ -5287,7 +5487,6 @@ module.exports=( function ( $ ) {
"MY": [
"ms",
"en",
- "zh-hant",
"zh",
"ta",
"jv",
@@ -5330,6 +5529,7 @@ module.exports=( function ( $ ) {
"ig",
"yo",
"ha-arab",
+ "kcg",
"ar",
"ff"
],
@@ -5524,6 +5724,7 @@ module.exports=( function ( $ ) {
"os",
"kbd",
"myv",
+ "dar",
"mdf",
"kum",
"kv",
@@ -5538,11 +5739,13 @@ module.exports=( function ( $ ) {
"lbe",
"koi",
"mrj",
+ "alt",
"fi",
"sr-latn",
"sr-cyrl",
"vep",
"mn",
+ "izh",
"vot",
"cu"
],
@@ -5638,7 +5841,8 @@ module.exports=( function ( $ ) {
],
"SS": [
"ar",
- "en"
+ "en",
+ "nus"
],
"ST": [
"pt"
@@ -5894,5 +6098,7 @@ module.exports=( function ( $ ) {
]
}
}
-} ( jQuery ) );
-},{}]},{},[1]);
+
+ }( jQuery ) );
+ }, {} ]
+}, {}, [ 1 ] );
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js
index 5606ab9e..0ddc407d 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.data.utils.js
@@ -282,7 +282,7 @@
* @return {string[]} list of language codes
*/
$.uls.data.getLanguagesInTerritory = function ( territory ) {
- return $.uls.data.territories[ territory ];
+ return $.uls.data.territories[ territory ] || [];
};
/**
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js
index f397aab2..8a2de4ab 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.uls/src/jquery.uls.languagefilter.js
@@ -107,11 +107,11 @@
if ( this.selectedLanguage ) {
// this.selectLanguage will be populated from a matching search
- this.options.onSelect( this.selectedLanguage );
+ this.options.onSelect( this.selectedLanguage, e );
} else if ( this.options.languages[ query ] ) {
// Search is yet to happen (in timeout delay),
// but we have a matching language code.
- this.options.onSelect( query );
+ this.options.onSelect( query, e );
}
break;
diff --git a/MLEB/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js b/MLEB/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js
index a28ca39d..db4ae6bf 100644
--- a/MLEB/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js
+++ b/MLEB/UniversalLanguageSelector/lib/jquery.webfonts/src/jquery.webfonts.js
@@ -200,7 +200,8 @@
$elements.each( function( i, element ) {
var fontFamilyStyle, fontFamily,
- $element = $( element );
+ $element = $( element ),
+ elementLanguage = element.getAttribute( 'lang' );
if ( $element.is( webfonts.options.exclude ) ) {
return;
@@ -214,7 +215,7 @@
if ( fontFamilyStyle ) {
// if it is overridable, override. always.
if ( webfonts.isOverridable( fontFamilyStyle ) ) {
- fontFamily = webfonts.getFont( element.lang || webfonts.language );
+ fontFamily = webfonts.getFont( elementLanguage || webfonts.language );
// We do not have fonts for all languages
if ( fontFamily ) {
addToFontQueue( fontFamily );
@@ -230,7 +231,7 @@
}
// Load and apply fonts for other language tagged elements (batched)
- if ( element.lang && element.lang !== webfonts.language ) {
+ if ( elementLanguage && elementLanguage !== webfonts.language ) {
// language differs. We may want to apply a different font.
if ( webfonts.hasExplicitFontStyle ( $element ) &&
!webfonts.isOverridable( fontFamilyStyle ) ) {
@@ -239,7 +240,7 @@
// browser settings.
return;
} else {
- fontFamily = webfonts.getFont( element.lang, element.className.split(/\s+/) );
+ fontFamily = webfonts.getFont( elementLanguage, element.className.split(/\s+/) );
}
if ( !fontFamily ) {
diff --git a/MLEB/UniversalLanguageSelector/package-lock.json b/MLEB/UniversalLanguageSelector/package-lock.json
index a23f2eec..a969690e 100644
--- a/MLEB/UniversalLanguageSelector/package-lock.json
+++ b/MLEB/UniversalLanguageSelector/package-lock.json
@@ -1,5359 +1,5988 @@
{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
- "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "@babel/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
- "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helpers": "^7.9.0",
- "@babel/parser": "^7.9.0",
- "@babel/template": "^7.8.6",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.1",
- "json5": "^2.1.2",
- "lodash": "^4.17.13",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- }
- }
- },
- "@babel/generator": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
- "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.9.5",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
- "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
- "dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.9.5"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
- "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
- "dev": true,
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.9.0",
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
- "dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
- "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
- "dev": true
- },
- "@babel/helpers": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
- "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0"
- }
- },
- "@babel/highlight": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
- "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
- "dev": true
- },
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- }
- }
- },
- "@babel/traverse": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
- "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.5",
- "@babel/helper-function-name": "^7.9.5",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.5",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
- "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- }
- }
- },
- "@babel/types": {
- "version": "7.9.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
- "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.5",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.3",
- "fastq": "^1.6.0"
- }
- },
- "@stylelint/postcss-css-in-js": {
- "version": "0.37.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz",
- "integrity": "sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw==",
- "dev": true,
- "requires": {
- "@babel/core": ">=7.9.0"
- }
- },
- "@stylelint/postcss-markdown": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
- "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
- "dev": true,
- "requires": {
- "remark": "^12.0.0",
- "unist-util-find-all-after": "^3.0.1"
- }
- },
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
- "@types/minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
- "dev": true
- },
- "@types/normalize-package-data": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
- "dev": true
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
- "@types/q": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
- "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
- "dev": true
- },
- "@types/unist": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
- "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
- "dev": true
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
- "dev": true
- },
- "ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "dev": true
- },
- "array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
- },
- "autoprefixer": {
- "version": "9.7.6",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz",
- "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==",
- "dev": true,
- "requires": {
- "browserslist": "^4.11.1",
- "caniuse-lite": "^1.0.30001039",
- "chalk": "^2.4.2",
- "normalize-range": "^0.1.2",
- "num2fraction": "^1.2.2",
- "postcss": "^7.0.27",
- "postcss-value-parser": "^4.0.3"
- }
- },
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "browserslist": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
- "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001043",
- "electron-to-chromium": "^1.3.413",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
- }
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30001045",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001045.tgz",
- "integrity": "sha512-Y8o2Iz1KPcD6FjySbk1sPpvJqchgxk/iow0DABpGyzA1UeQAuxh63Xh0Enj5/BrsYbXtCN32JmR4ZxQTCQ6E6A==",
- "dev": true
- },
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
- "dev": true
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "dev": true
- },
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "dev": true
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
- "dev": true
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "clone-regexp": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
- "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
- "dev": true,
- "requires": {
- "is-regexp": "^2.0.0"
- }
- },
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "colors": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
- "dev": true
- },
- "comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
- "dev": true
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
- "dev": true,
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "dependencies": {
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
- }
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "dependencies": {
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
- "css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "css-what": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
- "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==",
- "dev": true
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true
- },
- "csso": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz",
- "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==",
- "dev": true,
- "requires": {
- "css-tree": "1.0.0-alpha.37"
- }
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decamelize-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
- "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
- "dev": true,
- "requires": {
- "decamelize": "^1.1.0",
- "map-obj": "^1.0.0"
- }
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- }
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
- "dev": true,
- "requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
- }
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "dev": true,
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "each-async": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz",
- "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=",
- "dev": true,
- "requires": {
- "onetime": "^1.0.0",
- "set-immediate-shim": "^1.0.0"
- },
- "dependencies": {
- "onetime": {
- "version": "1.1.0",
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
- "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
- "dev": true
- }
- }
- },
- "electron-to-chromium": {
- "version": "1.3.414",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.414.tgz",
- "integrity": "sha512-UfxhIvED++qLwWrAq9uYVcqF8FdeV9sU2S7qhiHYFODxzXRrd1GZRl/PjITHsTEejgibcWDraD8TQqoHb1aCBQ==",
- "dev": true
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "requires": {
- "ansi-colors": "^4.1.1"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
- "dev": true
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "eslint": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
- "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
- "esquery": "^1.2.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash": "^4.17.14",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
- "dev": true,
- "requires": {
- "eslint": "^7.2.0",
- "eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
- "eslint-plugin-vue": "^6.2.2",
- "eslint-plugin-wdio": "^6.0.12"
- }
- },
- "eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
- "dev": true,
- "requires": {
- "eslint-utils": "^2.0.0",
- "regexpp": "^3.0.0"
- }
- },
- "eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
- "dev": true,
- "requires": {
- "comment-parser": "^0.7.5",
- "debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
- "regextras": "^0.7.1",
- "semver": "^6.3.0",
- "spdx-expression-parse": "^3.0.1"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- }
- }
- },
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- }
- }
- },
- "eslint-plugin-mediawiki": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.5.tgz",
- "integrity": "sha512-Xs5G4f1EnS6+9gFWkk28nWA9xcOEPx7YZEGsMYGLelZRAF+2DmV/PigF5N5VqoOkNBpwcbXqLD8wLfkg29aF8w==",
- "dev": true,
- "requires": {
- "eslint-plugin-vue": "^6.2.2",
- "upath": "^1.2.0"
- }
- },
- "eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
- "dev": true,
- "requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
- }
- },
- "eslint-plugin-no-jquery": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.5.0.tgz",
- "integrity": "sha512-RrQ380mUJJKdjgpQ/tZAJ3B3W1n3LbVmULooS2Pv5pUDcc5uVHVSJMTdUlsbvQyfo6hWP2LJ4FbOoDzENWcF7A==",
- "dev": true
- },
- "eslint-plugin-node": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
- "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
- "dev": true,
- "requires": {
- "eslint-plugin-es": "^3.0.0",
- "eslint-utils": "^2.0.0",
- "ignore": "^5.1.1",
- "minimatch": "^3.0.4",
- "resolve": "^1.10.1",
- "semver": "^6.1.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
- "dev": true
- },
- "eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
- "dev": true,
- "requires": {
- "natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
- }
- },
- "eslint-plugin-wdio": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-6.0.12.tgz",
- "integrity": "sha512-qZqcU1Z0bqrqhYM1MbwIvKQxcQEGIOEclOjcveavvLZAN4ezpXb1Ogw3xu+UK13iArregJOMI6uUt+JkFmER1A==",
- "dev": true
- },
- "eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
- "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- },
- "espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
- "dev": true,
- "requires": {
- "acorn": "^7.2.0",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
- "dev": true
- }
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "dev": true,
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "eventemitter2": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
- "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
- "dev": true
- },
- "execall": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
- "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
- "dev": true,
- "requires": {
- "clone-regexp": "^2.1.0"
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "dev": true,
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "findup-sync": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
- "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
- "dev": true,
- "requires": {
- "glob": "~5.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "fined": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
- "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "is-plain-object": "^2.0.3",
- "object.defaults": "^1.1.0",
- "object.pick": "^1.2.0",
- "parse-filepath": "^1.0.1"
- }
- },
- "flagged-respawn": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
- "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "dev": true
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "dev": true,
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- }
- },
- "flatted": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
- "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
- "dev": true
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "dev": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
- "dev": true
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getobject": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
- "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
- "dev": true
- },
- "glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "globby": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
- "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- }
- }
- },
- "globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
- "dev": true
- },
- "gonzales-pe": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
- "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
- "dev": true,
- "requires": {
- "dateformat": "~3.0.3",
- "eventemitter2": "~0.4.13",
- "exit": "~0.1.2",
- "findup-sync": "~0.3.0",
- "glob": "~7.1.6",
- "grunt-cli": "~1.3.2",
- "grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
- "iconv-lite": "~0.4.13",
- "js-yaml": "~3.14.0",
- "minimatch": "~3.0.4",
- "mkdirp": "~1.0.4",
- "nopt": "~3.0.6",
- "rimraf": "~3.0.2"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "grunt-cli": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
- "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
- "dev": true,
- "requires": {
- "grunt-known-options": "~1.1.0",
- "interpret": "~1.1.0",
- "liftoff": "~2.5.0",
- "nopt": "~4.0.1",
- "v8flags": "~3.1.1"
- },
- "dependencies": {
- "nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "dev": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- }
- }
- },
- "js-yaml": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
- "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "grunt-banana-checker": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.9.0.tgz",
- "integrity": "sha512-SqPiB6OazWqR8USL0NymtuT5Br3mD9WBBsM1rHC/3wIi2SrZNM6/+j9CIeuEM5oCn+AtO2Y0+rzzFyOdC9afAg==",
- "dev": true
- },
- "grunt-eslint": {
- "version": "23.0.0",
- "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-23.0.0.tgz",
- "integrity": "sha512-QqHSAiGF08EVD7YlD4OSRWuLRaDvpsRdTptwy9WaxUXE+03mCLVA/lEaR6SHWehF7oUwIqCEjaNONeeeWlB4LQ==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "eslint": "^7.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "grunt-known-options": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
- "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
- "dev": true
- },
- "grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
- "dev": true,
- "requires": {
- "colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
- "hooker": "~0.2.3",
- "lodash": "~4.17.5"
- }
- },
- "grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
- "dev": true,
- "requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
- }
- },
- "grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
- "dev": true,
- "requires": {
- "async": "~1.5.2",
- "exit": "~0.1.1",
- "getobject": "~0.1.0",
- "hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
- "which": "~1.3.0"
- }
- },
- "grunt-stylelint": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.15.0.tgz",
- "integrity": "sha512-1G5kbT3Y6OtAqgIv/XErtI6ai1t1UdtQWXxUV5Gd900PQoEzu/WrBYhGNAXdb/9nAsNWNjFHQjtdXQtZcDmobA==",
- "dev": true,
- "requires": {
- "chalk": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "grunt-svgmin": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/grunt-svgmin/-/grunt-svgmin-5.0.0.tgz",
- "integrity": "sha1-8O4pOtFi++hcjD5o2xUt/3J3qCQ=",
- "dev": true,
- "requires": {
- "chalk": "^2.3.0",
- "each-async": "^1.1.1",
- "log-symbols": "^2.1.0",
- "pretty-bytes": "^4.0.2",
- "svgo": "^1.0.3"
- }
- },
- "hard-rejection": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
- "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
- "dev": true
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
- "dev": true,
- "requires": {
- "parse-passwd": "^1.0.0"
- }
- },
- "hooker": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
- "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
- "dev": true
- },
- "hosted-git-info": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
- "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
- "dev": true
- },
- "html-tags": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
- "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
- "dev": true
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "dev": true,
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
- "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
- "dev": true
- },
- "interpret": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
- "dev": true
- },
- "is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "dev": true,
- "requires": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
- "dev": true
- },
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
- "is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "dev": true,
- "requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- }
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true
- },
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
- "dev": true
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
- "dev": true
- },
- "is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
- "dev": true
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-regexp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
- "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
- "dev": true
- },
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "dev": true,
- "requires": {
- "is-unc-path": "^1.0.0"
- }
- },
- "is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dev": true,
- "requires": {
- "unc-path-regex": "^0.1.2"
- }
- },
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "json5": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
- "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "known-css-properties": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.18.0.tgz",
- "integrity": "sha512-69AgJ1rQa7VvUsd2kpvVq+VeObDuo3zrj0CzM5Slmf6yduQFAI2kXPDQJR2IE/u6MSAUOJrwSzjg5vlz8qcMiw==",
- "dev": true
- },
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
- },
- "levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "liftoff": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
- "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "findup-sync": "^2.0.0",
- "fined": "^1.0.1",
- "flagged-respawn": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "object.map": "^1.0.0",
- "rechoir": "^0.6.2",
- "resolve": "^1.1.7"
- },
- "dependencies": {
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^3.1.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "lines-and-columns": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
- "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
- "dev": true
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "dependencies": {
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- }
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- },
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- },
- "longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
- "dev": true
- },
- "make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
- "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.0.0"
- }
- },
- "mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true
- },
- "mdast-util-compact": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
- "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "min-indent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz",
- "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "minimist-options": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
- "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
- },
- "dependencies": {
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
- "dev": true
- }
- }
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
- "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
- "dev": true
- },
- "nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
- "dev": true
- },
- "normalize-selector": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
- "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
- "dev": true
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "dev": true,
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "num2fraction": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
- "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
- "dev": true
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-inspect": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
- "dev": true
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
- "dev": true,
- "requires": {
- "array-each": "^1.0.1",
- "array-slice": "^1.0.0",
- "for-own": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
- "dev": true,
- "requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "requires": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "dev": true
- },
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
- "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
- "dev": true,
- "requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
- "dev": true,
- "requires": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
- }
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
- "dev": true,
- "requires": {
- "path-root-regex": "^0.1.0"
- }
- },
- "path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "dev": true
- },
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "dev": true,
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- }
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "postcss-html": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
- "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
- "dev": true,
- "requires": {
- "htmlparser2": "^3.10.0"
- }
- },
- "postcss-less": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
- "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.14"
- }
- },
- "postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
- "dev": true
- },
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- }
- },
- "postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
- "dev": true
- },
- "postcss-safe-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
- "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.26"
- }
- },
- "postcss-sass": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
- "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
- "dev": true,
- "requires": {
- "gonzales-pe": "^4.3.0",
- "postcss": "^7.0.21"
- }
- },
- "postcss-scss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
- "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "postcss-syntax": {
- "version": "0.36.2",
- "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
- "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
- "dev": true
- },
- "postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
- },
- "pretty-bytes": {
- "version": "4.0.2",
- "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
- "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
- "dev": true
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true
- },
- "quick-lru": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
- "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
- "dev": true
- },
- "ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
- "dev": true
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
- "dev": true
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexpp": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
- "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
- "dev": true
- },
- "regextras": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz",
- "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==",
- "dev": true
- },
- "remark": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.0.tgz",
- "integrity": "sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A==",
- "dev": true,
- "requires": {
- "remark-parse": "^8.0.0",
- "remark-stringify": "^8.0.0",
- "unified": "^9.0.0"
- }
- },
- "remark-parse": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.1.tgz",
- "integrity": "sha512-Ye/5W57tdQZWsfkuVyRq9SUWRgECHnDsMuyUMzdSKpTbNPkZeGtoYfsrkeSi4+Xyl0mhcPPddHITXPcCPHrl3w==",
- "dev": true,
- "requires": {
- "ccount": "^1.0.0",
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^2.0.0",
- "vfile-location": "^3.0.0",
- "xtend": "^4.0.1"
- }
- },
- "remark-stringify": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.0.0.tgz",
- "integrity": "sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w==",
- "dev": true,
- "requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^2.0.0",
- "mdast-util-compact": "^2.0.0",
- "parse-entities": "^2.0.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^3.0.0",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
- }
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
- "dev": true
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "resolve": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
- "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
- },
- "dependencies": {
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dev": true,
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- }
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
- "dev": true
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
- "dev": true
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
- "dev": true
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "dev": true,
- "requires": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
- },
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
- "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
- "dev": true
- },
- "specificity": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
- "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
- "dev": true
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "dev": true
- },
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
- "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
- "dev": true
- }
- }
- },
- "stringify-entities": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.0.tgz",
- "integrity": "sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw==",
- "dev": true,
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.2",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "strip-json-comments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
- "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
- "dev": true
- },
- "style-search": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
- "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
- "dev": true
- },
- "stylelint": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.3.2.tgz",
- "integrity": "sha512-kpO3/Gz2ZY40EWUwFYYkgpzhf8ZDUyKpcui5+pS0XKJBj/EMYmZpOJoL8IFAz2yApYeg91NVy5yAjE39hDzWvQ==",
- "dev": true,
- "requires": {
- "@stylelint/postcss-css-in-js": "^0.37.1",
- "@stylelint/postcss-markdown": "^0.36.1",
- "autoprefixer": "^9.7.6",
- "balanced-match": "^1.0.0",
- "chalk": "^4.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
- "execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.1.0",
- "ignore": "^5.1.4",
- "import-lazy": "^4.0.0",
- "imurmurhash": "^0.1.4",
- "known-css-properties": "^0.18.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^6.1.0",
- "micromatch": "^4.0.2",
- "normalize-selector": "^0.2.0",
- "postcss": "^7.0.27",
- "postcss-html": "^0.36.0",
- "postcss-less": "^3.1.4",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^4.0.2",
- "postcss-sass": "^0.4.4",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.3",
- "resolve-from": "^5.0.0",
- "slash": "^3.0.0",
- "specificity": "^0.4.1",
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "style-search": "^0.1.0",
- "sugarss": "^2.0.0",
- "svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
- "write-file-atomic": "^3.0.3"
- },
- "dependencies": {
- "ajv": {
- "version": "6.12.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
- "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- },
- "camelcase-keys": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
- "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.3.1",
- "map-obj": "^4.0.0",
- "quick-lru": "^4.0.1"
- }
- },
- "chalk": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
- "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
- "dev": true
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
- "dev": true
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- },
- "log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "map-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
- "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
- "dev": true
- },
- "meow": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
- "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
- "dev": true,
- "requires": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.1.1",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.0.0",
- "minimist-options": "^4.0.1",
- "normalize-package-data": "^2.5.0",
- "read-pkg-up": "^7.0.0",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.8.1",
- "yargs-parser": "^18.1.1"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- }
- },
- "redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "requires": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- }
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "requires": {
- "min-indent": "^1.0.0"
- }
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "trim-newlines": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
- "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
- "dev": true
- }
- }
- },
- "stylelint-config-wikimedia": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.1.tgz",
- "integrity": "sha512-R/E7xVKwDyneKmVwkNi+TqJlXZjnL5IH+bQPmfHrgwwyAekNx5GdYZ+tVjx7VBXdv/pjOr0HevVpXSQe86ZfVQ==",
- "dev": true,
- "requires": {
- "stylelint": "13.3.2"
- }
- },
- "sugarss": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
- "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
- "dev": true,
- "requires": {
- "postcss": "^7.0.2"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
- "dev": true
- },
- "svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- }
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": true,
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
- "dev": true
- },
- "trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
- "dev": true
- },
- "type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "dev": true
- },
- "underscore.string": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
- "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
- "dev": true,
- "requires": {
- "sprintf-js": "^1.0.3",
- "util-deprecate": "^1.0.2"
- }
- },
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "unified": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz",
- "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==",
- "dev": true,
- "requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-buffer": "^2.0.0",
- "is-plain-obj": "^2.0.0",
- "trough": "^1.0.0",
- "vfile": "^4.0.0"
- }
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
- "dev": true
- },
- "unist-util-find-all-after": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
- "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
- "dev": true,
- "requires": {
- "unist-util-is": "^4.0.0"
- }
- },
- "unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
- "dev": true
- },
- "unist-util-remove-position": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
- "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
- "unist-util-stringify-position": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
- "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.2"
- }
- },
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- },
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
- "dev": true
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "dev": true
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- }
- },
- "v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
- "dev": true
- },
- "v8flags": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
- "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vfile": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz",
- "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^2.0.0",
- "vfile-message": "^2.0.0"
- }
- },
- "vfile-location": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.0.1.tgz",
- "integrity": "sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ==",
- "dev": true
- },
- "vfile-message": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
- "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
- "dev": true,
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.2",
- "vscode-uri": "^2.1.2"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
- "vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "eslint-scope": "^5.0.0",
- "eslint-visitor-keys": "^1.1.0",
- "espree": "^6.2.1",
- "esquery": "^1.0.1",
- "lodash": "^4.17.15"
- },
- "dependencies": {
- "espree": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
- "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
- "dev": true,
- "requires": {
- "acorn": "^7.1.1",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- }
- }
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
- },
- "yaml": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.9.2.tgz",
- "integrity": "sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg==",
- "dev": true,
- "requires": {
- "@babel/runtime": "^7.9.2"
- }
- },
- "yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
- }
- }
- }
- }
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/core": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.7.tgz",
+ "integrity": "sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.5",
+ "@babel/parser": "^7.12.7",
+ "@babel/template": "^7.12.7",
+ "@babel/traverse": "^7.12.7",
+ "@babel/types": "^7.12.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz",
+ "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz",
+ "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz",
+ "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz",
+ "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.7"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz",
+ "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.12.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz",
+ "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.5",
+ "@babel/types": "^7.12.5"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz",
+ "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz",
+ "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.7.tgz",
+ "integrity": "sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.7",
+ "@babel/types": "^7.12.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz",
+ "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz",
+ "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+ "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.3",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+ "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+ "dev": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+ "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.3",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@stylelint/postcss-css-in-js": {
+ "version": "0.37.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+ "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": ">=7.9.0"
+ }
+ },
+ "@stylelint/postcss-markdown": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
+ "dev": true,
+ "requires": {
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
+ }
+ },
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/minimist": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
+ "dev": true
+ },
+ "@types/normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+ "dev": true
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "@types/q": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
+ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
+ "dev": true
+ },
+ "@types/unist": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
+ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
+ "dev": true
+ },
+ "JSONStream": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz",
+ "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=",
+ "dev": true,
+ "requires": {
+ "jsonparse": "0.0.5",
+ "through": ">=2.2.7 <3"
+ }
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "ast-metadata-inferer": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
+ "integrity": "sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "9.8.6",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+ "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.12.0",
+ "caniuse-lite": "^1.0.30001109",
+ "colorette": "^1.2.1",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^7.0.32",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.14.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz",
+ "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001157",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.591",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.66"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001159",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz",
+ "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "dev": true
+ },
+ "character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "dev": true
+ },
+ "character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "clone-regexp": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz",
+ "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==",
+ "dev": true,
+ "requires": {
+ "is-regexp": "^2.0.0"
+ }
+ },
+ "coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "dev": true,
+ "requires": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "comment-parser": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz",
+ "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
+ "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "dependencies": {
+ "import-fresh": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
+ "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ }
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "css-rule-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz",
+ "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=",
+ "dev": true,
+ "requires": {
+ "css-tokenize": "^1.0.1",
+ "duplexer2": "0.0.2",
+ "ldjson-stream": "^1.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "dev": true
+ },
+ "css-tokenize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz",
+ "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^1.0.33"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "css-what": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
+ "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "csso": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz",
+ "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==",
+ "dev": true,
+ "requires": {
+ "css-tree": "1.0.0-alpha.37"
+ }
+ },
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decamelize-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+ "dev": true,
+ "requires": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ }
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "doiuse": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.4.0.tgz",
+ "integrity": "sha512-+RbL+7ECpBzbX+GMnX3PXzc/t+ufvZV/q/ysES5U8i0VexgGKLezQPCVehKwzLH2pIFC0pISfPaSm69CxuEw6w==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.14.7",
+ "caniuse-lite": "^1.0.30001157",
+ "css-rule-stream": "^1.1.0",
+ "duplexer2": "0.0.2",
+ "jsonfilter": "^1.1.2",
+ "ldjson-stream": "^1.2.1",
+ "multimatch": "^5.0.0",
+ "postcss": "^8.1.6",
+ "source-map": "^0.7.3",
+ "through2": "^4.0.2",
+ "yargs": "^16.1.0"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+ "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.0",
+ "entities": "^1.1.1"
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "~1.1.9"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "each-async": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz",
+ "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=",
+ "dev": true,
+ "requires": {
+ "onetime": "^1.0.0",
+ "set-immediate-shim": "^1.0.0"
+ },
+ "dependencies": {
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
+ "dev": true
+ }
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.603",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz",
+ "integrity": "sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ==",
+ "dev": true
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
+ "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
+ "globals": {
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
+ "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.20.0.tgz",
+ "integrity": "sha512-F2dm+S6aCDDb99Fr6KD9L7u1gOK819deG6xAG4EIVaLsHdQhjbcpNUuzUkUmGmpEHIYHqSpwkZ1EvBMc9Pxn+w==",
+ "dev": true,
+ "requires": {
+ "eslint": "^7.23.0",
+ "eslint-plugin-compat": "^3.9.0",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^32.3.0",
+ "eslint-plugin-json-es": "^1.5.3",
+ "eslint-plugin-mediawiki": "^0.2.7",
+ "eslint-plugin-mocha": "^8.1.0",
+ "eslint-plugin-no-jquery": "^2.6.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^6.0.0",
+ "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-wdio": "^7.0.0"
+ }
+ },
+ "eslint-plugin-compat": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz",
+ "integrity": "sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^2.0.7",
+ "ast-metadata-inferer": "^0.4.0",
+ "browserslist": "^4.12.2",
+ "caniuse-lite": "^1.0.30001166",
+ "core-js": "^3.6.5",
+ "find-up": "^4.1.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.2"
+ },
+ "dependencies": {
+ "caniuse-lite": {
+ "version": "1.0.30001208",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz",
+ "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
+ "eslint-plugin-jsdoc": {
+ "version": "32.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz",
+ "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==",
+ "dev": true,
+ "requires": {
+ "comment-parser": "1.1.2",
+ "debug": "^4.3.1",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
+ "regextras": "^0.7.1",
+ "semver": "^7.3.4",
+ "spdx-expression-parse": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-json-es": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+ "integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-mediawiki": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+ "integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-vue": "^7.7.0",
+ "upath": "^1.2.0"
+ }
+ },
+ "eslint-plugin-mocha": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+ "integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
+ }
+ },
+ "eslint-plugin-no-jquery": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.6.0.tgz",
+ "integrity": "sha512-xC7pbNHJMdyxqhzcNMRrmC5/tbt1T4KCKXjOqUpKm/CaRryGKS5iWztzWPrL0KwyI3R3ub6goHFmIQS19f+mZA==",
+ "dev": true
+ },
+ "eslint-plugin-node": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-es": "^3.0.0",
+ "eslint-utils": "^2.0.0",
+ "ignore": "^5.1.1",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.10.1",
+ "semver": "^6.1.0"
+ },
+ "dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-qunit": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-6.0.0.tgz",
+ "integrity": "sha512-+R8z2umSTIiWcxmTQ9nGoML8DL0VQJg4C+E9OpJ2KF9QL4WL/FoayROeTG5Z9zhlZ2qqa+9WkZ1YD6mx89io8w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "requireindex": "^1.2.0"
+ }
+ },
+ "eslint-plugin-vue": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.3.2",
+ "vue-eslint-parser": "^7.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-wdio": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.4.2.tgz",
+ "integrity": "sha512-tkISFycJmRFMKsEjetRcAmWSHKJKnw5rKHDxfE7Ob3tF5lbmYlCLfNKH0UwanOpSdulpe52s3K+CBHSd6qUUNQ==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "eventemitter2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
+ "dev": true
+ },
+ "execall": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz",
+ "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==",
+ "dev": true,
+ "requires": {
+ "clone-regexp": "^2.1.0"
+ }
+ },
+ "exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz",
+ "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "dev": true,
+ "requires": {
+ "glob": "~5.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "fined": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+ "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "is-plain-object": "^2.0.3",
+ "object.defaults": "^1.1.0",
+ "object.pick": "^1.2.0",
+ "parse-filepath": "^1.0.1"
+ }
+ },
+ "flagged-respawn": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
+ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getobject": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
+ "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^3.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "globby": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
+ }
+ }
+ },
+ "globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
+ "dev": true
+ },
+ "gonzales-pe": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
+ "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "grunt": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
+ "dev": true,
+ "requires": {
+ "dateformat": "~3.0.3",
+ "eventemitter2": "~0.4.13",
+ "exit": "~0.1.2",
+ "findup-sync": "~0.3.0",
+ "glob": "~7.1.6",
+ "grunt-cli": "~1.3.2",
+ "grunt-known-options": "~1.1.0",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
+ "iconv-lite": "~0.4.13",
+ "js-yaml": "~3.14.0",
+ "minimatch": "~3.0.4",
+ "mkdirp": "~1.0.4",
+ "nopt": "~3.0.6",
+ "rimraf": "~3.0.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "grunt-cli": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
+ "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
+ "dev": true,
+ "requires": {
+ "grunt-known-options": "~1.1.0",
+ "interpret": "~1.1.0",
+ "liftoff": "~2.5.0",
+ "nopt": "~4.0.1",
+ "v8flags": "~3.1.1"
+ },
+ "dependencies": {
+ "nopt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+ "dev": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ }
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "grunt-banana-checker": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/grunt-banana-checker/-/grunt-banana-checker-0.9.0.tgz",
+ "integrity": "sha512-SqPiB6OazWqR8USL0NymtuT5Br3mD9WBBsM1rHC/3wIi2SrZNM6/+j9CIeuEM5oCn+AtO2Y0+rzzFyOdC9afAg==",
+ "dev": true
+ },
+ "grunt-eslint": {
+ "version": "23.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-23.0.0.tgz",
+ "integrity": "sha512-QqHSAiGF08EVD7YlD4OSRWuLRaDvpsRdTptwy9WaxUXE+03mCLVA/lEaR6SHWehF7oUwIqCEjaNONeeeWlB4LQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "eslint": "^7.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "grunt-known-options": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
+ "dev": true
+ },
+ "grunt-legacy-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
+ "dev": true,
+ "requires": {
+ "colors": "~1.1.2",
+ "grunt-legacy-log-utils": "~2.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.19"
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
+ "dev": true,
+ "requires": {
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "grunt-legacy-util": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
+ "dev": true,
+ "requires": {
+ "async": "~1.5.2",
+ "exit": "~0.1.1",
+ "getobject": "~0.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
+ "which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
+ }
+ },
+ "grunt-stylelint": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.16.0.tgz",
+ "integrity": "sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "grunt-svgmin": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-svgmin/-/grunt-svgmin-5.0.0.tgz",
+ "integrity": "sha1-8O4pOtFi++hcjD5o2xUt/3J3qCQ=",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.3.0",
+ "each-async": "^1.1.1",
+ "log-symbols": "^2.1.0",
+ "pretty-bytes": "^4.0.2",
+ "svgo": "^1.0.3"
+ }
+ },
+ "hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "^1.0.0"
+ }
+ },
+ "hooker": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
+ "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "html-tags": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
+ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-lazy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "dev": true,
+ "requires": {
+ "is-relative": "^1.0.0",
+ "is-windows": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "dev": true
+ },
+ "is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "dev": true,
+ "requires": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-boolean-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
+ "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-number-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-regexp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz",
+ "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "^1.0.0"
+ }
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "^0.1.2"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsdoctypeparser": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "jsonfilter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz",
+ "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=",
+ "dev": true,
+ "requires": {
+ "JSONStream": "^0.8.4",
+ "minimist": "^1.1.0",
+ "stream-combiner": "^0.2.1",
+ "through2": "^0.6.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "jsonparse": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz",
+ "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "known-css-properties": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.20.0.tgz",
+ "integrity": "sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==",
+ "dev": true
+ },
+ "ldjson-stream": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz",
+ "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=",
+ "dev": true,
+ "requires": {
+ "split2": "^0.2.1",
+ "through2": "^0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "^3.0.0",
+ "findup-sync": "^2.0.0",
+ "fined": "^1.0.1",
+ "flagged-respawn": "^1.0.0",
+ "is-plain-object": "^2.0.4",
+ "object.map": "^1.0.0",
+ "rechoir": "^0.6.2",
+ "resolve": "^1.1.7"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^3.1.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.19",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+ "dev": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "longest-streak": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
+ "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true
+ },
+ "mdast-util-from-markdown": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz",
+ "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==",
+ "dev": true,
+ "requires": {
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "micromark": "~2.10.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz",
+ "integrity": "sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^1.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
+ "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
+ "dev": true
+ },
+ "mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "dev": true
+ },
+ "meow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
+ "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ }
+ }
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "micromark": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz",
+ "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "dependencies": {
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true
+ }
+ }
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
+ "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
+ "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true
+ }
+ }
+ },
+ "nanoid": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.18.tgz",
+ "integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "1.1.67",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz",
+ "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz",
+ "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^3.0.6",
+ "resolve": "^1.17.0",
+ "semver": "^7.3.2",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+ "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.1.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ }
+ }
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true
+ },
+ "normalize-selector": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz",
+ "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
+ "dev": true
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "^1.0.1",
+ "array-slice": "^1.0.0",
+ "for-own": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "^1.0.0",
+ "make-iterator": "^1.0.0"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "dev": true,
+ "requires": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "^1.0.0",
+ "map-cache": "^0.2.0",
+ "path-root": "^0.1.1"
+ }
+ },
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "^0.1.0"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-html": {
+ "version": "0.36.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
+ "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "^3.10.0"
+ }
+ },
+ "postcss-less": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
+ "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.14"
+ }
+ },
+ "postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
+ "dev": true
+ },
+ "postcss-resolve-nested-selector": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+ "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
+ "dev": true
+ },
+ "postcss-safe-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
+ "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.26"
+ }
+ },
+ "postcss-sass": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
+ "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
+ "dev": true,
+ "requires": {
+ "gonzales-pe": "^4.3.0",
+ "postcss": "^7.0.21"
+ }
+ },
+ "postcss-scss": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-syntax": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
+ "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
+ "dev": true
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
+ "quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true
+ },
+ "ramda": {
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.1.6"
+ }
+ },
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "regextras": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz",
+ "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==",
+ "dev": true
+ },
+ "remark": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
+ "dev": true,
+ "requires": {
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
+ }
+ },
+ "remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+ "dev": true,
+ "requires": {
+ "mdast-util-from-markdown": "^0.8.0"
+ }
+ },
+ "remark-stringify": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz",
+ "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-markdown": "^0.5.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
+ "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "dependencies": {
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ }
+ }
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-parallel": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
+ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
+ "dev": true
+ },
+ "specificity": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+ "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "split2": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
+ "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=",
+ "dev": true,
+ "requires": {
+ "through2": "~0.6.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ }
+ }
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "requires": {
+ "min-indent": "^1.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
+ "dev": true
+ },
+ "stylelint": {
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
+ "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
+ "dev": true,
+ "requires": {
+ "@stylelint/postcss-css-in-js": "^0.37.2",
+ "@stylelint/postcss-markdown": "^0.36.2",
+ "autoprefixer": "^9.8.6",
+ "balanced-match": "^1.0.0",
+ "chalk": "^4.1.0",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.2.0",
+ "execall": "^2.0.0",
+ "fast-glob": "^3.2.4",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.0",
+ "get-stdin": "^8.0.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.1",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.1.0",
+ "ignore": "^5.1.8",
+ "import-lazy": "^4.0.0",
+ "imurmurhash": "^0.1.4",
+ "known-css-properties": "^0.20.0",
+ "lodash": "^4.17.20",
+ "log-symbols": "^4.0.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^8.0.0",
+ "micromatch": "^4.0.2",
+ "normalize-selector": "^0.2.0",
+ "postcss": "^7.0.35",
+ "postcss-html": "^0.36.0",
+ "postcss-less": "^3.1.4",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.1",
+ "postcss-safe-parser": "^4.0.2",
+ "postcss-sass": "^0.4.4",
+ "postcss-scss": "^2.1.1",
+ "postcss-selector-parser": "^6.0.4",
+ "postcss-syntax": "^0.36.2",
+ "postcss-value-parser": "^4.1.0",
+ "resolve-from": "^5.0.0",
+ "slash": "^3.0.0",
+ "specificity": "^0.4.1",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "style-search": "^0.1.0",
+ "sugarss": "^2.0.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.0.3",
+ "v8-compile-cache": "^2.2.0",
+ "write-file-atomic": "^3.0.3"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "table": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
+ "dev": true
+ }
+ }
+ },
+ "stylelint-config-wikimedia": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.10.3.tgz",
+ "integrity": "sha512-+n082jsEfX4v+ra5F6RfsEnjG6VymnHc613yJeyQAJtigL/+B5XDduVmtXk5vPZ01s0eXTOzVuK0aJ98ofmkoA==",
+ "dev": true,
+ "requires": {
+ "stylelint": "13.8.0",
+ "stylelint-no-unsupported-browser-features": "4.1.4"
+ }
+ },
+ "stylelint-no-unsupported-browser-features": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-4.1.4.tgz",
+ "integrity": "sha512-GORR+/z4KkWP9SWO4fLmC5WAIjDClShSfwCYTuAB9cT8GE+rtOXeAqw5RyXuN9BLIBAPjeO2W7LFIrWUH8x7FA==",
+ "dev": true,
+ "requires": {
+ "doiuse": "^4.3.1",
+ "lodash": "^4.17.15",
+ "postcss": "^8.1.4"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.1.9",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.9.tgz",
+ "integrity": "sha512-oWuBpEl1meaMKkQXn0ic78TUrgsMvrAZLE/6ZY0H3LTteq2O3L8PGWwMbPLctpksTJIHjQeossMUMNQW7qRIHQ==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.1",
+ "nanoid": "^3.1.18",
+ "source-map": "^0.6.1",
+ "vfile-location": "^3.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "sugarss": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
+ "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.2"
+ }
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+ "dev": true
+ },
+ "svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ }
+ },
+ "table": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.1.0.tgz",
+ "integrity": "sha512-T4G5KMmqIk6X87gLKWyU5exPpTjLjY5KyrFWaIjv3SvgaIUGXV7UEzGEnZJdTA38/yUS6f9PlKezQ0bYXG3iIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.flatten": "^4.4.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.1.0.tgz",
+ "integrity": "sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "trim-newlines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+ "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+ "dev": true
+ },
+ "trough": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
+ "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "^1.0.3",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "unified": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
+ "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+ "dev": true,
+ "requires": {
+ "bail": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^2.0.0",
+ "trough": "^1.0.0",
+ "vfile": "^4.0.0"
+ }
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "unist-util-find-all-after": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+ "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
+ "dev": true,
+ "requires": {
+ "unist-util-is": "^4.0.0"
+ }
+ },
+ "unist-util-is": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz",
+ "integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==",
+ "dev": true
+ },
+ "unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.2"
+ }
+ },
+ "unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
+ "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vfile": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
+ "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "is-buffer": "^2.0.0",
+ "replace-ext": "1.0.0",
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
+ }
+ },
+ "vfile-location": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
+ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
+ "dev": true
+ },
+ "vfile-message": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
+ }
+ },
+ "vue-eslint-parser": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+ "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "eslint-scope": "^5.0.0",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.2.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.15"
+ },
+ "dependencies": {
+ "espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz",
+ "integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
+ }
+ }
}
diff --git a/MLEB/UniversalLanguageSelector/package.json b/MLEB/UniversalLanguageSelector/package.json
index 9ae99f49..9f6b0e81 100644
--- a/MLEB/UniversalLanguageSelector/package.json
+++ b/MLEB/UniversalLanguageSelector/package.json
@@ -4,13 +4,13 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.20.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
"grunt-eslint": "23.0.0",
- "grunt-stylelint": "0.15.0",
+ "grunt-stylelint": "0.16.0",
"grunt-svgmin": "5.0.0",
- "stylelint-config-wikimedia": "0.10.1"
+ "stylelint-config-wikimedia": "0.10.3"
},
"eslintIgnore": [
"lib/**",
diff --git a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.compactlinks.less b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.compactlinks.less
index 342922f1..03c80242 100644
--- a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.compactlinks.less
+++ b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.compactlinks.less
@@ -11,24 +11,26 @@
.mw-interlanguage-selector,
.mw-interlanguage-selector:active {
- cursor: pointer;
- padding: 4px 6px 4px 25px;
+ background-image: url( ../images/language-base20.svg );
+ background-position: left 4px center;
+ background-repeat: no-repeat;
+ background-size: 16px;
+ margin: 4px 0 8px;
+ padding: 4px 8px 4px 26px;
font-size: 13px;
font-weight: normal;
- background-image: url( ../images/compact-links-trigger.svg );
- background-size: 18px;
- background-repeat: no-repeat;
- background-position: left 4px center;
- margin: 4px 0;
text-align: left;
+ cursor: pointer;
}
-.mw-interlanguage-selector:active,
.mw-interlanguage-selector.selector-open {
background-color: #c8ccd1;
- color: #54595d;
}
+/*
+ * Add caret to the ULS dialog when using the cog in the sidebar.
+ * This works together with selector-left and selector-right classes.
+ */
.interlanguage-uls-menu {
.caret();
}
diff --git a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.interface.less b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.interface.less
index 533f6110..ce60cf07 100644
--- a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.interface.less
+++ b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.interface.less
@@ -35,3 +35,7 @@
}
}
}
+
+.uls-tipsy.uls-tipsy {
+ z-index: 1000;
+}
diff --git a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.pt.less b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.pt.less
index d8e85aec..51202e02 100644
--- a/MLEB/UniversalLanguageSelector/resources/css/ext.uls.pt.less
+++ b/MLEB/UniversalLanguageSelector/resources/css/ext.uls.pt.less
@@ -20,8 +20,7 @@
* Copied from jquery.uls.css with the path changed.
*/
.uls-trigger {
- background: no-repeat left center;
- .background-image-svg( '../../lib/jquery.uls/images/language.svg', '../../lib/jquery.uls/images/language.png' );
+ background: no-repeat url( ../../lib/jquery.uls/images/language.svg ) left center;
// Let the SVG image fit without cropping or stretch
background-size: contain;
padding-left: 24px;
@@ -40,7 +39,7 @@
// Putting the icon in before in order to apply `opacity`.
&:before {
content: '';
- .background-image-svg( '../../lib/jquery.uls/images/language.svg', '../../lib/jquery.uls/images/language.png' );
+ background-image: url( ../../lib/jquery.uls/images/language.svg );
// Same values as Vector's `#pt-userpage a`.
background-position: @background-position-menu-uls-icon;
// Support Edge: Can't be `contain`, see T207075.
diff --git a/MLEB/UniversalLanguageSelector/resources/images/compact-links-trigger.svg b/MLEB/UniversalLanguageSelector/resources/images/compact-links-trigger.svg
deleted file mode 100644
index 3a62fe8c..00000000
--- a/MLEB/UniversalLanguageSelector/resources/images/compact-links-trigger.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24">
- <path fill="#72777d" d="M13 19l.8-3h5.3l.9 3h2.2L18 6h-3l-4.2 13H13zm3.5-11l2 6h-4l2-6zM5 4l.938 1.906H1V8h1.594C3.194 9.8 4 11.206 5 12.406c-1.1.7-4.313 1.781-4.313 1.781L2 16s3.487-1.387 4.688-2.188c1 .7 2.319 1.188 3.719 1.688l.594-2c-1-.3-1.988-.688-2.688-1.188 1.1-1.1 1.9-2.506 2.5-4.406h2.188l.5-2H7.938L7 4H5zm-.188 4h3.781c-.4 1.3-.906 2-1.906 3-1.1-1-1.475-1.7-1.875-3z"/>
-</svg>
diff --git a/MLEB/UniversalLanguageSelector/resources/images/language-base20.svg b/MLEB/UniversalLanguageSelector/resources/images/language-base20.svg
new file mode 100644
index 00000000..4567fbba
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/resources/images/language-base20.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+ <title>
+ language
+ </title>
+ <path fill="#54595d" d="M20 18h-1.44a.61.61 0 01-.4-.12.81.81 0 01-.23-.31L17 15h-5l-1 2.54a.77.77 0 01-.22.3.59.59 0 01-.4.14H9l4.55-11.47h1.89zm-3.53-4.31L14.89 9.5a11.62 11.62 0 01-.39-1.24q-.09.37-.19.69l-.19.56-1.58 4.19zm-6.3-1.58a13.43 13.43 0 01-2.91-1.41 11.46 11.46 0 002.81-5.37H12V4H7.31a4 4 0 00-.2-.56C6.87 2.79 6.6 2 6.6 2l-1.47.5s.4.89.6 1.5H0v1.33h2.15A11.23 11.23 0 005 10.7a17.19 17.19 0 01-5 2.1q.56.82.87 1.38a23.28 23.28 0 005.22-2.51 15.64 15.64 0 003.56 1.77zM3.63 5.33h4.91a8.11 8.11 0 01-2.45 4.45 9.11 9.11 0 01-2.46-4.45z"/>
+</svg>
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.common.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.common.js
index 1a22a35a..e2072b79 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.common.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.common.js
@@ -32,7 +32,6 @@
mw.uls = mw.uls || {};
mw.uls.previousLanguagesStorageKey = 'uls-previous-languages';
- mw.uls.languageSettingsModules = [ 'ext.uls.inputsettings', 'ext.uls.displaysettings' ];
/**
* Change the language of wiki using API or set cookie and reload the page
@@ -40,68 +39,68 @@
* @param {string} language Language code.
*/
mw.uls.changeLanguage = function ( language ) {
- var deferred = new $.Deferred();
+ mw.uls.setLanguage( language ).then( function () {
+ location.reload();
+ } );
+ };
+
+ /**
+ * Change the language of wiki using API or set cookie.
+ *
+ * @param {string} language Language code.
+ * @return {jQuery.Promise}
+ */
+ mw.uls.setLanguage = function ( language ) {
+ var api = new mw.Api();
function changeLanguageAnon() {
if ( mw.config.get( 'wgULSAnonCanChangeLanguage' ) ) {
mw.cookie.set( 'language', language );
- location.reload();
}
+ return $.Deferred().resolve();
}
- deferred.done( function () {
- var api = new mw.Api();
+ // Track if event logging is enabled
+ mw.hook( 'mw.uls.interface.language.change' ).fire( language );
- if ( mw.user.isAnon() ) {
- changeLanguageAnon();
- return;
- }
+ if ( mw.user.isAnon() ) {
+ return changeLanguageAnon();
+ }
- // TODO We can avoid doing this query if we know global preferences are not enabled
- api.get( {
- action: 'query',
- meta: 'globalpreferences',
- gprprop: 'preferences'
- } ).then( function ( res ) {
- // Check whether global preferences are in use. If they are not, `res.query` is
- // an empty object. `res` will also contain warnings about unknown parameters.
- try {
- return !!res.query.globalpreferences.preferences.language;
- } catch ( e ) {
- return false;
- }
- } ).then( function ( hasGlobalPreference ) {
- var apiModule;
-
- if ( hasGlobalPreference ) {
- apiModule = 'globalpreferenceoverrides';
- mw.storage.set( 'uls-gp', '1' );
- } else {
- apiModule = 'options';
- mw.storage.remove( 'uls-gp' );
- }
+ // TODO We can avoid doing this query if we know global preferences are not enabled
+ return api.get( {
+ action: 'query',
+ meta: 'globalpreferences',
+ gprprop: 'preferences'
+ } ).then( function ( res ) {
+ // Check whether global preferences are in use. If they are not, `res.query` is
+ // an empty object. `res` will also contain warnings about unknown parameters.
+ try {
+ return !!res.query.globalpreferences.preferences.language;
+ } catch ( e ) {
+ return false;
+ }
+ } ).then( function ( hasGlobalPreference ) {
+ var apiModule;
+
+ if ( hasGlobalPreference ) {
+ apiModule = 'globalpreferenceoverrides';
+ mw.storage.set( 'uls-gp', '1' );
+ } else {
+ apiModule = 'options';
+ mw.storage.remove( 'uls-gp' );
+ }
- return api.postWithToken( 'csrf', {
- action: apiModule,
- optionname: 'language',
- optionvalue: language
- } );
- } ).done( function () {
- location.reload();
- } ).fail( function () {
- // Setting the option failed. Maybe the user has logged off.
- // Continue like anonymous user and set cookie.
- changeLanguageAnon();
+ return api.postWithToken( 'csrf', {
+ action: apiModule,
+ optionname: 'language',
+ optionvalue: language
} );
+ } ).catch( function () {
+ // Setting the option failed. Maybe the user has logged off.
+ // Continue like anonymous user and set cookie.
+ return changeLanguageAnon();
} );
-
- mw.hook( 'mw.uls.interface.language.change' ).fire( language, deferred );
-
- // Delay is zero if event logging is not enabled
- setTimeout( function () {
- deferred.resolve();
- }, mw.config.get( 'wgULSEventLogging' ) * 500 );
-
};
mw.uls.setPreviousLanguages = function ( previousLanguages ) {
@@ -113,6 +112,35 @@
} catch ( e ) {}
};
+ /**
+ * Normalize a language code for ULS usage.
+ *
+ * MediaWiki language codes (especially on WMF sites) are inconsistent
+ * with ULS codes. We need to use ULS codes to access the proper data.
+ *
+ * @param {string} code
+ * @return {string} Normalized language code
+ */
+ mw.uls.convertMediaWikiLanguageCodeToULS = function ( code ) {
+ code = code.toLowerCase();
+ return $.uls.data.isRedirect( code ) || code;
+ };
+
+ /**
+ * @param {Element[]} nodes to parse
+ * @return {Object} that maps language codes to the corresponding DOM elements
+ */
+ mw.uls.getInterlanguageListFromNodes = function ( nodes ) {
+ var interlanguageList = {};
+
+ Array.prototype.forEach.call( nodes, function ( el ) {
+ var langCode = mw.uls.convertMediaWikiLanguageCodeToULS( el.lang );
+ interlanguageList[ langCode ] = el;
+ } );
+
+ return interlanguageList;
+ };
+
mw.uls.getPreviousLanguages = function () {
var previousLanguages = [];
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.compactlinks.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.compactlinks.js
index 61d763ff..72038c78 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.compactlinks.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.compactlinks.js
@@ -45,20 +45,6 @@
}
/**
- * Normalize a language code for ULS usage.
- *
- * MediaWiki language codes (especially on WMF sites) are inconsistent
- * with ULS codes. We need to use ULS codes to access the proper data.
- *
- * @param {string} code
- * @return {string} Normalized language code
- */
- function convertMediaWikiLanguageCodeToULS( code ) {
- code = code.toLowerCase();
- return $.uls.data.isRedirect( code ) || code;
- }
-
- /**
* Get user-defined assistant languages on wikis with Translate extension.
*
* Where available, they're languages deemed useful by the user.
@@ -96,7 +82,7 @@
}
/**
- * Get site-specific highlighted languags. Mostly used on Wikimedia sites.
+ * Get site-specific highlighted languages. Mostly used on Wikimedia sites.
*
* @return {string[]|undefined} Language codes
*/
@@ -144,7 +130,9 @@
* @class
* @constructor
* @param {HTMLElement} listElement Interlanguage list element
- * @param {Object} options
+ * @param {Object} [options]
+ * @param {number} [options.max] maximum number of languages to show
+ * in the compacted list. This defaults to DEFAULT_LIST_SIZE.
*/
function CompactInterlanguageList( listElement, options ) {
this.listElement = listElement;
@@ -154,7 +142,9 @@
* @private
* @property {Object} interlanguageList
*/
- this.interlanguageList = null;
+ this.interlanguageList = mw.uls.getInterlanguageListFromNodes(
+ listElement.querySelectorAll( '.interlanguage-link-target' )
+ );
/**
* @private
@@ -174,7 +164,6 @@
CompactInterlanguageList.prototype.init = function () {
var max = this.options.max || DEFAULT_LIST_SIZE;
- this.interlanguageList = this.getInterlanguageList();
this.listSize = Object.keys( this.interlanguageList ).length;
if ( this.listSize <= max ) {
@@ -189,7 +178,6 @@
this.compactList = this.getCompactList();
this.hideOriginal();
this.render();
- this.listen();
};
/**
@@ -208,122 +196,6 @@
};
/**
- * Attaches the actual selector to the trigger.
- *
- * @param {jQuery} $trigger Element to use as trigger.
- */
- CompactInterlanguageList.prototype.createSelector = function ( $trigger ) {
- var languageCode,
- languages = Object.keys( this.interlanguageList ),
- self = this,
- ulsLanguageList = {};
-
- for ( languageCode in this.interlanguageList ) {
- ulsLanguageList[ languageCode ] = this.interlanguageList[ languageCode ].textContent;
- }
-
- // Attach ULS to the trigger
- $trigger.uls( {
- onReady: function () {
- this.$menu.addClass( 'interlanguage-uls-menu' );
- },
- /**
- * Language selection handler
- *
- * @param {string} language language code
- * @param {Object} event jQuery event object
- */
- onSelect: function ( language, event ) {
- self.$trigger.removeClass( 'selector-open' );
- mw.uls.addPreviousLanguage( language );
-
- // Switch the current tab to the new language,
- // unless it was Ctrl-click or Command-click
- if ( !event.metaKey && !event.shiftKey ) {
- location.href = self.interlanguageList[ language ].href;
- }
- },
- onVisible: function () {
- var offset, height, width, triangleWidth;
- // The panel is positioned carefully so that our pointy triangle,
- // which is implemented as a square box rotated 45 degrees with
- // rotation origin in the middle. See the corresponding style file.
-
- // These are for the trigger
- offset = $trigger.offset();
- width = $trigger.outerWidth();
- height = $trigger.outerHeight();
-
- // Triangle width is: who knows now, but this still looks fine.
- triangleWidth = 12;
-
- if ( offset.left > $( window ).width() / 2 ) {
- this.left = offset.left - this.$menu.outerWidth() - triangleWidth;
- this.$menu.removeClass( 'selector-left' ).addClass( 'selector-right' );
- } else {
- this.left = offset.left + width + triangleWidth;
- this.$menu.removeClass( 'selector-right' ).addClass( 'selector-left' );
- }
- // Offset from the middle of the trigger
- this.top = offset.top + ( height / 2 ) - 27;
-
- this.$menu.css( {
- left: this.left,
- top: this.top
- } );
- $trigger.addClass( 'selector-open' );
- },
- languageDecorator: function ( $languageLink, language ) {
- var element = self.interlanguageList[ language ];
- // Set href, text, and tooltip exactly same as what was in
- // interlanguage link. The ULS autonym might be different in some
- // cases like sr. In ULS it is "српски", while in interlanguage links
- // it is "српски / srpski"
- $languageLink
- .prop( {
- href: element.href,
- title: element.title
- } )
- .text( element.textContent );
-
- // This code is to support badges used in Wikimedia
- // eslint-disable-next-line mediawiki/class-doc
- $languageLink.parent().addClass( element.parentNode.className );
- },
- onCancel: function () {
- $trigger.removeClass( 'selector-open' );
- },
- languages: ulsLanguageList,
- ulsPurpose: 'compact-language-links',
- // Show common languages
- quickList: self.getCommonLanguages( languages ),
- noResultsTemplate: function () {
- var $defaultTemplate = $.fn.lcd.defaults.noResultsTemplate.call( this );
- // Customize the message
- $defaultTemplate
- .find( '.uls-no-results-found-title' )
- .data( 'i18n', 'ext-uls-compact-no-results' );
- return $defaultTemplate;
- }
- } );
- };
-
- /**
- * Bind to event handlers and listen for events
- */
- CompactInterlanguageList.prototype.listen = function () {
- var self = this;
-
- this.$trigger.one( 'click', function () {
- // Load the ULS now.
- mw.loader.using( 'ext.uls.mediawiki' ).then( function () {
- self.createSelector( self.$trigger );
- self.$trigger.trigger( 'click' );
- } );
- } );
- };
-
- /**
* Get the compacted interlanguage list as associative array
*
* @return {Object}
@@ -364,8 +236,8 @@
getBabelLanguages,
getSitePicks,
getCommonLanguages,
- this.getLangsInText,
- this.getLangsWithBadges,
+ this.getLangsInText.bind( this ),
+ this.getLangsWithBadges.bind( this ),
getExtraCommonLanguages,
getFinalFallback
];
@@ -411,7 +283,7 @@
CompactInterlanguageList.prototype.getLangsInText = function () {
var languagesInText = [];
Array.prototype.forEach.call( document.querySelectorAll( '#mw-content-text [lang]' ), function ( el ) {
- var lang = convertMediaWikiLanguageCodeToULS( el.lang );
+ var lang = mw.uls.convertMediaWikiLanguageCodeToULS( el.lang );
if ( languagesInText.indexOf( lang ) === -1 ) {
languagesInText.push( lang );
}
@@ -428,49 +300,14 @@
*/
CompactInterlanguageList.prototype.getLangsWithBadges = function () {
return Array.prototype.map.call(
- document.querySelectorAll( '#p-lang [class*="badge"]' ),
+ this.listElement.querySelectorAll( '[class*="badge"] a.interlanguage-link-target' ),
function ( el ) {
- return convertMediaWikiLanguageCodeToULS(
- el.querySelector( '.interlanguage-link-target' ).lang
- );
+ return mw.uls.convertMediaWikiLanguageCodeToULS( el.lang );
}
);
};
/**
- * Get the list of languages links.
- *
- * @return {Object} Map of language codes to elements.
- */
- CompactInterlanguageList.prototype.getInterlanguageList = function () {
- var interlanguageList = {};
-
- Array.prototype.forEach.call( this.listElement.querySelectorAll( '.interlanguage-link-target' ), function ( el ) {
- var langCode = convertMediaWikiLanguageCodeToULS( el.lang );
- interlanguageList[ langCode ] = el;
- } );
-
- return interlanguageList;
- };
-
- /**
- * Get common languages - the most probable languages predicted by ULS.
- *
- * @param {string[]} languages Language codes
- * @return {string[]} List of all common language codes
- */
- CompactInterlanguageList.prototype.getCommonLanguages = function ( languages ) {
- if ( this.commonInterlanguageList === null ) {
- this.commonInterlanguageList = mw.uls.getFrequentLanguageList()
- .filter( function ( language ) {
- return languages.indexOf( language ) >= 0;
- } );
- }
-
- return this.commonInterlanguageList;
- };
-
- /**
* Hide languages in the interlanguage list.
*
* The most relevant ones are unhidden in #render.
@@ -484,10 +321,13 @@
};
/**
- * Add the trigger at the bottom of the language list
+ * Add the trigger at the bottom of the language list.
+ *
+ * Click handler is setup in ext.uls.interface module.
*/
CompactInterlanguageList.prototype.addTrigger = function () {
var trigger = document.createElement( 'button' );
+ // TODO: Should we have a different class name where the CLS styles are attached?
trigger.className = 'mw-interlanguage-selector mw-ui-button';
trigger.title = mw.message( 'ext-uls-compact-link-info' ).plain();
// Use text() because the message needs {{PLURAL:}}
@@ -501,33 +341,30 @@
};
/**
- * Performance cost of calling createCompactList(), as of 2018-09-10.
+ * Performance cost of calling createCompactList(), as of 2021-02-10.
*
* Summary:
- * - DOM Queries: 5 + 1N
+ * - DOM Queries: 5
* * createCompactList (1 querySelector)
- * * getLangsWithBadges (1N querySelector, 1 querySelectorAll)
- * * getInterlanguageList (1 querySelectorAll)
+ * * CompactInterlanguageList constructor (1 querySelectorAll)
+ * * getLangsWithBadges (1 querySelectorAll)
* * getLangsInText (1 querySelectorAll)
* * hideOriginal (1 querySelectorAll)
* - DOM Writes: 1 + 2N
* * addTrigger (1 appendChild)
* * hideOriginal (1N Element.style)
- * * render (1N Element.style)
+ * * render (1N Element.style) // N defaults to 9
* - Misc: 1
* * addTrigger (1 mw.Message#parser)
*/
function createCompactList() {
var listElement, compactList;
- listElement = document.querySelector( '#p-lang ul' );
+ listElement = document.querySelector( '.mw-portlet-lang ul, #p-lang ul' );
if ( !listElement ) {
- // Not all namespaces/pages/actions have #p-lang.
+ // Not all namespaces will have a list of languages.
return;
}
- compactList = new CompactInterlanguageList( listElement, {
- // Compact the list to this size
- max: 9
- } );
+ compactList = new CompactInterlanguageList( listElement );
compactList.init();
}
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.displaysettings.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.displaysettings.js
index 9a1feab8..3e532bac 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.displaysettings.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.displaysettings.js
@@ -110,6 +110,7 @@
this.$webfonts = null;
this.$parent = $parent;
this.savedRegistry = $.extend( true, {}, mw.webfonts.preferences );
+ this.dirty = false;
}
DisplaySettings.prototype = {
@@ -117,11 +118,36 @@
constructor: DisplaySettings,
/**
+ * Loads the webfonts module sets the `webfonts` property when its safe to do so
+ */
+ setupWebFonts: function () {
+ var d = $.Deferred();
+ mw.loader.using( [ 'ext.uls.webfonts.fonts' ] ).then( function () {
+ if ( this.isWebFontsEnabled ) {
+ mw.webfonts.setup();
+ }
+
+ // Allow the webfonts library to finish loading (hack)
+ setTimeout( function () {
+ this.$webfonts = $( document.body ).data( 'webfonts' );
+ d.resolve();
+ }.bind( this ), 1 );
+ }.bind( this ) );
+ return d;
+ },
+ /**
* Render the module into a given target
*/
render: function () {
+ this.setupWebFonts().then( function () {
+ this.renderAfterDependenciesLoaded();
+ }.bind( this ) );
+ },
+ /**
+ * Render the module into a given target after all
+ */
+ renderAfterDependenciesLoaded: function () {
this.$parent.$settingsPanel.empty();
- this.$webfonts = $( document.body ).data( 'webfonts' );
this.$parent.$settingsPanel.append( this.$template );
this.prepareLanguages();
this.prepareUIFonts();
@@ -132,7 +158,6 @@
// might not be.
this.preview( this.uiLanguage );
this.listen();
- this.dirty = false;
},
prepareWebfontsCheckbox: function () {
@@ -182,30 +207,14 @@
new mw.Api().parse( $.i18n( 'ext-uls-display-settings-anon-log-in-cta' ) )
.done( function ( parsedCta ) {
- var deferred = new $.Deferred();
-
- $loginCta.html( parsedCta ); // The parsed CTA is HTML
- $loginCta.find( 'a' ).on( 'click', function ( event ) {
- event.preventDefault();
- // Because browsers navigate away when clicking a link,
- // we are overriding the normal click behavior to allow
- // the event be logged first - currently there is no
- // local queue for events. Since the hook system does not
- // allow returning values, we have this ugly hack
- // for event logging to delay the page loading if event logging
- // is enabled. The promise is passed to the hook, so that
- // if event logging is enabled, in can resole the promise
- // immediately to avoid extra delays.
- deferred.done( function () {
- location.href = event.target.href;
- } );
-
- mw.hook( 'mw.uls.login.click' ).fire( deferred );
-
- // Delay is zero if event logging is not enabled
- setTimeout( function () {
- deferred.resolve();
- }, mw.config.get( 'wgULSEventLogging' ) * 500 );
+ // The parsed CTA is HTML
+ $loginCta.html( parsedCta );
+ $loginCta.find( 'a' ).on( 'click', function () {
+ // If EventLogging is installed and enabled for ULS, give it a
+ // chance to log this event. There is no promise provided and in
+ // most browsers this will use the Beacon API in the background.
+ // In older browsers, this event will likely get lost.
+ mw.hook( 'mw.uls.login.click' );
} );
} );
@@ -293,8 +302,7 @@
$languages.append( $moreLanguagesButton );
// Show the long language list to select a language for display settings
$moreLanguagesButton.uls( {
- left: displaySettings.$parent.left,
- top: displaySettings.$parent.top,
+ onPosition: this.$parent.position.bind( this.$parent ),
onReady: function () {
var $wrap,
uls = this,
@@ -319,8 +327,6 @@
uls.$menu.toggleClass( 'selector-right', displaySettings.$parent.$window.hasClass( 'selector-right' ) );
},
onVisible: function () {
- var $parent;
-
this.$menu.find( '.uls-languagefilter' )
.prop( 'placeholder', $.i18n( 'ext-uls-display-settings-ui-language' ) );
@@ -331,15 +337,6 @@
return;
}
- $parent = $( '#language-settings-dialog' );
-
- // Re-position the element according to the window that called it
- if ( parseInt( $parent.css( 'left' ), 10 ) ) {
- this.$menu.css( 'left', $parent.css( 'left' ) );
- }
- if ( parseInt( $parent.css( 'top' ), 10 ) ) {
- this.$menu.css( 'top', $parent.css( 'top' ) );
- }
// If the ULS is shown in the sidebar,
// add a caret pointing to the icon
// eslint-disable-next-line no-jquery/no-class-state
@@ -528,7 +525,7 @@
*/
markDirty: function () {
this.dirty = true;
- this.$parent.$window.find( 'button.uls-settings-apply' ).prop( 'disabled', false );
+ this.$parent.enableApplyButton();
},
/**
@@ -546,25 +543,18 @@
displaySettings.markDirty();
if ( this.checked ) {
- mw.loader.using( 'ext.uls.webfonts.fonts', function () {
- mw.webfonts.setup();
-
- // Allow the webfonts library to finish loading
- setTimeout( function () {
- displaySettings.$webfonts = $( document.body ).data( 'webfonts' );
-
- mw.webfonts.preferences.enable();
+ displaySettings.setupWebFonts().then( function () {
+ mw.webfonts.preferences.enable();
- displaySettings.prepareContentFonts();
- displaySettings.prepareUIFonts();
+ displaySettings.prepareContentFonts();
+ displaySettings.prepareUIFonts();
- displaySettings.i18n();
- // eslint-disable-next-line no-jquery/no-sizzle
- displaySettings.$webfonts.apply( $uiFontSelector.find( 'option:selected' ) );
- displaySettings.$webfonts.refresh();
+ displaySettings.i18n();
+ // eslint-disable-next-line no-jquery/no-sizzle
+ displaySettings.$webfonts.apply( $uiFontSelector.find( 'option:selected' ) );
+ displaySettings.$webfonts.refresh();
- $fontSelectors.removeClass( 'hide' );
- }, 1 );
+ $fontSelectors.removeClass( 'hide' );
} );
} else {
$fontSelectors.addClass( 'hide' );
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.eventlogger.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.eventlogger.js
deleted file mode 100644
index a5f4a0be..00000000
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.eventlogger.js
+++ /dev/null
@@ -1,228 +0,0 @@
-/*!
- * ULS Event logger
- *
- * See https://meta.wikimedia.org/wiki/Schema:UniversalLanguageSelector
- *
- * @private
- * @since 2013.08
- *
- * Copyright (C) 2012-2013 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
- * Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
- * contributors. See CREDITS for a list.
- *
- * UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
- * have to do anything special to choose one license or the other and you don't
- * have to notify anyone which license you are using. You are free to use
- * UniversalLanguageSelector in commercial projects as long as the copyright
- * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
- *
- * @file
- * @ingroup Extensions
- * @licence GNU General Public Licence 2.0 or later
- * @licence MIT License
- */
-
-( function () {
- 'use strict';
-
- /**
- * Try to emit an EventLogging event with schema 'UniversalLanguageSelector'.
- *
- * If EventLogging is not installed, this simply does nothing.
- *
- * @param {Object} event Event action and optional fields
- */
- function log( event ) {
- event = $.extend( {
- version: 1,
- token: mw.user.id(),
- contentLanguage: mw.config.get( 'wgContentLanguage' ),
- interfaceLanguage: mw.config.get( 'wgUserLanguage' )
- }, event );
-
- mw.track( 'event.UniversalLanguageSelector', event );
- }
-
- /**
- * Log language settings open
- *
- * @param {string} context Where it was opened from
- */
- function ulsSettingsOpen( context ) {
- log( {
- action: 'settings-open',
- context: context
- } );
- }
-
- /**
- * Log language revert
- *
- * @param {jQuery.Deferred} deferred
- */
- function ulsLanguageRevert( deferred ) {
- log( { action: 'ui-lang-revert' } );
- deferred.resolve();
- }
-
- /**
- * Log IME disabling
- *
- * @param {string} context Where the setting was changed.
- */
- function disableIME( context ) {
- log( { action: 'ime-disable', context: context } );
- }
-
- /**
- * Log IME enabling
- *
- * @param {string} context Where the setting was changed.
- */
- function enableIME( context ) {
- log( { action: 'ime-enable', context: context } );
- }
-
- /**
- * Log IME change
- *
- * @param {string} inputMethod
- */
- function changeIME( inputMethod ) {
- log( {
- action: 'ime-change',
- inputMethod: inputMethod
- } );
- }
-
- /**
- * Log login link click in display settings.
- *
- * @param {jQuery.Deferred} deferred
- */
- function loginClick( deferred ) {
- log( { action: 'login-click' } );
- deferred.resolve();
- }
-
- /**
- * Log when "More languages" item in IME menu is clicked.
- */
- function imeMoreLanguages() {
- log( {
- action: 'more-languages-access',
- context: 'ime'
- } );
- }
-
- /**
- * Log interface language change
- *
- * @param {string} language language code
- * @param {jQuery.Deferred} deferred
- */
- function interfaceLanguageChange( language, deferred ) {
- var logParams = {
- action: 'language-change',
- context: 'interface',
- interfaceLanguage: language
- };
-
- log( logParams );
- deferred.resolve();
- }
-
- /**
- * More languages in display settings is clicked
- */
- function interfaceMoreLanguages() {
- log( {
- action: 'more-languages-access',
- context: 'interface'
- } );
- }
-
- /**
- * Log font preference changes
- *
- * @param {string} context Either 'interface' or 'content'
- * @param {string} language
- * @param {string} font
- */
- function fontChange( context, language, font ) {
- var logParams = {
- action: 'font-change',
- context: context
- };
-
- if ( context === 'interface' ) {
- logParams.interfaceFont = font;
- // Override in case the user changed the ui language but hasn't applied it yet
- logParams.interfaceLanguage = language;
- } else {
- logParams.contentFont = font;
- }
-
- log( logParams );
- }
-
- /**
- * Log webfonts disabling
- *
- * @param {string} context Where the setting was changed.
- */
- function disableWebfonts( context ) {
- log( { action: 'webfonts-disable', context: context } );
- }
-
- /**
- * Log webfonts enabling
- *
- * @param {string} context Where the setting was changed.
- */
- function enableWebfonts( context ) {
- log( { action: 'webfonts-enable', context: context } );
- }
-
- /**
- * Log search strings which produce no search results.
- *
- * @param {jQuery.event} event The original event
- * @param {Object} data Information about the failed search
- */
- function noSearchResults( event, data ) {
- log( {
- action: 'no-search-results',
- context: data.query,
- ulsPurpose: data.ulsPurpose,
- title: mw.config.get( 'wgPageName' )
- } );
- }
-
- /**
- * Start listening for event logging
- */
- function listen() {
- // Register handlers for event logging triggers
- mw.hook( 'mw.uls.settings.open' ).add( ulsSettingsOpen );
- mw.hook( 'mw.uls.language.revert' ).add( ulsLanguageRevert );
- mw.hook( 'mw.uls.ime.enable' ).add( enableIME );
- mw.hook( 'mw.uls.ime.disable' ).add( disableIME );
- mw.hook( 'mw.uls.ime.change' ).add( changeIME );
- mw.hook( 'mw.uls.login.click' ).add( loginClick );
- mw.hook( 'mw.uls.ime.morelanguages' ).add( imeMoreLanguages );
- mw.hook( 'mw.uls.interface.morelanguages' ).add( interfaceMoreLanguages );
- mw.hook( 'mw.uls.interface.language.change' ).add( interfaceLanguageChange );
- mw.hook( 'mw.uls.font.change' ).add( fontChange );
- mw.hook( 'mw.uls.webfonts.enable' ).add( enableWebfonts );
- mw.hook( 'mw.uls.webfonts.disable' ).add( disableWebfonts );
-
- $( document.body ).on(
- 'noresults.uls',
- '.uls-menu .uls-languagefilter',
- noSearchResults
- );
- }
-
- listen();
-}() );
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.i18n.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.i18n.js
index f1228e60..4123fd64 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.i18n.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.i18n.js
@@ -31,7 +31,7 @@
$.i18n.fallbacks = {};
/**
- * Load localization messags for a locale to the jquery.i18n
+ * Load localization messages for a locale to the jquery.i18n
* messagestore.
* Also called by RL module ResourceLoaderULSJsonMessageModule
*
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.ime.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.ime.js
index e0f50283..050d92bd 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.ime.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.ime.js
@@ -20,13 +20,15 @@
( function () {
'use strict';
- var mwImeRulesPath, inputSelector, inputPreferences, ulsIMEPreferences, customHelpLink;
+ var mwImeRulesPath, inputSelector, inputPreferences, ulsIMEPreferences, customHelpLink,
+ getULSPreferences = require( 'ext.uls.preferences' ),
+ languageSettingsModules = [ 'ext.uls.displaysettings' ];
mwImeRulesPath = mw.config.get( 'wgExtensionAssetsPath' ) +
'/UniversalLanguageSelector/lib/jquery.ime/';
inputSelector = 'input:not([type]), input[type=text], input[type=search], textarea, [contenteditable]';
- inputPreferences = mw.uls.preferences();
+ inputPreferences = getULSPreferences();
mw.ime = mw.ime || {};
@@ -73,7 +75,7 @@
// we don't want to save isDirty field.
this.registry.isDirty = undefined;
// get updated copy of preferences
- inputPreferences = mw.uls.preferences();
+ inputPreferences = getULSPreferences();
inputPreferences.set( 'ime', this.registry );
inputPreferences.save( callback );
// reset the dirty bit
@@ -82,6 +84,19 @@
load: function () {
this.registry = inputPreferences.get( 'ime' ) || this.registry;
+ // Some validation in case the stored preferences are corrupt
+ if ( typeof this.registry.language !== 'string' ) {
+ this.registry.language = null;
+ }
+ if ( !Array.isArray( this.registry.previousLanguages ) ) {
+ this.registry.previousLanguages = [];
+ }
+ if ( !Array.isArray( this.registry.previousInputMethods ) ) {
+ this.registry.previousInputMethods = [];
+ }
+ if ( !$.isPlainObject( this.registry.imes ) ) {
+ this.registry.imes = {};
+ }
},
disable: function () {
@@ -145,7 +160,7 @@
// Apparently we depend on some styles which are loaded with
// these modules. This needs refactoring.
- mw.loader.using( mw.uls.languageSettingsModules, function () {
+ mw.loader.using( languageSettingsModules, function () {
$moreSettingsLink.languagesettings( {
defaultModule: 'input',
onClose: function () {
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.inputsettings.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.inputsettings.js
index 099e2a1a..b4f69726 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.inputsettings.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.inputsettings.js
@@ -64,7 +64,6 @@
this.$template = $( template );
this.uiLanguage = this.getInterfaceLanguage();
this.contentLanguage = this.getContentLanguage();
- this.$imes = null;
this.$parent = $parent;
// ime system is lazy loaded, make sure it is initialized
mw.ime.init();
@@ -84,7 +83,6 @@
this.dirty = false;
this.$parent.$settingsPanel.empty();
- this.$imes = $( document.body ).data( 'ime' );
this.$parent.$settingsPanel.append( this.$template );
$enabledOnly = this.$template.find( '.enabled-only' );
if ( $.ime.preferences.isEnabled() ) {
@@ -111,7 +109,7 @@
*/
markDirty: function () {
this.dirty = true;
- this.$parent.$window.find( 'button.uls-settings-apply' ).prop( 'disabled', false );
+ this.$parent.enableApplyButton();
},
prepareInputmethods: function ( language ) {
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.interface.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.interface.js
index 9004b4d5..1518afee 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.interface.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.interface.js
@@ -19,6 +19,8 @@
( function () {
'use strict';
+ var languageSettingsModules = [ 'ext.uls.displaysettings' ],
+ launchULS = require( './ext.uls.launch.js' );
/**
* Construct the display settings link
@@ -51,6 +53,20 @@
}
/**
+ * For Vector: Check whether the classic Vector or "new" vector ([[mw:Desktop_improvements]]) is enabled based
+ * on the contents of the page.
+ * For other skins, check if ULSDisplayInputAndDisplaySettingsInInterlanguage contains the current skin.
+ *
+ * @return {bool}
+ */
+ function isUsingStandaloneLanguageButton() {
+ var skin = mw.config.get( 'skin' );
+ // special handling for Vector. This can be removed when Vector is split into 2 separate skins.
+ return skin === 'vector' ? $( '#p-lang-btn' ).length > 0 :
+ mw.config.get( 'wgULSDisplaySettingsInInterlanguage' );
+ }
+
+ /**
* Add display settings link to the settings bar in ULS
*
* @param {Object} uls The ULS object
@@ -59,27 +75,14 @@
var $displaySettings = displaySettings();
uls.$menu.find( '#uls-settings-block' ).append( $displaySettings );
-
// Initialize the trigger
$displaySettings.one( 'click', function () {
- var displaySettingsOptions = {
- defaultModule: 'display'
- },
- ulsPosition = mw.config.get( 'wgULSPosition' ),
- anonMode = ( mw.user.isAnon() &&
- !mw.config.get( 'wgULSAnonCanChangeLanguage' ) );
-
- // If the ULS trigger is shown in the top personal menu,
- // closing the display settings must show the main ULS
- // languages list, unless we are in anon mode and thus
- // cannot show the language list
- if ( ulsPosition === 'personal' && !anonMode ) {
- displaySettingsOptions.onClose = function () {
- uls.show();
- };
- }
- $.extend( displaySettingsOptions, uls.position() );
- $displaySettings.languagesettings( displaySettingsOptions ).trigger( 'click' );
+ $displaySettings.languagesettings( {
+ defaultModule: 'display',
+ onClose: uls.show.bind( uls ),
+ onPosition: uls.position.bind( uls ),
+ onVisible: uls.hide.bind( uls )
+ } ).trigger( 'click' );
} );
}
@@ -92,20 +95,14 @@
var $inputSettings = inputSettings();
uls.$menu.find( '#uls-settings-block' ).append( $inputSettings );
-
// Initialize the trigger
$inputSettings.one( 'click', function () {
- var position = uls.position();
-
$inputSettings.languagesettings( {
defaultModule: 'input',
- onClose: function () {
- uls.show();
- },
- top: position.top,
- left: position.left
+ onClose: uls.show.bind( uls ),
+ onPosition: uls.position.bind( uls ),
+ onVisible: uls.hide.bind( uls )
} ).trigger( 'click' );
-
} );
}
@@ -125,9 +122,20 @@
ulsPosition = mw.config.get( 'wgULSPosition' );
$ulsTrigger = ( ulsPosition === 'interlanguage' ) ?
- $( '.uls-settings-trigger' ) :
+ $( '.uls-settings-trigger, .mw-interlanguage-selector' ) :
$( '.uls-trigger' );
+ // Fallback if no entry point is present
+ if ( !$ulsTrigger.length ) {
+ $ulsTrigger = $( '#pt-preferences' );
+ }
+
+ // Skip tooltip if there is no element to attach the tooltip to.
+ // It will cause errors otherwise.
+ if ( !$ulsTrigger.length ) {
+ return;
+ }
+
function hideTipsy() {
ulsPopup.toggle( false );
}
@@ -143,28 +151,13 @@
clearTimeout( tipsyTimer );
} ).on( 'mouseout', function () {
tipsyTimer = setTimeout( hideTipsy, timeout );
- } );
-
- // hide the tooltip when clicked on it
- $( '.uls-tipsy' ).on( 'click', hideTipsy );
+ } ).on( 'click', hideTipsy );
tipsyTimer = setTimeout( hideTipsy, timeout );
}
- // remove any existing popups
- if ( ulsPopup ) {
- ulsPopup.$element.remove();
- }
if ( ulsPosition === 'interlanguage' ) {
- if ( $ulsTrigger.offset().left > $( window ).width() / 2 ) {
- ulsPopupPosition = 'before';
- } else {
- ulsPopupPosition = 'after';
- }
- // Reverse for RTL
- if ( $( document.documentElement ).prop( 'dir' ) === 'rtl' ) {
- ulsPopupPosition = ( ulsPopupPosition === 'after' ) ? 'before' : 'after';
- }
+ ulsPopupPosition = 'after';
} else {
ulsPopupPosition = 'below';
}
@@ -191,19 +184,14 @@
dir: 'auto'
} )
.on( 'click', function ( event ) {
- var deferred = $.Deferred();
-
event.preventDefault();
- deferred.done( function () {
- mw.uls.changeLanguage( event.target.lang );
- } );
- mw.hook( 'mw.uls.language.revert' ).fire( deferred );
+ // Track if event logging is enabled
+ mw.hook( 'mw.uls.language.revert' ).fire();
- // Delay is zero if event logging is not enabled
- setTimeout( function () {
- deferred.resolve();
- }, mw.config.get( 'wgULSEventLogging' ) * 500 );
+ mw.loader.using( [ 'ext.uls.common' ] ).then( function () {
+ mw.uls.changeLanguage( event.target.lang );
+ } );
} );
if ( mw.storage.get( 'uls-gp' ) === '1' ) {
@@ -236,9 +224,23 @@
} );
}
+ /**
+ * Adds display and input settings to the ULS dialog after loading their code.
+ *
+ * @param {ULS} uls instance
+ */
+ function loadDisplayAndInputSettings( uls ) {
+ return mw.loader.using( languageSettingsModules ).then( function () {
+ addDisplaySettings( uls );
+ addInputSettings( uls );
+ } );
+ }
+
function initInterface() {
var $pLang,
clickHandler,
+ // T273928: No change to the heading should be made in modern Vector when the language button is present
+ isButton = isUsingStandaloneLanguageButton(),
$ulsTrigger = $( '.uls-trigger' ),
anonMode = ( mw.user.isAnon() &&
!mw.config.get( 'wgULSAnonCanChangeLanguage' ) ),
@@ -246,7 +248,7 @@
if ( ulsPosition === 'interlanguage' ) {
// TODO: Refactor this block
- // The interlanguage links section
+ // The interlanguage links section.
$pLang = $( '#p-lang' );
// Add an element near the interlanguage links header
$ulsTrigger = $( '<button>' )
@@ -256,7 +258,7 @@
// Take care of any other elements with this class.
$ulsTrigger = $( '.uls-settings-trigger' );
- if ( !$pLang.find( 'div ul' ).children().length ) {
+ if ( !$pLang.find( 'div ul' ).children().length && isButton ) {
// Replace the title of the interlanguage links area
// if there are no interlanguage links
$pLang.find( 'h3' )
@@ -282,37 +284,38 @@
// Initialize the Language settings window
languageSettingsOptions = {
defaultModule: 'display',
- onVisible: function () {
- var caretRadius,
+ onPosition: function () {
+ var caretRadius, top, left,
ulsTriggerHeight = this.$element.height(),
ulsTriggerWidth = this.$element[ 0 ].offsetWidth,
ulsTriggerOffset = this.$element.offset();
- this.$window.addClass( 'callout' );
-
// Same as border width in mixins.less, or near enough
caretRadius = 12;
if ( ulsTriggerOffset.left > $( window ).width() / 2 ) {
- this.left = ulsTriggerOffset.left - this.$window.width() - caretRadius;
+ left = ulsTriggerOffset.left - this.$window.width() - caretRadius;
this.$window.removeClass( 'selector-left' ).addClass( 'selector-right' );
} else {
- this.left = ulsTriggerOffset.left + ulsTriggerWidth + caretRadius;
+ left = ulsTriggerOffset.left + ulsTriggerWidth + caretRadius;
this.$window.removeClass( 'selector-right' ).addClass( 'selector-left' );
}
// The top of the dialog is aligned in relation to
// the middle of the trigger, so that middle of the
// caret aligns with it. 16 is trigger icon height in pixels
- this.top = ulsTriggerOffset.top +
+ top = ulsTriggerOffset.top +
( ulsTriggerHeight / 2 ) -
( caretRadius + 16 );
- this.position();
+ return { top: top, left: left };
+ },
+ onVisible: function () {
+ this.$window.addClass( 'callout' );
}
};
- mw.loader.using( mw.uls.languageSettingsModules, function () {
+ mw.loader.using( languageSettingsModules, function () {
$ulsTrigger.languagesettings( languageSettingsOptions ).trigger( 'click' );
} );
@@ -329,7 +332,7 @@
mw.hook( 'mw.uls.settings.open' ).fire( eventParams && eventParams.source || 'personal' );
}
} else {
- mw.loader.using( mw.uls.languageSettingsModules, function () {
+ mw.loader.using( languageSettingsModules, function () {
$ulsTrigger.languagesettings();
$ulsTrigger.trigger( 'click', eventParams );
@@ -353,11 +356,7 @@
return mw.uls.getFrequentLanguageList();
},
onReady: function () {
- var uls = this;
- mw.loader.using( mw.uls.languageSettingsModules, function () {
- addDisplaySettings( uls );
- addInputSettings( uls );
- } );
+ loadDisplayAndInputSettings( this );
},
onSelect: function ( language ) {
mw.uls.changeLanguage( language );
@@ -427,7 +426,9 @@
mw.storage.set( 'uls-previous-language-code', currentLanguage );
mw.storage.set( 'uls-previous-language-autonym', currentAutonym );
// Store this language in a list of frequently used languages
- mw.uls.addPreviousLanguage( currentLanguage );
+ mw.loader.using( [ 'ext.uls.common' ] ).then( function () {
+ mw.uls.addPreviousLanguage( currentLanguage );
+ } );
}
}
@@ -444,10 +445,68 @@
} );
}
+ /**
+ * Load and open ULS for content language selection.
+ *
+ * This dialog is primarily for selecting the language of the content, but may also provide
+ * access to display and input settings if isUsingStandaloneLanguageButton() returns true.
+ *
+ * @param {jQuery.Event} ev
+ */
+ function loadContentLanguageSelector( ev ) {
+ var $target = $( ev.currentTarget );
+ ev.preventDefault();
+
+ mw.loader.using( 'ext.uls.mediawiki' ).then( function () {
+ var parent, languageNodes, standalone, uls;
+
+ parent = document.querySelectorAll( '.mw-portlet-lang, #p-lang' )[ 0 ];
+ languageNodes = parent ? parent.querySelectorAll( '.interlanguage-link-target' ) : [];
+ standalone = isUsingStandaloneLanguageButton();
+
+ // Setup click handler for ULS
+ launchULS(
+ $target,
+ mw.uls.getInterlanguageListFromNodes( languageNodes ),
+ // Using this as heuristic for now. May need to reconsider later. Enables
+ // behavior specific to compact language links.
+ !standalone
+ );
+
+ // Trigger the click handler to open ULS once ready
+ if ( standalone ) {
+ // Provide access to display and input settings if this entry point is the single point
+ // of access to all language settings.
+ uls = $target.data( 'uls' );
+ loadDisplayAndInputSettings( uls ).always( function () {
+ $target.trigger( 'click' );
+ } );
+ } else {
+ $target.trigger( 'click' );
+ }
+ } );
+ }
+
+ /** Setup lazy-loading for content language selector */
+ function initContentLanguageSelectorClickHandler() {
+ // FIXME: In Timeless ULS is embedded in a menu which stops event propagation
+ if ( $( '.sidebar-inner' ).length ) {
+ $( '.sidebar-inner #p-lang' )
+ .one( 'click', '.mw-interlanguage-selector', loadContentLanguageSelector );
+ } else {
+ // This button may be created by the new Vector skin, or ext.uls.compactlinks module
+ // if there are many languages. Warning: Both this module and ext.uls.compactlinks
+ // module may run simultaneously. Using event delegation to avoid race conditions where
+ // the trigger may be created after this code.
+ $( document ).one( 'click', '.mw-interlanguage-selector', loadContentLanguageSelector );
+ }
+ }
+
function init() {
initInterface();
initTooltip();
initIme();
+ initContentLanguageSelectorClickHandler();
}
// Early execute of init
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.languagesettings.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.languagesettings.js
index 467f361b..064dbff9 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.languagesettings.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.languagesettings.js
@@ -60,6 +60,7 @@
this.top = this.options.top;
this.modules = {};
this.$settingsPanel = this.$window.find( '#languagesettings-settings-panel' );
+ this.$applyButton = this.$window.find( '.uls-settings-apply' );
this.init();
this.listen();
}
@@ -78,7 +79,7 @@
this.$window.find( '#languagesettings-close, button.uls-settings-cancel' )
.on( 'click', mw.hook( 'mw.uls.settings.cancel' ).fire.bind( this ) );
- this.$window.find( 'button.uls-settings-apply' )
+ this.$applyButton
.on( 'click', mw.hook( 'mw.uls.settings.apply' ).fire.bind( this ) );
// Hide the window when clicked outside
$( document.documentElement ).on( 'click', this.hide.bind( this ) );
@@ -173,12 +174,16 @@
},
position: function () {
+ if ( this.options.onPosition ) {
+ return this.options.onPosition.call( this );
+ }
+
this.top = this.top || this.$element.offset().top + this.$element.outerHeight();
this.left = this.left || '25%';
- this.$window.css( {
+ return {
top: this.top,
left: this.left
- } );
+ };
},
i18n: function () {
@@ -186,7 +191,7 @@
},
show: function () {
- this.position();
+ this.$window.css( this.position() );
if ( !this.initialized ) {
this.render();
@@ -240,16 +245,14 @@
* false to unset the busy mode.
*/
setBusy: function ( busy ) {
- var $applyButton = this.$window.find( 'button.uls-settings-apply' );
-
if ( busy ) {
this.$window.addClass( 'waiting' );
- $applyButton
+ this.$applyButton
.text( $.i18n( 'ext-uls-language-settings-applying' ) )
.prop( 'disabled', true );
} else {
this.$window.removeClass( 'waiting' );
- $applyButton.text( $.i18n( 'ext-uls-language-settings-apply' ) );
+ this.$applyButton.text( $.i18n( 'ext-uls-language-settings-apply' ) );
}
},
@@ -282,8 +285,12 @@
}
},
+ enableApplyButton: function () {
+ this.$applyButton.prop( 'disabled', false );
+ },
+
disableApplyButton: function () {
- this.$window.find( 'button.uls-settings-apply' ).prop( 'disabled', true );
+ this.$applyButton.prop( 'disabled', true );
}
};
@@ -308,9 +315,10 @@
template: windowTemplate,
defaultModule: false, // Name of the default module
onClose: null, // An onClose event handler.
- top: null, // Top position of this window
- left: null, // Left position of this window
- onVisible: null // A callback that runs after the ULS panel becomes visible
+ top: null, // DEPRECATED: Top position of this window
+ left: null, // DEPRECATED: Left position of this window
+ onVisible: null, // A callback that runs after the ULS panel becomes visible
+ onPosition: null // A callback that allows positioning the dialog
};
$.fn.languagesettings.Constructor = LanguageSettings;
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.launch.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.launch.js
new file mode 100644
index 00000000..e2bfe9de
--- /dev/null
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.launch.js
@@ -0,0 +1,175 @@
+/**
+ * Setup code for content language selector dialog
+ */
+
+/* eslint-disable no-implicit-globals */
+var commonInterlanguageList = null;
+
+/**
+ * @param {string[]} languageCodes array of language codes available
+ * @return {Array} of languages filtered to those commonly used
+ */
+function filterForCommonLanguagesForUser( languageCodes ) {
+ if ( commonInterlanguageList === null ) {
+ commonInterlanguageList = mw.uls.getFrequentLanguageList()
+ .filter( function ( language ) {
+ return languageCodes.indexOf( language ) >= 0;
+ } );
+ }
+
+ return commonInterlanguageList;
+}
+
+/**
+ * @param {Object} languagesObject mapping language codes to DOMElements
+ * @return {Object} mapping language codes to the textContent of DOMElements
+ */
+function languageObjectTextContent( languagesObject ) {
+ var newLanguageObject = {};
+ Object.keys( languagesObject ).forEach( function ( langCode ) {
+ newLanguageObject[ langCode ] = languagesObject[ langCode ].textContent;
+ } );
+ return newLanguageObject;
+}
+
+/**
+ * Launches an instance of UniversalLanguageSelector for changing to another
+ * article language.
+ *
+ * @param {jQuery.Object} $trigger for opening ULS dialog
+ * @param {Object} languagesObject of the available languages, mapping code (string) to Element
+ * @param {boolean} forCLS Whether to enable compact language links specific behavior
+ */
+function launchULS( $trigger, languagesObject, forCLS ) {
+ var ulsConfig = {
+ /**
+ * Language selection handler
+ *
+ * @param {string} language language code
+ * @param {Object} event jQuery event object
+ */
+ onSelect: function ( language, event ) {
+ $trigger.removeClass( 'selector-open' );
+ mw.uls.addPreviousLanguage( language );
+
+ // Switch the current tab to the new language, unless it was
+ // {Ctrl,Shift,Command} activation on a link
+ if (
+ event.target instanceof HTMLAnchorElement &&
+ ( event.metaKey || event.shiftKey || event.ctrlKey )
+ ) {
+ return;
+ }
+ location.href = languagesObject[ language ].href;
+ },
+ onPosition: function () {
+ // Override the default positioning. See https://phabricator.wikimedia.org/T276248
+ // Default positioning of jquery.uls is middle of the screen under the trigger.
+ // This code aligns it under the trigger and to the trigger edge depending on which
+ // side of the page the trigger is - should work automatically for both LTR and RTL.
+ var offset, height, width;
+ // These are for the trigger.
+ offset = $trigger.offset();
+ width = $trigger.outerWidth();
+ height = $trigger.outerHeight();
+
+ if ( offset.left + ( width / 2 ) > $( window ).width() / 2 ) {
+ // Midpoint of the trigger is on the right side of the viewport.
+ return {
+ // Right edge of the dialog aligns with the right edge of the trigger.
+ right: $( window ).width() - ( offset.left + width ),
+ top: offset.top + height
+ };
+ } else {
+ // Midpoint of the trigger is on the left side of the viewport.
+ return {
+ // Left edge of the dialog aligns with the left edge of the trigger.
+ left: offset.left,
+ top: offset.top + height
+ };
+ }
+ },
+ onVisible: function () {
+ $trigger.addClass( 'selector-open' );
+ },
+ languageDecorator: function ( $languageLink, language ) {
+ var element = languagesObject[ language ];
+ // Set href, text, and tooltip exactly same as what was in
+ // interlanguage link. The ULS autonym might be different in some
+ // cases like sr. In ULS it is "српски", while in interlanguage links
+ // it is "српски / srpski"
+ $languageLink
+ .prop( {
+ href: element.href,
+ title: element.title
+ } )
+ .text( element.textContent );
+
+ // This code is to support badges used in Wikimedia
+ // eslint-disable-next-line mediawiki/class-doc
+ $languageLink.parent().addClass( element.parentNode.className );
+ },
+ onCancel: function () {
+ $trigger.removeClass( 'selector-open' );
+ },
+ languages: languageObjectTextContent( languagesObject ),
+ ulsPurpose: 'compact-language-links',
+ // Show common languages
+ quickList: filterForCommonLanguagesForUser(
+ Object.keys( languagesObject )
+ ),
+ noResultsTemplate: function () {
+ var $defaultTemplate = $.fn.lcd.defaults.noResultsTemplate.call( this );
+ // Customize the message
+ $defaultTemplate
+ .find( '.uls-no-results-found-title' )
+ .data( 'i18n', 'ext-uls-compact-no-results' );
+ return $defaultTemplate;
+ }
+ };
+
+ if ( forCLS ) {
+ // Styles for these classes are defined in the ext.uls.compactlinks module
+ ulsConfig.onReady = function () {
+ // This class enables the caret
+ this.$menu.addClass( 'interlanguage-uls-menu' );
+ };
+ ulsConfig.onPosition = function () {
+ // Compact language links specific positioning with a caret
+ var top, left, offset, height, width, triangleWidth;
+ // The panel is positioned carefully so that our pointy triangle,
+ // which is implemented as a square box rotated 45 degrees with
+ // rotation origin in the middle. See the corresponding style file.
+
+ // These are for the trigger
+ offset = $trigger.offset();
+ width = $trigger.outerWidth();
+ height = $trigger.outerHeight();
+
+ // Triangle width is: who knows now, but this still looks fine.
+ triangleWidth = 12;
+
+ // selector-{left,right} control which side the caret appears.
+ // It needs to match the positioning of the dialog.
+ if ( offset.left > $( window ).width() / 2 ) {
+ left = offset.left - this.$menu.outerWidth() - triangleWidth;
+ this.$menu.removeClass( 'selector-left' ).addClass( 'selector-right' );
+ } else {
+ left = offset.left + width + triangleWidth;
+ this.$menu.removeClass( 'selector-right' ).addClass( 'selector-left' );
+ }
+ // Offset from the middle of the trigger
+ top = offset.top + ( height / 2 ) - 27;
+
+ return {
+ left: left,
+ top: top
+ };
+ };
+ }
+
+ // Attach ULS behavior to the trigger. ULS will be shown only once it is clicked.
+ $trigger.uls( ulsConfig );
+}
+
+module.exports = launchULS;
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.preferences.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.preferences.js
index 0afc40b2..41f08108 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.preferences.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.preferences.js
@@ -21,51 +21,11 @@
( function () {
'use strict';
- var ULSPreferences;
-
- /**
- * Wrapper for localStorage, falls back to cookie
- * when localStorage not supported by browser.
- *
- * @return {Object}
- */
- function preferenceStore() {
-
- // If value is detected, set new or modify store
- return {
- /*
- * Set the value to the given key
- * @param {string} key
- * @param {Object} value value to be set
- */
- set: function ( key, value ) {
- // Convert object values to JSON
- if ( typeof value === 'object' ) {
- value = JSON.stringify( value );
- }
-
- try {
- localStorage.setItem( key, value );
- } catch ( e ) {}
- },
- /*
- * Returns the value of the given key
- * @param {string} key
- * @return {Object} value of the key
- */
- get: function ( key ) {
- var data;
-
- try {
- data = JSON.parse( localStorage.getItem( key ) );
- } catch ( e ) {}
-
- return data;
- }
- };
- }
+ var ULSPreferences, instance;
ULSPreferences = function () {
+ // This violates coding conventions for localstorage:
+ // https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript#Keys
this.preferenceName = 'uls-preferences';
this.username = mw.user.getName();
this.isAnon = mw.user.isAnon();
@@ -74,28 +34,19 @@
};
ULSPreferences.prototype = {
- /**
- * Initialize
- */
init: function () {
- var options;
-
if ( this.isAnon ) {
- this.preferences = preferenceStore().get( this.preferenceName );
+ this.preferences = mw.storage.getObject( this.preferenceName );
} else {
- options = mw.user.options.get( this.preferenceName );
- if ( !options ) {
- options = '{}';
- }
- // Try to parse JSON
try {
- this.preferences = JSON.parse( options );
+ this.preferences = JSON.parse( mw.user.options.get( this.preferenceName ) );
} catch ( e ) {
- this.preferences = {};
}
}
- this.preferences = this.preferences || {};
+ if ( !$.isPlainObject( this.preferences ) ) {
+ this.preferences = {};
+ }
},
/**
@@ -124,35 +75,29 @@
* @param {Function} callback
*/
save: function ( callback ) {
- var ulsPreferences = this;
+ var self = this;
callback = callback || function () {};
if ( this.isAnon ) {
// Anonymous user. Save preferences in local storage
- preferenceStore().set( this.preferenceName, this.preferences );
+ mw.storage.setObject( this.preferenceName, this.preferences );
callback.call( this, true );
} else {
// Logged in user. Use MW APIs to change preferences
new mw.Api().saveOption(
- ulsPreferences.preferenceName,
- JSON.stringify( ulsPreferences.preferences )
+ this.preferenceName,
+ JSON.stringify( this.preferences )
).done( function () {
- callback.call( this, true );
+ callback.call( self, true );
} ).fail( function () {
- callback.call( this, false );
+ callback.call( self, false );
} );
}
}
};
- mw.uls = mw.uls || {};
- mw.uls.preferences = function () {
- var data = $( document.body ).data( 'preferences' );
-
- if ( !data ) {
- $( document.body ).data( 'preferences', ( data = new ULSPreferences() ) );
- }
- return data;
+ module.exports = function () {
+ instance = instance || new ULSPreferences();
+ return instance;
};
-
}() );
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.setlang.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.setlang.js
index c26a01ee..3af7090a 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.setlang.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.setlang.js
@@ -1,5 +1,5 @@
/*!
- * Loaded when setlang query paramter is set on the page.
+ * Loaded when setlang query parameter is set on the page.
*
* @private
* @since 2020.01
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.js
index cf942772..9d7d7372 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.js
@@ -20,10 +20,10 @@
( function () {
'use strict';
- var ulsPreferences;
+ var getULSPreferences = require( 'ext.uls.preferences' ),
+ ulsPreferences = getULSPreferences();
mw.webfonts = mw.webfonts || {};
- ulsPreferences = mw.uls.preferences();
mw.webfonts.preferences = {
registry: {
fonts: {},
@@ -52,7 +52,7 @@
save: function ( callback ) {
// get updated copy of preferences
- ulsPreferences = mw.uls.preferences();
+ ulsPreferences = getULSPreferences();
ulsPreferences.set( 'webfonts', this.registry );
ulsPreferences.save( callback );
},
@@ -135,7 +135,10 @@
mw.webfonts.preferences.load();
if ( mw.webfonts.preferences.isEnabled() ) {
- mw.loader.using( 'ext.uls.webfonts.fonts', mw.webfonts.setup );
+ // Queue to next idle period to optimize loading.
+ mw.requestIdleCallback( function () {
+ mw.loader.using( 'ext.uls.webfonts.fonts' ).then( mw.webfonts.setup );
+ } );
}
} );
diff --git a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.repository.js b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.repository.js
index a3bab6ed..2ea5aafe 100644
--- a/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.repository.js
+++ b/MLEB/UniversalLanguageSelector/resources/js/ext.uls.webfonts.repository.js
@@ -76,9 +76,9 @@
],
"ckb": [
"system",
- "Amiri",
"Lateef",
- "Scheherazade"
+ "Scheherazade",
+ "Amiri"
],
"cr": [
"OskiEast"
@@ -125,6 +125,10 @@
"system",
"OpenDyslexic"
],
+ "eu": [
+ "system",
+ "GochiHand"
+ ],
"fa": [
"system",
"Iranian Sans",
@@ -185,6 +189,10 @@
"Miriam CLM",
"Taamey Frank CLM"
],
+ "hoc": [
+ "system",
+ "Boyo Gagrai"
+ ],
"hu": [
"system",
"OpenDyslexic"
@@ -470,6 +478,9 @@
"woff": "Artaxerxes/Artaxerxes.woff?c1ed7",
"woff2": "Artaxerxes/Artaxerxes.woff2?7a96e"
},
+ "Boyo Gagrai": {
+ "woff2": "BoyoGagrai/BoyoGagrai.woff2?d1060"
+ },
"CharisSIL": {
"woff": "CharisSIL/CharisSIL-R.woff?3a622",
"woff2": "CharisSIL/CharisSIL-R.woff2?b2a18"
@@ -532,6 +543,10 @@
"woff": "GentiumPlus/GentiumPlus-I.woff?ab550",
"woff2": "GentiumPlus/GentiumPlus-I.woff2?35b11"
},
+ "GochiHand": {
+ "woff": "GochiHand/GochiHand-Regular.woff?310cc",
+ "woff2": "GochiHand/GochiHand-Regular.woff2?b6160"
+ },
"Hanuman": {
"woff": "Hanuman/Hanuman.woff?d5078",
"woff2": "Hanuman/Hanuman.woff2?0107a",
@@ -569,8 +584,8 @@
"woff2": "Jomolhari/Jomolhari.woff2?f448a"
},
"Junicode": {
- "woff": "Junicode/Junicode.woff?dc7ef",
- "woff2": "Junicode/Junicode.woff2?7e6d6",
+ "woff": "Junicode/Junicode.woff?19f4e",
+ "woff2": "Junicode/Junicode.woff2?1a244",
"variants": {
"bold": "Junicode Bold",
"bolditalic": "Junicode Bold Italic",
@@ -579,23 +594,23 @@
},
"Junicode Bold": {
"fontweight": "bold",
- "woff": "Junicode/Junicode-Bold.woff?f7ef4",
- "woff2": "Junicode/Junicode-Bold.woff2?d5d04"
+ "woff": "Junicode/Junicode-Bold.woff?c77c1",
+ "woff2": "Junicode/Junicode-Bold.woff2?94fed"
},
"Junicode Bold Italic": {
"fontweight": "bold",
"fontstyle": "italic",
- "woff": "Junicode/Junicode-BoldItalic.woff?3cec9",
- "woff2": "Junicode/Junicode-BoldItalic.woff2?80351"
+ "woff": "Junicode/Junicode-BoldItalic.woff?23d9c",
+ "woff2": "Junicode/Junicode-BoldItalic.woff2?4f1cd"
},
"Junicode Italic": {
"fontstyle": "italic",
- "woff": "Junicode/Junicode-Italic.woff?c458b",
- "woff2": "Junicode/Junicode-Italic.woff2?3fe39"
+ "woff": "Junicode/Junicode-Italic.woff?66b80",
+ "woff2": "Junicode/Junicode-Italic.woff2?b2597"
},
"Kadiri": {
- "woff": "Kadiri/Kadiri.woff?1b711",
- "woff2": "Kadiri/Kadiri.woff2?a266a"
+ "woff": "Kadiri/Kadiri.woff?98297",
+ "woff2": "Kadiri/Kadiri.woff2?0cfa1"
},
"KhmerOS": {
"woff": "KhmerOS/KhmerOS.woff?2ef9e",
@@ -765,8 +780,8 @@
"woff2": "Ponomar/PonomarUnicode.woff2?ea5c5"
},
"Pustaka Bali": {
- "woff": "PustakaBali/PustakaBali.woff?cb41e",
- "woff2": "PustakaBali/PustakaBali.woff2?743c0"
+ "woff": "PustakaBali/PustakaBali.woff?7c072",
+ "woff2": "PustakaBali/PustakaBali.woff2?6b142"
},
"RailwaySans": {
"woff": "RailwaySans/RailwaySans.woff?fda9a",
@@ -817,8 +832,8 @@
"woff2": "UnifrakturMaguntia/UnifrakturMaguntia.woff2?23272"
},
"Vimala": {
- "woff": "Vimala/Vimala.woff?e387b",
- "woff2": "Vimala/Vimala.woff2?70690"
+ "woff": "Vimala/Vimala.woff?f75ba",
+ "woff2": "Vimala/Vimala.woff2?a3b10"
},
"lklug": {
"woff": "lklug/lklug.woff?57de7",
diff --git a/MLEB/UniversalLanguageSelector/tests/qunit/ext.uls.tests.js b/MLEB/UniversalLanguageSelector/tests/qunit/ext.uls.tests.js
index 4d7e428c..65fdd9eb 100644
--- a/MLEB/UniversalLanguageSelector/tests/qunit/ext.uls.tests.js
+++ b/MLEB/UniversalLanguageSelector/tests/qunit/ext.uls.tests.js
@@ -40,7 +40,7 @@
// Here it's used as a meaningless word, to test
// the preferences without changing anything useful.
prefName = 'gofanim';
- prefs = mw.uls.preferences();
+ prefs = require( 'ext.uls.preferences' )();
prefsToSave = {};
prefsToSave[ prefName ] = {
diff --git a/MLEB/cldr/.eslintrc.json b/MLEB/cldr/.eslintrc.json
index 88396642..9db47a12 100644
--- a/MLEB/cldr/.eslintrc.json
+++ b/MLEB/cldr/.eslintrc.json
@@ -1,4 +1,7 @@
{
"root": true,
- "extends": "wikimedia"
+ "extends": [
+ "wikimedia",
+ "wikimedia/mediawiki"
+ ]
}
diff --git a/MLEB/cldr/.phpcs.xml b/MLEB/cldr/.phpcs.xml
index 4d4c9334..3954e70d 100644
--- a/MLEB/cldr/.phpcs.xml
+++ b/MLEB/cldr/.phpcs.xml
@@ -1,19 +1,14 @@
<?xml version="1.0"?>
<ruleset>
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+ <exclude name="MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate" />
<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
<exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
- <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
</rule>
<rule ref="Generic.Files.LineLength.TooLong">
<exclude-pattern>*/CldrNames/CldrNames*\.php</exclude-pattern>
</rule>
- <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
- <properties>
- <property name="ignoreList" type="array" value="getRealCode" />
- </properties>
- </rule>
<file>.</file>
- <arg name="extensions" value="php,php5,inc" />
+ <arg name="extensions" value="php" />
<arg name="encoding" value="UTF-8" />
</ruleset>
diff --git a/MLEB/cldr/CldrCurrencies.php b/MLEB/cldr/CldrCurrencies.php
index 400974a6..694202da 100644
--- a/MLEB/cldr/CldrCurrencies.php
+++ b/MLEB/cldr/CldrCurrencies.php
@@ -69,7 +69,8 @@ class CldrCurrency {
if ( $country_code !== null ) {
$country_code = strtoupper( $country_code );
if ( $country_code === 'UK' ) {
- $country_code = 'GB'; // dang iso overlap...
+ // dang iso overlap...
+ $country_code = 'GB';
}
}
@@ -119,7 +120,8 @@ class CldrCurrency {
self::loadData( 'locale' );
$country_code = strtoupper( $country_code );
if ( $country_code === 'UK' ) {
- $country_code = 'GB'; // iso overlap again
+ // iso overlap again
+ $country_code = 'GB';
}
return self::$cache['locale'][$country_code] ?? [];
}
diff --git a/MLEB/cldr/CldrCurrency/Symbols.php b/MLEB/cldr/CldrCurrency/Symbols.php
index bf78f2d2..59199db2 100644
--- a/MLEB/cldr/CldrCurrency/Symbols.php
+++ b/MLEB/cldr/CldrCurrency/Symbols.php
@@ -9,11 +9,101 @@ $currencySymbols = [
],
],
'AFN' => [
+ 'af' => 'AFN',
+ 'am' => 'AFN',
+ 'ar' => 'AFN',
+ 'as' => 'AFN',
+ 'ast' => 'AFN',
+ 'az' => 'AFN',
+ 'be' => 'AFN',
+ 'bg' => 'AFN',
+ 'bn' => 'AFN',
+ 'br' => 'AFN',
+ 'bs' => 'AFN',
+ 'ca' => 'AFN',
+ 'ccp' => 'AFN',
+ 'ce' => 'AFN',
+ 'chr' => 'AFN',
+ 'cs' => 'AFN',
+ 'cy' => 'AFN',
+ 'da' => 'AFN',
+ 'de' => 'AFN',
+ 'el' => 'AFN',
'en' => [
'AU' => 'AFN',
],
- 'fa' => '؋',
- 'ps' => '؋',
+ 'es' => 'AFN',
+ 'et' => 'AFN',
+ 'eu' => 'AFN',
+ 'fi' => 'AFN',
+ 'fil' => 'AFN',
+ 'fo' => 'AFN',
+ 'fr' => 'AFN',
+ 'gd' => 'AFN',
+ 'gl' => 'AFN',
+ 'gu' => 'AFN',
+ 'he' => 'AFN',
+ 'hi' => 'AFN',
+ 'hr' => 'AFN',
+ 'hu' => 'AFN',
+ 'hy' => 'AFN',
+ 'id' => 'AFN',
+ 'is' => 'AFN',
+ 'ja' => 'AFN',
+ 'ka' => 'AFN',
+ 'kab' => 'AFN',
+ 'kea' => 'AFN',
+ 'kk' => 'AFN',
+ 'km' => 'AFN',
+ 'kn' => 'AFN',
+ 'ko' => 'AFN',
+ 'kok' => 'AFN',
+ 'ky' => 'AFN',
+ 'lb' => 'AFN',
+ 'lo' => 'AFN',
+ 'lt' => 'AFN',
+ 'lv' => 'AFN',
+ 'mk' => 'AFN',
+ 'ml' => 'AFN',
+ 'mn' => 'AFN',
+ 'mr' => 'AFN',
+ 'ms' => 'AFN',
+ 'mt' => 'AFN',
+ 'my' => 'AFN',
+ 'mzn' => 'AFN',
+ 'nb' => 'AFN',
+ 'ne' => 'AFN',
+ 'nl' => 'AFN',
+ 'nn' => 'AFN',
+ 'or' => 'AFN',
+ 'pa' => 'AFN',
+ 'pcm' => 'AFN',
+ 'pl' => 'AFN',
+ 'pt' => 'AFN',
+ 'qu' => 'AFN',
+ 'ro' => 'AFN',
+ 'root' => '؋',
+ 'ru' => 'AFN',
+ 'sd' => 'AFN',
+ 'si' => 'AFN',
+ 'sk' => 'AFN',
+ 'sl' => 'AFN',
+ 'sq' => 'AFN',
+ 'sr' => 'AFN',
+ 'sv' => 'AFN',
+ 'sw' => 'AFN',
+ 'ta' => 'AFN',
+ 'te' => 'AFN',
+ 'th' => 'AFN',
+ 'tk' => 'AFN',
+ 'tr' => 'AFN',
+ 'uk' => 'AFN',
+ 'ur' => 'AFN',
+ 'uz' => 'AFN',
+ 'vi' => 'AFN',
+ 'yue' => 'AFN',
+ 'zh' => 'AFN',
+ 'zu' => 'AFN',
],
'ALL' => [
'en' => [
@@ -22,10 +112,100 @@ $currencySymbols = [
'sq' => 'Lekë',
],
'AMD' => [
+ 'af' => 'AMD',
+ 'am' => 'AMD',
+ 'ar' => 'AMD',
+ 'as' => 'AMD',
+ 'ast' => 'AMD',
+ 'az' => 'AMD',
+ 'be' => 'AMD',
+ 'bg' => 'AMD',
+ 'bn' => 'AMD',
+ 'br' => 'AMD',
+ 'bs' => 'AMD',
+ 'ca' => 'AMD',
+ 'ccp' => 'AMD',
+ 'ce' => 'AMD',
+ 'chr' => 'AMD',
+ 'cs' => 'AMD',
+ 'cy' => 'AMD',
+ 'da' => 'AMD',
+ 'de' => 'AMD',
+ 'el' => 'AMD',
'en' => [
'AU' => 'AMD',
],
- 'hy' => '֏',
+ 'es' => 'AMD',
+ 'et' => 'AMD',
+ 'eu' => 'AMD',
+ 'fa' => 'AMD',
+ 'fi' => 'AMD',
+ 'fil' => 'AMD',
+ 'fo' => 'AMD',
+ 'fr' => 'AMD',
+ 'gd' => 'AMD',
+ 'gl' => 'AMD',
+ 'gu' => 'AMD',
+ 'he' => 'AMD',
+ 'hi' => 'AMD',
+ 'hr' => 'AMD',
+ 'hu' => 'AMD',
+ 'id' => 'AMD',
+ 'is' => 'AMD',
+ 'ja' => 'AMD',
+ 'ka' => 'AMD',
+ 'kab' => 'AMD',
+ 'kea' => 'AMD',
+ 'kk' => 'AMD',
+ 'km' => 'AMD',
+ 'kn' => 'AMD',
+ 'ko' => 'AMD',
+ 'kok' => 'AMD',
+ 'ky' => 'AMD',
+ 'lo' => 'AMD',
+ 'lt' => 'AMD',
+ 'lv' => 'AMD',
+ 'mk' => 'AMD',
+ 'ml' => 'AMD',
+ 'mn' => 'AMD',
+ 'mr' => 'AMD',
+ 'ms' => 'AMD',
+ 'mt' => 'AMD',
+ 'my' => 'AMD',
+ 'mzn' => 'AMD',
+ 'nb' => 'AMD',
+ 'ne' => 'AMD',
+ 'nl' => 'AMD',
+ 'nn' => 'AMD',
+ 'or' => 'AMD',
+ 'pa' => 'AMD',
+ 'pcm' => 'AMD',
+ 'pl' => 'AMD',
+ 'pt' => 'AMD',
+ 'qu' => 'AMD',
+ 'ro' => 'AMD',
+ 'root' => '֏',
+ 'ru' => 'AMD',
+ 'sd' => 'AMD',
+ 'si' => 'AMD',
+ 'sk' => 'AMD',
+ 'sl' => 'AMD',
+ 'sq' => 'AMD',
+ 'sr' => 'AMD',
+ 'sv' => 'AMD',
+ 'sw' => 'AMD',
+ 'ta' => 'AMD',
+ 'te' => 'AMD',
+ 'th' => 'AMD',
+ 'tk' => 'AMD',
+ 'tr' => 'AMD',
+ 'uk' => 'AMD',
+ 'ur' => 'AMD',
+ 'uz' => 'AMD',
+ 'vi' => 'AMD',
+ 'yue' => 'AMD',
+ 'zh' => 'AMD',
+ 'zu' => 'AMD',
],
'ANG' => [
'en' => [
@@ -324,10 +504,100 @@ $currencySymbols = [
],
],
'AZN' => [
- 'az' => '₼',
+ 'af' => 'AZN',
+ 'am' => 'AZN',
+ 'ar' => 'AZN',
+ 'as' => 'AZN',
+ 'ast' => 'AZN',
+ 'be' => 'AZN',
+ 'bg' => 'AZN',
+ 'bn' => 'AZN',
+ 'br' => 'AZN',
+ 'bs' => 'AZN',
+ 'ca' => 'AZN',
+ 'ccp' => 'AZN',
+ 'ce' => 'AZN',
+ 'chr' => 'AZN',
+ 'cs' => 'AZN',
+ 'cy' => 'AZN',
+ 'da' => 'AZN',
+ 'de' => 'AZN',
+ 'el' => 'AZN',
'en' => [
'AU' => 'AZN',
],
+ 'es' => 'AZN',
+ 'et' => 'AZN',
+ 'eu' => 'AZN',
+ 'fa' => 'AZN',
+ 'fi' => 'AZN',
+ 'fil' => 'AZN',
+ 'fo' => 'AZN',
+ 'fr' => 'AZN',
+ 'gd' => 'AZN',
+ 'gl' => 'AZN',
+ 'gu' => 'AZN',
+ 'he' => 'AZN',
+ 'hi' => 'AZN',
+ 'hr' => 'AZN',
+ 'hu' => 'AZN',
+ 'hy' => 'AZN',
+ 'id' => 'AZN',
+ 'is' => 'AZN',
+ 'ja' => 'AZN',
+ 'ka' => 'AZN',
+ 'kab' => 'AZN',
+ 'kea' => 'AZN',
+ 'kk' => 'AZN',
+ 'km' => 'AZN',
+ 'kn' => 'AZN',
+ 'ko' => 'AZN',
+ 'kok' => 'AZN',
+ 'ky' => 'AZN',
+ 'lo' => 'AZN',
+ 'lt' => 'AZN',
+ 'lv' => 'AZN',
+ 'mk' => 'AZN',
+ 'ml' => 'AZN',
+ 'mn' => 'AZN',
+ 'mr' => 'AZN',
+ 'ms' => 'AZN',
+ 'mt' => 'AZN',
+ 'my' => 'AZN',
+ 'mzn' => 'AZN',
+ 'nb' => 'AZN',
+ 'ne' => 'AZN',
+ 'nl' => 'AZN',
+ 'nn' => 'AZN',
+ 'or' => 'AZN',
+ 'pa' => 'AZN',
+ 'pcm' => 'AZN',
+ 'pl' => 'AZN',
+ 'pt' => 'AZN',
+ 'qu' => 'AZN',
+ 'ro' => 'AZN',
+ 'root' => '₼',
+ 'ru' => 'AZN',
+ 'sd' => 'AZN',
+ 'si' => 'AZN',
+ 'sk' => 'AZN',
+ 'sl' => 'AZN',
+ 'sq' => 'AZN',
+ 'sr' => 'AZN',
+ 'sv' => 'AZN',
+ 'sw' => 'AZN',
+ 'ta' => 'AZN',
+ 'te' => 'AZN',
+ 'th' => 'AZN',
+ 'tk' => 'AZN',
+ 'tr' => 'AZN',
+ 'uk' => 'AZN',
+ 'ur' => 'AZN',
+ 'uz' => 'AZN',
+ 'vi' => 'AZN',
+ 'yue' => 'AZN',
+ 'zh' => 'AZN',
+ 'zu' => 'AZN',
],
'BAM' => [
'af' => 'BAM',
@@ -1215,7 +1485,6 @@ $currencySymbols = [
'ce' => 'BYN',
'chr' => 'BYN',
'cs' => 'BYN',
- 'cu' => 'BYN',
'cy' => 'BYN',
'da' => 'BYN',
'de' => 'BYN',
@@ -1224,7 +1493,6 @@ $currencySymbols = [
'es' => [
'DEFAULT' => 'BYN',
'MX' => 'p.',
- 'US' => 'p.',
],
'et' => 'BYN',
'eu' => 'BYN',
@@ -1422,14 +1690,11 @@ $currencySymbols = [
'AU' => 'CAD',
'CA' => '$',
],
- 'es' => [
- 'DEFAULT' => 'CA$',
- 419 => 'CAD',
- ],
+ 'es' => 'CAD',
'fa' => '$CA',
'fi' => 'CAD',
'fr' => [
- 'CA' => '$',
+ 'CA' => '$ CA',
'DEFAULT' => '$CA',
],
'fy' => 'C$',
@@ -1617,6 +1882,7 @@ $currencySymbols = [
'pl' => 'CNY',
'ro' => 'CNY',
'root' => 'CN¥',
+ 'sa' => '¥',
'sk' => 'CNY',
'sv' => 'CNY',
'ug' => '¥',
@@ -2792,7 +3058,6 @@ $currencySymbols = [
'hr' => 'GBP',
'hu' => 'GBP',
'is' => 'GBP',
- 'kab' => '£GB',
'ky' => 'GBP',
'lt' => 'GBP',
'mk' => 'GBP',
@@ -2915,18 +3180,107 @@ $currencySymbols = [
'zu' => 'GEL',
],
'GHS' => [
- 'ak' => 'GH₵',
- 'ee' => 'GH₵',
+ 'af' => 'GHS',
+ 'am' => 'GHS',
+ 'ar' => 'GHS',
+ 'as' => 'GHS',
+ 'ast' => 'GHS',
+ 'az' => 'GHS',
+ 'be' => 'GHS',
+ 'bg' => 'GHS',
+ 'bn' => 'GHS',
+ 'br' => 'GHS',
+ 'bs' => 'GHS',
+ 'ca' => 'GHS',
+ 'ccp' => 'GHS',
+ 'ce' => 'GHS',
+ 'chr' => 'GHS',
+ 'cs' => 'GHS',
+ 'cy' => 'GHS',
+ 'da' => 'GHS',
+ 'de' => 'GHS',
+ 'el' => 'GHS',
'en' => [
'AU' => 'GHS',
'GH' => 'GH₵',
],
+ 'es' => 'GHS',
+ 'et' => 'GHS',
+ 'eu' => 'GHS',
+ 'fa' => 'GHS',
'ff' => [
'GH' => 'GH₵',
],
+ 'fi' => 'GHS',
+ 'fil' => 'GHS',
+ 'fo' => 'GHS',
+ 'fr' => 'GHS',
+ 'gd' => 'GHS',
+ 'gl' => 'GHS',
+ 'gu' => 'GHS',
'ha' => [
'GH' => 'GH₵',
],
+ 'he' => 'GHS',
+ 'hi' => 'GHS',
+ 'hr' => 'GHS',
+ 'hu' => 'GHS',
+ 'hy' => 'GHS',
+ 'id' => 'GHS',
+ 'is' => 'GHS',
+ 'ja' => 'GHS',
+ 'ka' => 'GHS',
+ 'kab' => 'GHS',
+ 'kk' => 'GHS',
+ 'km' => 'GHS',
+ 'kn' => 'GHS',
+ 'ko' => 'GHS',
+ 'kok' => 'GHS',
+ 'ky' => 'GHS',
+ 'lo' => 'GHS',
+ 'lt' => 'GHS',
+ 'lv' => 'GHS',
+ 'mk' => 'GHS',
+ 'ml' => 'GHS',
+ 'mn' => 'GHS',
+ 'mr' => 'GHS',
+ 'ms' => 'GHS',
+ 'mt' => 'GHS',
+ 'my' => 'GHS',
+ 'mzn' => 'GHS',
+ 'nb' => 'GHS',
+ 'ne' => 'GHS',
+ 'nl' => 'GHS',
+ 'nn' => 'GHS',
+ 'or' => 'GHS',
+ 'pa' => 'GHS',
+ 'pcm' => 'GHS',
+ 'pl' => 'GHS',
+ 'pt' => 'GHS',
+ 'qu' => 'GHS',
+ 'ro' => 'GHS',
+ 'root' => 'GH₵',
+ 'ru' => 'GHS',
+ 'sd' => 'GHS',
+ 'si' => 'GHS',
+ 'sk' => 'GHS',
+ 'sl' => 'GHS',
+ 'sq' => 'GHS',
+ 'sr' => 'GHS',
+ 'sv' => 'GHS',
+ 'sw' => 'GHS',
+ 'ta' => 'GHS',
+ 'te' => 'GHS',
+ 'th' => 'GHS',
+ 'tk' => 'GHS',
+ 'tr' => 'GHS',
+ 'uk' => 'GHS',
+ 'ur' => 'GHS',
+ 'uz' => 'GHS',
+ 'vi' => 'GHS',
+ 'yue' => 'GHS',
+ 'zh' => 'GHS',
+ 'zu' => 'GHS',
],
'GIP' => [
'af' => 'GIP',
@@ -3852,6 +4206,7 @@ $currencySymbols = [
'hu' => 'INR',
'id' => 'Rs',
'is' => 'INR',
+ 'it' => 'INR',
'ka' => 'INR',
'ky' => 'INR',
'lt' => 'INR',
@@ -4096,6 +4451,7 @@ $currencySymbols = [
'bs' => '¥',
'ca' => '¥',
'de' => '¥',
+ 'doi' => '¥',
'dsb' => '¥',
'en' => [
001 => 'JP¥',
@@ -4139,6 +4495,7 @@ $currencySymbols = [
'ro' => 'JPY',
'root' => 'JP¥',
'ru' => '¥',
+ 'sa' => '¥',
'sk' => 'JPY',
'sl' => '¥',
'sr' => '¥',
@@ -4148,6 +4505,7 @@ $currencySymbols = [
'th' => '¥',
'tr' => '¥',
'uk' => '¥',
+ 'vi' => '¥',
'wae' => '¥',
'yue' => '¥',
],
@@ -6822,7 +7180,7 @@ $currencySymbols = [
],
'PTE' => [
'pt' => [
- 'CV' => '​PTE',
+ 'CV' => 'PTE',
'DEFAULT' => 'Esc.',
'PT' => '​',
],
@@ -7062,6 +7420,7 @@ $currencySymbols = [
'cy' => 'RUB',
'da' => 'RUB',
'de' => 'RUB',
+ 'doi' => 'RUB',
'ee' => 'RUB',
'el' => 'RUB',
'en' => [
@@ -7987,6 +8346,7 @@ $currencySymbols = [
'it' => 'STN',
'ja' => 'STN',
'ka' => 'STN',
+ 'kab' => 'STN',
'kn' => 'STN',
'ko' => 'STN',
'kok' => 'STN',
@@ -8003,6 +8363,7 @@ $currencySymbols = [
'nb' => 'STN',
'ne' => 'STN',
'nl' => 'STN',
+ 'nn' => 'STN',
'or' => 'STN',
'pa' => 'STN',
'pcm' => 'STN',
@@ -8694,15 +9055,16 @@ $currencySymbols = [
'ca' => 'USD',
'ceb' => 'US $',
'chr' => '$',
- 'cu' => '$',
'da' => '$',
'de' => '$',
+ 'doi' => '$',
'dsb' => '$',
'el' => '$',
'en' => [
001 => 'US$',
'AU' => 'USD',
'DEFAULT' => '$',
+ 'IN' => '$',
],
'es' => [
'AR' => 'US$',
@@ -8742,7 +9104,7 @@ $currencySymbols = [
'is' => 'USD',
'it' => 'USD',
'ja' => '$',
- 'kab' => '$US',
+ 'kab' => '$',
'kk' => '$',
'km' => '$',
'kn' => '$',
@@ -9047,6 +9409,7 @@ $currencySymbols = [
'hr' => 'VND',
'hu' => 'VND',
'is' => 'VND',
+ 'it' => 'VND',
'ka' => 'VND',
'lt' => 'VND',
'mk' => 'VND',
diff --git a/MLEB/cldr/CldrNames/CldrNamesAf.php b/MLEB/cldr/CldrNames/CldrNamesAf.php
index 25d49c11..d6e34787 100644
--- a/MLEB/cldr/CldrNames/CldrNamesAf.php
+++ b/MLEB/cldr/CldrNames/CldrNamesAf.php
@@ -150,7 +150,7 @@ $languageNames = [
'io' => 'Ido',
'is' => 'Yslands',
'it' => 'Italiaans',
- 'iu' => 'Inuïties',
+ 'iu' => 'Inoektitoet',
'ja' => 'Japannees',
'jbo' => 'Lojban',
'jgo' => 'Ngomba',
@@ -790,7 +790,7 @@ $countryNames = [
'CK' => 'Cookeilande',
'CL' => 'Chili',
'CM' => 'Kameroen',
- 'CN' => 'Sjina',
+ 'CN' => 'China',
'CO' => 'Colombië',
'CP' => 'Clippertoneiland',
'CR' => 'Costa Rica',
@@ -950,7 +950,7 @@ $countryNames = [
'SG' => 'Singapoer',
'SH' => 'Sint Helena',
'SI' => 'Slowenië',
- 'SJ' => 'Svalbard en Jan Mayen',
+ 'SJ' => 'Spitsbergen en Jan Mayen',
'SK' => 'Slowakye',
'SL' => 'Sierra Leone',
'SM' => 'San Marino',
diff --git a/MLEB/cldr/CldrNames/CldrNamesAm.php b/MLEB/cldr/CldrNames/CldrNamesAm.php
index 85ad5196..cd2a08da 100644
--- a/MLEB/cldr/CldrNames/CldrNamesAm.php
+++ b/MLEB/cldr/CldrNames/CldrNamesAm.php
@@ -959,7 +959,7 @@ $countryNames = [
'ML' => 'ማሊ',
'MM' => 'ማይናማር(በርማ)',
'MN' => 'ሞንጎሊያ',
- 'MO' => 'ማካኡ',
+ 'MO' => 'ማካኦ',
'MP' => 'የሰሜናዊ ማሪያና ደሴቶች',
'MQ' => 'ማርቲኒክ',
'MR' => 'ሞሪቴኒያ',
@@ -992,7 +992,7 @@ $countryNames = [
'PK' => 'ፓኪስታን',
'PL' => 'ፖላንድ',
'PM' => 'ቅዱስ ፒዬር እና ሚኩኤሎን',
- 'PN' => 'ፒትካኢርን አይስላንድ',
+ 'PN' => 'ፒትካኢርን ደሴቶች',
'PR' => 'ፖርታ ሪኮ',
'PS' => 'ፍልስጥኤም',
'PT' => 'ፖርቱጋል',
diff --git a/MLEB/cldr/CldrNames/CldrNamesBe.php b/MLEB/cldr/CldrNames/CldrNamesBe.php
index 8d9a450f..e713c9be 100644
--- a/MLEB/cldr/CldrNames/CldrNamesBe.php
+++ b/MLEB/cldr/CldrNames/CldrNamesBe.php
@@ -1004,7 +1004,7 @@ $countryNames = [
'WF' => 'Уоліс і Футуна',
'WS' => 'Самоа',
'XA' => 'Псеўдаакцэнты',
- 'XB' => 'Псеўда-Bidi',
+ 'XB' => 'псеўдадвухнапрамкавы',
'XK' => 'Косава',
'YE' => 'Емен',
'YT' => 'Маёта',
diff --git a/MLEB/cldr/CldrNames/CldrNamesBg.php b/MLEB/cldr/CldrNames/CldrNamesBg.php
index 1373b8e2..8b59b88c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesBg.php
+++ b/MLEB/cldr/CldrNames/CldrNamesBg.php
@@ -114,8 +114,10 @@ $languageNames = [
'el' => 'гръцки',
'elx' => 'еламитски',
'en' => 'английски',
- 'en-gb' => 'английски (Обединено кралство)',
- 'en-us' => 'английски (САЩ)',
+ 'en-au' => 'австралийски английски',
+ 'en-ca' => 'канадски английски',
+ 'en-gb' => 'британски английски',
+ 'en-us' => 'американски английски',
'enm' => 'средновековен английски',
'eo' => 'есперанто',
'es' => 'испански',
@@ -374,7 +376,7 @@ $languageNames = [
'rwk' => 'рва',
'sa' => 'санскрит',
'sad' => 'сандаве',
- 'sah' => 'сакха',
+ 'sah' => 'саха',
'sam' => 'самаритански арамейски',
'saq' => 'самбуру',
'sas' => 'сасак',
@@ -463,7 +465,7 @@ $languageNames = [
'uga' => 'угаритски',
'uk' => 'украински',
'umb' => 'умбунду',
- 'und' => 'неопределен',
+ 'und' => 'непознат език',
'ur' => 'урду',
'uz' => 'узбекски',
'vai' => 'ваи',
@@ -480,7 +482,7 @@ $languageNames = [
'wbp' => 'валпири',
'wo' => 'волоф',
'xal' => 'калмик',
- 'xh' => 'ксоса',
+ 'xh' => 'кхоса',
'xog' => 'сога',
'yao' => 'яо',
'yap' => 'япезе',
@@ -560,7 +562,7 @@ $currencyNames = [
'CHW' => 'WIR франк',
'CLF' => 'Условна разчетна единица на Чили',
'CLP' => 'Чилийско песо',
- 'CNH' => 'Китайски ренминби юан (offshore)',
+ 'CNH' => 'Китайски юан (офшорен)',
'CNY' => 'Китайски юан',
'COP' => 'Колумбийско песо',
'COU' => 'Колумбийска единица на реалната стойност',
@@ -588,7 +590,7 @@ $currencyNames = [
'EUR' => 'Евро',
'FIM' => 'Финландска марка',
'FJD' => 'Фиджийски долар',
- 'FKP' => 'Фолклендска лира',
+ 'FKP' => 'Фолкландска лира',
'FRF' => 'Френски франк',
'GBP' => 'Британска лира',
'GEK' => 'Грузински купон',
@@ -645,12 +647,12 @@ $currencyNames = [
'LYD' => 'Либийски динар',
'MAD' => 'Марокански дирхам',
'MAF' => 'Марокански франк',
- 'MDL' => 'Молдовско леу',
+ 'MDL' => 'Молдовска лея',
'MGA' => 'Малгашко ариари',
'MGF' => 'Малгашки франк - Мадагаскар',
'MKD' => 'Македонски денар',
'MLF' => 'Малийски франк',
- 'MMK' => 'Мианмарски кият',
+ 'MMK' => 'Мианмарски киат',
'MNT' => 'Монголски тугрик',
'MOP' => 'Патака на Макао',
'MRO' => 'Мавританска угия (1973–2017)',
@@ -658,7 +660,7 @@ $currencyNames = [
'MTL' => 'Малтийска лира',
'MUR' => 'Маврицийска рупия',
'MVR' => 'Малдивска руфия',
- 'MWK' => 'Малавийска квача',
+ 'MWK' => 'Малавийска куача',
'MXN' => 'Мексиканско песо',
'MXP' => 'Мексиканско сребърно песо (1861–1992)',
'MXV' => 'Мексиканска конвертируема единица (UDI)',
@@ -728,7 +730,7 @@ $currencyNames = [
'TTD' => 'Долар на Тринидад и Тобаго',
'TWD' => 'Тайвански долар',
'TZS' => 'Танзанийски шилинг',
- 'UAH' => 'Украинска хривня',
+ 'UAH' => 'Украинска гривня',
'UAK' => 'Украински карбованец',
'UGS' => 'Угандийски шилинг (1966–1987)',
'UGX' => 'Угандски шилинг',
@@ -1173,7 +1175,7 @@ $countryNames = [
'TH' => 'Тайланд',
'TJ' => 'Таджикистан',
'TK' => 'Токелау',
- 'TL' => 'Източен Тимор',
+ 'TL' => 'Тимор Лесте',
'TM' => 'Туркменистан',
'TN' => 'Тунис',
'TO' => 'Тонга',
@@ -1363,10 +1365,10 @@ $timeUnits = [
'thu-short-past-other' => 'преди {0} чт',
'tue-future-one' => 'след {0} вторник',
'tue-future-other' => 'след {0} вторника',
- 'tue-narrow-future-one' => 'сл. {0} вт.',
- 'tue-narrow-future-other' => 'сл. {0} вт.',
- 'tue-narrow-past-one' => 'пр. {0} вт.',
- 'tue-narrow-past-other' => 'пр. {0} вт.',
+ 'tue-narrow-future-one' => 'сл. {0} вт',
+ 'tue-narrow-future-other' => 'сл. {0} вт',
+ 'tue-narrow-past-one' => 'пр. {0} вт',
+ 'tue-narrow-past-other' => 'пр. {0} вт',
'tue-past-one' => 'преди {0} вторник',
'tue-past-other' => 'преди {0} вторника',
'tue-short-future-one' => 'след {0} вт',
diff --git a/MLEB/cldr/CldrNames/CldrNamesBn.php b/MLEB/cldr/CldrNames/CldrNamesBn.php
index 04c51556..7451714b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesBn.php
+++ b/MLEB/cldr/CldrNames/CldrNamesBn.php
@@ -331,7 +331,7 @@ $languageNames = [
'nl' => 'ওলন্দাজ',
'nl-be' => 'ফ্লেমিশ',
'nmg' => 'কোয়াসিও',
- 'nn' => 'নরওয়েজীয়ান নিনর্স্ক',
+ 'nn' => 'নরওয়েজিয়ান নিনর্স্ক',
'nnh' => 'নিঙ্গেম্বুন',
'no' => 'নরওয়েজীয়',
'nog' => 'নোগাই',
@@ -1294,7 +1294,7 @@ $timeUnits = [
'mon-narrow-future-other' => '{0} সোমবারেতে',
'mon-narrow-past-one' => '{0} সোমবার আগে',
'mon-narrow-past-other' => '{0} সোমবার আগে',
- 'mon-past-one' => '{0} সোমবারেতে',
+ 'mon-past-one' => '{0} সোমবার আগে',
'mon-past-other' => '{0} সোমবার আগে',
'mon-short-future-one' => '{0} সোমবারেতে',
'mon-short-future-other' => '{0} সোমবারেতে',
diff --git a/MLEB/cldr/CldrNames/CldrNamesBr.php b/MLEB/cldr/CldrNames/CldrNamesBr.php
index 65ddbc6a..6ab94e09 100644
--- a/MLEB/cldr/CldrNames/CldrNamesBr.php
+++ b/MLEB/cldr/CldrNames/CldrNamesBr.php
@@ -138,6 +138,7 @@ $languageNames = [
'eu' => 'euskareg',
'ewo' => 'ewondo',
'fa' => 'perseg',
+ 'fa-af' => 'dareg',
'fan' => 'fang',
'fat' => 'fanti',
'ff' => 'fula',
@@ -531,7 +532,7 @@ $languageNames = [
'yue' => 'kantoneg',
'za' => 'zhuang',
'zap' => 'zapoteg',
- 'zbl' => 'Bliss',
+ 'zbl' => 'arouezioù Bliss',
'zea' => 'zelandeg',
'zen' => 'zenaga',
'zgh' => 'tamacheg Maroko standart',
@@ -598,6 +599,7 @@ $currencyNames = [
'CLE' => 'escudo Chile',
'CLF' => 'unanenn jediñ Chile',
'CLP' => 'peso Chile',
+ 'CNH' => 'yuan Sina (diavaez)',
'CNX' => 'dollar Bank poblel Sina',
'CNY' => 'yuan Sina',
'COP' => 'peso Kolombia',
@@ -799,6 +801,7 @@ $currencyNames = [
'XPF' => 'lur CFP',
'XPT' => 'platin',
'XTS' => 'kod moneiz amprouiñ',
+ 'XUA' => 'unanenn jediñ BAD',
'XXX' => 'moneiz dianav',
'YDD' => 'dinar Yemen',
'YER' => 'rial Yemen',
diff --git a/MLEB/cldr/CldrNames/CldrNamesBs.php b/MLEB/cldr/CldrNames/CldrNamesBs.php
index 623d2c7e..7c32e97b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesBs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesBs.php
@@ -531,7 +531,7 @@ $currencyNames = [
'AOR' => 'Angolijska kvanza reajustado (1995–1999)',
'ARA' => 'Argentinski austral',
'ARL' => 'argentinski pezos lej',
- 'ARM' => 'argentinski pezo monedo nacional',
+ 'ARM' => 'argentinski pezos monedo nacional',
'ARP' => 'Argentinski pezo (1983–1985)',
'ARS' => 'Argentinski pezos',
'ATS' => 'Austrijski šiling',
@@ -539,9 +539,9 @@ $currencyNames = [
'AWG' => 'Arubanski florin',
'AZM' => 'Azerbejdžanski manat (1993–2006)',
'AZN' => 'Azerbejdžanski manat',
- 'BAD' => 'Bosansko-Hercegovački dinar',
+ 'BAD' => 'Bosanskohercegovački dinar',
'BAM' => 'Bosanskohercegovačka konvertibilna marka',
- 'BAN' => 'Bosansko-hercegovački novi dinar',
+ 'BAN' => 'Bosanskohercegovački novi dinar',
'BBD' => 'Barbadoski dolar',
'BDT' => 'Bangladeška taka',
'BEC' => 'Belgijski frank (konvertibilni)',
@@ -586,7 +586,7 @@ $currencyNames = [
'CNX' => 'Dolar kineske narodne banke',
'CNY' => 'Kineski juan',
'COP' => 'Kolumbijski pezos',
- 'COU' => 'unidad de valor real',
+ 'COU' => 'Kolumbijski Unidade real de valor',
'CRC' => 'Kostarikanski kolon',
'CSD' => 'Srpski dinar (2002–2006)',
'CSK' => 'Čehoslovačka tvrda koruna',
@@ -677,7 +677,7 @@ $currencyNames = [
'MAD' => 'Marokanski dirham',
'MAF' => 'Marokanski franak',
'MCF' => 'Monegaskaški franak',
- 'MDC' => 'moldavski kupon',
+ 'MDC' => 'Moldavski kupon',
'MDL' => 'Moldavski lej',
'MGA' => 'Malagaški arijari',
'MGF' => 'Malagasijski franak',
@@ -1032,10 +1032,10 @@ $countryNames = [
'CM' => 'Kamerun',
'CN' => 'Kina',
'CO' => 'Kolumbija',
- 'CP' => 'Ostrvo Kliperton',
+ 'CP' => 'Ostrvo Clipperton',
'CR' => 'Kostarika',
'CU' => 'Kuba',
- 'CV' => 'Kape Verde',
+ 'CV' => 'Zelenortska Ostrva',
'CW' => 'Kurasao',
'CX' => 'Božićno ostrvo',
'CY' => 'Kipar',
@@ -1068,7 +1068,7 @@ $countryNames = [
'GD' => 'Grenada',
'GE' => 'Gruzija',
'GF' => 'Francuska Gvajana',
- 'GG' => 'Gernzi',
+ 'GG' => 'Guernsey',
'GH' => 'Gana',
'GI' => 'Gibraltar',
'GL' => 'Grenland',
@@ -1083,7 +1083,7 @@ $countryNames = [
'GW' => 'Gvineja-Bisao',
'GY' => 'Gvajana',
'HK' => 'Hong Kong',
- 'HM' => 'Herd i arhipelag MekDonald',
+ 'HM' => 'Ostrvo Heard i arhipelag McDonald',
'HN' => 'Honduras',
'HR' => 'Hrvatska',
'HT' => 'Haiti',
diff --git a/MLEB/cldr/CldrNames/CldrNamesCa.php b/MLEB/cldr/CldrNames/CldrNamesCa.php
index 296854e0..efbcdc63 100644
--- a/MLEB/cldr/CldrNames/CldrNamesCa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesCa.php
@@ -258,7 +258,7 @@ $languageNames = [
'kj' => 'kuanyama',
'kk' => 'kazakh',
'kkj' => 'kako',
- 'kl' => 'grenlandès',
+ 'kl' => 'groenlandès',
'kln' => 'kalenjin',
'km' => 'khmer',
'kmb' => 'kimbundu',
@@ -1135,7 +1135,7 @@ $countryNames = [
'GL' => 'Groenlàndia',
'GM' => 'Gàmbia',
'GN' => 'Guinea',
- 'GP' => 'Guadeloupe',
+ 'GP' => 'Guadalupe',
'GQ' => 'Guinea Equatorial',
'GR' => 'Grècia',
'GS' => 'Illes Geòrgia del Sud i Sandwich del Sud',
diff --git a/MLEB/cldr/CldrNames/CldrNamesCeb.php b/MLEB/cldr/CldrNames/CldrNamesCeb.php
index ef70cff6..a422affb 100644
--- a/MLEB/cldr/CldrNames/CldrNamesCeb.php
+++ b/MLEB/cldr/CldrNames/CldrNamesCeb.php
@@ -7,7 +7,7 @@ $languageNames = [
'ceb' => 'Binisaya',
'de' => 'Aleman',
'de-at' => 'Austriano nga Aleman',
- 'de-ch' => 'Swiss nga Taas nga Aleman',
+ 'de-ch' => 'Taas nga Aleman sa Switzerland',
'en' => 'Ingles',
'en-au' => 'Ingles sa Australia',
'en-ca' => 'Ingles sa Canada',
@@ -19,7 +19,7 @@ $languageNames = [
'es-mx' => 'Espanyol sa Mexico',
'fr' => 'Pranses',
'fr-ca' => 'Pranses sa Canada',
- 'fr-ch' => 'Swiss nga Pranses',
+ 'fr-ch' => 'Pranses sa Switzerland',
'hi' => 'Hindi',
'id' => 'Indonesian',
'it' => 'Italiano',
@@ -193,7 +193,7 @@ $currencyNames = [
'XCD' => 'East Caribbean Dollar',
'XOF' => 'West African CFA Franc',
'XPF' => 'CFP Franc',
- 'XXX' => 'Wala Nahibaluan nga Currency',
+ 'XXX' => 'Wala Nailhi nga Kwarta',
'YER' => 'Yemeni Rial',
'ZAR' => 'South African Rand',
'ZMW' => 'Zambian Kwacha',
@@ -276,7 +276,7 @@ $countryNames = [
'EG' => 'Egypt',
'EH' => 'Western Sahara',
'ER' => 'Eritrea',
- 'ES' => 'Spain',
+ 'ES' => 'Espanya',
'ET' => 'Ethiopia',
'EU' => 'European Union',
'EZ' => 'Eurozone',
@@ -446,7 +446,7 @@ $countryNames = [
'UA' => 'Ukraine',
'UG' => 'Uganda',
'UM' => 'U.S. Outlying Islands',
- 'UN' => 'United Nations',
+ 'UN' => 'Hiniusang Kanasoran',
'US' => 'US',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistan',
diff --git a/MLEB/cldr/CldrNames/CldrNamesCkb.php b/MLEB/cldr/CldrNames/CldrNamesCkb.php
index 8f03908d..645168bd 100644
--- a/MLEB/cldr/CldrNames/CldrNamesCkb.php
+++ b/MLEB/cldr/CldrNames/CldrNamesCkb.php
@@ -392,6 +392,7 @@ $currencyNames = [
'AFN' => 'ئەفغانیی ئەفغانستان',
'BHD' => 'دیناری بەحرەینی',
'BZD' => 'دۆلاری بەلیزی',
+ 'CAD' => 'دۆلاری کەنەدی',
'DZD' => 'دیناری جەزائیری',
'EUR' => 'یورۆ',
'IQD' => 'دیناری عێراقی',
diff --git a/MLEB/cldr/CldrNames/CldrNamesCs.php b/MLEB/cldr/CldrNames/CldrNamesCs.php
index 6426214d..b4d5aa66 100644
--- a/MLEB/cldr/CldrNames/CldrNamesCs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesCs.php
@@ -1440,7 +1440,7 @@ $countryNames = [
'SV' => 'Salvador',
'SX' => 'Svatý Martin (Nizozemsko)',
'SY' => 'Sýrie',
- 'SZ' => 'Svazijsko',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Turks a Caicos',
'TD' => 'Čad',
diff --git a/MLEB/cldr/CldrNames/CldrNamesCy.php b/MLEB/cldr/CldrNames/CldrNamesCy.php
index c2660e8b..dd022e3e 100644
--- a/MLEB/cldr/CldrNames/CldrNamesCy.php
+++ b/MLEB/cldr/CldrNames/CldrNamesCy.php
@@ -377,9 +377,9 @@ $languageNames = [
'prg' => 'Prwseg',
'pro' => 'Hen Brofensaleg',
'ps' => 'Pashto',
- 'pt' => 'Portiwgeeg',
- 'pt-br' => 'Portiwgeeg Brasil',
- 'pt-pt' => 'Portiwgeeg Ewrop',
+ 'pt' => 'Portiwgaleg',
+ 'pt-br' => 'Portiwgaleg Brasil',
+ 'pt-pt' => 'Portiwgaleg Ewrop',
'qu' => 'Quechua',
'quc' => 'K’iche’',
'raj' => 'Rajasthaneg',
@@ -527,7 +527,7 @@ $languageNames = [
'zap' => 'Zapoteceg',
'zbl' => 'Blisssymbols',
'zea' => 'Zêlandeg',
- 'zgh' => 'Tamaseit Safonol',
+ 'zgh' => 'Tamaseit Moroco Safonol',
'zh' => 'Tsieinëeg',
'zh-hans' => 'Tsieinëeg Symledig',
'zh-hant' => 'Tsieinëeg Traddodiadol',
@@ -688,7 +688,7 @@ $currencyNames = [
'MLF' => 'Ffranc Mali',
'MMK' => 'Kyat Myanmar',
'MNT' => 'Tugrik Mongolia',
- 'MOP' => 'Pataca Macau',
+ 'MOP' => 'pataca Macau',
'MRO' => 'Ouguiya Mauritania (1973–2017)',
'MRU' => 'Ouguiya Mauritania',
'MUR' => 'Rwpî Mauritius',
@@ -1067,7 +1067,7 @@ $countryNames = [
'AU' => 'Awstralia',
'AW' => 'Aruba',
'AX' => 'Ynysoedd Åland',
- 'AZ' => 'Azerbaijan',
+ 'AZ' => 'Aserbaijan',
'BA' => 'Bosnia a Herzegovina',
'BB' => 'Barbados',
'BD' => 'Bangladesh',
@@ -1142,9 +1142,9 @@ $countryNames = [
'GI' => 'Gibraltar',
'GL' => 'Yr Ynys Las',
'GM' => 'Gambia',
- 'GN' => 'Guinée',
+ 'GN' => 'Gini',
'GP' => 'Guadeloupe',
- 'GQ' => 'Guinea Gyhydeddol',
+ 'GQ' => 'Gini Gyhydeddol',
'GR' => 'Gwlad Groeg',
'GS' => 'De Georgia ac Ynysoedd Sandwich y De',
'GT' => 'Guatemala',
@@ -1178,11 +1178,11 @@ $countryNames = [
'KI' => 'Kiribati',
'KM' => 'Comoros',
'KN' => 'Saint Kitts a Nevis',
- 'KP' => 'Gogledd Korea',
- 'KR' => 'De Korea',
+ 'KP' => 'Gogledd Corea',
+ 'KR' => 'De Corea',
'KW' => 'Kuwait',
'KY' => 'Ynysoedd Cayman',
- 'KZ' => 'Kazakstan',
+ 'KZ' => 'Kazakhstan',
'LA' => 'Laos',
'LB' => 'Libanus',
'LC' => 'Saint Lucia',
@@ -1190,7 +1190,7 @@ $countryNames = [
'LK' => 'Sri Lanka',
'LR' => 'Liberia',
'LS' => 'Lesotho',
- 'LT' => 'Lithuania',
+ 'LT' => 'Lithwania',
'LU' => 'Lwcsembwrg',
'LV' => 'Latfia',
'LY' => 'Libya',
@@ -1274,15 +1274,15 @@ $countryNames = [
'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Ynysoedd Turks a Caicos',
- 'TD' => 'Tchad',
+ 'TD' => 'Tsiad',
'TF' => 'Tiroedd Deheuol ac Antarctig Ffrainc',
'TG' => 'Togo',
'TH' => 'Gwlad Thai',
- 'TJ' => 'Tajikistan',
+ 'TJ' => 'Tajicistan',
'TK' => 'Tokelau',
'TL' => 'Timor-Leste',
- 'TM' => 'Turkmenistan',
- 'TN' => 'Tunisia',
+ 'TM' => 'Tyrcmenistan',
+ 'TN' => 'Tiwnisia',
'TO' => 'Tonga',
'TR' => 'Twrci',
'TT' => 'Trinidad a Tobago',
@@ -1378,14 +1378,14 @@ $timeUnits = [
'fri-future-zero' => 'ymhen {0} dydd Gwener',
'fri-narrow-future-few' => 'ymhen {0} dydd Gwener',
'fri-narrow-future-many' => 'ymhen {0} dydd Gwener',
- 'fri-narrow-future-one' => 'ymhen {0} dydd Gwener',
- 'fri-narrow-future-other' => 'ymhen {0} dydd Gwener',
+ 'fri-narrow-future-one' => 'ymhen {0} G',
+ 'fri-narrow-future-other' => 'ymhen {0} G',
'fri-narrow-future-two' => 'ymhen {0} dydd Gwener',
'fri-narrow-future-zero' => 'ymhen {0} dydd Gwener',
'fri-narrow-past-few' => '{0} dydd Gwener yn ôl',
'fri-narrow-past-many' => '{0} dydd Gwener yn ôl',
- 'fri-narrow-past-one' => '{0} dydd Gwener yn ôl',
- 'fri-narrow-past-other' => '{0} dydd Gwener yn ôl',
+ 'fri-narrow-past-one' => '{0} G yn ôl',
+ 'fri-narrow-past-other' => '{0} G yn ôl',
'fri-narrow-past-two' => '{0} dydd Gwener yn ôl',
'fri-narrow-past-zero' => '{0} dydd Gwener yn ôl',
'fri-past-few' => '{0} dydd Gwener yn ôl',
@@ -1396,14 +1396,14 @@ $timeUnits = [
'fri-past-zero' => '{0} dydd Gwener yn ôl',
'fri-short-future-few' => 'ymhen {0} dydd Gwener',
'fri-short-future-many' => 'ymhen {0} dydd Gwener',
- 'fri-short-future-one' => 'ymhen {0} dydd Gwener',
- 'fri-short-future-other' => 'ymhen {0} dydd Gwener',
+ 'fri-short-future-one' => 'ymhen {0} Gwen.',
+ 'fri-short-future-other' => 'ymhen {0} Gwen',
'fri-short-future-two' => 'ymhen {0} dydd Gwener',
'fri-short-future-zero' => 'ymhen {0} dydd Gwener',
'fri-short-past-few' => '{0} dydd Gwener yn ôl',
'fri-short-past-many' => '{0} dydd Gwener yn ôl',
- 'fri-short-past-one' => '{0} dydd Gwener yn ôl',
- 'fri-short-past-other' => '{0} dydd Gwener yn ôl',
+ 'fri-short-past-one' => '{0} Gwen. yn ôl',
+ 'fri-short-past-other' => '{0} Gwen. yn ôl',
'fri-short-past-two' => '{0} dydd Gwener yn ôl',
'fri-short-past-zero' => '{0} dydd Gwener yn ôl',
'hour-few' => '{0} awr',
@@ -1468,18 +1468,18 @@ $timeUnits = [
'minute-future-two' => 'ymhen {0} munud',
'minute-future-zero' => 'ymhen {0} munud',
'minute-many' => '{0} munud',
- 'minute-narrow-future-few' => 'ymhen {0} mun.',
- 'minute-narrow-future-many' => 'ymhen {0} mun.',
+ 'minute-narrow-future-few' => 'ymhen {0} munud',
+ 'minute-narrow-future-many' => 'ymhen {0} munud',
'minute-narrow-future-one' => 'ymhen {0} mun.',
'minute-narrow-future-other' => 'ymhen {0} mun.',
'minute-narrow-future-two' => 'ymhen {0} mun.',
- 'minute-narrow-future-zero' => 'ymhen {0} mun.',
+ 'minute-narrow-future-zero' => 'ymhen {0} munud',
'minute-narrow-past-few' => '{0} mun. yn ôl',
- 'minute-narrow-past-many' => '{0} mun. yn ôl',
+ 'minute-narrow-past-many' => '{0} munud yn ôl',
'minute-narrow-past-one' => '{0} mun. yn ôl',
'minute-narrow-past-other' => '{0} mun. yn ôl',
'minute-narrow-past-two' => '{0} mun. yn ôl',
- 'minute-narrow-past-zero' => '{0} mun. yn ôl',
+ 'minute-narrow-past-zero' => '{0} munud yn ôl',
'minute-one' => '{0} munud',
'minute-other' => '{0} munud',
'minute-past-few' => '{0} munud yn ôl',
@@ -1491,14 +1491,14 @@ $timeUnits = [
'minute-short-future-few' => 'ymhen {0} munud',
'minute-short-future-many' => 'ymhen {0} munud',
'minute-short-future-one' => 'ymhen {0} mun.',
- 'minute-short-future-other' => 'ymhen {0} munud',
+ 'minute-short-future-other' => 'ymhen {0} mun.',
'minute-short-future-two' => 'ymhen {0} fun.',
'minute-short-future-zero' => 'ymhen {0} munud',
'minute-short-past-few' => '{0} munud yn ôl',
'minute-short-past-many' => '{0} munud yn ôl',
- 'minute-short-past-one' => '{0} munud yn ôl',
- 'minute-short-past-other' => '{0} munud yn ôl',
- 'minute-short-past-two' => '{0} fun. yn ôl',
+ 'minute-short-past-one' => '{0} mun. yn ôl',
+ 'minute-short-past-other' => '{0} mun. yn ôl',
+ 'minute-short-past-two' => '{0} funud yn ôl',
'minute-short-past-zero' => '{0} munud yn ôl',
'minute-two' => '{0} funud',
'minute-zero' => '{0} munud',
@@ -1510,14 +1510,14 @@ $timeUnits = [
'mon-future-zero' => 'ymhen {0} Dydd Llun',
'mon-narrow-future-few' => 'ymhen {0} Dydd Llun',
'mon-narrow-future-many' => 'ymhen {0} Dydd Llun',
- 'mon-narrow-future-one' => 'ymhen {0} Dydd Llun',
- 'mon-narrow-future-other' => 'ymhen {0} Dydd Llun',
+ 'mon-narrow-future-one' => 'ymhen {0} Ll',
+ 'mon-narrow-future-other' => 'ymhen {0} Ll',
'mon-narrow-future-two' => 'ymhen {0} Dydd Llun',
'mon-narrow-future-zero' => 'ymhen {0} Dydd Llun',
'mon-narrow-past-few' => '{0} dydd Llun yn ôl',
'mon-narrow-past-many' => '{0} dydd Llun yn ôl',
- 'mon-narrow-past-one' => '{0} dydd Llun yn ôl',
- 'mon-narrow-past-other' => '{0} dydd Llun yn ôl',
+ 'mon-narrow-past-one' => '{0} Ll yn ôl',
+ 'mon-narrow-past-other' => '{0} Ll yn ôl',
'mon-narrow-past-two' => '{0} dydd Llun yn ôl',
'mon-narrow-past-zero' => '{0} dydd Llun yn ôl',
'mon-past-few' => '{0} dydd Llun yn ôl',
@@ -1528,14 +1528,14 @@ $timeUnits = [
'mon-past-zero' => '{0} dydd Llun yn ôl',
'mon-short-future-few' => 'ymhen {0} Dydd Llun',
'mon-short-future-many' => 'ymhen {0} Dydd Llun',
- 'mon-short-future-one' => 'ymhen {0} Dydd Llun',
- 'mon-short-future-other' => 'ymhen {0} Dydd Llun',
+ 'mon-short-future-one' => 'ymhen {0} Llun',
+ 'mon-short-future-other' => 'ymhen {0} Llun',
'mon-short-future-two' => 'ymhen {0} Dydd Llun',
'mon-short-future-zero' => 'ymhen {0} Dydd Llun',
'mon-short-past-few' => '{0} dydd Llun yn ôl',
'mon-short-past-many' => '{0} dydd Llun yn ôl',
- 'mon-short-past-one' => '{0} dydd Llun yn ôl',
- 'mon-short-past-other' => '{0} dydd Llun yn ôl',
+ 'mon-short-past-one' => '{0} Llun yn ôl',
+ 'mon-short-past-other' => '{0} Llun yn ôl',
'mon-short-past-two' => '{0} dydd Llun yn ôl',
'mon-short-past-zero' => '{0} dydd Llun yn ôl',
'month-few' => '{0} mis',
@@ -1594,14 +1594,14 @@ $timeUnits = [
'quarter-future-zero' => 'ymhen {0} chwarter',
'quarter-narrow-future-few' => 'ymhen {0} chwarter',
'quarter-narrow-future-many' => 'ymhen {0} chwarter',
- 'quarter-narrow-future-one' => 'ymhen {0} chwarter',
- 'quarter-narrow-future-other' => 'ymhen {0} chwarter',
+ 'quarter-narrow-future-one' => 'ymhen {0} chw.',
+ 'quarter-narrow-future-other' => 'ymhen {0} chw.',
'quarter-narrow-future-two' => 'ymhen {0} chwarter',
'quarter-narrow-future-zero' => 'ymhen {0} chwarter',
'quarter-narrow-past-few' => '{0} chwarter yn ôl',
'quarter-narrow-past-many' => '{0} chwarter yn ôl',
- 'quarter-narrow-past-one' => '{0} chwarter yn ôl',
- 'quarter-narrow-past-other' => '{0} o chwarteri yn ôl',
+ 'quarter-narrow-past-one' => '{0} chw. yn ôl',
+ 'quarter-narrow-past-other' => '{0} chw. yn ôl',
'quarter-narrow-past-two' => '{0} chwarter yn ôl',
'quarter-narrow-past-zero' => '{0} o chwarteri yn ôl',
'quarter-past-few' => '{0} chwarter yn ôl',
@@ -1612,14 +1612,14 @@ $timeUnits = [
'quarter-past-zero' => '{0} o chwarteri yn ôl',
'quarter-short-future-few' => 'ymhen {0} chwarter',
'quarter-short-future-many' => 'ymhen {0} chwarter',
- 'quarter-short-future-one' => 'ymhen {0} chwarter',
- 'quarter-short-future-other' => 'ymhen {0} chwarter',
+ 'quarter-short-future-one' => 'ymhen {0} chw.',
+ 'quarter-short-future-other' => 'ymhen {0} chw.',
'quarter-short-future-two' => 'ymhen {0} chwarter',
'quarter-short-future-zero' => 'ymhen {0} chwarter',
'quarter-short-past-few' => '{0} chwarter yn ôl',
'quarter-short-past-many' => '{0} chwarter yn ôl',
- 'quarter-short-past-one' => '{0} chwarter yn ôl',
- 'quarter-short-past-other' => '{0} o chwarteri yn ôl',
+ 'quarter-short-past-one' => '{0} chw. yn ôl',
+ 'quarter-short-past-other' => '{0} chw. yn ôl',
'quarter-short-past-two' => '{0} chwarter yn ôl',
'quarter-short-past-zero' => '{0} o chwarteri yn ôl',
'sat-future-few' => 'ymhen {0} dydd Sadwrn',
@@ -1630,14 +1630,14 @@ $timeUnits = [
'sat-future-zero' => 'ymhen {0} dydd Sadwrn',
'sat-narrow-future-few' => 'ymhen {0} dydd Sadwrn',
'sat-narrow-future-many' => 'ymhen {0} dydd Sadwrn',
- 'sat-narrow-future-one' => 'ymhen {0} dydd Sadwrn',
- 'sat-narrow-future-other' => 'ymhen {0} dydd Sadwrn',
+ 'sat-narrow-future-one' => 'ymhen {0} Sad.',
+ 'sat-narrow-future-other' => 'ymhen {0} Sad.',
'sat-narrow-future-two' => 'ymhen {0} dydd Sadwrn',
'sat-narrow-future-zero' => 'ymhen {0} dydd Sadwrn',
'sat-narrow-past-few' => '{0} dydd Sadwrn yn ôl',
'sat-narrow-past-many' => '{0} dydd Sadwrn yn ôl',
- 'sat-narrow-past-one' => '{0} dydd Sadwrn yn ôl',
- 'sat-narrow-past-other' => '{0} dydd Sadwrn yn ôl',
+ 'sat-narrow-past-one' => '{0} Sad. yn ôl',
+ 'sat-narrow-past-other' => '{0} Sad. yn ôl',
'sat-narrow-past-two' => '{0} dydd Sadwrn yn ôl',
'sat-narrow-past-zero' => '{0} dydd Sadwrn yn ôl',
'sat-past-few' => '{0} dydd Sadwrn yn ôl',
@@ -1648,14 +1648,14 @@ $timeUnits = [
'sat-past-zero' => '{0} dydd Sadwrn yn ôl',
'sat-short-future-few' => 'ymhen {0} dydd Sadwrn',
'sat-short-future-many' => 'ymhen {0} dydd Sadwrn',
- 'sat-short-future-one' => 'ymhen {0} dydd Sadwrn',
- 'sat-short-future-other' => 'ymhen {0} dydd Sadwrn',
+ 'sat-short-future-one' => 'ymhen {0} Sad.',
+ 'sat-short-future-other' => 'ymhen {0} Sad.',
'sat-short-future-two' => 'ymhen {0} dydd Sadwrn',
'sat-short-future-zero' => 'ymhen {0} dydd Sadwrn',
'sat-short-past-few' => '{0} dydd Sadwrn yn ôl',
'sat-short-past-many' => '{0} dydd Sadwrn yn ôl',
- 'sat-short-past-one' => '{0} dydd Sadwrn yn ôl',
- 'sat-short-past-other' => '{0} dydd Sadwrn yn ôl',
+ 'sat-short-past-one' => '{0} Sad. yn ôl',
+ 'sat-short-past-other' => '{0} Sad. yn ôl',
'sat-short-past-two' => '{0} dydd Sadwrn yn ôl',
'sat-short-past-zero' => '{0} dydd Sadwrn yn ôl',
'second-few' => '{0} eiliad',
@@ -1688,14 +1688,14 @@ $timeUnits = [
'second-past-zero' => '{0} eiliad yn ôl',
'second-short-future-few' => 'ymhen {0} eiliad',
'second-short-future-many' => 'ymhen {0} eiliad',
- 'second-short-future-one' => 'ymhen {0} eiliad',
- 'second-short-future-other' => 'ymhen {0} eiliad',
+ 'second-short-future-one' => 'ymhen {0} eil.',
+ 'second-short-future-other' => 'ymhen {0} eil.',
'second-short-future-two' => 'ymhen {0} eiliad',
'second-short-future-zero' => 'ymhen {0} eiliad',
'second-short-past-few' => '{0} eiliad yn ôl',
'second-short-past-many' => '{0} eiliad yn ôl',
- 'second-short-past-one' => '{0} eiliad yn ôl',
- 'second-short-past-other' => '{0} eiliad yn ôl',
+ 'second-short-past-one' => '{0} eil. yn ôl',
+ 'second-short-past-other' => '{0} eil. yn ôl',
'second-short-past-two' => '{0} eiliad yn ôl',
'second-short-past-zero' => '{0} eiliad yn ôl',
'second-two' => '{0} eiliad',
@@ -1708,14 +1708,14 @@ $timeUnits = [
'sun-future-zero' => 'ymhen {0} Dydd Sul',
'sun-narrow-future-few' => 'ymhen {0} Dydd Sul',
'sun-narrow-future-many' => 'ymhen {0} Dydd Sul',
- 'sun-narrow-future-one' => 'ymhen {0} Dydd Sul',
- 'sun-narrow-future-other' => 'ymhen {0} Dydd Sul',
+ 'sun-narrow-future-one' => 'ymhen {0} Sul',
+ 'sun-narrow-future-other' => 'ymhen {0} Sul',
'sun-narrow-future-two' => 'ymhen {0} Dydd Sul',
'sun-narrow-future-zero' => 'ymhen {0} Dydd Sul',
'sun-narrow-past-few' => '{0} Dydd Sul yn ôl',
'sun-narrow-past-many' => '{0} Dydd Sul yn ôl',
- 'sun-narrow-past-one' => '{0} Dydd Sul yn ôl',
- 'sun-narrow-past-other' => '{0} Dydd Sul yn ôl',
+ 'sun-narrow-past-one' => '{0} Sul yn ôl',
+ 'sun-narrow-past-other' => '{0} Sul yn ôl',
'sun-narrow-past-two' => '{0} Dydd Sul yn ôl',
'sun-narrow-past-zero' => '{0} Dydd Sul yn ôl',
'sun-past-few' => '{0} Dydd Sul yn ôl',
@@ -1726,14 +1726,14 @@ $timeUnits = [
'sun-past-zero' => '{0} Dydd Sul yn ôl',
'sun-short-future-few' => 'ymhen {0} Dydd Sul',
'sun-short-future-many' => 'ymhen {0} Dydd Sul',
- 'sun-short-future-one' => 'ymhen {0} Dydd Sul',
- 'sun-short-future-other' => 'ymhen {0} Dydd Sul',
+ 'sun-short-future-one' => 'ymhen {0} Sul',
+ 'sun-short-future-other' => 'ymhen {0} Sul',
'sun-short-future-two' => 'ymhen {0} Dydd Sul',
'sun-short-future-zero' => 'ymhen {0} Dydd Sul',
'sun-short-past-few' => '{0} Dydd Sul yn ôl',
'sun-short-past-many' => '{0} Dydd Sul yn ôl',
- 'sun-short-past-one' => '{0} Dydd Sul yn ôl',
- 'sun-short-past-other' => '{0} Dydd Sul yn ôl',
+ 'sun-short-past-one' => '{0} Sul yn ôl',
+ 'sun-short-past-other' => '{0} Sul yn ôl',
'sun-short-past-two' => '{0} Dydd Sul yn ôl',
'sun-short-past-zero' => '{0} Dydd Sul yn ôl',
'thu-future-few' => 'ymhen {0} dydd Iau',
@@ -1744,14 +1744,14 @@ $timeUnits = [
'thu-future-zero' => 'ymhen {0} dydd Iau',
'thu-narrow-future-few' => 'ymhen {0} dydd Iau',
'thu-narrow-future-many' => 'ymhen {0} dydd Iau',
- 'thu-narrow-future-one' => 'ymhen {0} dydd Iau',
- 'thu-narrow-future-other' => 'ymhen {0} dydd Iau',
+ 'thu-narrow-future-one' => 'ymhen {0} Iau',
+ 'thu-narrow-future-other' => 'ymhen {0} Iau',
'thu-narrow-future-two' => 'ymhen {0} dydd Iau',
'thu-narrow-future-zero' => 'ymhen {0} dydd Iau',
'thu-narrow-past-few' => '{0} dydd Iau yn ôl',
'thu-narrow-past-many' => '{0} dydd Iau yn ôl',
- 'thu-narrow-past-one' => '{0} dydd Iau yn ôl',
- 'thu-narrow-past-other' => '{0} dydd Iau yn ôl',
+ 'thu-narrow-past-one' => '{0} Iau yn ôl',
+ 'thu-narrow-past-other' => '{0} Iau yn ôl',
'thu-narrow-past-two' => '{0} dydd Iau yn ôl',
'thu-narrow-past-zero' => '{0} dydd Iau yn ôl',
'thu-past-few' => '{0} dydd Iau yn ôl',
@@ -1762,14 +1762,14 @@ $timeUnits = [
'thu-past-zero' => '{0} dydd Iau yn ôl',
'thu-short-future-few' => 'ymhen {0} dydd Iau',
'thu-short-future-many' => 'ymhen {0} dydd Iau',
- 'thu-short-future-one' => 'ymhen {0} dydd Iau',
- 'thu-short-future-other' => 'ymhen {0} dydd Iau',
+ 'thu-short-future-one' => 'ymhen {0} Iau',
+ 'thu-short-future-other' => 'ymhen {0} Iau',
'thu-short-future-two' => 'ymhen {0} dydd Iau',
'thu-short-future-zero' => 'ymhen {0} dydd Iau',
'thu-short-past-few' => '{0} dydd Iau yn ôl',
'thu-short-past-many' => '{0} dydd Iau yn ôl',
- 'thu-short-past-one' => '{0} dydd Iau yn ôl',
- 'thu-short-past-other' => '{0} dydd Iau yn ôl',
+ 'thu-short-past-one' => '{0} Iau yn ôl',
+ 'thu-short-past-other' => '{0} Iau yn ôl',
'thu-short-past-two' => '{0} dydd Iau yn ôl',
'thu-short-past-zero' => '{0} dydd Iau yn ôl',
'tue-future-few' => 'ymhen {0} dydd Mawrth',
@@ -1780,14 +1780,14 @@ $timeUnits = [
'tue-future-zero' => 'ymhen {0} dydd Mawrth',
'tue-narrow-future-few' => 'ymhen {0} dydd Mawrth',
'tue-narrow-future-many' => 'ymhen {0} dydd Mawrth',
- 'tue-narrow-future-one' => 'ymhen {0} dydd Mawrth',
- 'tue-narrow-future-other' => 'ymhen {0} dydd Mawrth',
+ 'tue-narrow-future-one' => 'ymhen {0} Maw.',
+ 'tue-narrow-future-other' => 'ymhen {0} Maw.',
'tue-narrow-future-two' => 'ymhen {0} dydd Mawrth',
'tue-narrow-future-zero' => 'ymhen {0} dydd Mawrth',
'tue-narrow-past-few' => '{0} dydd Mawrth yn ôl',
'tue-narrow-past-many' => '{0} dydd Mawrth yn ôl',
- 'tue-narrow-past-one' => '{0} dydd Mawrth yn ôl',
- 'tue-narrow-past-other' => '{0} dydd Mawrth yn ôl',
+ 'tue-narrow-past-one' => '{0} Maw. yn ôl',
+ 'tue-narrow-past-other' => '{0} Maw. yn ôl',
'tue-narrow-past-two' => '{0} dydd Mawrth yn ôl',
'tue-narrow-past-zero' => '{0} dydd Mawrth yn ôl',
'tue-past-few' => '{0} dydd Mawrth yn ôl',
@@ -1798,14 +1798,14 @@ $timeUnits = [
'tue-past-zero' => '{0} dydd Mawrth yn ôl',
'tue-short-future-few' => 'ymhen {0} dydd Mawrth',
'tue-short-future-many' => 'ymhen {0} dydd Mawrth',
- 'tue-short-future-one' => 'ymhen {0} dydd Mawrth',
- 'tue-short-future-other' => 'ymhen {0} dydd Mawrth',
+ 'tue-short-future-one' => 'ymhen {0} Maw.',
+ 'tue-short-future-other' => 'ymhen {0} Maw.',
'tue-short-future-two' => 'ymhen {0} dydd Mawrth',
'tue-short-future-zero' => 'ymhen {0} dydd Mawrth',
'tue-short-past-few' => '{0} dydd Mawrth yn ôl',
'tue-short-past-many' => '{0} dydd Mawrth yn ôl',
- 'tue-short-past-one' => '{0} dydd Mawrth yn ôl',
- 'tue-short-past-other' => '{0} dydd Mawrth yn ôl',
+ 'tue-short-past-one' => '{0} Maw. yn ôl',
+ 'tue-short-past-other' => '{0} Maw. yn ôl',
'tue-short-past-two' => '{0} dydd Mawrth yn ôl',
'tue-short-past-zero' => '{0} dydd Mawrth yn ôl',
'wed-future-few' => 'ymhen {0} dydd Mercher',
@@ -1816,14 +1816,14 @@ $timeUnits = [
'wed-future-zero' => 'ymhen {0} dydd Mercher',
'wed-narrow-future-few' => 'ymhen {0} dydd Mercher',
'wed-narrow-future-many' => 'ymhen {0} dydd Mercher',
- 'wed-narrow-future-one' => 'ymhen {0} dydd Mercher',
- 'wed-narrow-future-other' => 'ymhen {0} dydd Mercher',
+ 'wed-narrow-future-one' => 'ymhen {0} Me.',
+ 'wed-narrow-future-other' => 'ymhen {0} Me.',
'wed-narrow-future-two' => 'ymhen {0} dydd Mercher',
'wed-narrow-future-zero' => 'ymhen {0} dydd Mercher',
'wed-narrow-past-few' => '{0} dydd Mercher yn ôl',
'wed-narrow-past-many' => '{0} dydd Mercher yn ôl',
- 'wed-narrow-past-one' => '{0} dydd Mercher yn ôl',
- 'wed-narrow-past-other' => '{0} dydd Mercher yn ôl',
+ 'wed-narrow-past-one' => '{0} Me. yn ôl',
+ 'wed-narrow-past-other' => '{0} Me. yn ôl',
'wed-narrow-past-two' => '{0} dydd Mercher yn ôl',
'wed-narrow-past-zero' => '{0} dydd Mercher yn ôl',
'wed-past-few' => '{0} dydd Mercher yn ôl',
@@ -1834,14 +1834,14 @@ $timeUnits = [
'wed-past-zero' => '{0} dydd Mercher yn ôl',
'wed-short-future-few' => 'ymhen {0} dydd Mercher',
'wed-short-future-many' => 'ymhen {0} dydd Mercher',
- 'wed-short-future-one' => 'ymhen {0} dydd Mercher',
- 'wed-short-future-other' => 'ymhen {0} dydd Mercher',
+ 'wed-short-future-one' => 'ymhen {0} Mer.',
+ 'wed-short-future-other' => 'ymhen {0} Mer.',
'wed-short-future-two' => 'ymhen {0} dydd Mercher',
'wed-short-future-zero' => 'ymhen {0} dydd Mercher',
'wed-short-past-few' => '{0} dydd Mercher yn ôl',
'wed-short-past-many' => '{0} dydd Mercher yn ôl',
- 'wed-short-past-one' => '{0} dydd Mercher yn ôl',
- 'wed-short-past-other' => '{0} dydd Mercher yn ôl',
+ 'wed-short-past-one' => '{0} Mer. yn ôl',
+ 'wed-short-past-other' => '{0} Mer. yn ôl',
'wed-short-past-two' => '{0} dydd Mercher yn ôl',
'wed-short-past-zero' => '{0} dydd Mercher yn ôl',
'week-few' => '{0} wythnos',
@@ -1854,14 +1854,14 @@ $timeUnits = [
'week-many' => '{0} wythnos',
'week-narrow-future-few' => 'ymhen {0} wythnos',
'week-narrow-future-many' => 'ymhen {0} wythnos',
- 'week-narrow-future-one' => 'ymhen {0} wythnos',
- 'week-narrow-future-other' => 'ymhen {0} wythnos',
+ 'week-narrow-future-one' => 'ymhen {0} ws.',
+ 'week-narrow-future-other' => 'ymhen {0} ws.',
'week-narrow-future-two' => 'ymhen {0} wythnos',
'week-narrow-future-zero' => 'ymhen {0} wythnos',
'week-narrow-past-few' => '{0} wythnos yn ôl',
'week-narrow-past-many' => '{0} wythnos yn ôl',
- 'week-narrow-past-one' => '{0} wythnos yn ôl',
- 'week-narrow-past-other' => '{0} wythnos yn ôl',
+ 'week-narrow-past-one' => '{0} ws. yn ôl',
+ 'week-narrow-past-other' => '{0} ws. yn ôl',
'week-narrow-past-two' => 'pythefnos yn ôl',
'week-narrow-past-zero' => '{0} wythnos yn ôl',
'week-one' => '{0} wythnos',
@@ -1874,14 +1874,14 @@ $timeUnits = [
'week-past-zero' => '{0} wythnos yn ôl',
'week-short-future-few' => 'ymhen {0} wythnos',
'week-short-future-many' => 'ymhen {0} wythnos',
- 'week-short-future-one' => 'ymhen wythnos',
- 'week-short-future-other' => 'ymhen {0} wythnos',
+ 'week-short-future-one' => 'ymhen ws.',
+ 'week-short-future-other' => 'ymhen {0} ws.',
'week-short-future-two' => 'ymhen pythefnos',
'week-short-future-zero' => 'ymhen {0} wythnos',
'week-short-past-few' => '{0} wythnos yn ôl',
'week-short-past-many' => '{0} wythnos yn ôl',
- 'week-short-past-one' => '{0} wythnos yn ôl',
- 'week-short-past-other' => '{0} wythnos yn ôl',
+ 'week-short-past-one' => '{0} ws. yn ôl',
+ 'week-short-past-other' => '{0} ws yn ôl.',
'week-short-past-two' => 'pythefnos yn ôl',
'week-short-past-zero' => '{0} wythnos yn ôl',
'week-two' => '{0} wythnos',
@@ -1896,14 +1896,14 @@ $timeUnits = [
'year-many' => '{0} blynedd',
'year-narrow-future-few' => 'ymhen {0} blynedd',
'year-narrow-future-many' => 'ymhen {0} blynedd',
- 'year-narrow-future-one' => 'ymhen blwyddyn',
+ 'year-narrow-future-one' => 'ymhen bl.',
'year-narrow-future-other' => 'ymhen {0} mlynedd',
'year-narrow-future-two' => 'ymhen {0} flynedd',
'year-narrow-future-zero' => 'ymhen {0} mlynedd',
'year-narrow-past-few' => '{0} blynedd yn ôl',
'year-narrow-past-many' => '{0} blynedd yn ôl',
'year-narrow-past-one' => 'blwyddyn yn ôl',
- 'year-narrow-past-other' => '{0} o flynyddoedd yn ôl',
+ 'year-narrow-past-other' => '{0} bl. yn ôl',
'year-narrow-past-two' => '{0} flynedd yn ôl',
'year-narrow-past-zero' => '{0} o flynyddoedd yn ôl',
'year-one' => '{0} flwyddyn',
@@ -1922,8 +1922,8 @@ $timeUnits = [
'year-short-future-zero' => 'ymhen {0} mlynedd',
'year-short-past-few' => '{0} blynedd yn ôl',
'year-short-past-many' => '{0} blynedd yn ôl',
- 'year-short-past-one' => 'blwyddyn yn ôl',
- 'year-short-past-other' => '{0} o flynyddoedd yn ôl',
+ 'year-short-past-one' => '{0} bl. yn ôl',
+ 'year-short-past-other' => '{0} bl. yn ôl',
'year-short-past-two' => '{0} flynedd yn ôl',
'year-short-past-zero' => '{0} o flynyddoedd yn ôl',
'year-two' => '{0} flynedd',
diff --git a/MLEB/cldr/CldrNames/CldrNamesDa.php b/MLEB/cldr/CldrNames/CldrNamesDa.php
index db64c48a..c887bd95 100644
--- a/MLEB/cldr/CldrNames/CldrNamesDa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesDa.php
@@ -156,7 +156,7 @@ $languageNames = [
'fro' => 'oldfransk',
'frr' => 'nordfrisisk',
'frs' => 'østfrisisk',
- 'fur' => 'friulian',
+ 'fur' => 'friulisk',
'fy' => 'vestfrisisk',
'ga' => 'irsk',
'gaa' => 'ga',
@@ -334,7 +334,7 @@ $languageNames = [
'nan' => 'min-kinesisk',
'nap' => 'napolitansk',
'naq' => 'nama',
- 'nb' => 'norsk bokmål',
+ 'nb' => 'bokmål',
'nd' => 'nordndebele',
'nds' => 'nedertysk',
'nds-nl' => 'plattysk (Holland)',
@@ -404,7 +404,7 @@ $languageNames = [
'rwk' => 'rwa',
'sa' => 'sanskrit',
'sad' => 'sandawe',
- 'sah' => 'yakut',
+ 'sah' => 'jakutisk',
'sam' => 'samaritansk aramæisk',
'saq' => 'samburu',
'sas' => 'sasak',
@@ -513,7 +513,7 @@ $languageNames = [
'wo' => 'wolof',
'wuu' => 'wu-kinesisk',
'xal' => 'kalmyk',
- 'xh' => 'isiXhosa',
+ 'xh' => 'xhosa',
'xog' => 'soga',
'yao' => 'yao',
'yap' => 'yapese',
@@ -777,7 +777,7 @@ $currencyNames = [
'TPE' => 'Escudo fra Timor',
'TRL' => 'Tyrkisk lire (1922–2005)',
'TRY' => 'tyrkisk lira',
- 'TTD' => 'dollar fra Trinidad og Tobago',
+ 'TTD' => 'trinidadisk dollar',
'TWD' => 'ny taiwansk dollar',
'TZS' => 'tanzanisk shilling',
'UAH' => 'ukrainsk grynia',
@@ -1079,7 +1079,7 @@ $countryNames = [
'FO' => 'Færøerne',
'FR' => 'Frankrig',
'GA' => 'Gabon',
- 'GB' => 'UK',
+ 'GB' => 'Storbritannien',
'GD' => 'Grenada',
'GE' => 'Georgien',
'GF' => 'Fransk Guyana',
@@ -1268,44 +1268,44 @@ $timeUnits = [
'day-future-other' => 'om {0} dage',
'day-narrow-future-one' => 'om {0} dag',
'day-narrow-future-other' => 'om {0} dage',
- 'day-narrow-past-one' => 'for {0} dag siden',
- 'day-narrow-past-other' => 'for {0} dage siden',
+ 'day-narrow-past-one' => '{0} dag siden',
+ 'day-narrow-past-other' => '{0} dage siden',
'day-one' => '{0} dag',
'day-other' => '{0} dage',
'day-past-one' => 'for {0} dag siden',
'day-past-other' => 'for {0} dage siden',
'day-short-future-one' => 'om {0} dag',
'day-short-future-other' => 'om {0} dage',
- 'day-short-past-one' => 'for {0} dag siden',
- 'day-short-past-other' => 'for {0} dage siden',
+ 'day-short-past-one' => '{0} dag siden',
+ 'day-short-past-other' => '{0} dage siden',
'decade-one' => '{0} årti',
'decade-other' => '{0} årtier',
'fri-future-one' => 'om {0} fredag',
'fri-future-other' => 'om {0} fredage',
- 'fri-narrow-future-one' => 'om {0} fredag',
- 'fri-narrow-future-other' => 'om {0} fredage',
- 'fri-narrow-past-one' => 'for {0} fredag siden',
- 'fri-narrow-past-other' => 'for {0} fredage siden',
+ 'fri-narrow-future-one' => 'om {0} fr.',
+ 'fri-narrow-future-other' => 'om {0} fr.',
+ 'fri-narrow-past-one' => '{0} fr. siden',
+ 'fri-narrow-past-other' => '{0} fr. siden',
'fri-past-one' => 'for {0} fredag siden',
'fri-past-other' => 'for {0} fredage siden',
- 'fri-short-future-one' => 'om {0} fredag',
- 'fri-short-future-other' => 'om {0} fredage',
- 'fri-short-past-one' => 'for {0} fredag siden',
- 'fri-short-past-other' => 'for {0} fredage siden',
+ 'fri-short-future-one' => 'om {0} fre.',
+ 'fri-short-future-other' => 'om {0} fre.',
+ 'fri-short-past-one' => '{0} fre. siden',
+ 'fri-short-past-other' => '{0} fre. siden',
'hour-future-one' => 'om {0} time',
'hour-future-other' => 'om {0} timer',
'hour-narrow-future-one' => 'om {0} time',
'hour-narrow-future-other' => 'om {0} timer',
- 'hour-narrow-past-one' => 'for {0} time siden',
- 'hour-narrow-past-other' => 'for {0} timer siden',
+ 'hour-narrow-past-one' => '{0} time siden',
+ 'hour-narrow-past-other' => '{0} timer siden',
'hour-one' => '{0} time',
'hour-other' => '{0} timer',
'hour-past-one' => 'for {0} time siden',
'hour-past-other' => 'for {0} timer siden',
'hour-short-future-one' => 'om {0} time',
'hour-short-future-other' => 'om {0} timer',
- 'hour-short-past-one' => 'for {0} time siden',
- 'hour-short-past-other' => 'for {0} timer siden',
+ 'hour-short-past-one' => '{0} time siden',
+ 'hour-short-past-other' => '{0} timer siden',
'microsecond-one' => '{0} mikrosekund',
'microsecond-other' => '{0} mikrosekunder',
'millisecond-one' => '{0} millisekund',
@@ -1314,156 +1314,156 @@ $timeUnits = [
'minute-future-other' => 'om {0} minutter',
'minute-narrow-future-one' => 'om {0} min.',
'minute-narrow-future-other' => 'om {0} min.',
- 'minute-narrow-past-one' => 'for {0} min. siden',
- 'minute-narrow-past-other' => 'for {0} min. siden',
+ 'minute-narrow-past-one' => '{0} min. siden',
+ 'minute-narrow-past-other' => '{0} min. siden',
'minute-one' => '{0} minut',
'minute-other' => '{0} minutter',
'minute-past-one' => 'for {0} minut siden',
'minute-past-other' => 'for {0} minutter siden',
'minute-short-future-one' => 'om {0} min.',
'minute-short-future-other' => 'om {0} min.',
- 'minute-short-past-one' => 'for {0} min. siden',
- 'minute-short-past-other' => 'for {0} min. siden',
+ 'minute-short-past-one' => '{0} min. siden',
+ 'minute-short-past-other' => '{0} min. siden',
'mon-future-one' => 'om {0} mandag',
'mon-future-other' => 'om {0} mandage',
- 'mon-narrow-future-one' => 'om {0} mandag',
- 'mon-narrow-future-other' => 'om {0} mandage',
- 'mon-narrow-past-one' => 'for {0} mandag siden',
- 'mon-narrow-past-other' => 'for {0} mandage siden',
+ 'mon-narrow-future-one' => 'om {0} ma.',
+ 'mon-narrow-future-other' => 'om {0} ma.',
+ 'mon-narrow-past-one' => '{0} ma. siden',
+ 'mon-narrow-past-other' => '{0} ma. siden',
'mon-past-one' => 'for {0} mandag siden',
'mon-past-other' => 'for {0} mandage siden',
- 'mon-short-future-one' => 'om {0} mandag',
- 'mon-short-future-other' => 'om {0} mandage',
- 'mon-short-past-one' => 'for {0} mandag siden',
- 'mon-short-past-other' => 'for {0} mandage siden',
+ 'mon-short-future-one' => 'om {0} man.',
+ 'mon-short-future-other' => 'om {0} man.',
+ 'mon-short-past-one' => '{0} man. siden',
+ 'mon-short-past-other' => '{0} man. siden',
'month-future-one' => 'om {0} måned',
'month-future-other' => 'om {0} måneder',
'month-narrow-future-one' => 'om {0} md.',
'month-narrow-future-other' => 'om {0} mdr.',
- 'month-narrow-past-one' => 'for {0} md. siden',
- 'month-narrow-past-other' => 'for {0} mdr. siden',
+ 'month-narrow-past-one' => '{0} md. siden',
+ 'month-narrow-past-other' => '{0} mdr. siden',
'month-one' => '{0} måned',
'month-other' => '{0} måneder',
'month-past-one' => 'for {0} måned siden',
'month-past-other' => 'for {0} måneder siden',
'month-short-future-one' => 'om {0} md.',
'month-short-future-other' => 'om {0} mdr.',
- 'month-short-past-one' => 'for {0} md. siden',
- 'month-short-past-other' => 'for {0} mdr. siden',
+ 'month-short-past-one' => '{0} md. siden',
+ 'month-short-past-other' => '{0} mdr. siden',
'nanosecond-one' => '{0} nanosekund',
'nanosecond-other' => '{0} nanosekunder',
'quarter-future-one' => 'om {0} kvartal',
'quarter-future-other' => 'om {0} kvartaler',
'quarter-narrow-future-one' => 'om {0} kvt.',
'quarter-narrow-future-other' => 'om {0} kvt.',
- 'quarter-narrow-past-one' => 'for {0} kvt. siden',
- 'quarter-narrow-past-other' => 'for {0} kvt. siden',
+ 'quarter-narrow-past-one' => '{0} kvt. siden',
+ 'quarter-narrow-past-other' => '{0} kvt. siden',
'quarter-past-one' => 'for {0} kvartal siden',
'quarter-past-other' => 'for {0} kvartaler siden',
'quarter-short-future-one' => 'om {0} kvt.',
'quarter-short-future-other' => 'om {0} kvt.',
- 'quarter-short-past-one' => 'for {0} kvt. siden',
- 'quarter-short-past-other' => 'for {0} kvt. siden',
+ 'quarter-short-past-one' => '{0} kvt. siden',
+ 'quarter-short-past-other' => '{0} kvt. siden',
'sat-future-one' => 'om {0} lørdag',
'sat-future-other' => 'om {0} lørdage',
- 'sat-narrow-future-one' => 'om {0} lørdag',
- 'sat-narrow-future-other' => 'om {0} lørdage',
- 'sat-narrow-past-one' => 'for {0} lørdag siden',
- 'sat-narrow-past-other' => 'for {0} lørdage siden',
+ 'sat-narrow-future-one' => 'om {0} lø.',
+ 'sat-narrow-future-other' => 'om {0} lø.',
+ 'sat-narrow-past-one' => '{0} lø. siden',
+ 'sat-narrow-past-other' => '{0} lø. siden',
'sat-past-one' => 'for {0} lørdag siden',
'sat-past-other' => 'for {0} lørdage siden',
- 'sat-short-future-one' => 'om {0} lørdag',
- 'sat-short-future-other' => 'om {0} lørdage',
- 'sat-short-past-one' => 'for {0} lørdag siden',
- 'sat-short-past-other' => 'for {0} lørdage siden',
+ 'sat-short-future-one' => 'om {0} lør.',
+ 'sat-short-future-other' => 'om {0} lør.',
+ 'sat-short-past-one' => '{0} lør. siden',
+ 'sat-short-past-other' => '{0} lør. siden',
'second-future-one' => 'om {0} sekund',
'second-future-other' => 'om {0} sekunder',
'second-narrow-future-one' => 'om {0} sek.',
'second-narrow-future-other' => 'om {0} sek.',
- 'second-narrow-past-one' => 'for {0} sek. siden',
- 'second-narrow-past-other' => 'for {0} sek. siden',
+ 'second-narrow-past-one' => '{0} sek. siden',
+ 'second-narrow-past-other' => '{0} sek. siden',
'second-one' => '{0} sekund',
'second-other' => '{0} sekunder',
'second-past-one' => 'for {0} sekund siden',
'second-past-other' => 'for {0} sekunder siden',
'second-short-future-one' => 'om {0} sek.',
'second-short-future-other' => 'om {0} sek.',
- 'second-short-past-one' => 'for {0} sek. siden',
- 'second-short-past-other' => 'for {0} sek. siden',
+ 'second-short-past-one' => '{0} sek. siden',
+ 'second-short-past-other' => '{0} sek. siden',
'sun-future-one' => 'om {0} søndag',
'sun-future-other' => 'om {0} søndage',
- 'sun-narrow-future-one' => 'om {0} søndag',
- 'sun-narrow-future-other' => 'om {0} søndage',
- 'sun-narrow-past-one' => 'for {0} søndag siden',
- 'sun-narrow-past-other' => 'for {0} søndage siden',
+ 'sun-narrow-future-one' => 'om {0} sø.',
+ 'sun-narrow-future-other' => 'om {0} sø.',
+ 'sun-narrow-past-one' => '{0} sø. siden',
+ 'sun-narrow-past-other' => '{0} sø. siden',
'sun-past-one' => 'for {0} søndag siden',
'sun-past-other' => 'for {0} søndage siden',
- 'sun-short-future-one' => 'om {0} søndag',
- 'sun-short-future-other' => 'om {0} søndage',
- 'sun-short-past-one' => 'for {0} søndag siden',
- 'sun-short-past-other' => 'for {0} søndage siden',
+ 'sun-short-future-one' => 'om {0} søn.',
+ 'sun-short-future-other' => 'om {0} søn.',
+ 'sun-short-past-one' => '{0} søn. siden',
+ 'sun-short-past-other' => '{0} søn. siden',
'thu-future-one' => 'om {0} torsdag',
'thu-future-other' => 'om {0} torsdage',
- 'thu-narrow-future-one' => 'om {0} torsdag',
- 'thu-narrow-future-other' => 'om {0} torsdage',
- 'thu-narrow-past-one' => 'for {0} torsdag siden',
- 'thu-narrow-past-other' => 'for {0} torsdage siden',
+ 'thu-narrow-future-one' => 'om {0} to.',
+ 'thu-narrow-future-other' => 'om {0} to.',
+ 'thu-narrow-past-one' => '{0} to. siden',
+ 'thu-narrow-past-other' => '{0} to. siden',
'thu-past-one' => 'for {0} torsdag siden',
'thu-past-other' => 'for {0} torsdage siden',
- 'thu-short-future-one' => 'om {0} torsdag',
- 'thu-short-future-other' => 'om {0} torsdage',
- 'thu-short-past-one' => 'for {0} torsdag siden',
- 'thu-short-past-other' => 'for {0} torsdage siden',
+ 'thu-short-future-one' => 'om {0} tor.',
+ 'thu-short-future-other' => 'om {0} tor.',
+ 'thu-short-past-one' => '{0} tor. siden',
+ 'thu-short-past-other' => '{0} tor. siden',
'tue-future-one' => 'om {0} tirsdag',
'tue-future-other' => 'om {0} tirsdage',
- 'tue-narrow-future-one' => 'om {0} tirsdag',
- 'tue-narrow-future-other' => 'om {0} tirsdage',
- 'tue-narrow-past-one' => 'for {0} tirsdag siden',
- 'tue-narrow-past-other' => 'for {0} tirsdage siden',
+ 'tue-narrow-future-one' => 'om {0} ti.',
+ 'tue-narrow-future-other' => 'om {0} ti.',
+ 'tue-narrow-past-one' => '{0} ti. siden',
+ 'tue-narrow-past-other' => '{0} ti. siden',
'tue-past-one' => 'for {0} tirsdag siden',
'tue-past-other' => 'for {0} tirsdage siden',
- 'tue-short-future-one' => 'om {0} tirsdag',
- 'tue-short-future-other' => 'om {0} tirsdage',
- 'tue-short-past-one' => 'for {0} tirsdag siden',
- 'tue-short-past-other' => 'for {0} tirsdage siden',
+ 'tue-short-future-one' => 'om {0} tir.',
+ 'tue-short-future-other' => 'om {0} tir.',
+ 'tue-short-past-one' => '{0} tir. siden',
+ 'tue-short-past-other' => '{0} tir. siden',
'wed-future-one' => 'om {0} onsdag',
'wed-future-other' => 'om {0} onsdage',
- 'wed-narrow-future-one' => 'om {0} onsdag',
- 'wed-narrow-future-other' => 'om {0} onsdage',
- 'wed-narrow-past-one' => 'for {0} onsdag siden',
- 'wed-narrow-past-other' => 'for {0} onsdage siden',
+ 'wed-narrow-future-one' => 'om {0} on.',
+ 'wed-narrow-future-other' => 'om {0} on.',
+ 'wed-narrow-past-one' => '{0} on. siden',
+ 'wed-narrow-past-other' => '{0} on. siden',
'wed-past-one' => 'for {0} onsdag siden',
'wed-past-other' => 'for {0} onsdage siden',
- 'wed-short-future-one' => 'om {0} onsdag',
- 'wed-short-future-other' => 'om {0} onsdage',
- 'wed-short-past-one' => 'for {0} onsdag siden',
- 'wed-short-past-other' => 'for {0} onsdage siden',
+ 'wed-short-future-one' => 'om {0} ons.',
+ 'wed-short-future-other' => 'om {0} ons.',
+ 'wed-short-past-one' => '{0} ons. siden',
+ 'wed-short-past-other' => '{0} ons. siden',
'week-future-one' => 'om {0} uge',
'week-future-other' => 'om {0} uger',
'week-narrow-future-one' => 'om {0} uge',
'week-narrow-future-other' => 'om {0} uger',
- 'week-narrow-past-one' => 'for {0} uge siden',
- 'week-narrow-past-other' => 'for {0} uger siden',
+ 'week-narrow-past-one' => '{0} uge siden',
+ 'week-narrow-past-other' => '{0} uger siden',
'week-one' => '{0} uge',
'week-other' => '{0} uger',
'week-past-one' => 'for {0} uge siden',
'week-past-other' => 'for {0} uger siden',
'week-short-future-one' => 'om {0} uge',
'week-short-future-other' => 'om {0} uger',
- 'week-short-past-one' => 'for {0} uge siden',
- 'week-short-past-other' => 'for {0} uger siden',
+ 'week-short-past-one' => '{0} uge siden',
+ 'week-short-past-other' => '{0} uger siden',
'year-future-one' => 'om {0} år',
'year-future-other' => 'om {0} år',
'year-narrow-future-one' => 'om {0} år',
'year-narrow-future-other' => 'om {0} år',
- 'year-narrow-past-one' => 'for {0} år siden',
- 'year-narrow-past-other' => 'for {0} år siden',
+ 'year-narrow-past-one' => '{0} år siden',
+ 'year-narrow-past-other' => '{0} år siden',
'year-one' => '{0} år',
'year-other' => '{0} år',
'year-past-one' => 'for {0} år siden',
'year-past-other' => 'for {0} år siden',
'year-short-future-one' => 'om {0} år',
'year-short-future-other' => 'om {0} år',
- 'year-short-past-one' => 'for {0} år siden',
- 'year-short-past-other' => 'for {0} år siden',
+ 'year-short-past-one' => '{0} år siden',
+ 'year-short-past-other' => '{0} år siden',
];
diff --git a/MLEB/cldr/CldrNames/CldrNamesDe.php b/MLEB/cldr/CldrNames/CldrNamesDe.php
index 010b1128..aa217b5a 100644
--- a/MLEB/cldr/CldrNames/CldrNamesDe.php
+++ b/MLEB/cldr/CldrNames/CldrNamesDe.php
@@ -37,7 +37,7 @@ $languageNames = [
'as' => 'Assamesisch',
'asa' => 'Asu',
'ase' => 'Amerikanische Gebärdensprache',
- 'ast' => 'Asturianisch',
+ 'ast' => 'Asturisch',
'av' => 'Awarisch',
'avk' => 'Kotava',
'awa' => 'Awadhi',
@@ -47,11 +47,11 @@ $languageNames = [
'bal' => 'Belutschisch',
'ban' => 'Balinesisch',
'bar' => 'Bairisch',
- 'bas' => 'Basaa',
+ 'bas' => 'Bassa',
'bax' => 'Bamun',
'bbc' => 'Batak Toba',
'bbj' => 'Ghomala',
- 'be' => 'Weißrussisch',
+ 'be' => 'Belarussisch',
'bej' => 'Bedauye',
'bem' => 'Bemba',
'bew' => 'Betawi',
@@ -180,7 +180,7 @@ $languageNames = [
'gay' => 'Gayo',
'gba' => 'Gbaya',
'gbz' => 'Gabri',
- 'gd' => 'Schottisches Gälisch',
+ 'gd' => 'Gälisch (Schottland)',
'gez' => 'Geez',
'gil' => 'Kiribatisch',
'gl' => 'Galicisch',
@@ -340,7 +340,7 @@ $languageNames = [
'men' => 'Mende',
'mer' => 'Meru',
'mfe' => 'Morisyen',
- 'mg' => 'Madagassisch',
+ 'mg' => 'Malagasy',
'mga' => 'Mittelirisch',
'mgh' => 'Makhuwa-Meetto',
'mgo' => 'Meta’',
@@ -373,7 +373,7 @@ $languageNames = [
'nan' => 'Min Nan',
'nap' => 'Neapolitanisch',
'naq' => 'Nama',
- 'nb' => 'Norwegisch Bokmål',
+ 'nb' => 'Norwegisch (Bokmål)',
'nd' => 'Nord-Ndebele',
'nds' => 'Niederdeutsch',
'nds-nl' => 'Niedersächsisch',
@@ -386,7 +386,7 @@ $languageNames = [
'nl' => 'Niederländisch',
'nl-be' => 'Flämisch',
'nmg' => 'Kwasio',
- 'nn' => 'Norwegisch Nynorsk',
+ 'nn' => 'Norwegisch (Nynorsk)',
'nnh' => 'Ngiemboon',
'no' => 'Norwegisch',
'nog' => 'Nogai',
@@ -633,7 +633,7 @@ $currencyNames = [
'AZM' => 'Aserbaidschan-Manat (1993–2006)',
'AZN' => 'Aserbaidschan-Manat',
'BAD' => 'Bosnien und Herzegowina Dinar (1992–1994)',
- 'BAM' => 'Bosnien und Herzegowina Konvertierbare Mark',
+ 'BAM' => 'Konvertible Mark Bosnien und Herzegowina',
'BAN' => 'Bosnien und Herzegowina Neuer Dinar (1994–1997)',
'BBD' => 'Barbados-Dollar',
'BDT' => 'Bangladesch-Taka',
@@ -675,7 +675,7 @@ $currencyNames = [
'CLE' => 'Chilenischer Escudo',
'CLF' => 'Chilenische Unidades de Fomento',
'CLP' => 'Chilenischer Peso',
- 'CNH' => 'Renminbi Yuan (Off–Shore)',
+ 'CNH' => 'Renminbi-Yuan (Offshore)',
'CNX' => 'Dollar der Chinesischen Volksbank',
'CNY' => 'Renminbi Yuan',
'COP' => 'Kolumbianischer Peso',
@@ -808,7 +808,7 @@ $currencyNames = [
'PEI' => 'Peruanischer Inti',
'PEN' => 'Peruanischer Sol',
'PES' => 'Peruanischer Sol (1863–1965)',
- 'PGK' => 'Papua-Neuguineischer Kina',
+ 'PGK' => 'Papua-neuguineischer Kina',
'PHP' => 'Philippinischer Peso',
'PKR' => 'Pakistanische Rupie',
'PLN' => 'Polnischer Złoty',
@@ -831,7 +831,7 @@ $currencyNames = [
'SDP' => 'Sudanesisches Pfund (1957–1998)',
'SEK' => 'Schwedische Krone',
'SGD' => 'Singapur-Dollar',
- 'SHP' => 'St. Helena-Pfund',
+ 'SHP' => 'St.-Helena-Pfund',
'SIT' => 'Slowenischer Tolar',
'SKK' => 'Slowakische Krone',
'SLL' => 'Sierra-leonischer Leone',
@@ -855,7 +855,7 @@ $currencyNames = [
'TPE' => 'Timor-Escudo',
'TRL' => 'Türkische Lira (1922–2005)',
'TRY' => 'Türkische Lira',
- 'TTD' => 'Trinidad und Tobago-Dollar',
+ 'TTD' => 'Trinidad-und-Tobago-Dollar',
'TWD' => 'Neuer Taiwan-Dollar',
'TZS' => 'Tansania-Schilling',
'UAH' => 'Ukrainische Hrywnja',
@@ -1240,7 +1240,7 @@ $countryNames = [
'BM' => 'Bermuda',
'BN' => 'Brunei Darussalam',
'BO' => 'Bolivien',
- 'BQ' => 'Bonaire, Sint Eustatius und Saba',
+ 'BQ' => 'Karibische Niederlande',
'BR' => 'Brasilien',
'BS' => 'Bahamas',
'BT' => 'Bhutan',
@@ -1292,7 +1292,7 @@ $countryNames = [
'FO' => 'Färöer',
'FR' => 'Frankreich',
'GA' => 'Gabun',
- 'GB' => 'GB',
+ 'GB' => 'UK',
'GD' => 'Grenada',
'GE' => 'Georgien',
'GF' => 'Französisch-Guayana',
@@ -1483,7 +1483,7 @@ $timeUnits = [
'day-narrow-future-other' => 'in {0} Tagen',
'day-narrow-past-one' => 'vor {0} Tag',
'day-narrow-past-other' => 'vor {0} Tagen',
- 'day-one' => '{0} Tag',
+ 'day-one' => '{0} Tages',
'day-other' => '{0} Tage',
'day-past-one' => 'vor {0} Tag',
'day-past-other' => 'vor {0} Tagen',
@@ -1555,7 +1555,7 @@ $timeUnits = [
'month-narrow-future-other' => 'in {0} Monaten',
'month-narrow-past-one' => 'vor {0} Monat',
'month-narrow-past-other' => 'vor {0} Monaten',
- 'month-one' => '{0} Monat',
+ 'month-one' => '{0} Monats',
'month-other' => '{0} Monate',
'month-past-one' => 'vor {0} Monat',
'month-past-other' => 'vor {0} Monaten',
@@ -1671,7 +1671,7 @@ $timeUnits = [
'year-narrow-future-other' => 'in {0} Jahren',
'year-narrow-past-one' => 'vor {0} Jahr',
'year-narrow-past-other' => 'vor {0} Jahren',
- 'year-one' => '{0} Jahr',
+ 'year-one' => '{0} Jahrs',
'year-other' => '{0} Jahre',
'year-past-one' => 'vor {0} Jahr',
'year-past-other' => 'vor {0} Jahren',
diff --git a/MLEB/cldr/CldrNames/CldrNamesDe_ch.php b/MLEB/cldr/CldrNames/CldrNamesDe_ch.php
index a8e1d262..a8081f71 100644
--- a/MLEB/cldr/CldrNames/CldrNamesDe_ch.php
+++ b/MLEB/cldr/CldrNames/CldrNamesDe_ch.php
@@ -6,7 +6,6 @@ $languageNames = [
'ar-001' => 'Modernes Hocharabisch',
'ars' => 'Nadschd-Arabisch',
'bas' => 'Basaa-Sprache',
- 'be' => 'Weissrussisch',
'bik' => 'Bikol-Sprache',
'bin' => 'Bini-Sprache',
'chb' => 'Chibcha-Sprache',
@@ -31,7 +30,6 @@ $currencyNames = [
$countryNames = [
'BN' => 'Brunei',
'BW' => 'Botswana',
- 'BY' => 'Weissrussland',
'CV' => 'Kapverden',
'GB' => 'Grossbritannien',
'QO' => 'Äusseres Ozeanien',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEl.php b/MLEB/cldr/CldrNames/CldrNamesEl.php
index 0272b0d4..7379411f 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEl.php
@@ -308,7 +308,7 @@ $languageNames = [
'mi' => 'Μαορί',
'mic' => 'Μικμάκ',
'min' => 'Μινανγκαμπάου',
- 'mk' => 'Μακεδονικά',
+ 'mk' => 'Σλαβομακεδονικά',
'ml' => 'Μαλαγιαλαμικά',
'mn' => 'Μογγολικά',
'mnc' => 'Μαντσού',
@@ -487,7 +487,7 @@ $languageNames = [
'tyv' => 'Τουβινικά',
'tzm' => 'Ταμαζίτ Κεντρικού Μαρόκο',
'udm' => 'Ουντμούρτ',
- 'ug' => 'Ουιγκουρικά',
+ 'ug' => 'Ουιγουρικά',
'uga' => 'Ουγκαριτικά',
'uk' => 'Ουκρανικά',
'umb' => 'Ουμπούντου',
@@ -1209,7 +1209,7 @@ $countryNames = [
'SV' => 'Ελ Σαλβαδόρ',
'SX' => 'Άγιος Μαρτίνος (Ολλανδικό τμήμα)',
'SY' => 'Συρία',
- 'SZ' => 'Σουαζιλάνδη',
+ 'SZ' => 'Εσουατίνι',
'TA' => 'Τριστάν ντα Κούνια',
'TC' => 'Νήσοι Τερκς και Κάικος',
'TD' => 'Τσαντ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEn_ca.php b/MLEB/cldr/CldrNames/CldrNamesEn_ca.php
index 79174dec..861e0301 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEn_ca.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEn_ca.php
@@ -27,10 +27,6 @@ $languageNames = [
'zh-hant' => 'Traditional Chinese',
];
-$currencyNames = [
- 'ILS' => 'Israeli new sheqel',
-];
-
$timeUnits = [
'fri-narrow-future-one' => 'in {0} Fr',
'fri-narrow-future-other' => 'in {0} Fr’s',
@@ -56,6 +52,10 @@ $timeUnits = [
'minute-short-future-other' => 'in {0} mins.',
'minute-short-past-one' => '{0} min. ago',
'minute-short-past-other' => '{0} mins. ago',
+ 'mon-narrow-future-one' => 'in {0} M',
+ 'mon-narrow-future-other' => 'in {0} Mo’s',
+ 'mon-narrow-past-one' => '{0} M ago',
+ 'mon-narrow-past-other' => '{0} Mo’s ago',
'mon-short-future-one' => 'in {0} Mon.',
'mon-short-future-other' => 'in {0} Mon’s.',
'mon-short-past-one' => '{0} Mon. ago',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEn_gb.php b/MLEB/cldr/CldrNames/CldrNamesEn_gb.php
index 370486d6..0dfd028c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEn_gb.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEn_gb.php
@@ -24,6 +24,16 @@ $languageNames = [
'zh-hant' => 'Traditional Chinese',
];
+$countryNames = [
+ 'BL' => 'St Barthélemy',
+ 'KN' => 'St Kitts & Nevis',
+ 'LC' => 'St Lucia',
+ 'MF' => 'St Martin',
+ 'PM' => 'St Pierre & Miquelon',
+ 'SH' => 'St Helena',
+ 'VC' => 'St Vincent & the Grenadines',
+];
+
$timeUnits = [
'day-narrow-future-one' => 'in {0} day',
'day-narrow-future-other' => 'in {0} days',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEs.php b/MLEB/cldr/CldrNames/CldrNamesEs.php
index 2d226fac..5f3ad8d1 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEs.php
@@ -543,7 +543,7 @@ $currencyNames = [
'AFN' => 'afgani',
'ALL' => 'lek',
'AMD' => 'dram',
- 'ANG' => 'florín de las Antillas Neerlandesas',
+ 'ANG' => 'florín antillano',
'AOA' => 'kuanza',
'AOK' => 'kwanza angoleño (1977–1990)',
'AON' => 'nuevo kwanza angoleño (1990–2000)',
@@ -567,7 +567,7 @@ $currencyNames = [
'BGN' => 'lev búlgaro',
'BHD' => 'dinar bahreiní',
'BIF' => 'franco burundés',
- 'BMD' => 'dólar de Bermudas',
+ 'BMD' => 'dólar bermudeño',
'BND' => 'dólar bruneano',
'BOB' => 'boliviano',
'BOP' => 'peso boliviano',
@@ -707,7 +707,7 @@ $currencyNames = [
'NAD' => 'dólar namibio',
'NGN' => 'naira',
'NIC' => 'córdoba nicaragüense (1988–1991)',
- 'NIO' => 'córdoba nicaragüense',
+ 'NIO' => 'córdoba oro',
'NLG' => 'florín neerlandés',
'NOK' => 'corona noruega',
'NPR' => 'rupia nepalí',
@@ -846,7 +846,7 @@ $currencySymbols = [
'BYN' => 'BYN',
'BYR' => 'BYR',
'BZD' => 'BZD',
- 'CAD' => 'CA$',
+ 'CAD' => 'CAD',
'CDF' => 'CDF',
'CHF' => 'CHF',
'CLP' => 'CLP',
@@ -1001,7 +1001,7 @@ $countryNames = [
'AT' => 'Austria',
'AU' => 'Australia',
'AW' => 'Aruba',
- 'AX' => 'Islas Åland',
+ 'AX' => 'Islas Aland',
'AZ' => 'Azerbaiyán',
'BA' => 'Bosnia y Herzegovina',
'BB' => 'Barbados',
@@ -1060,7 +1060,7 @@ $countryNames = [
'ES' => 'España',
'ET' => 'Etiopía',
'EU' => 'Unión Europea',
- 'EZ' => 'zona euro',
+ 'EZ' => 'zona del euro',
'FI' => 'Finlandia',
'FJ' => 'Fiyi',
'FK' => 'Islas Malvinas',
@@ -1072,7 +1072,7 @@ $countryNames = [
'GD' => 'Granada',
'GE' => 'Georgia',
'GF' => 'Guayana Francesa',
- 'GG' => 'Guernsey',
+ 'GG' => 'Guernesey',
'GH' => 'Ghana',
'GI' => 'Gibraltar',
'GL' => 'Groenlandia',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEs_419.php b/MLEB/cldr/CldrNames/CldrNamesEs_419.php
index 4bd27bda..3f42960a 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEs_419.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEs_419.php
@@ -54,8 +54,11 @@ $languageNames = [
];
$currencyNames = [
+ 'ANG' => 'florín de las Antillas Neerlandesas',
'BGN' => 'lev búlgaro',
+ 'BMD' => 'dólar de Bermudas',
'MWK' => 'kwacha malauí',
+ 'NIO' => 'córdoba nicaragüense',
'THB' => 'baht tailandes',
'UZS' => 'som uzbeko',
'XXX' => '(unidad de moneda desconocida)',
@@ -67,12 +70,12 @@ $currencySymbols = [
$countryNames = [
'AC' => 'Isla Ascensión',
+ 'AX' => 'Islas Åland',
'BA' => 'Bosnia-Herzegovina',
'CG' => 'República del Congo',
'CI' => 'Costa de Marfil',
'EZ' => 'Eurozona',
'GB' => 'R. U.',
- 'GG' => 'Guernesey',
'IC' => 'Islas Canarias',
'QO' => 'Islas Ultramarinas',
'TA' => 'Tristán da Cunha',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEt.php b/MLEB/cldr/CldrNames/CldrNamesEt.php
index 4078085b..71cafcee 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEt.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEt.php
@@ -24,7 +24,7 @@ $languageNames = [
'ang' => 'vanainglise',
'anp' => 'angika',
'ar' => 'araabia',
- 'ar-001' => 'araabia (tänapäevane)',
+ 'ar-001' => 'tänapäeva araabia kirjakeel',
'arc' => 'aramea',
'arn' => 'mapudunguni',
'aro' => 'araona',
@@ -392,7 +392,7 @@ $languageNames = [
'nnh' => 'ngiembooni',
'no' => 'norra',
'nog' => 'nogai',
- 'non' => 'vanapõhjala',
+ 'non' => 'vanapõhja',
'nov' => 'noviaal',
'nqo' => 'nkoo',
'nr' => 'lõunandebele',
@@ -547,7 +547,7 @@ $languageNames = [
'trv' => 'taroko',
'ts' => 'tsonga',
'tsd' => 'tsakoonia',
- 'tsi' => 'tšimši',
+ 'tsi' => 'tsimši',
'tt' => 'tatari',
'ttt' => 'lõunataadi',
'tum' => 'tumbuka',
diff --git a/MLEB/cldr/CldrNames/CldrNamesEu.php b/MLEB/cldr/CldrNames/CldrNamesEu.php
index 77ccac17..dc592ab4 100644
--- a/MLEB/cldr/CldrNames/CldrNamesEu.php
+++ b/MLEB/cldr/CldrNames/CldrNamesEu.php
@@ -396,7 +396,7 @@ $languageNames = [
'yue' => 'kantonera',
'zgh' => 'amazigera estandarra',
'zh' => 'txinera',
- 'zh-hans' => 'txinera soildua',
+ 'zh-hans' => 'txinera sinplifikatu',
'zh-hant' => 'txinera tradizionala',
'zu' => 'zuluera',
'zun' => 'zuñia',
@@ -472,7 +472,7 @@ $currencyNames = [
'IQD' => 'dinar irakiarra',
'IRR' => 'rial irandarra',
'ISK' => 'koroa islandiarra',
- 'JMD' => 'Jamaikako dolarra',
+ 'JMD' => 'dolar jamaikarra',
'JOD' => 'dinar jordaniarra',
'JPY' => 'yen japoniarra',
'KES' => 'txelin kenyarra',
@@ -502,14 +502,14 @@ $currencyNames = [
'MRO' => 'Mauritaniako ouguiya (1973–2017)',
'MRU' => 'uguiya mauritaniarra',
'MUR' => 'errupia mauriziarra',
- 'MVR' => 'errupia maldivarra',
+ 'MVR' => 'rufiyaa maldivarra',
'MWK' => 'kwacha malawiarra',
'MXN' => 'peso mexikarra',
'MYR' => 'ringgit malaysiarra',
'MZN' => 'metical mozambiketarra',
'NAD' => 'dolar namibiarra',
'NGN' => 'naira nigeriarra',
- 'NIO' => 'córdoba nikaraguarra',
+ 'NIO' => 'cordoba nikaraguarra',
'NOK' => 'koroa norvegiarra',
'NPR' => 'errupia nepaldarra',
'NZD' => 'dolar zeelandaberritarra',
@@ -545,12 +545,12 @@ $currencyNames = [
'TJS' => 'somoni tajikistandarra',
'TMT' => 'manat turkmenistandarra',
'TND' => 'dinar tunisiarra',
- 'TOP' => 'Tongako Paʻanga',
+ 'TOP' => 'paʻanga tongatarra',
'TRY' => 'lira turkiarra',
'TTD' => 'Trinidad eta Tobagoko dolarra',
'TWD' => 'dolar taiwandar berria',
'TZS' => 'txelin tanzaniarra',
- 'UAH' => 'Ukrainako hryvnia',
+ 'UAH' => 'hryvnia ukrainarra',
'UGX' => 'txelin ugandarra',
'USD' => 'dolar estatubatuarra',
'UYU' => 'peso uruguaitarra',
@@ -991,7 +991,7 @@ $countryNames = [
'WF' => 'Wallis eta Futuna',
'WS' => 'Samoa',
'XA' => 'Sasiazentuak',
- 'XB' => 'pseudobidia',
+ 'XB' => 'Pseudobidia',
'XK' => 'Kosovo',
'YE' => 'Yemen',
'YT' => 'Mayotte',
diff --git a/MLEB/cldr/CldrNames/CldrNamesFa.php b/MLEB/cldr/CldrNames/CldrNamesFa.php
index 0b835b9d..23fdcdf7 100644
--- a/MLEB/cldr/CldrNames/CldrNamesFa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesFa.php
@@ -82,7 +82,7 @@ $languageNames = [
'chm' => 'ماریایی',
'cho' => 'چوکتویی',
'chp' => 'چیپه‌ویه‌ای',
- 'chr' => 'چروکیایی',
+ 'chr' => 'چروکی',
'chy' => 'شایانی',
'ckb' => 'کردی مرکزی',
'co' => 'کورسی',
@@ -155,7 +155,7 @@ $languageNames = [
'frr' => 'فریزی شمالی',
'frs' => 'فریزی شرقی',
'fur' => 'فریولیایی',
- 'fy' => 'فریزی غربی',
+ 'fy' => 'فریسی غربی',
'ga' => 'ایرلندی',
'gaa' => 'گایی',
'gag' => 'گاگائوزیایی',
@@ -180,9 +180,9 @@ $languageNames = [
'guz' => 'گوسی',
'gv' => 'مانی',
'gwi' => 'گویچ این',
- 'ha' => 'هوسیایی',
+ 'ha' => 'هوسایی',
'hai' => 'هایدایی',
- 'haw' => 'هاوائیایی',
+ 'haw' => 'هاوایی',
'he' => 'عبری',
'hi' => 'هندی',
'hif' => 'هندی فیجیایی',
@@ -197,7 +197,7 @@ $languageNames = [
'hup' => 'هوپا',
'hy' => 'ارمنی',
'hz' => 'هریرویی',
- 'ia' => 'میان‌زبان',
+ 'ia' => 'اینترلینگوا',
'iba' => 'ایبانی',
'ibb' => 'ایبیبیو',
'id' => 'اندونزیایی',
@@ -256,12 +256,12 @@ $languageNames = [
'ks' => 'کشمیری',
'ksb' => 'شامبالا',
'ksf' => 'بافیایی',
- 'ksh' => 'ریپواری',
+ 'ksh' => 'کولش',
'ku' => 'کردی',
'kum' => 'کومیکی',
'kut' => 'کوتنی',
'kv' => 'کومیایی',
- 'kw' => 'کرنوالی',
+ 'kw' => 'کورنی',
'ky' => 'قرقیزی',
'la' => 'لاتین',
'lad' => 'لادینو',
@@ -300,19 +300,19 @@ $languageNames = [
'men' => 'منده‌ای',
'mer' => 'مرویی',
'mfe' => 'موریسین',
- 'mg' => 'مالاگاسیایی',
+ 'mg' => 'مالاگاسی',
'mga' => 'ایرلندی میانه',
'mgh' => 'ماکوا متو',
'mgo' => 'متایی',
'mh' => 'مارشالی',
- 'mi' => 'مائوریایی',
+ 'mi' => 'مائوری',
'mic' => 'میکماکی',
'min' => 'مینانگ‌کابویی',
'mk' => 'مقدونی',
'ml' => 'مالایالامی',
'mn' => 'مغولی',
'mnc' => 'مانچویی',
- 'mni' => 'میته‌ای',
+ 'mni' => 'مانیپوری',
'moh' => 'موهاکی',
'mos' => 'ماسیایی',
'mr' => 'مراتی',
@@ -442,7 +442,7 @@ $languageNames = [
'srr' => 'سریری',
'ss' => 'سوازیایی',
'ssy' => 'ساهو',
- 'st' => 'سوتویی جنوبی',
+ 'st' => 'سوتوی جنوبی',
'su' => 'سوندایی',
'suk' => 'سوکومایی',
'sus' => 'سوسویی',
diff --git a/MLEB/cldr/CldrNames/CldrNamesFi.php b/MLEB/cldr/CldrNames/CldrNamesFi.php
index f683cbea..3d9e4833 100644
--- a/MLEB/cldr/CldrNames/CldrNamesFi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesFi.php
@@ -102,7 +102,7 @@ $languageNames = [
'chp' => 'chipewyan',
'chr' => 'cherokee',
'chy' => 'cheyenne',
- 'ckb' => 'sorani',
+ 'ckb' => 'soranî',
'co' => 'korsika',
'cop' => 'kopti',
'cps' => 'capiznon',
@@ -612,8 +612,6 @@ $languageNames = [
'zen' => 'zenaga',
'zgh' => 'vakioitu tamazight',
'zh' => 'kiina',
- 'zh-hans' => 'yksinkertaistettu kiina',
- 'zh-hant' => 'perinteinen kiina',
'zu' => 'zulu',
'zun' => 'zuni',
'zxx' => 'ei kielellistä sisältöä',
@@ -1309,7 +1307,7 @@ $countryNames = [
'FI' => 'Suomi',
'FJ' => 'Fidži',
'FK' => 'Falklandinsaaret',
- 'FM' => 'Mikronesian liittovaltio',
+ 'FM' => 'Mikronesia',
'FO' => 'Färsaaret',
'FR' => 'Ranska',
'GA' => 'Gabon',
@@ -1326,7 +1324,7 @@ $countryNames = [
'GP' => 'Guadeloupe',
'GQ' => 'Päiväntasaajan Guinea',
'GR' => 'Kreikka',
- 'GS' => 'Etelä-Georgia ja Eteläiset Sandwichsaaret',
+ 'GS' => 'Etelä-Georgia ja Eteläiset Sandwichinsaaret',
'GT' => 'Guatemala',
'GU' => 'Guam',
'GW' => 'Guinea-Bissau',
@@ -1425,7 +1423,7 @@ $countryNames = [
'PW' => 'Palau',
'PY' => 'Paraguay',
'QA' => 'Qatar',
- 'QO' => 'ulkomeri',
+ 'QO' => 'Oseanian erillissaaret',
'RE' => 'Réunion',
'RO' => 'Romania',
'RS' => 'Serbia',
@@ -1439,7 +1437,7 @@ $countryNames = [
'SG' => 'Singapore',
'SH' => 'Saint Helena',
'SI' => 'Slovenia',
- 'SJ' => 'Huippuvuoret ja Jan Mayen',
+ 'SJ' => 'Svalbard ja Jan Mayen',
'SK' => 'Slovakia',
'SL' => 'Sierra Leone',
'SM' => 'San Marino',
@@ -1451,11 +1449,11 @@ $countryNames = [
'SV' => 'El Salvador',
'SX' => 'Sint Maarten',
'SY' => 'Syyria',
- 'SZ' => 'Swazimaa',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Turks- ja Caicossaaret',
'TD' => 'Tšad',
- 'TF' => 'Ranskan eteläiset alueet',
+ 'TF' => 'Ranskan eteläiset ja antarktiset alueet',
'TG' => 'Togo',
'TH' => 'Thaimaa',
'TJ' => 'Tadžikistan',
@@ -1512,6 +1510,8 @@ $timeUnits = [
'day-short-future-other' => '{0} pv päästä',
'day-short-past-one' => '{0} pv sitten',
'day-short-past-other' => '{0} pv sitten',
+ 'decade-one' => '{0} vuosikymmen',
+ 'decade-other' => '{0} vuosikymmentä',
'fri-future-one' => '{0} perjantain päästä',
'fri-future-other' => '{0} perjantain päästä',
'fri-narrow-future-one' => '{0} pe päästä',
diff --git a/MLEB/cldr/CldrNames/CldrNamesFo.php b/MLEB/cldr/CldrNames/CldrNamesFo.php
index 745432fb..019d3d03 100644
--- a/MLEB/cldr/CldrNames/CldrNamesFo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesFo.php
@@ -91,6 +91,7 @@ $languageNames = [
'eu' => 'baskiskt',
'ewo' => 'ewondo',
'fa' => 'persiskt',
+ 'fa-af' => 'dari',
'ff' => 'fulah',
'fi' => 'finskt',
'fil' => 'filipiniskt',
@@ -415,7 +416,7 @@ $currencyNames = [
'BAM' => 'Bosnia-Hersegovina mark (kann vekslast)',
'BBD' => 'Barbados dollari',
'BDT' => 'Bangladesj taka',
- 'BGN' => 'Bulgaria lev',
+ 'BGN' => 'Bulgarskur Lev',
'BHD' => 'Barein dinar',
'BIF' => 'Burundi frankur',
'BMD' => 'Bermuda dollari',
@@ -425,10 +426,10 @@ $currencyNames = [
'BSD' => 'Bahamaoyggjar dollari',
'BTN' => 'Butan ngultrum',
'BWP' => 'Botsvana pula',
- 'BYN' => 'Hvítarussland ruble',
+ 'BYN' => 'Hvítarussiskur Ruble',
'BYR' => 'Hvítarussland ruble (2000–2016)',
'BZD' => 'Belis dollari',
- 'CAD' => 'Kanada dollari',
+ 'CAD' => 'Kanadiskur dollari',
'CDF' => 'Kongo frankur',
'CHF' => 'sveisiskur frankur',
'CLP' => 'Kili peso',
@@ -439,7 +440,7 @@ $currencyNames = [
'CUC' => 'Kuba peso (sum kann vekslast)',
'CUP' => 'Kuba peso',
'CVE' => 'Grønhøvdaoyggjar escudo',
- 'CZK' => 'Kekkia koruna',
+ 'CZK' => 'Kekkiskt Koruna',
'DJF' => 'Djibuti frankur',
'DKK' => 'donsk króna',
'DOP' => 'Dominika peso',
@@ -462,7 +463,7 @@ $currencyNames = [
'HNL' => 'Honduras lempira',
'HRK' => 'Kroatia kuna',
'HTG' => 'Haiti gourde',
- 'HUF' => 'Ungarn forint',
+ 'HUF' => 'Ungarskur Forintur',
'IDR' => 'Indonesia rupiah',
'ILS' => 'Ísrael new shekel',
'INR' => 'indiskir rupis',
@@ -487,7 +488,7 @@ $currencyNames = [
'LRD' => 'Liberia dollari',
'LYD' => 'Libya dinar',
'MAD' => 'Marokko dirham',
- 'MDL' => 'Moldova leu',
+ 'MDL' => 'Moldovanskur Leu',
'MGA' => 'Madagaskar ariary',
'MKD' => 'Makedónia denar',
'MMK' => 'Myanmar (Burma) kyat',
@@ -513,7 +514,7 @@ $currencyNames = [
'PGK' => 'Papua Nýguinea kina',
'PHP' => 'Filipsoyggjar peso',
'PKR' => 'Pakistan rupi',
- 'PLN' => 'Pólland zloty',
+ 'PLN' => 'Pólskur Zloty',
'PYG' => 'Paraguai guarani',
'QAR' => 'Katar rial',
'RON' => 'Rumenia leu',
@@ -879,6 +880,7 @@ $countryNames = [
'MF' => 'St-Martin',
'MG' => 'Madagaskar',
'MH' => 'Marshalloyggjar',
+ 'MK' => 'Norður Makedónia',
'ML' => 'Mali',
'MM' => 'Myanmar (Burma)',
'MN' => 'Mongolia',
diff --git a/MLEB/cldr/CldrNames/CldrNamesFr.php b/MLEB/cldr/CldrNames/CldrNamesFr.php
index c0de8ac4..9478a10c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesFr.php
+++ b/MLEB/cldr/CldrNames/CldrNamesFr.php
@@ -42,7 +42,7 @@ $languageNames = [
'avk' => 'kotava',
'awa' => 'awadhi',
'ay' => 'aymara',
- 'az' => 'azéri',
+ 'az' => 'azerbaïdjanais',
'ba' => 'bachkir',
'bal' => 'baloutchi',
'ban' => 'balinais',
@@ -55,7 +55,7 @@ $languageNames = [
'bej' => 'bedja',
'bem' => 'bemba',
'bew' => 'betawi',
- 'bez' => 'béna',
+ 'bez' => 'bena',
'bfd' => 'bafut',
'bfq' => 'badaga',
'bg' => 'bulgare',
@@ -136,7 +136,7 @@ $languageNames = [
'dyu' => 'dioula',
'dz' => 'dzongkha',
'dzg' => 'dazaga',
- 'ebu' => 'embou',
+ 'ebu' => 'embu',
'ee' => 'éwé',
'efi' => 'éfik',
'egl' => 'émilien',
@@ -204,7 +204,7 @@ $languageNames = [
'grb' => 'grebo',
'grc' => 'grec ancien',
'gsw' => 'suisse allemand',
- 'gu' => 'goudjerati',
+ 'gu' => 'goudjarati',
'guc' => 'wayuu',
'gur' => 'gurenne',
'guz' => 'gusii',
@@ -297,7 +297,7 @@ $languageNames = [
'ks' => 'cachemiri',
'ksb' => 'shambala',
'ksf' => 'bafia',
- 'ksh' => 'francique ripuaire',
+ 'ksh' => 'kölsch',
'ku' => 'kurde',
'kum' => 'koumyk',
'kut' => 'kutenai',
@@ -866,7 +866,7 @@ $currencyNames = [
'TPE' => 'escudo timorais',
'TRL' => 'livre turque (1844–2005)',
'TRY' => 'livre turque',
- 'TTD' => 'dollar trinidadien',
+ 'TTD' => 'dollar de Trinité-et-Tobago',
'TWD' => 'nouveau dollar taïwanais',
'TZS' => 'shilling tanzanien',
'UAH' => 'hryvnia ukrainienne',
@@ -1261,7 +1261,7 @@ $countryNames = [
'BJ' => 'Bénin',
'BL' => 'Saint-Barthélemy',
'BM' => 'Bermudes',
- 'BN' => 'Brunéi Darussalam',
+ 'BN' => 'Brunei',
'BO' => 'Bolivie',
'BQ' => 'Pays-Bas caribéens',
'BR' => 'Brésil',
@@ -1311,7 +1311,7 @@ $countryNames = [
'FI' => 'Finlande',
'FJ' => 'Fidji',
'FK' => 'Îles Malouines',
- 'FM' => 'États fédérés de Micronésie',
+ 'FM' => 'Micronésie',
'FO' => 'Îles Féroé',
'FR' => 'France',
'GA' => 'Gabon',
@@ -1328,13 +1328,13 @@ $countryNames = [
'GP' => 'Guadeloupe',
'GQ' => 'Guinée équatoriale',
'GR' => 'Grèce',
- 'GS' => 'Géorgie du Sud et îles Sandwich du Sud',
+ 'GS' => 'Géorgie du Sud-et-les Îles Sandwich du Sud',
'GT' => 'Guatemala',
'GU' => 'Guam',
'GW' => 'Guinée-Bissau',
'GY' => 'Guyana',
'HK' => 'Hong Kong',
- 'HM' => 'Îles Heard et McDonald',
+ 'HM' => 'Îles Heard-et-MacDonald',
'HN' => 'Honduras',
'HR' => 'Croatie',
'HT' => 'Haïti',
@@ -1355,7 +1355,7 @@ $countryNames = [
'JO' => 'Jordanie',
'JP' => 'Japon',
'KE' => 'Kenya',
- 'KG' => 'Kirghizistan',
+ 'KG' => 'Kirghizstan',
'KH' => 'Cambodge',
'KI' => 'Kiribati',
'KM' => 'Comores',
@@ -1370,7 +1370,7 @@ $countryNames = [
'LC' => 'Sainte-Lucie',
'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka',
- 'LR' => 'Libéria',
+ 'LR' => 'Liberia',
'LS' => 'Lesotho',
'LT' => 'Lituanie',
'LU' => 'Luxembourg',
@@ -1403,7 +1403,7 @@ $countryNames = [
'NC' => 'Nouvelle-Calédonie',
'NE' => 'Niger',
'NF' => 'Île Norfolk',
- 'NG' => 'Nigéria',
+ 'NG' => 'Nigeria',
'NI' => 'Nicaragua',
'NL' => 'Pays-Bas',
'NO' => 'Norvège',
@@ -1479,11 +1479,11 @@ $countryNames = [
'UY' => 'Uruguay',
'UZ' => 'Ouzbékistan',
'VA' => 'État de la Cité du Vatican',
- 'VC' => 'Saint-Vincent-et-les-Grenadines',
+ 'VC' => 'Saint-Vincent-et-les Grenadines',
'VE' => 'Venezuela',
'VG' => 'Îles Vierges britanniques',
'VI' => 'Îles Vierges des États-Unis',
- 'VN' => 'Vietnam',
+ 'VN' => 'Viêt Nam',
'VU' => 'Vanuatu',
'WF' => 'Wallis-et-Futuna',
'WS' => 'Samoa',
diff --git a/MLEB/cldr/CldrNames/CldrNamesGa.php b/MLEB/cldr/CldrNames/CldrNamesGa.php
index a6e52151..5df0bcb4 100644
--- a/MLEB/cldr/CldrNames/CldrNamesGa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesGa.php
@@ -6,6 +6,7 @@ $languageNames = [
'ady' => 'Adaigéis',
'ae' => 'Aivéistis',
'af' => 'Afracáinis',
+ 'agq' => 'Aghem',
'ain' => 'Aidhniúis',
'ak' => 'Acáinis',
'akk' => 'Acáidis',
@@ -17,6 +18,7 @@ $languageNames = [
'arc' => 'Aramais',
'arn' => 'Mapúitsis',
'as' => 'Asaimis',
+ 'asa' => 'Asu',
'ast' => 'Astúiris',
'av' => 'Aváiris',
'ay' => 'Aidhmiris',
@@ -24,14 +26,17 @@ $languageNames = [
'ba' => 'Baiscíris',
'ban' => 'Bailís',
'bar' => 'Baváiris',
+ 'bas' => 'Basáis',
'be' => 'Bealarúisis',
'bem' => 'Beimbis',
+ 'bez' => 'Béinis',
'bg' => 'Bulgáiris',
'bi' => 'Bioslaimis',
'bm' => 'Bambairis',
'bn' => 'Beangáilis',
'bo' => 'Tibéidis',
'br' => 'Briotáinis',
+ 'brx' => 'Bódóis',
'bs' => 'Boisnis',
'bua' => 'Buiriáitis',
'bug' => 'Buiginis',
@@ -39,6 +44,7 @@ $languageNames = [
'ccp' => 'Chakma',
'ce' => 'Seisnis',
'ceb' => 'Seabúáinis',
+ 'cgg' => 'Cígis',
'ch' => 'Seamóiris',
'chm' => 'Mairis',
'chr' => 'Seiricis',
@@ -62,7 +68,9 @@ $languageNames = [
'dua' => 'Duailis',
'dum' => 'Meán-Ollainnis',
'dv' => 'Divéihis',
+ 'dyo' => 'Ióla-Fainís',
'dz' => 'Seoinicis',
+ 'ebu' => 'Eambúis',
'ee' => 'Éabhais',
'egy' => 'Sean-Éigiptis',
'el' => 'Gréigis',
@@ -109,6 +117,7 @@ $languageNames = [
'gsw' => 'Gearmáinis Eilvéiseach',
'gu' => 'Gúisearáitis',
'guc' => 'Uaúis',
+ 'guz' => 'Gúisis',
'gv' => 'Manainnis',
'ha' => 'Hásais',
'hak' => 'Haicéis',
@@ -133,6 +142,7 @@ $languageNames = [
'id' => 'Indinéisis',
'ie' => 'Interlingue',
'ig' => 'Íogbóis',
+ 'ii' => 'Ís Shichuan',
'ik' => 'Iniúipiaicis',
'inh' => 'Iongúis',
'io' => 'Ido',
@@ -150,13 +160,13 @@ $languageNames = [
'kab' => 'Caibílis',
'kam' => 'Cambais',
'kde' => 'Makonde',
- 'kea' => 'Kabuverdianu',
+ 'kea' => 'Criól Cabo Verde',
'kg' => 'Congóis',
- 'khq' => 'Koyra Chiini',
+ 'khq' => 'Songais Iartharach',
'ki' => 'Ciocúis',
'kj' => 'Cuainiáimis',
'kk' => 'Casaicis',
- 'kkj' => 'Kako',
+ 'kkj' => 'Cacóis',
'kl' => 'Kalaallisut',
'kln' => 'Kalenjin',
'km' => 'Ciméiris',
@@ -167,20 +177,23 @@ $languageNames = [
'krl' => 'Cairéilis',
'kru' => 'Curúicis',
'ks' => 'Caismíris',
+ 'ksb' => 'Shambala',
+ 'ksf' => 'Baifiais',
+ 'ksh' => 'Coilsis',
'ku' => 'Coirdis',
'kv' => 'Coimis',
'kw' => 'Coirnis',
'ky' => 'Cirgisis',
'la' => 'Laidin',
'lad' => 'Laidínis',
- 'lag' => 'Langi',
+ 'lag' => 'Láingis',
'lah' => 'Puinseáibis Iartharach',
'lb' => 'Lucsambuirgis',
'lg' => 'Lugandais',
'li' => 'Liombuirgis',
'lij' => 'Liogúiris',
'liv' => 'Liovóinis',
- 'lkt' => 'Lakota',
+ 'lkt' => 'Lacótais',
'lmo' => 'Lombairdis',
'ln' => 'Liongáilis',
'lo' => 'Laoisis',
@@ -215,7 +228,7 @@ $languageNames = [
'mwl' => 'Mioraindéis',
'mwr' => 'Marmhairis',
'my' => 'Burmais',
- 'mzn' => 'Mazanderani',
+ 'mzn' => 'Mázandaráinis',
'na' => 'Nárúis',
'nan' => 'Sínis Min Nan',
'nap' => 'Napóilis',
@@ -229,14 +242,14 @@ $languageNames = [
'niu' => 'Níobhais',
'nl' => 'Ollainnis',
'nl-be' => 'Pléimeannais',
- 'nmg' => 'Kwasio',
+ 'nmg' => 'Cuaiseois',
'nn' => 'Nua-Ioruais',
'nnh' => 'Ngiemboon',
'no' => 'Ioruais',
'non' => 'Sean-Lochlainnis',
'nr' => 'Ndeibéilis an Deiscirt',
'nso' => 'Sútúis an Tuaiscirt',
- 'nus' => 'Nuer',
+ 'nus' => 'Nuairis',
'nv' => 'Navachóis',
'ny' => 'Siséivis',
'nyn' => 'Niancóilis',
@@ -246,6 +259,7 @@ $languageNames = [
'or' => 'Oirísis',
'os' => 'Oiséitis',
'pa' => 'Puinseáibis',
+ 'pcm' => 'pidsean na Nigéire',
'peo' => 'Sean-Pheirsis',
'pi' => 'Páilis',
'pl' => 'Polainnis',
@@ -260,20 +274,25 @@ $languageNames = [
'rn' => 'Rúindis',
'ro' => 'Rómáinis',
'ro-md' => 'Moldáivis',
+ 'rof' => 'Rombo',
'rom' => 'Romainis',
'ru' => 'Rúisis',
'rup' => 'Arómáinis',
'rw' => 'Ciniaruaindis',
+ 'rwk' => 'Rwa',
'sa' => 'Sanscrait',
'sah' => 'Sachais',
'sam' => 'Aramais Shamárach',
+ 'saq' => 'Samburu',
'sat' => 'Santáilis',
+ 'sbp' => 'Sangu',
'sc' => 'Sairdínis',
'scn' => 'Sicilis',
'sco' => 'Albainis',
'sd' => 'Sindis',
'se' => 'Sáimis Thuaidh',
- 'ses' => 'Koyraboro Senni',
+ 'seh' => 'Sena',
+ 'ses' => 'Songais Oirthearach',
'sg' => 'Sangóis',
'sga' => 'Sean-Ghaeilge',
'sh' => 'Seirbea-Chróitis',
@@ -338,13 +357,14 @@ $languageNames = [
'wo' => 'Volaifis',
'xal' => 'Cailmícis',
'xh' => 'Cóisis',
+ 'xog' => 'Soga',
'yav' => 'Yangben',
'yi' => 'Giúdais',
'yo' => 'Iarúibis',
'yue' => 'Cantainis',
'za' => 'Siuáingis',
'zea' => 'Séalainnis',
- 'zgh' => 'Tamazight Caighdeánach Mharacó',
+ 'zgh' => 'Tamaisis Chaighdeánach Mharacó',
'zh' => 'Sínis',
'zh-hans' => 'Sínis Shimplithe',
'zh-hant' => 'Sínis Thraidisiúnta',
@@ -413,6 +433,7 @@ $currencyNames = [
'CLE' => 'Escudo na Sile',
'CLF' => 'Unidades de Fomento na Sile',
'CLP' => 'Peso na Sile',
+ 'CNH' => 'Yuan na Síne (seachairgeadra)',
'CNY' => 'Yuan na Síne',
'COP' => 'Peso na Colóime',
'CRC' => 'Colón Chósta Ríce',
@@ -1188,7 +1209,7 @@ $timeUnits = [
'fri-short-past-other' => 'Dé hAoine {0} seachtain ó shin',
'fri-short-past-two' => 'Dé hAoine {0} sheachtain ó shin',
'hour-few' => '{0} huaire',
- 'hour-future-few' => 'i gceann {0} huaire an chloig',
+ 'hour-future-few' => 'i gceann {0} uair an chloig',
'hour-future-many' => 'i gceann {0} n-uaire an chloig',
'hour-future-one' => 'i gceann {0} uair an chloig',
'hour-future-other' => 'i gceann {0} uair an chloig',
@@ -1206,7 +1227,7 @@ $timeUnits = [
'hour-narrow-past-two' => '-{0} u',
'hour-one' => '{0} uair',
'hour-other' => '{0} uair',
- 'hour-past-few' => '{0} huaire an chloig ó shin',
+ 'hour-past-few' => '{0} uair an chloig ó shin',
'hour-past-many' => '{0} n-uaire an chloig ó shin',
'hour-past-one' => '{0} uair an chloig ó shin',
'hour-past-other' => '{0} uair an chloig ó shin',
diff --git a/MLEB/cldr/CldrNames/CldrNamesGd.php b/MLEB/cldr/CldrNames/CldrNamesGd.php
index 11a92cfc..59c1608c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesGd.php
+++ b/MLEB/cldr/CldrNames/CldrNamesGd.php
@@ -856,7 +856,7 @@ $currencyNames = [
'UYI' => 'Peso Uruguaidheach (aonadan inneacsaichte)',
'UYP' => 'Peso Uruguaidheach (1975–1993)',
'UYU' => 'Peso Uruguaidheach',
- 'UYW' => 'aonad inneacs tuarastail ainmeach Uruguaidh',
+ 'UYW' => 'Aonad inneacs tuarastail ainmeach Uruguaidh',
'UZS' => 'Som Usbagach',
'VEB' => 'Bolívar Bheinisealach (1871–2008)',
'VEF' => 'Bolívar Bheinisealach (2008–2018)',
@@ -1417,7 +1417,7 @@ $countryNames = [
'SG' => 'Singeapòr',
'SH' => 'Eilean Naomh Eilidh',
'SI' => 'An t-Slòbhain',
- 'SJ' => 'Svalbard agus Jan Mayen',
+ 'SJ' => 'Svalbard is Jan Mayen',
'SK' => 'An t-Slòbhac',
'SL' => 'Siarra Leòmhann',
'SM' => 'San Marino',
@@ -1522,18 +1522,18 @@ $timeUnits = [
'fri-narrow-past-one' => 'o {0} Dih.',
'fri-narrow-past-other' => 'o {0} Dih.',
'fri-narrow-past-two' => 'o {0} Dhih.',
- 'fri-past-few' => 'o chionn {0} DihAoine',
- 'fri-past-one' => 'o chionn {0} DihAoine',
- 'fri-past-other' => 'o chionn {0} DihAoine',
- 'fri-past-two' => 'o chionn {0} DhihAoine',
+ 'fri-past-few' => '{0} DihAoine air ais',
+ 'fri-past-one' => '{0} DihAoine air ais',
+ 'fri-past-other' => '{0} DihAoine air ais',
+ 'fri-past-two' => '{0} DhihAoine air ais',
'fri-short-future-few' => 'an ceann {0} Dih.',
'fri-short-future-one' => 'an ceann {0} Dih.',
'fri-short-future-other' => 'an ceann {0} Dih.',
'fri-short-future-two' => 'an ceann {0} Dhih.',
- 'fri-short-past-few' => 'o chionn {0} Dih.',
- 'fri-short-past-one' => 'o chionn {0} Dih.',
- 'fri-short-past-other' => 'o chionn {0} Dih.',
- 'fri-short-past-two' => 'o chionn {0} Dhih.',
+ 'fri-short-past-few' => '{0} Dih. air ais',
+ 'fri-short-past-one' => '{0} Dih. air ais',
+ 'fri-short-past-other' => '{0} Dih. air ais',
+ 'fri-short-past-two' => '{0} Dhih. air ais',
'hour-few' => '{0} uairean a thìde',
'hour-future-few' => 'an ceann {0} uairean a thìde',
'hour-future-one' => 'an ceann {0} uair a thìde',
@@ -1610,18 +1610,18 @@ $timeUnits = [
'mon-narrow-past-one' => 'o {0} DiL.',
'mon-narrow-past-other' => 'o {0} DiL.',
'mon-narrow-past-two' => 'o {0} DhiL.',
- 'mon-past-few' => 'o chionn {0} DiLuain',
- 'mon-past-one' => 'o chionn {0} DiLuain',
- 'mon-past-other' => 'o chionn {0} DiLuain',
- 'mon-past-two' => 'o chionn {0} DhiLuain',
+ 'mon-past-few' => '{0} DiLuain air ais',
+ 'mon-past-one' => '{0} DiLuain air ais',
+ 'mon-past-other' => '{0} DiLuain air ais',
+ 'mon-past-two' => '{0} DhiLuain air ais',
'mon-short-future-few' => 'an ceann {0} DiL.',
'mon-short-future-one' => 'an ceann {0} DiL.',
'mon-short-future-other' => 'an ceann {0} DiL.',
'mon-short-future-two' => 'an ceann {0} DhiL.',
- 'mon-short-past-few' => 'o chionn {0} DiL.',
- 'mon-short-past-one' => 'o chionn {0} DiL.',
- 'mon-short-past-other' => 'o chionn {0} DiL.',
- 'mon-short-past-two' => 'o chionn {0} DhiL.',
+ 'mon-short-past-few' => '{0} DiL. air ais',
+ 'mon-short-past-one' => '{0} DiL. air ais',
+ 'mon-short-past-other' => '{0} DiL. air ais',
+ 'mon-short-past-two' => '{0} DhiL. air ais',
'month-few' => '{0} mìosan',
'month-future-few' => 'an ceann {0} mìosan',
'month-future-one' => 'an ceann {0} mhìosa',
@@ -1666,10 +1666,10 @@ $timeUnits = [
'quarter-narrow-past-one' => '-{0} c.',
'quarter-narrow-past-other' => '-{0} c.',
'quarter-narrow-past-two' => '-{0} c.',
- 'quarter-past-few' => 'o chionn {0} cairtealan',
- 'quarter-past-one' => 'o chionn {0} chairteil',
- 'quarter-past-other' => 'o chionn {0} cairteil',
- 'quarter-past-two' => 'o chionn {0} chairteil',
+ 'quarter-past-few' => '{0} cairtealan air ais',
+ 'quarter-past-one' => '{0} chairteal air ais',
+ 'quarter-past-other' => '{0} cairteal air ais',
+ 'quarter-past-two' => '{0} chairteal air ais',
'quarter-short-future-few' => 'an {0} cairt.',
'quarter-short-future-one' => 'an {0} chairt.',
'quarter-short-future-other' => 'an {0} cairt.',
@@ -1690,18 +1690,18 @@ $timeUnits = [
'sat-narrow-past-one' => 'o {0} DiS.',
'sat-narrow-past-other' => 'o {0} DiS.',
'sat-narrow-past-two' => 'o {0} DhiS.',
- 'sat-past-few' => 'o chionn {0} DiSathairne',
- 'sat-past-one' => 'o chionn {0} DiSathairne',
- 'sat-past-other' => 'o chionn {0} DiSathairne',
- 'sat-past-two' => 'o chionn {0} DhiSathairne',
+ 'sat-past-few' => '{0} DiSathairne air ais',
+ 'sat-past-one' => '{0} DiSathairne air ais',
+ 'sat-past-other' => '{0} DiSathairne air ais',
+ 'sat-past-two' => '{0} DhiSathairne air ais',
'sat-short-future-few' => 'an ceann {0} DiS.',
'sat-short-future-one' => 'an ceann {0} DiS.',
'sat-short-future-other' => 'an ceann {0} DiS.',
'sat-short-future-two' => 'an ceann {0} DhiS.',
- 'sat-short-past-few' => 'o chionn {0} DiS.',
- 'sat-short-past-one' => 'o chionn {0} DiS.',
- 'sat-short-past-other' => 'o chionn {0} DiS.',
- 'sat-short-past-two' => 'o chionn {0} DhiS.',
+ 'sat-short-past-few' => '{0} DiS. air ais',
+ 'sat-short-past-one' => '{0} DiS. air ais',
+ 'sat-short-past-other' => '{0} DiS. air ais',
+ 'sat-short-past-two' => '{0} DhiS. air ais',
'second-few' => '{0} diogan',
'second-future-few' => 'an ceann {0} diogan',
'second-future-one' => 'an ceann {0} diog',
@@ -1742,18 +1742,18 @@ $timeUnits = [
'sun-narrow-past-one' => 'o {0} DiD.',
'sun-narrow-past-other' => 'o {0} DiD.',
'sun-narrow-past-two' => 'o {0} DhiD.',
- 'sun-past-few' => 'o chionn {0} DiDòmhnaich',
- 'sun-past-one' => 'o chionn {0} DiDòmhnaich',
- 'sun-past-other' => 'o chionn {0} DiDòmhnaich',
- 'sun-past-two' => 'o chionn {0} DhiDòmhnaich',
+ 'sun-past-few' => '{0} DiDòmhnaich air ais',
+ 'sun-past-one' => '{0} DiDòmhnaich air ais',
+ 'sun-past-other' => '{0} DiDòmhnaich air ais',
+ 'sun-past-two' => '{0} DhiDòmhnaich air ais',
'sun-short-future-few' => 'an ceann {0} DiD.',
'sun-short-future-one' => 'an ceann {0} DiD.',
'sun-short-future-other' => 'an ceann {0} DiD.',
'sun-short-future-two' => 'an ceann {0} DhiD.',
- 'sun-short-past-few' => 'o chionn {0} DiDòmhnaich',
- 'sun-short-past-one' => 'o chionn {0} DiD.',
- 'sun-short-past-other' => 'o chionn {0} DiDòmhnaich',
- 'sun-short-past-two' => 'o chionn {0} DhiD.',
+ 'sun-short-past-few' => '{0} DiD. air ais',
+ 'sun-short-past-one' => '{0} DiD. air ais',
+ 'sun-short-past-other' => '{0} DiD. air ais',
+ 'sun-short-past-two' => '{0} DhiD. air ais',
'thu-future-few' => 'an ceann {0} DiarDaoin',
'thu-future-one' => 'an ceann {0} DiarDaoin',
'thu-future-other' => 'an ceann {0} DiarDaoin',
@@ -1766,18 +1766,18 @@ $timeUnits = [
'thu-narrow-past-one' => 'o {0} Dia.',
'thu-narrow-past-other' => 'o {0} Dia.',
'thu-narrow-past-two' => 'o {0} Dhia.',
- 'thu-past-few' => 'o chionn {0} DiarDaoin',
- 'thu-past-one' => 'o chionn {0} DiarDaoin',
- 'thu-past-other' => 'o chionn {0} DiarDaoin',
- 'thu-past-two' => 'o chionn {0} DhiarDaoin',
+ 'thu-past-few' => '{0} DiarDaoin air ais',
+ 'thu-past-one' => '{0} DiarDaoin air ais',
+ 'thu-past-other' => '{0} DiarDaoin air ais',
+ 'thu-past-two' => '{0} DhiarDaoin air ais',
'thu-short-future-few' => 'an ceann {0} Dia.',
'thu-short-future-one' => 'an ceann {0} Dia.',
'thu-short-future-other' => 'an ceann {0} Dia.',
'thu-short-future-two' => 'an ceann {0} Dhia.',
- 'thu-short-past-few' => 'o chionn {0} Dia.',
- 'thu-short-past-one' => 'o chionn {0} Dia.',
- 'thu-short-past-other' => 'o chionn {0} Dia.',
- 'thu-short-past-two' => 'o chionn {0} Dhia.',
+ 'thu-short-past-few' => '{0} Dia. air ais',
+ 'thu-short-past-one' => '{0} Dia. air ais',
+ 'thu-short-past-other' => '{0} Dia. air ais',
+ 'thu-short-past-two' => '{0} Dhia. air ais',
'tue-future-few' => 'an ceann {0} DiMàirt',
'tue-future-one' => 'an ceann {0} DiMàirt',
'tue-future-other' => 'an ceann {0} DiMàirt',
@@ -1790,18 +1790,18 @@ $timeUnits = [
'tue-narrow-past-one' => 'o {0} DiM.',
'tue-narrow-past-other' => 'o {0} DiM.',
'tue-narrow-past-two' => 'o {0} DhiM.',
- 'tue-past-few' => 'o chionn {0} DiMàirt',
- 'tue-past-one' => 'o chionn {0} DiMàirt',
- 'tue-past-other' => 'o chionn {0} DiMàirt',
- 'tue-past-two' => 'o chionn {0} DhiMàirt',
+ 'tue-past-few' => '{0} DiMàirt air ais',
+ 'tue-past-one' => '{0} DiMàirt air ais',
+ 'tue-past-other' => '{0} DiMàirt air ais',
+ 'tue-past-two' => '{0} DhiMàirt air ais',
'tue-short-future-few' => 'an ceann {0} DiM.',
'tue-short-future-one' => 'an ceann {0} DiM.',
'tue-short-future-other' => 'an ceann {0} DiM.',
'tue-short-future-two' => 'an ceann {0} DhiM.',
- 'tue-short-past-few' => 'o chionn {0} DiM.',
- 'tue-short-past-one' => 'o chionn {0} DiM.',
- 'tue-short-past-other' => 'o chionn {0} DiM.',
- 'tue-short-past-two' => 'o chionn {0} DhiM.',
+ 'tue-short-past-few' => '{0} DiM. air ais',
+ 'tue-short-past-one' => '{0} DiM. air ais',
+ 'tue-short-past-other' => '{0} DiM. air ais',
+ 'tue-short-past-two' => '{0} DhiM. air ais',
'wed-future-few' => 'an ceann {0} DiCiadain',
'wed-future-one' => 'an ceann {0} DiCiadain',
'wed-future-other' => 'an ceann {0} DiCiadain',
@@ -1814,18 +1814,18 @@ $timeUnits = [
'wed-narrow-past-one' => 'o {0} DiC.',
'wed-narrow-past-other' => 'o {0} DiC.',
'wed-narrow-past-two' => 'o {0} DhiC.',
- 'wed-past-few' => 'o chionn {0} DiCiadain',
- 'wed-past-one' => 'o chionn {0} DiCiadain',
- 'wed-past-other' => 'o chionn {0} DiCiadain',
- 'wed-past-two' => 'o chionn {0} DhiCiadain',
+ 'wed-past-few' => '{0} DiCiadain air ais',
+ 'wed-past-one' => '{0} DiCiadain air ais',
+ 'wed-past-other' => '{0} DiCiadain air ais',
+ 'wed-past-two' => '{0} DhiCiadain air ais',
'wed-short-future-few' => 'an ceann {0} DiC.',
'wed-short-future-one' => 'an ceann {0} DiC.',
'wed-short-future-other' => 'an ceann {0} DiC.',
'wed-short-future-two' => 'an ceann {0} DhiC.',
- 'wed-short-past-few' => 'o chionn {0} DiC.',
- 'wed-short-past-one' => 'o chionn {0} DiC.',
- 'wed-short-past-other' => 'o chionn {0} DiC.',
- 'wed-short-past-two' => 'o chionn {0} DhiC.',
+ 'wed-short-past-few' => '{0} DiC. air ais',
+ 'wed-short-past-one' => '{0} DiC. air ais',
+ 'wed-short-past-other' => '{0} DiC. air ais',
+ 'wed-short-past-two' => '{0} DhiC. air ais',
'week-few' => '{0} seachdainean',
'week-future-few' => 'an ceann {0} seachdainean',
'week-future-one' => 'an ceann {0} seachdain',
diff --git a/MLEB/cldr/CldrNames/CldrNamesGl.php b/MLEB/cldr/CldrNames/CldrNamesGl.php
index 1b692efa..71150a8c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesGl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesGl.php
@@ -527,7 +527,7 @@ $currencyNames = [
'LYD' => 'dinar libio',
'MAD' => 'dirham marroquí',
'MAF' => 'Franco marroquí',
- 'MDL' => 'Leu moldavo',
+ 'MDL' => 'leu moldavo',
'MGA' => 'ariary malgaxe',
'MKD' => 'dinar macedonio',
'MMK' => 'kyat birmano',
@@ -584,7 +584,7 @@ $currencyNames = [
'SUR' => 'Rublo soviético',
'SVC' => 'Colón salvadoreño',
'SYP' => 'libra siria',
- 'SZL' => 'lilangeni de Eswatini',
+ 'SZL' => 'lilangeni de Swazilandia',
'THB' => 'baht tailandés',
'TJS' => 'somoni taxiquistano',
'TMT' => 'manat turkmeno',
diff --git a/MLEB/cldr/CldrNames/CldrNamesHa.php b/MLEB/cldr/CldrNames/CldrNamesHa.php
index 4cd8a941..e7e6c48b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesHa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesHa.php
@@ -9,13 +9,13 @@ $languageNames = [
'ar-001' => 'Larabci Asali Na Zamani',
'as' => 'Asamisanci',
'asa' => 'Asu',
- 'ast' => 'Asturian',
+ 'ast' => 'Asturia',
'az' => 'Azerbaijanci',
'bas' => 'Basaa',
'be' => 'Belarusanci',
'bem' => 'Bemba',
'bez' => 'Bena',
- 'bg' => 'Bulgaranci',
+ 'bg' => 'Bulgariyanci',
'bm' => 'Bambara',
'bn' => 'Bengali',
'bo' => 'Tibetan',
@@ -28,18 +28,18 @@ $languageNames = [
'ceb' => 'Cebuano',
'cgg' => 'Chiga',
'chr' => 'Cherokee',
- 'ckb' => 'Kurdish na Tsaka',
+ 'ckb' => 'Kurdawa ta Tsakiya',
'co' => 'Corsican',
- 'cs' => 'Harshen Cak',
+ 'cs' => 'Cek',
'cu' => 'Church Slavic',
- 'cy' => 'Kabilar Welsh',
+ 'cy' => 'Welsh',
'da' => 'Danish',
'dav' => 'Taita',
'de' => 'Jamusanci',
'de-at' => 'Jamusanci Ostiriya',
'de-ch' => 'Jamusanci Suwizalan',
'dje' => 'Zarma',
- 'dsb' => 'Lower Sorbian',
+ 'dsb' => 'Sorbianci ta kasa',
'dua' => 'Duala',
'dyo' => 'Jola-Fonyi',
'dz' => 'Dzongkha',
@@ -51,7 +51,7 @@ $languageNames = [
'en-ca' => 'Turanci Kanada',
'en-gb' => 'Turanci Biritaniya',
'en-us' => 'Turanci Amirka',
- 'eo' => 'Dʼan/ʼYar Kabilar Andalus',
+ 'eo' => 'Esperanto',
'es' => 'Sifaniyanci',
'es-419' => 'Sifaniyancin Latin Amirka',
'es-es' => 'Sifaniyanci Turai',
@@ -59,7 +59,7 @@ $languageNames = [
'et' => 'Istoniyanci',
'eu' => 'Basque',
'ewo' => 'Ewondo',
- 'fa' => 'Parisanci',
+ 'fa' => 'Farisa',
'ff' => 'Fulah',
'fi' => 'Yaren mutanen Finland',
'fil' => 'Dan Filifin',
@@ -68,8 +68,8 @@ $languageNames = [
'fr-ca' => 'Farasanci Kanada',
'fr-ch' => 'Farasanci Suwizalan',
'fur' => 'Friulian',
- 'fy' => 'Kʼabilan Firsi',
- 'ga' => 'Dan Ailan',
+ 'fy' => 'Frisian ta Yamma',
+ 'ga' => 'Dan Irish',
'gd' => 'Kʼabilan Scots Gaelic',
'gl' => 'Bagalike',
'gn' => 'Guwaraniyanci',
@@ -78,7 +78,7 @@ $languageNames = [
'guz' => 'Gusii',
'gv' => 'Manx',
'ha' => 'Hausa',
- 'haw' => 'Hawaiian',
+ 'haw' => 'Hawaiianci',
'he' => 'Ibrananci',
'hi' => 'Harshen Hindi',
'hmn' => 'Hmong',
@@ -90,14 +90,14 @@ $languageNames = [
'ia' => 'Yare Tsakanin Kasashe',
'id' => 'Harshen Indunusiya',
'ie' => 'Intagulanci',
- 'ig' => 'Inyamuranci',
+ 'ig' => 'Igbo',
'ii' => 'Sichuan Yi',
'is' => 'Yaren mutanen Iceland',
'it' => 'Italiyanci',
'ja' => 'Japananci',
'jgo' => 'Ngomba',
'jmc' => 'Machame',
- 'jv' => 'Jabananci',
+ 'jv' => 'Jafananci',
'ka' => 'Jojiyanci',
'kab' => 'Kabyle',
'kam' => 'Kamba',
@@ -112,7 +112,7 @@ $languageNames = [
'km' => 'Harshen Kimar',
'kn' => 'Kannada',
'ko' => 'Harshen Koreya',
- 'kok' => 'Konkani',
+ 'kok' => 'Konkananci',
'ks' => 'Kashmiri',
'ksb' => 'Shambala',
'ksf' => 'Bafia',
@@ -126,24 +126,26 @@ $languageNames = [
'lg' => 'Ganda',
'lkt' => 'Lakota',
'ln' => 'Lingala',
- 'lo' => 'Laothian',
- 'lrc' => 'Northern Luri',
+ 'lo' => 'Lao',
+ 'lrc' => 'Arewacin Luri',
'lt' => 'Lituweniyanci',
'lu' => 'Luba-Katanga',
'luo' => 'Luo',
'luy' => 'Luyia',
'lv' => 'Latbiyanci',
+ 'mai' => 'Maithili',
'mas' => 'Harshen Masai',
'mer' => 'Meru',
'mfe' => 'Morisyen',
- 'mg' => 'Malagasy',
+ 'mg' => 'Malagasi',
'mgh' => 'Makhuwa-Meetto',
'mgo' => 'Metaʼ',
'mi' => 'Maori',
'mk' => 'Dan Masedoniya',
- 'ml' => 'Kabilar Maleyalam',
- 'mn' => 'Mongolian',
- 'mr' => 'Kʼabilan Marathi',
+ 'ml' => 'Malayalamci',
+ 'mn' => 'Mongoliyanci',
+ 'mni' => 'Manipuri',
+ 'mr' => 'Maratinci',
'ms' => 'Harshen Malai',
'mt' => 'Harshen Maltis',
'mua' => 'Mundang',
@@ -165,28 +167,31 @@ $languageNames = [
'nyn' => 'Nyankole',
'oc' => 'Ositanci',
'om' => 'Oromo',
- 'or' => 'Oriyanci',
+ 'or' => 'Odiya',
'os' => 'Ossetic',
'pa' => 'Punjabi',
+ 'pcm' => 'Pidgin na Najeriya',
'pl' => 'Harshen Polan',
'prg' => 'Ferusawa',
'ps' => 'Pashtanci',
- 'pt' => 'Harshen Fotugis',
- 'pt-pt' => 'Fotugis kasashen Turai',
+ 'pt' => 'Harshen Potugis',
+ 'pt-br' => 'Harshen Potugis na Birazil',
+ 'pt-pt' => 'Potugis Ƙasashen Turai',
'qu' => 'Quechua',
'rm' => 'Romansh',
'rn' => 'Rundi',
'ro' => 'Romaniyanci',
'rof' => 'Rombo',
'ru' => 'Rashanci',
- 'rw' => 'Kiniyaruwanda',
- 'rwk' => 'yaren Rwa',
+ 'rw' => 'Kinyarwanda',
+ 'rwk' => 'Rwa',
'sa' => 'Sanskrit',
'sah' => 'Sakha',
'saq' => 'Samburu',
+ 'sat' => 'Santali',
'sbp' => 'Sangu',
'sd' => 'Sindiyanci',
- 'se' => 'Northern Sami',
+ 'se' => 'Sami ta Arewa',
'seh' => 'Sena',
'ses' => 'Koyraboro Senni',
'sg' => 'Sango',
@@ -199,30 +204,30 @@ $languageNames = [
'smn' => 'Inari Sami',
'sn' => 'Shona',
'so' => 'Somalianci',
- 'sq' => 'Albanian',
+ 'sq' => 'Albaniyanci',
'sr' => 'Sabiyan',
'st' => 'Sesotanci',
- 'su' => 'Sudananci',
+ 'su' => 'Harshen Sundanese',
'sv' => 'Harshen Suwedan',
'sw' => 'Harshen Suwahili',
'ta' => 'Tamil',
- 'te' => 'Dʼan/ʼYar Kabilar Telug',
+ 'te' => 'Telugu',
'teo' => 'Teso',
'tg' => 'Tajik',
'th' => 'Thai',
- 'ti' => 'Tigriyanci',
+ 'ti' => 'Tigrinyanci',
'tk' => 'Tukmenistanci',
'tlh' => 'Klingon',
- 'to' => 'Tongan',
+ 'to' => 'Tonganci',
'tr' => 'Harshen Turkiyya',
'tt' => 'Tatar',
'tw' => 'Tiwiniyanci',
- 'twq' => 'Tasawaq',
+ 'twq' => 'Tasawak',
'tzm' => 'Tamazight na Atlas Tsaka',
'ug' => 'Ugiranci',
'uk' => 'Harshen Yukuren',
'und' => 'Harshen da ba a sani ba',
- 'ur' => 'Urdawa',
+ 'ur' => 'Urdanci',
'uz' => 'Uzbek',
'vai' => 'Vai',
'vi' => 'Harshen Biyetinam',
@@ -233,55 +238,55 @@ $languageNames = [
'xh' => 'Bazosa',
'xog' => 'Soga',
'yav' => 'Yangben',
- 'yi' => 'Yiddish',
+ 'yi' => 'Yaren Yiddish',
'yo' => 'Yarbanci',
- 'yue' => 'Cantonese',
- 'zgh' => 'Standard Moroccan Tamazight',
+ 'yue' => 'Harshen Cantonese',
+ 'zgh' => 'Daidaitaccen Moroccan Tamazight',
'zh' => 'Harshen Sinanci',
'zh-hans' => 'Sauƙaƙaƙƙen Sinanci',
'zh-hant' => 'Sinanci na gargajiya',
'zu' => 'Harshen Zulu',
- 'zxx' => 'Babu abun-ciki na yare',
+ 'zxx' => 'Babu abun cikin yare',
];
$currencyNames = [
'AED' => 'Kuɗin Haɗaɗɗiyar Daular Larabawa',
- 'AFN' => 'Afghani na kasar Afghanistan',
- 'ALL' => 'Kudin Albanian',
- 'AMD' => 'Kudin Armenian',
+ 'AFN' => 'Afghani na ƙasar Afghanistan',
+ 'ALL' => 'Kuɗin Albania',
+ 'AMD' => 'Kuɗin Armenia',
'ANG' => 'Antillean Guilder na ƙasar Netherlands',
'AOA' => 'Kuɗin Angola',
'ARS' => 'Peso na ƙasar Argentina',
'AUD' => 'Dalar Ostareliya',
'AWG' => 'Florin na yankin Aruba',
- 'AZN' => 'Kudin Azerbaijani',
- 'BAM' => 'Kudaden Bosnia da Harzegovina',
+ 'AZN' => 'Kuɗin Azerbaijani',
+ 'BAM' => 'Kuɗaɗen Bosnia da Herzegovina',
'BBD' => 'Dalar ƙasar Barbados',
- 'BDT' => 'Taka na kasar Bangladesh',
- 'BGN' => 'Kudin Bulgeria',
+ 'BDT' => 'Taka na ƙasar Bangladesh',
+ 'BGN' => 'Kuɗin Bulgeria',
'BHD' => 'Kuɗin Baharan',
'BIF' => 'Kuɗin Burundi',
'BMD' => 'Dalar ƙasar Bermuda',
- 'BND' => 'Kudin Brunei',
+ 'BND' => 'Dalar Brunei',
'BOB' => 'Boloviano na ƙasar Bolivia',
'BRL' => 'Ril Kudin Birazil',
'BSD' => 'Dalar ƙasar Bahamas',
- 'BTN' => 'Ngultrum na kasar Bhutan',
+ 'BTN' => 'Ngultrum na ƙasar Bhutan',
'BWP' => 'Kuɗin Baswana',
- 'BYN' => 'Kudin Belarusian',
+ 'BYN' => 'Kuɗin Belarus',
'BZD' => 'Dalar ƙasar Belize',
'CAD' => 'Dalar Kanada',
'CDF' => 'Kuɗin Kongo',
'CHF' => 'Kuɗin Suwizalan',
'CLP' => 'Peso na ƙasar Chile',
- 'CNH' => 'Yuan na ƙasar Sin (na wajen ƙasa)',
- 'CNY' => 'Yuwan kasar Sin',
+ 'CNH' => 'Yuwan na ƙasar Sin (na wajen ƙasa)',
+ 'CNY' => 'Yuwan na ƙasar Sin',
'COP' => 'Peso na ƙasar Columbia',
- 'CRC' => 'Colón na kasar Costa Rica',
- 'CUC' => 'Peso mai fuska biyu na ƙasar Cuba',
- 'CUP' => 'Peso na ƙasar Cuba',
+ 'CRC' => 'Colón na ƙasar Costa Rica',
+ 'CUC' => 'Peso mai fuska biyu na ƙasar Kuba',
+ 'CUP' => 'Peso na ƙasar Kuba',
'CVE' => 'Kuɗin Tsibiran Kap Barde',
- 'CZK' => 'Kudin Czech',
+ 'CZK' => 'Kuɗin Czech',
'DJF' => 'Kuɗin Jibuti',
'DKK' => 'Krone na ƙasar Denmark',
'DOP' => 'Peso na jamhuriyar Dominica',
@@ -293,58 +298,58 @@ $currencyNames = [
'FJD' => 'Dalar Fiji',
'FKP' => 'Fam na ƙasar Tsibirai na Falkland',
'GBP' => 'Fam na Ingila',
- 'GEL' => 'Kudin Georgian',
+ 'GEL' => 'Kuɗin Georgia',
'GHC' => 'Cedi',
- 'GHS' => 'Kudin Ghana',
- 'GIP' => 'Kudin Gibraltar',
+ 'GHS' => 'Sidi na Ghana',
+ 'GIP' => 'Kuɗin Gibraltal',
'GMD' => 'Kuɗin Gambiya',
- 'GNF' => 'Kudin Guinean',
+ 'GNF' => 'Kuɗin Guinea',
'GNS' => 'Kuɗin Gini',
'GTQ' => 'Quetzal na ƙasar Guatemala',
'GYD' => 'Dalar Guyana',
'HKD' => 'Dalar Hong Kong',
'HNL' => 'Lempira na ƙasar Honduras',
- 'HRK' => 'Kudin Croatian',
+ 'HRK' => 'Kuɗin Croatia',
'HTG' => 'Gourde na ƙasar Haiti',
- 'HUF' => 'Kudin Hungarian',
+ 'HUF' => 'Kuɗin Hungary',
'IDR' => 'Rupiah na ƙasar Indonesia',
- 'ILS' => 'Sabbin Kudin Shekel',
+ 'ILS' => 'Sabbin Kuɗin Israʼila',
'INR' => 'Kuɗin Indiya',
'IQD' => 'Dinarin Iraqi',
- 'IRR' => 'Riyal na kasar Iran',
+ 'IRR' => 'Riyal na ƙasar Iran',
'ISK' => 'Króna na ƙasar Iceland',
'JMD' => 'Dalar Jamaica',
- 'JOD' => 'Dinarin Jordanian',
- 'JPY' => 'Yen kasar Japan',
+ 'JOD' => 'Dinarin Jordan',
+ 'JPY' => 'Yen na ƙasar Japan',
'KES' => 'Sulen Kenya',
'KGS' => 'Som na ƙasar Kyrgystani',
'KHR' => 'Riel na ƙasar Cambodia',
'KMF' => 'Kuɗin Kwamoras',
- 'KPW' => 'Won na ƙasar Koreya ta Arewa',
- 'KRW' => 'Won na Koreya ta Kudu',
+ 'KPW' => 'won na ƙasar Koriya ta Arewa',
+ 'KRW' => 'won na Koriya ta Kudu',
'KWD' => 'Dinarin Kuwaiti',
'KYD' => 'Dalar ƙasar Tsibirai na Cayman',
'KZT' => 'Tenge na ƙasar Kazkhstan',
- 'LAK' => 'Kudin Laotian',
- 'LBP' => 'Kudin Lebanese',
- 'LKR' => 'Rupee na kasar Sri Lanka',
+ 'LAK' => 'Kuɗin Laos',
+ 'LBP' => 'Kuɗin Lebanon',
+ 'LKR' => 'Rupee na ƙasar Sri Lanka',
'LRD' => 'Dalar Laberiya',
'LSL' => 'Kuɗin Lesoto',
'LYD' => 'Kuɗin Libiya',
'MAD' => 'Kuɗin Maroko',
- 'MDL' => 'kudaden Moldova',
+ 'MDL' => 'kuɗaɗen Moldova',
'MGA' => 'Kuɗin Madagaskar',
- 'MKD' => 'Dinarin Macedonian',
- 'MMK' => 'Kudin Myanmar',
+ 'MKD' => 'Dinarin Macedonia',
+ 'MMK' => 'Kuɗin Myanmar',
'MNT' => 'Tugrik na Mongolia',
'MOP' => 'Pataca na ƙasar Macao',
'MRO' => 'Kuɗin Moritaniya (1973–2017)',
'MRU' => 'Kuɗin Moritaniya',
'MUR' => 'Kuɗin Moritus',
- 'MVR' => 'Rufiyaa na kasar Maldives',
+ 'MVR' => 'Rufiyaa na ɓasar Maldives',
'MWK' => 'Kuɗin Malawi',
- 'MXN' => 'Peso na ƙasar Mexico',
- 'MYR' => 'Kudin Malaysian',
+ 'MXN' => 'Peso na ƙasar Mekziko',
+ 'MYR' => 'Kuɗin Malaysia',
'MZM' => 'Kuɗin Mozambik',
'MZN' => 'Metical na ƙasar Mozambique',
'NAD' => 'Dalar Namibiya',
@@ -353,25 +358,25 @@ $currencyNames = [
'NOK' => 'Krone na ƙasar Norway',
'NPR' => 'Rupee na Nepal',
'NZD' => 'Dalar New Zealand',
- 'OMR' => 'Riyal din Omani',
+ 'OMR' => 'Riyal ɗin Oman',
'PAB' => 'Balboa na ƙasar Panama',
'PEN' => 'Sol na ƙasar Peru',
'PGK' => 'Kina na ƙasar Papua Sabon Guinea',
- 'PHP' => 'Kudin Philippine',
- 'PKR' => 'Rupee na kasar Pakistan',
- 'PLN' => 'Kudaden Polish',
+ 'PHP' => 'Kuɗin Philippine',
+ 'PKR' => 'Rupee na ƙasar Pakistan',
+ 'PLN' => 'Kuɗin Polan',
'PYG' => 'Guarani na ƙasar Paraguay',
- 'QAR' => 'Riyal din Qatari',
- 'RON' => 'Kudin Romanian',
- 'RSD' => 'Dinar Serbian',
- 'RUB' => 'Ruble kasar Rasha',
+ 'QAR' => 'Riyal ɗin Qatar',
+ 'RON' => 'Kuɗin Romania',
+ 'RSD' => 'Dinarin Serbia',
+ 'RUB' => 'Ruble na ƙasar Rasha',
'RWF' => 'Kuɗin Ruwanda',
'SAR' => 'Riyal',
'SBD' => 'Dalar Tsibirai na Solomon',
'SCR' => 'Kuɗin Saishal',
- 'SDG' => 'Fam kin Sudan',
+ 'SDG' => 'Fam na Sudan',
'SEK' => 'Krona na ƙasar Sweden',
- 'SGD' => 'Dilar Singapore',
+ 'SGD' => 'Dalar Singapore',
'SHP' => 'Fam kin San Helena',
'SLL' => 'Kuɗin Salewo',
'SOS' => 'Sulen Somaliya',
@@ -379,32 +384,32 @@ $currencyNames = [
'SSP' => 'Fam na Kudancin Sudan',
'STD' => 'Kuɗin Sawo Tome da Paransip (1977–2017)',
'STN' => 'Kuɗin Sawo Tome da Paransip',
- 'SYP' => 'Kudin Syrian',
+ 'SYP' => 'Kuɗin Siriya',
'SZL' => 'Kuɗin Lilangeni',
'THB' => 'Baht na ƙasar Thailand',
'TJS' => 'Somoni na ƙasar Tajikistan',
'TMT' => 'Manat na ƙasar Turkmenistan',
'TND' => 'Kuɗin Tunisiya',
- 'TOP' => 'Paʼanga na ƙasar Tonga',
- 'TRY' => 'Kudin Turkish',
+ 'TOP' => 'Paʻanga na ƙasar Tonga',
+ 'TRY' => 'Kuɗin Turkiyya',
'TTD' => 'Dalar ƙasar Trinidad da Tobago',
'TWD' => 'Sabuwar Dalar Taiwan',
'TZS' => 'Sulen Tanzaniya',
'UAH' => 'Kudin Ukrainian',
'UGX' => 'Sule Yuganda',
- 'USD' => 'Dalar Amirka',
+ 'USD' => 'Dalar Amurka',
'UYU' => 'Peso na ƙasar Uruguay',
'UZS' => 'Som na ƙasar Uzbekistan',
'VES' => 'Bolívar na ƙasar Venezuela',
- 'VND' => 'Kudin Vietnamese',
+ 'VND' => 'Kuɗin Vietnam',
'VUV' => 'Vatu da ƙasar Vanuatu',
'WST' => 'Tala na ƙasar Samoa',
'XAF' => 'Kuɗin Sefa na Afirka Ta Tsakiya',
- 'XCD' => 'Dalar Gabashin Caribbean',
+ 'XCD' => 'Dalar Gabashin Karebiyan',
'XOF' => 'Kuɗin Sefa na Afirka Ta Yamma',
- 'XPF' => 'kudin CFP Franc',
+ 'XPF' => 'Kuɗin CFP franc',
'XXX' => 'Kudin da ba a sani ba',
- 'YER' => 'Riyal din Yemeni',
+ 'YER' => 'Riyal ɗin Yemen',
'ZAR' => 'Kuɗin Afirka Ta Kudu',
'ZMK' => 'Kuɗin Zambiya (1968–2012)',
'ZMW' => 'Kuɗin Zambiya',
@@ -423,7 +428,7 @@ $countryNames = [
'AD' => 'Andora',
'AE' => 'Haɗaɗɗiyar Daular Larabawa',
'AF' => 'Afaganistan',
- 'AG' => 'Antigwa da Barbuba',
+ 'AG' => 'Antigua da Barbuda',
'AI' => 'Angila',
'AL' => 'Albaniya',
'AM' => 'Armeniya',
@@ -436,7 +441,7 @@ $countryNames = [
'AW' => 'Aruba',
'AX' => 'Tsibirai na Åland',
'AZ' => 'Azarbaijan',
- 'BA' => 'Bosniya Harzagobina',
+ 'BA' => 'Bosniya da Harzagobina',
'BB' => 'Barbadas',
'BD' => 'Bangiladas',
'BE' => 'Belgiyom',
@@ -445,7 +450,7 @@ $countryNames = [
'BH' => 'Baharan',
'BI' => 'Burundi',
'BJ' => 'Binin',
- 'BL' => 'St. Barthélemy',
+ 'BL' => 'San Barthélemy',
'BM' => 'Barmuda',
'BN' => 'Burune',
'BO' => 'Bolibiya',
@@ -473,7 +478,7 @@ $countryNames = [
'CR' => 'Kwasta Rika',
'CU' => 'Kyuba',
'CV' => 'Tsibiran Kap Barde',
- 'CW' => 'Kasar Curaçao',
+ 'CW' => 'Ƙasar Curaçao',
'CX' => 'Tsibirin Kirsmati',
'CY' => 'Sifurus',
'CZ' => 'Jamhuriyar Cak',
@@ -484,7 +489,7 @@ $countryNames = [
'DM' => 'Dominika',
'DO' => 'Jamhuriyar Dominika',
'DZ' => 'Aljeriya',
- 'EA' => 'Ceuta & Melilla',
+ 'EA' => 'Ceuta da Melilla',
'EC' => 'Ekwador',
'EE' => 'Estoniya',
'EG' => 'Misira',
@@ -519,16 +524,16 @@ $countryNames = [
'GU' => 'Gwam',
'GW' => 'Gini Bisau',
'GY' => 'Guyana',
- 'HK' => 'Hong Kong Babban Birnin Kasar Chana',
+ 'HK' => 'Babban Yankin Mulkin Hong Kong na Ƙasar Sin',
'HM' => 'Tsibirin Heard da McDonald',
'HN' => 'Honduras',
'HR' => 'Kurowaishiya',
'HT' => 'Haiti',
'HU' => 'Hungari',
- 'IC' => 'Canary Islands',
+ 'IC' => 'Tsibiran Canary',
'ID' => 'Indunusiya',
'IE' => 'Ayalan',
- 'IL' => 'Iziraʼila',
+ 'IL' => 'Israʼila',
'IM' => 'Isle na Mutum',
'IN' => 'Indiya',
'IO' => 'Yankin Birtaniya Na Tekun Indiya',
@@ -539,7 +544,7 @@ $countryNames = [
'JE' => 'Kasar Jersey',
'JM' => 'Jamaika',
'JO' => 'Jordan',
- 'JP' => 'Jàpân',
+ 'JP' => 'Japan',
'KE' => 'Kenya',
'KG' => 'Kirgizistan',
'KH' => 'Kambodiya',
@@ -560,20 +565,20 @@ $countryNames = [
'LS' => 'Lesoto',
'LT' => 'Lituweniya',
'LU' => 'Lukusambur',
- 'LV' => 'latibiya',
+ 'LV' => 'Litibiya',
'LY' => 'Libiya',
'MA' => 'Maroko',
'MC' => 'Monako',
'MD' => 'Maldoba',
'ME' => 'Mantanegara',
- 'MF' => 'St. Martin',
+ 'MF' => 'San Martin',
'MG' => 'Madagaskar',
'MH' => 'Tsibiran Marshal',
'MK' => 'Macedonia ta Arewa',
'ML' => 'Mali',
'MM' => 'Burma, Miyamar',
'MN' => 'Mangoliya',
- 'MO' => 'Babban Birnin Mulki na Chana',
+ 'MO' => 'Babban Yankin Mulkin Macao na Ƙasar Sin',
'MP' => 'Tsibiran Mariyana Na Arewa',
'MQ' => 'Martinik',
'MR' => 'Moritaniya',
@@ -605,7 +610,7 @@ $countryNames = [
'PH' => 'Filipin',
'PK' => 'Pakistan',
'PL' => 'Polan',
- 'PM' => 'San Piyar Da Mikelan',
+ 'PM' => 'San Piyar da Mikelan',
'PN' => 'Pitakarin',
'PR' => 'Porto Riko',
'PS' => 'Palasɗinu',
@@ -634,10 +639,10 @@ $countryNames = [
'SN' => 'Sanigal',
'SO' => 'Somaliya',
'SR' => 'Suriname',
- 'SS' => 'Sudan ta kudu',
+ 'SS' => 'Sudan ta Kudu',
'ST' => 'Sawo Tome Da Paransip',
'SV' => 'El Salbador',
- 'SX' => 'Sint Maarten',
+ 'SX' => 'San Maarten',
'SY' => 'Sham, Siriya',
'SZ' => 'Eswatini',
'TA' => 'Tritan da Kunha',
@@ -660,7 +665,7 @@ $countryNames = [
'UA' => 'Yukaran',
'UG' => 'Yuganda',
'UM' => 'Rukunin Tsibirin U.S',
- 'UN' => 'Majalisar Dinkin Duniya',
+ 'UN' => 'Majalisar Ɗinkin Duniya',
'US' => 'Amurka',
'UY' => 'Yurigwai',
'UZ' => 'Uzubekistan',
@@ -684,6 +689,24 @@ $countryNames = [
];
$timeUnits = [
+ 'century-one' => 'ƙarni {0}',
+ 'century-other' => 'ƙarnoni {0}',
+ 'day-future-one' => 'a cikin rana {0}',
+ 'day-future-other' => 'a cikin kwanaki {0}',
+ 'day-narrow-future-one' => 'a cikin rana {0}',
+ 'day-narrow-future-other' => 'a cikin kwanaki {0}',
+ 'day-narrow-past-one' => 'rana da ya gabata {0}',
+ 'day-narrow-past-other' => 'kwanaki da suka gabata {0}',
+ 'day-one' => 'rana {0}',
+ 'day-other' => 'ranaku {0}',
+ 'day-past-one' => 'rana da ya gabata {0}',
+ 'day-past-other' => 'kwanaki da suka gabata {0}',
+ 'day-short-future-one' => 'a cikin rana {0}',
+ 'day-short-future-other' => 'a cikin kwanaki {0}',
+ 'day-short-past-one' => 'rana da ya gabata {0}',
+ 'day-short-past-other' => 'kwanaki da suka gabata {0}',
+ 'decade-one' => 'shekaru goma {0}',
+ 'decade-other' => 'shekaru goma-goma {0}',
'fri-future-one' => 'cikin {0} Jumaʼa',
'fri-future-other' => 'cikin {0} Jumaʼa',
'fri-narrow-future-one' => 'cikin {0} Jumaʼa',
@@ -702,18 +725,26 @@ $timeUnits = [
'hour-narrow-future-other' => 'cikin {0} awa',
'hour-narrow-past-one' => '{0} awa da ya gabata',
'hour-narrow-past-other' => '{0} awa da ya gabata',
+ 'hour-one' => 'sa\'a {0}',
+ 'hour-other' => 'sa\'o\'i {0}',
'hour-past-one' => '{0} awa da ya gabata',
'hour-past-other' => '{0} awa da ya gabata',
'hour-short-future-one' => 'cikin {0} awa',
'hour-short-future-other' => 'cikin {0} awa',
'hour-short-past-one' => '{0} awa da ya gabata',
'hour-short-past-other' => '{0} awa da ya gabata',
+ 'microsecond-one' => 'makirosekan {0}',
+ 'microsecond-other' => 'makirosekans {0}',
+ 'millisecond-one' => 'millisakan {0}',
+ 'millisecond-other' => 'millisakans {0}',
'minute-future-one' => 'cikin {0} minti',
'minute-future-other' => 'cikin {0} minti',
'minute-narrow-future-one' => 'cikin {0} minti',
'minute-narrow-future-other' => 'cikin {0} minti',
'minute-narrow-past-one' => '{0} minti da ya gabata',
'minute-narrow-past-other' => '{0} minti da ya gabata',
+ 'minute-one' => 'minti {0}',
+ 'minute-other' => 'mintoci {0}',
'minute-past-one' => '{0} minti da ya gabata',
'minute-past-other' => '{0} minti da ya gabata',
'minute-short-future-one' => 'cikin {0} minti',
@@ -732,6 +763,34 @@ $timeUnits = [
'mon-short-future-other' => 'cikin {0} Litinin',
'mon-short-past-one' => '{0} Litinin din da ta gabata',
'mon-short-past-other' => '{0} Litinin din da ta gabata',
+ 'month-future-one' => 'a cikin watan {0}',
+ 'month-future-other' => 'a cikin watanni {0}',
+ 'month-narrow-future-one' => 'a cikin watan {0}',
+ 'month-narrow-future-other' => 'a cikin watan {0}',
+ 'month-narrow-past-one' => 'watan da ya gabata {0}',
+ 'month-narrow-past-other' => 'watan da ya gabata {0}',
+ 'month-one' => 'wata {0}',
+ 'month-other' => 'watanni {0}',
+ 'month-past-one' => 'watan da ya gabata',
+ 'month-past-other' => 'watanni da suka gabata {0}}',
+ 'month-short-future-one' => 'a cikin watan {0}',
+ 'month-short-future-other' => 'a cikin watan {0}',
+ 'month-short-past-one' => 'watan da ya gabata',
+ 'month-short-past-other' => 'watan da ya gabata {0}',
+ 'nanosecond-one' => 'nanosekan {0}',
+ 'nanosecond-other' => 'nanosekans {0}',
+ 'quarter-future-one' => 'a cikin kwata {0}',
+ 'quarter-future-other' => 'a cikin kwatas {0}',
+ 'quarter-narrow-future-one' => 'a cikin kwata {0}',
+ 'quarter-narrow-future-other' => 'a cikin kwatas {0}',
+ 'quarter-narrow-past-one' => 'kwata da suka gabata {0}',
+ 'quarter-narrow-past-other' => 'kwatas da suka gabata {0}',
+ 'quarter-past-one' => 'kwata da suka gabata {0}',
+ 'quarter-past-other' => 'kwatas da suka gabata {0}',
+ 'quarter-short-future-one' => 'a cikin kwata {0}',
+ 'quarter-short-future-other' => 'a cikin kwatas {0}',
+ 'quarter-short-past-one' => 'kwata da suka gabata {0}',
+ 'quarter-short-past-other' => 'kwatas da suka gabata {0}',
'sat-future-one' => 'cikin {0} Asabar',
'sat-future-other' => 'cikin {0} Asabar',
'sat-narrow-future-one' => 'cikin {0} Asabar',
@@ -750,6 +809,8 @@ $timeUnits = [
'second-narrow-future-other' => 'cikin {0} dakika',
'second-narrow-past-one' => '{0} dakika da ya gabata',
'second-narrow-past-other' => '{0} dakika da ya gabata',
+ 'second-one' => 'daƙiƙa {0}',
+ 'second-other' => 'daƙiƙoƙi {0}',
'second-past-one' => '{0} dakika da ya gabata',
'second-past-other' => '{0} dakika da ya gabata',
'second-short-future-one' => 'cikin {0} dakika',
@@ -804,4 +865,28 @@ $timeUnits = [
'wed-short-future-other' => 'cikin {0} Laraba',
'wed-short-past-one' => '{0} Laraba da ta gabata',
'wed-short-past-other' => '{0} Laraba da ta gabata',
+ 'week-future-one' => 'a cikin mako {0}',
+ 'week-future-other' => 'a cikin makonni {0}',
+ 'week-narrow-future-one' => 'a cikin mako {0}',
+ 'week-narrow-future-other' => 'a cikin mako {0}',
+ 'week-narrow-past-one' => 'mako da suka gabata {0}',
+ 'week-narrow-past-other' => 'mako da ya gabata {0}',
+ 'week-one' => 'mako {0}',
+ 'week-other' => 'makonni {0}',
+ 'week-past-one' => 'mako da ya gabata {0}',
+ 'week-past-other' => 'makonni da suka gabata {0}',
+ 'week-short-future-one' => 'a cikin mako {0}',
+ 'week-short-future-other' => 'a cikin mako {0}',
+ 'week-short-past-one' => 'mako da ya gabata {0}',
+ 'week-short-past-other' => 'mako da ya gabata {0}',
+ 'year-future-one' => 'a shekarar {0}',
+ 'year-future-other' => 'a shekaru {0}',
+ 'year-narrow-past-one' => 'shekara da suka gabata {0}',
+ 'year-narrow-past-other' => 'shekara da suka gabata {0}',
+ 'year-one' => 'shekara {0}',
+ 'year-other' => 'shekaru {0}',
+ 'year-past-one' => 'shekara da suka gabata {0}',
+ 'year-past-other' => 'shekara da suka gabata {0}',
+ 'year-short-past-one' => 'shekara da suka gabata {0}',
+ 'year-short-past-other' => 'shekara da suka gabata {0}',
];
diff --git a/MLEB/cldr/CldrNames/CldrNamesHe.php b/MLEB/cldr/CldrNames/CldrNamesHe.php
index 9ab6ad77..c68b0a0b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesHe.php
+++ b/MLEB/cldr/CldrNames/CldrNamesHe.php
@@ -168,7 +168,7 @@ $languageNames = [
'got' => 'גותית',
'grb' => 'גרבו',
'grc' => 'יוונית עתיקה',
- 'gsw' => 'גרמנית (בשוויץ)',
+ 'gsw' => 'גרמנית שוויצרית',
'gu' => 'גוג׳ארטי',
'guz' => 'גוסי',
'gv' => 'מאנית',
diff --git a/MLEB/cldr/CldrNames/CldrNamesHi.php b/MLEB/cldr/CldrNames/CldrNamesHi.php
index 6aeba946..da6d3511 100644
--- a/MLEB/cldr/CldrNames/CldrNamesHi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesHi.php
@@ -543,6 +543,7 @@ $currencyNames = [
'BRL' => 'ब्राज़ीली रियाल',
'BSD' => 'बहामाई डॉलर',
'BTN' => 'भूटानी नंगलट्रम',
+ 'BUK' => 'बर्मी क्यात',
'BWP' => 'बोत्सवानियाई पुला',
'BYN' => 'बेलारूसी रूबल',
'BYR' => 'बेलारूसी रूबल (2000–2016)',
@@ -678,6 +679,7 @@ $currencyNames = [
'TMT' => 'तुर्कमेनिस्तानी मैनत',
'TND' => 'ट्यूनीशियाई दिनार',
'TOP' => 'टोंगन पांगा',
+ 'TPE' => 'तिमोरी एस्कूडो',
'TRL' => 'पुरानी तुर्की लीरा',
'TRY' => 'तुर्की लीरा',
'TTD' => 'त्रिनिदाद और टोबैगो डॉलर',
@@ -694,10 +696,12 @@ $currencyNames = [
'VEF' => 'वेनेज़ुएला बोलिवर (2008–2018)',
'VES' => 'वेनेज़ुएला बोलिवर',
'VND' => 'वियतनामी डोंग',
+ 'VNN' => 'वियतनामी डोंग (1978–1985)',
'VUV' => 'वनुआतू वातू',
'WST' => 'समोआई ताला',
'XAF' => 'केंद्रीय अफ़्रीकी CFA फ़्रैंक',
'XCD' => 'पूर्वी कैरिबियाई डॉलर',
+ 'XEU' => 'यूरोपीय मुद्रा इकाई',
'XOF' => 'पश्चिमी अफ़्रीकी CFA फ़्रैंक',
'XPF' => '[CFP] फ़्रैंक',
'XXX' => 'अज्ञात मुद्रा',
@@ -1173,8 +1177,8 @@ $timeUnits = [
'hour-narrow-future-other' => '{0} घं॰ में',
'hour-narrow-past-one' => '{0} घं॰ पहले',
'hour-narrow-past-other' => '{0} घं॰ पहले',
- 'hour-one' => '{0} घंटा',
- 'hour-other' => '{0} घंटे',
+ 'hour-one' => '{0} घंटे',
+ 'hour-other' => '{0} घंटों',
'hour-past-one' => '{0} घंटे पहले',
'hour-past-other' => '{0} घंटे पहले',
'hour-short-future-one' => '{0} घं॰ में',
@@ -1217,7 +1221,7 @@ $timeUnits = [
'month-narrow-future-other' => '{0} माह में',
'month-narrow-past-one' => '{0} माह पहले',
'month-narrow-past-other' => '{0} माह पहले',
- 'month-one' => '{0} माह',
+ 'month-one' => '{0} महीने',
'month-other' => '{0} माह',
'month-past-one' => '{0} माह पहले',
'month-past-other' => '{0} माह पहले',
@@ -1257,8 +1261,8 @@ $timeUnits = [
'second-narrow-future-other' => '{0} से॰ में',
'second-narrow-past-one' => '{0} से॰ पहले',
'second-narrow-past-other' => '{0} से॰ पहले',
- 'second-one' => '{0} सेकंड',
- 'second-other' => '{0} सेकंड',
+ 'second-one' => '{0} सेकेंड',
+ 'second-other' => '{0} सेकेंड',
'second-past-one' => '{0} सेकंड पहले',
'second-past-other' => '{0} सेकंड पहले',
'second-short-future-one' => '{0} से॰ में',
diff --git a/MLEB/cldr/CldrNames/CldrNamesHsb.php b/MLEB/cldr/CldrNames/CldrNamesHsb.php
index b5d6fdc6..7c6d10fb 100644
--- a/MLEB/cldr/CldrNames/CldrNamesHsb.php
+++ b/MLEB/cldr/CldrNames/CldrNamesHsb.php
@@ -723,6 +723,7 @@ $countryNames = [
'UA' => 'Ukraina',
'UG' => 'Uganda',
'UM' => 'Ameriska Oceaniska',
+ 'UN' => 'Zjednoćene narody',
'US' => 'USA',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistan',
diff --git a/MLEB/cldr/CldrNames/CldrNamesHu.php b/MLEB/cldr/CldrNames/CldrNamesHu.php
index cde2e8f9..43278f75 100644
--- a/MLEB/cldr/CldrNames/CldrNamesHu.php
+++ b/MLEB/cldr/CldrNames/CldrNamesHu.php
@@ -21,7 +21,7 @@ $languageNames = [
'ang' => 'óangol',
'anp' => 'angika',
'ar' => 'arab',
- 'ar-001' => 'modern szabányos arab',
+ 'ar-001' => 'modern szabványos arab',
'arc' => 'arámi',
'arn' => 'mapucse',
'arp' => 'arapaho',
@@ -606,7 +606,7 @@ $currencyNames = [
'CSK' => 'Csehszlovák kemény korona',
'CUC' => 'kubai konvertibilis peso',
'CUP' => 'kubai peso',
- 'CVE' => 'Cape Verde-i escudo',
+ 'CVE' => 'Zöld-foki escudo',
'CYP' => 'Ciprusi font',
'CZK' => 'cseh korona',
'DDM' => 'Kelet-Német márka',
@@ -1032,9 +1032,9 @@ $countryNames = [
'BZ' => 'Belize',
'CA' => 'Kanada',
'CC' => 'Kókusz (Keeling)-szigetek',
- 'CD' => 'Kongó - Kinshasa',
+ 'CD' => 'Kongó – Kinshasa',
'CF' => 'Közép-afrikai Köztársaság',
- 'CG' => 'Kongó - Brazzaville',
+ 'CG' => 'Kongó – Brazzaville',
'CH' => 'Svájc',
'CI' => 'Elefántcsontpart',
'CK' => 'Cook-szigetek',
diff --git a/MLEB/cldr/CldrNames/CldrNamesId.php b/MLEB/cldr/CldrNames/CldrNamesId.php
index 1d909d33..52bbb690 100644
--- a/MLEB/cldr/CldrNames/CldrNamesId.php
+++ b/MLEB/cldr/CldrNames/CldrNamesId.php
@@ -153,8 +153,6 @@ $languageNames = [
'fo' => 'Faroe',
'fon' => 'Fon',
'fr' => 'Prancis',
- 'fr-ca' => 'Perancis (Kanada)',
- 'fr-ch' => 'Perancis (Swiss)',
'frc' => 'Prancis Cajun',
'frm' => 'Prancis Abad Pertengahan',
'fro' => 'Prancis Kuno',
@@ -542,8 +540,6 @@ $languageNames = [
'zen' => 'Zenaga',
'zgh' => 'Tamazight Maroko Standar',
'zh' => 'Tionghoa',
- 'zh-hans' => 'Tionghoa (Aksara Sederhana)',
- 'zh-hant' => 'Tionghoa (Aksara Tradisional)',
'zu' => 'Zulu',
'zun' => 'Zuni',
'zxx' => 'Tidak ada konten linguistik',
@@ -626,13 +622,13 @@ $currencyNames = [
'CUP' => 'Peso Kuba',
'CVE' => 'Escudo Tanjung Verde',
'CYP' => 'Pound Siprus',
- 'CZK' => 'Koruna Cheska',
+ 'CZK' => 'Koruna Ceko',
'DDM' => 'Mark Jerman Timur',
'DEM' => 'Mark Jerman',
'DJF' => 'Franc Jibuti',
'DKK' => 'Krone Denmark',
'DOP' => 'Peso Dominika',
- 'DZD' => 'Dinar Algeria',
+ 'DZD' => 'Dinar Aljazair',
'ECS' => 'Sucre Ekuador',
'ECV' => 'Satuan Nilai Tetap Ekuador',
'EEK' => 'Kroon Estonia',
@@ -683,7 +679,7 @@ $currencyNames = [
'JOD' => 'Dinar Yordania',
'JPY' => 'Yen Jepang',
'KES' => 'Shilling Kenya',
- 'KGS' => 'Som Kirgistan',
+ 'KGS' => 'Som Kirgizstan',
'KHR' => 'Riel Kamboja',
'KMF' => 'Franc Komoro',
'KPW' => 'Won Korea Utara',
@@ -692,7 +688,7 @@ $currencyNames = [
'KRW' => 'Won Korea Selatan',
'KWD' => 'Dinar Kuwait',
'KYD' => 'Dolar Kepulauan Cayman',
- 'KZT' => 'Tenge Kazakstan',
+ 'KZT' => 'Tenge Kazakhstan',
'LAK' => 'Kip Laos',
'LBP' => 'Pound Lebanon',
'LKR' => 'Rupee Sri Lanka',
@@ -750,7 +746,7 @@ $currencyNames = [
'PGK' => 'Kina Papua Nugini',
'PHP' => 'Peso Filipina',
'PKR' => 'Rupee Pakistan',
- 'PLN' => 'Polandia Zloty',
+ 'PLN' => 'Zloty Polandia',
'PLZ' => 'Zloty Polandia (1950–1995)',
'PTE' => 'Escudo Portugal',
'PYG' => 'Guarani Paraguay',
@@ -788,7 +784,7 @@ $currencyNames = [
'TJR' => 'Rubel Tajikistan',
'TJS' => 'Somoni Tajikistan',
'TMM' => 'Manat Turkmenistan (1993–2009)',
- 'TMT' => 'Manat Turkimenistan',
+ 'TMT' => 'Manat Turkmenistan',
'TND' => 'Dinar Tunisia',
'TOP' => 'Paʻanga Tonga',
'TPE' => 'Escudo Timor',
@@ -815,7 +811,7 @@ $currencyNames = [
'VNN' => 'Dong Vietnam (1978–1985)',
'VUV' => 'Vatu Vanuatu',
'WST' => 'Tala Samoa',
- 'XAF' => 'Franc CFA BEAC',
+ 'XAF' => 'Franc CFA Afrika Tengah',
'XAG' => 'Silver',
'XAU' => 'Emas',
'XBA' => 'Unit Gabungan Eropa',
@@ -827,7 +823,7 @@ $currencyNames = [
'XEU' => 'Satuan Mata Uang Eropa',
'XFO' => 'Franc Gold Perancis',
'XFU' => 'Franc UIC Perancis',
- 'XOF' => 'Franc CFA BCEAO',
+ 'XOF' => 'Franc CFA Afrika Barat',
'XPD' => 'Palladium',
'XPF' => 'Franc CFP',
'XPT' => 'Platinum',
@@ -1106,7 +1102,7 @@ $countryNames = [
'GG' => 'Guernsey',
'GH' => 'Ghana',
'GI' => 'Gibraltar',
- 'GL' => 'Grinlandia',
+ 'GL' => 'Greenland',
'GM' => 'Gambia',
'GN' => 'Guinea',
'GP' => 'Guadeloupe',
@@ -1139,7 +1135,7 @@ $countryNames = [
'JO' => 'Yordania',
'JP' => 'Jepang',
'KE' => 'Kenya',
- 'KG' => 'Kirgistan',
+ 'KG' => 'Kirgizstan',
'KH' => 'Kamboja',
'KI' => 'Kiribati',
'KM' => 'Komoro',
@@ -1148,7 +1144,7 @@ $countryNames = [
'KR' => 'Korea Selatan',
'KW' => 'Kuwait',
'KY' => 'Kepulauan Cayman',
- 'KZ' => 'Kazakstan',
+ 'KZ' => 'Kazakhstan',
'LA' => 'Laos',
'LB' => 'Lebanon',
'LC' => 'Saint Lucia',
@@ -1159,7 +1155,7 @@ $countryNames = [
'LT' => 'Lituania',
'LU' => 'Luksemburg',
'LV' => 'Latvia',
- 'LY' => 'Libia',
+ 'LY' => 'Libya',
'MA' => 'Maroko',
'MC' => 'Monako',
'MD' => 'Moldova',
@@ -1240,14 +1236,14 @@ $countryNames = [
'SZ' => 'eSwatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Kepulauan Turks dan Caicos',
- 'TD' => 'Cad',
- 'TF' => 'Wilayah Selatan Perancis',
+ 'TD' => 'Chad',
+ 'TF' => 'Wilayah Selatan Prancis',
'TG' => 'Togo',
'TH' => 'Thailand',
'TJ' => 'Tajikistan',
'TK' => 'Tokelau',
'TL' => 'Timor Leste',
- 'TM' => 'Turkimenistan',
+ 'TM' => 'Turkmenistan',
'TN' => 'Tunisia',
'TO' => 'Tonga',
'TR' => 'Turki',
@@ -1257,9 +1253,9 @@ $countryNames = [
'TZ' => 'Tanzania',
'UA' => 'Ukraina',
'UG' => 'Uganda',
- 'UM' => 'Kepulauan Terluar A.S.',
+ 'UM' => 'Kepulauan Terluar AS',
'UN' => 'PBB',
- 'US' => 'A.S.',
+ 'US' => 'AS',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistan',
'VA' => 'Vatikan',
diff --git a/MLEB/cldr/CldrNames/CldrNamesIg.php b/MLEB/cldr/CldrNames/CldrNamesIg.php
index 7d69e638..09746bc2 100644
--- a/MLEB/cldr/CldrNames/CldrNamesIg.php
+++ b/MLEB/cldr/CldrNames/CldrNamesIg.php
@@ -1,66 +1,231 @@
<?php
$languageNames = [
+ 'af' => 'Afrikaans',
+ 'agq' => 'Aghem',
'ak' => 'Akan',
'am' => 'Amariikị',
'ar' => 'Arabiikị',
'ar-001' => 'Ụdị Arabiikị nke oge a',
- 'be' => 'Belaruusu',
+ 'asa' => 'Asụ',
+ 'az' => 'Azerbajanị',
+ 'be' => 'Belarusianụ',
+ 'bez' => 'Bena',
'bg' => 'Bọlụgarịa',
+ 'bm' => 'Bambara',
'bn' => 'Bengali',
+ 'bo' => 'Tibetan',
+ 'br' => 'Breton',
+ 'brx' => 'Bọdọ',
+ 'bs' => 'Bosnia',
+ 'ca' => 'Catalan',
+ 'ccp' => 'Chakma',
+ 'ce' => 'Chechen',
+ 'ceb' => 'Cebụanọ',
+ 'chr' => 'Cheroke',
+ 'co' => 'Kọsịan',
'cs' => 'Cheekị',
- 'de' => 'Asụsụ Jaman',
+ 'cu' => 'Church slavic',
+ 'cy' => 'Wesh',
+ 'da' => 'Danịsh',
+ 'dav' => 'Taịta',
+ 'de' => 'Jamanị',
'de-at' => 'Jaman ndị Austria',
'de-ch' => 'Jaman Izugbe ndị Switzerland',
+ 'dje' => 'Zarma',
+ 'dsb' => 'Lowa Sorbịan',
+ 'dua' => 'Dụala',
+ 'dyo' => 'Jọla-Fọnyị',
+ 'dz' => 'Dọzngọka',
+ 'ebu' => 'Ebụm',
+ 'ee' => 'Ewe',
'el' => 'Giriikị',
- 'en' => 'Asụsụ Bekee',
+ 'en' => 'Bekee',
'en-au' => 'Bekee ndị Australia',
'en-ca' => 'Bekee ndị Canada',
+ 'en-gb' => 'Bekee ndị United Kingdom',
'en-us' => 'Bekee ndị America',
- 'es' => 'Asụsụ Spanish',
- 'es-419' => 'Asụsụ Spanish ndị Latin America',
- 'es-es' => 'Asụsụ Spanish ndị Europe',
- 'es-mx' => 'Asụsụ Spanish ndị Mexico',
- 'fa' => 'Peshan',
- 'fr' => 'Asụsụ Fụrench',
+ 'eo' => 'Ndị Esperantọ',
+ 'es' => 'Spanishi',
+ 'es-419' => 'Spanishi ndị Latin America',
+ 'es-es' => 'Spanishi ndị Europe',
+ 'es-mx' => 'Spanishi ndị Mexico',
+ 'et' => 'Ndị Estọnịa',
+ 'eu' => 'Baskwe',
+ 'ewo' => 'Ewọndọ',
+ 'fa' => 'Peshianụ',
+ 'ff' => 'Fula',
+ 'fi' => 'Fịnịsh',
+ 'fil' => 'Fịlịpịnọ',
+ 'fo' => 'Farọse',
+ 'fr' => 'Fụrenchị',
'fr-ca' => 'Fụrench ndị Canada',
'fr-ch' => 'Fụrench ndị Switzerland',
- 'ha' => 'Awụsa',
- 'hi' => 'Hindi',
- 'hu' => 'Magịya',
+ 'fur' => 'Frụlịan',
+ 'fy' => 'Westan Frịsịan',
+ 'ga' => 'Ịrịsh',
+ 'gd' => 'Sụkọtịs Gelị',
+ 'gl' => 'Galịcịan',
+ 'gsw' => 'German Swiss',
+ 'gu' => 'Gụaratị',
+ 'guz' => 'Gụshị',
+ 'gv' => 'Mansị',
+ 'ha' => 'Hausa',
+ 'haw' => 'Hawaịlịan',
+ 'he' => 'Hebrew',
+ 'hi' => 'Hindị',
+ 'hmn' => 'Hmong',
+ 'hr' => 'Kọrọtịan',
+ 'hsb' => 'Ụpa Sọrbịa',
+ 'ht' => 'Haịtịan ndị Cerọle',
+ 'hu' => 'Hụngarian',
+ 'ia' => 'Intalịgụa',
'id' => 'Indonisia',
- 'ig' => 'Asụsụ Igbo',
- 'it' => 'Asụsụ Italian',
- 'ja' => 'Asụsụ Japanese',
+ 'ig' => 'Igbo',
+ 'ii' => 'Sịchụayị',
+ 'is' => 'Icịlandịk',
+ 'it' => 'Italịanu',
+ 'ja' => 'Japaniisi',
+ 'jgo' => 'Ngọmba',
+ 'jmc' => 'Machame',
'jv' => 'Java',
- 'km' => 'Keme, Etiti',
- 'ko' => 'Koria',
+ 'ka' => 'Geọjịan',
+ 'kab' => 'Kabyle',
+ 'kam' => 'Kamba',
+ 'kde' => 'Makọnde',
+ 'kea' => 'Kabụverdịanụ',
+ 'khq' => 'Kọyra Chịnị',
+ 'ki' => 'Kịkụyụ',
+ 'kk' => 'Kazak',
+ 'kkj' => 'Kakọ',
+ 'kl' => 'Kalaalịsụt',
+ 'kln' => 'Kalenjịn',
+ 'km' => 'Keme',
+ 'kn' => 'Kanhada',
+ 'ko' => 'Korịa',
+ 'kok' => 'Kọnkanị',
+ 'ks' => 'Kashmịrị',
+ 'ksb' => 'Shabala',
+ 'ksf' => 'Bafịa',
+ 'ksh' => 'Colognịan',
+ 'ku' => 'Ndị Kụrdịsh',
+ 'kw' => 'Kọnịsh',
+ 'ky' => 'Kyrayz',
+ 'la' => 'Latịn',
+ 'lag' => 'Langị',
+ 'lb' => 'Lụxenbọụgịsh',
+ 'lg' => 'Ganda',
+ 'ln' => 'Lịngala',
+ 'lo' => 'Laọ',
+ 'lrc' => 'Nọrtụ Lụrị',
+ 'lt' => 'Lituanian',
+ 'lu' => 'Lịba-Katanga',
+ 'luy' => 'Lụyịa',
+ 'lv' => 'Latviani',
+ 'mai' => 'Maịtịlị',
+ 'mas' => 'Masaị',
+ 'mer' => 'Merụ',
+ 'mfe' => 'Mọrịsye',
+ 'mg' => 'Malagasị',
+ 'mgh' => 'Makụwa Metọ',
+ 'mgo' => 'Meta',
+ 'mi' => 'Maọrị',
+ 'mk' => 'Masedọnịa',
+ 'ml' => 'Malayalam',
+ 'mn' => 'Mọngolịan',
+ 'mni' => 'Manịpụrị',
+ 'mr' => 'Maratị',
'ms' => 'Maleyi',
- 'my' => 'Mịanma',
+ 'mt' => 'Matịse',
+ 'mua' => 'Mụdang',
+ 'mul' => 'Ọtụtụ asụsụ',
+ 'my' => 'Bụrmese',
+ 'mzn' => 'Mazandaranị',
+ 'naq' => 'Nama',
+ 'nb' => 'Nọrweyịan Bọkmal',
+ 'nd' => 'Nọrtụ Ndabede',
+ 'nds' => 'Lowa German',
'ne' => 'Nepali',
- 'nl' => 'Dọọch',
+ 'nl' => 'Dọchị',
+ 'nmg' => 'Kwasịọ',
+ 'nn' => 'Nọrweyịan Nynersk',
+ 'nnh' => 'Nglembọn',
+ 'nus' => 'Nụer',
+ 'ny' => 'Nyanja',
+ 'nyn' => 'Nyakọle',
+ 'om' => 'Ọromo',
+ 'or' => 'Ọdịa',
+ 'os' => 'Osetik',
'pa' => 'Punjabi',
+ 'pcm' => 'Pidgịn',
'pl' => 'Poliishi',
- 'pt' => 'Asụsụ Portuguese',
- 'pt-br' => 'Asụsụ Portuguese ndị Brazil',
+ 'prg' => 'Prụssịan',
+ 'ps' => 'Pashọ',
+ 'pt' => 'Pọrtụgụese',
+ 'pt-br' => 'Pọrtụgụese ndị Brazil',
'pt-pt' => 'Asụsụ Portuguese ndị Europe',
- 'ro' => 'Rumenia',
- 'ru' => 'Asụsụ Russian',
- 'rw' => 'Rụwanda',
+ 'qu' => 'Qụechụa',
+ 'rm' => 'Rọmansị',
+ 'rn' => 'Rụndị',
+ 'ro' => 'Romania',
+ 'rof' => 'Rọmbọ',
+ 'ru' => 'Rọshian',
+ 'rw' => 'Kinyarwanda',
+ 'rwk' => 'Rwa',
+ 'sa' => 'Sansịkịt',
+ 'sah' => 'Saka',
+ 'saq' => 'Sambụrụ',
+ 'sat' => 'Santalị',
+ 'sbp' => 'Sangụ',
+ 'sd' => 'Sịndh',
+ 'se' => 'Nọrtan Samị',
+ 'seh' => 'Sena',
+ 'ses' => 'Kọyraboro Senị',
+ 'sg' => 'Sangọ',
+ 'shi' => 'Tachịkịt',
+ 'si' => 'Sinhala',
+ 'sk' => 'Slova',
+ 'sl' => 'Slovịan',
+ 'sm' => 'Samọa',
+ 'smn' => 'Inarị Samị',
+ 'sn' => 'Shọna',
'so' => 'Somali',
+ 'sr' => 'Sebịan',
+ 'st' => 'Sọụth Soto',
'sv' => 'Sụwidiishi',
- 'ta' => 'Tamụlụ',
+ 'ta' => 'Tamil',
+ 'te' => 'Telụgụ',
+ 'teo' => 'Tesọ',
+ 'tg' => 'Tajịk',
'th' => 'Taị',
+ 'ti' => 'Tịgrịnya',
+ 'tk' => 'Turkịs',
+ 'to' => 'Tọngan',
'tr' => 'Tọkiishi',
+ 'tt' => 'Tata',
+ 'twq' => 'Tasawa',
+ 'ug' => 'Ụyghụr',
'uk' => 'Ukureenị',
'und' => 'Asụsụ amaghị',
- 'ur' => 'Urudu',
- 'vi' => 'Viyetịnaamụ',
+ 'ur' => 'Urdụ',
+ 'uz' => 'Ụzbek',
+ 'vai' => 'Val',
+ 'vi' => 'Vietnamisi',
+ 'vo' => 'Volapụ',
+ 'vun' => 'Vụnjọ',
+ 'wae' => 'Wasa',
+ 'wo' => 'Wolọf',
+ 'xh' => 'Xhọsa',
+ 'xog' => 'Sọga',
+ 'yav' => 'Yangben',
+ 'yi' => 'Yịdịsh',
'yo' => 'Yoruba',
- 'zh' => 'Mandarịịnị',
+ 'yue' => 'Katọnịse',
+ 'zh' => 'Chainisi',
'zh-hans' => 'Asụsụ Chinese dị mfe',
'zh-hant' => 'Asụsụ Chinese Izugbe',
'zu' => 'Zulu',
+ 'zxx' => 'Ndị ọzọ abụghị asụsụ',
];
$currencyNames = [
@@ -231,12 +396,12 @@ $currencySymbols = [
$countryNames = [
'AC' => 'Ascension Island',
'AD' => 'Andorra',
- 'AE' => 'Obodo United Arab Emirates',
- 'AF' => 'Mba Afghanistan',
- 'AG' => 'Antigua & Barbuda',
+ 'AE' => 'United Arab Emirates',
+ 'AF' => 'Afghanistan',
+ 'AG' => 'Antigua na Barbuda',
'AI' => 'Anguilla',
'AL' => 'Albania',
- 'AM' => 'Obodo Armenia',
+ 'AM' => 'Armenia',
'AO' => 'Angola',
'AQ' => 'Antarctica',
'AR' => 'Argentina',
@@ -245,24 +410,24 @@ $countryNames = [
'AU' => 'Australia',
'AW' => 'Aruba',
'AX' => 'Agwaetiti Aland',
- 'AZ' => 'Obodo Azerbaijan',
+ 'AZ' => 'Azerbaijan',
'BA' => 'Bosnia & Herzegovina',
'BB' => 'Barbados',
- 'BD' => 'Obodo Bangladesh',
+ 'BD' => 'Bangladesh',
'BE' => 'Belgium',
'BF' => 'Burkina Faso',
'BG' => 'Bulgaria',
- 'BH' => 'Obodo Bahrain',
+ 'BH' => 'Bahrain',
'BI' => 'Burundi',
'BJ' => 'Binin',
- 'BL' => 'St. Barthélemy',
+ 'BL' => 'Barthélemy Dị nsọ',
'BM' => 'Bemuda',
'BN' => 'Brunei',
'BO' => 'Bolivia',
'BQ' => 'Caribbean Netherlands',
- 'BR' => 'Mba Brazil',
+ 'BR' => 'Brazil',
'BS' => 'Bahamas',
- 'BT' => 'Obodo Bhutan',
+ 'BT' => 'Bhutan',
'BV' => 'Agwaetiti Bouvet',
'BW' => 'Botswana',
'BY' => 'Belarus',
@@ -277,7 +442,7 @@ $countryNames = [
'CK' => 'Agwaetiti Cook',
'CL' => 'Chile',
'CM' => 'Cameroon',
- 'CN' => 'Mba China',
+ 'CN' => 'China',
'CO' => 'Colombia',
'CP' => 'Agwaetiti Clipperton',
'CR' => 'Kosta Rika',
@@ -285,9 +450,9 @@ $countryNames = [
'CV' => 'Cape Verde',
'CW' => 'Kurakao',
'CX' => 'Agwaetiti Christmas',
- 'CY' => 'Obodo Cyprus',
+ 'CY' => 'Cyprus',
'CZ' => 'Czechia',
- 'DE' => 'Mba Germany',
+ 'DE' => 'Jamanị',
'DG' => 'Diego Garcia',
'DJ' => 'Djibouti',
'DK' => 'Denmark',
@@ -309,11 +474,11 @@ $countryNames = [
'FK' => 'Agwaetiti Falkland',
'FM' => 'Micronesia',
'FO' => 'Agwaetiti Faroe',
- 'FR' => 'Mba France',
+ 'FR' => 'France',
'GA' => 'Gabon',
'GB' => 'UK',
'GD' => 'Grenada',
- 'GE' => 'Obodo Georgia',
+ 'GE' => 'Georgia',
'GF' => 'Frenchi Guiana',
'GG' => 'Guernsey',
'GH' => 'Ghana',
@@ -329,7 +494,7 @@ $countryNames = [
'GU' => 'Guam',
'GW' => 'Guinea-Bissau',
'GY' => 'Guyana',
- 'HK' => 'Honk Kong mba nwere ndozi pụrụ iche n’obodo China',
+ 'HK' => 'Hong Kong SAR China',
'HM' => 'Agwaetiti Heard na Agwaetiti McDonald',
'HN' => 'Honduras',
'HR' => 'Croatia',
@@ -338,52 +503,52 @@ $countryNames = [
'IC' => 'Agwaetiti Kanarị',
'ID' => 'Indonesia',
'IE' => 'Ireland',
- 'IL' => 'Obodo Israel',
+ 'IL' => 'Israel',
'IM' => 'Isle of Man',
- 'IN' => 'Mba India',
+ 'IN' => 'India',
'IO' => 'British Indian Ocean Territory',
- 'IQ' => 'Obodo Iraq',
- 'IR' => 'Obodo Iran',
+ 'IQ' => 'Iraq',
+ 'IR' => 'Iran',
'IS' => 'Iceland',
- 'IT' => 'Mba Italy',
+ 'IT' => 'Italy',
'JE' => 'Jersey',
'JM' => 'Jamaika',
- 'JO' => 'Obodo Jordan',
- 'JP' => 'Mba Japan',
+ 'JO' => 'Jordan',
+ 'JP' => 'Japan',
'KE' => 'Kenya',
- 'KG' => 'Obodo Kyrgyzstan',
+ 'KG' => 'Kyrgyzstan',
'KH' => 'Cambodia',
'KI' => 'Kiribati',
'KM' => 'Comorosu',
- 'KN' => 'St. Kitts & Nevis',
- 'KP' => 'Mba Ugwu Korea',
- 'KR' => 'Mba South Korea',
- 'KW' => 'Obodo Kuwait',
+ 'KN' => 'Kitts na Nevis Dị nsọ',
+ 'KP' => 'Ugwu Korea',
+ 'KR' => 'South Korea',
+ 'KW' => 'Kuwait',
'KY' => 'Agwaetiti Cayman',
- 'KZ' => 'Obodo Kazakhstan',
+ 'KZ' => 'Kazakhstan',
'LA' => 'Laos',
- 'LB' => 'Obodo Lebanon',
- 'LC' => 'St. Lucia',
+ 'LB' => 'Lebanon',
+ 'LC' => 'Lucia Dị nsọ',
'LI' => 'Liechtenstein',
- 'LK' => 'Obodo Sri Lanka',
+ 'LK' => 'Sri Lanka',
'LR' => 'Liberia',
'LS' => 'Lesotho',
'LT' => 'Lithuania',
'LU' => 'Luxembourg',
'LV' => 'Latvia',
- 'LY' => 'Libyia',
+ 'LY' => 'Libia',
'MA' => 'Morocco',
'MC' => 'Monaco',
'MD' => 'Moldova',
'ME' => 'Montenegro',
- 'MF' => 'St. Martin',
+ 'MF' => 'Martin Dị nsọ',
'MG' => 'Madagaskar',
'MH' => 'Agwaetiti Marshall',
'MK' => 'North Macedonia',
'ML' => 'Mali',
'MM' => 'Myanmar (Burma)',
- 'MN' => 'Obodo Mongolia',
- 'MO' => 'Obodo Macao nwere ndozi pụrụ iche na mba China',
+ 'MN' => 'Mongolia',
+ 'MO' => 'Macao',
'MP' => 'Agwaetiti Northern Mariana',
'MQ' => 'Martinique',
'MR' => 'Mauritania',
@@ -403,33 +568,33 @@ $countryNames = [
'NI' => 'Nicaragua',
'NL' => 'Netherlands',
'NO' => 'Norway',
- 'NP' => 'Obodo Nepal',
+ 'NP' => 'Nepal',
'NR' => 'Nauru',
'NU' => 'Niue',
'NZ' => 'New Zealand',
- 'OM' => 'Obodo Oman',
+ 'OM' => 'Oman',
'PA' => 'Panama',
'PE' => 'Peru',
'PF' => 'Frenchi Polynesia',
'PG' => 'Papua New Guinea',
'PH' => 'Philippines',
- 'PK' => 'Obodo Pakistan',
+ 'PK' => 'Pakistan',
'PL' => 'Poland',
- 'PM' => 'St. Pierre & Miquelon',
+ 'PM' => 'Pierre na Miquelon Dị nsọ',
'PN' => 'Agwaetiti Pitcairn',
'PR' => 'Puerto Rico',
- 'PS' => 'Obodo dị iche iche dị n’okpuru mba Palestine',
+ 'PS' => 'Palestinian Territories',
'PT' => 'Portugal',
'PW' => 'Palau',
'PY' => 'Paraguay',
- 'QA' => 'Obodo Qatar',
+ 'QA' => 'Qatar',
'QO' => 'Outlying Oceania',
'RE' => 'Réunion',
'RO' => 'Romania',
'RS' => 'Serbia',
- 'RU' => 'Mba Russia',
+ 'RU' => 'Rụssịa',
'RW' => 'Rwanda',
- 'SA' => 'Obodo Saudi Arabia',
+ 'SA' => 'Saudi Arabia',
'SB' => 'Agwaetiti Solomon',
'SC' => 'Seychelles',
'SD' => 'Sudan',
@@ -448,7 +613,7 @@ $countryNames = [
'ST' => 'São Tomé & Príncipe',
'SV' => 'El Salvador',
'SX' => 'Sint Maarten',
- 'SY' => 'Obodo Syria',
+ 'SY' => 'Syria',
'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Agwaetiti Turks na Caicos',
@@ -456,26 +621,26 @@ $countryNames = [
'TF' => 'Ụmụ ngalaba Frenchi Southern',
'TG' => 'Togo',
'TH' => 'Thailand',
- 'TJ' => 'Obodo Tajikistan',
+ 'TJ' => 'Tajikistan',
'TK' => 'Tokelau',
'TL' => 'Timor-Leste',
- 'TM' => 'Obodo Turkmenistan',
+ 'TM' => 'Turkmenistan',
'TN' => 'Tunisia',
'TO' => 'Tonga',
- 'TR' => 'Obodo Turkey',
- 'TT' => 'Trinidad & Tobago',
+ 'TR' => 'Turkey',
+ 'TT' => 'Trinidad na Tobago',
'TV' => 'Tuvalu',
- 'TW' => 'Obodo Taiwan',
+ 'TW' => 'Taiwan',
'TZ' => 'Tanzania',
'UA' => 'Ukraine',
'UG' => 'Uganda',
'UM' => 'Obere Agwaetiti Dị Na Mpụga U.S',
'UN' => 'Mba Ụwa Jikọrọ Ọnụ',
- 'US' => 'Mba United States',
+ 'US' => 'United States',
'UY' => 'Uruguay',
- 'UZ' => 'Obodo Uzbekistan',
+ 'UZ' => 'Uzbekistan',
'VA' => 'Vatican City',
- 'VC' => 'St. Vincent & Grenadines',
+ 'VC' => 'Vincent na Grenadines Dị nsọ',
'VE' => 'Venezuela',
'VG' => 'Agwaetiti British Virgin',
'VI' => 'Agwaetiti Virgin nke US',
@@ -486,7 +651,7 @@ $countryNames = [
'XA' => 'Pseudo-Accents',
'XB' => 'Pseudo-Bidi',
'XK' => 'Kosovo',
- 'YE' => 'Obodo Yemen',
+ 'YE' => 'Yemen',
'YT' => 'Mayotte',
'ZA' => 'South Africa',
'ZM' => 'Zambia',
diff --git a/MLEB/cldr/CldrNames/CldrNamesIs.php b/MLEB/cldr/CldrNames/CldrNamesIs.php
index daf7659a..8a844305 100644
--- a/MLEB/cldr/CldrNames/CldrNamesIs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesIs.php
@@ -161,7 +161,7 @@ $languageNames = [
'gd' => 'skosk gelíska',
'gez' => 'gís',
'gil' => 'gilberska',
- 'gl' => 'galíanska',
+ 'gl' => 'galisíska',
'gmh' => 'miðháþýska',
'gn' => 'gvaraní',
'goh' => 'fornháþýska',
@@ -191,7 +191,7 @@ $languageNames = [
'hup' => 'húpa',
'hy' => 'armenska',
'hz' => 'hereró',
- 'ia' => 'alþjóðatunga',
+ 'ia' => 'interlingua',
'iba' => 'íban',
'ibb' => 'ibibio',
'id' => 'indónesíska',
@@ -315,7 +315,7 @@ $languageNames = [
'mus' => 'krík',
'mwl' => 'mirandesíska',
'mwr' => 'marvarí',
- 'my' => 'burmneska',
+ 'my' => 'búrmneska',
'myv' => 'ersja',
'mzn' => 'masanderaní',
'na' => 'nárúska',
@@ -661,7 +661,7 @@ $currencyNames = [
'NAD' => 'namibískur dalur',
'NGN' => 'nígerísk næra',
'NIC' => 'Níkarögsk kordóva (1988–1991)',
- 'NIO' => 'níkaraögsk kordóva',
+ 'NIO' => 'níkarögsk kordóva',
'NLG' => 'Hollenskt gyllini',
'NOK' => 'norsk króna',
'NPR' => 'nepölsk rúpía',
@@ -1137,7 +1137,7 @@ $countryNames = [
'SS' => 'Suður-Súdan',
'ST' => 'Saó Tóme og Prinsípe',
'SV' => 'El Salvador',
- 'SX' => 'Sankti Martin',
+ 'SX' => 'Sint Maarten',
'SY' => 'Sýrland',
'SZ' => 'Svasíland',
'TA' => 'Tristan da Cunha',
@@ -1146,7 +1146,7 @@ $countryNames = [
'TF' => 'Frönsku suðlægu landsvæðin',
'TG' => 'Tógó',
'TH' => 'Taíland',
- 'TJ' => 'Tadsjikistan',
+ 'TJ' => 'Tadsíkistan',
'TK' => 'Tókelá',
'TL' => 'Tímor-Leste',
'TM' => 'Túrkmenistan',
diff --git a/MLEB/cldr/CldrNames/CldrNamesIt.php b/MLEB/cldr/CldrNames/CldrNamesIt.php
index 33992618..aebd4d4c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesIt.php
+++ b/MLEB/cldr/CldrNames/CldrNamesIt.php
@@ -111,7 +111,7 @@ $languageNames = [
'crs' => 'creolo delle Seychelles',
'cs' => 'ceco',
'csb' => 'kashubian',
- 'cu' => 'slavo della Chiesa',
+ 'cu' => 'slavo ecclesiastico',
'cv' => 'ciuvascio',
'cy' => 'gallese',
'da' => 'danese',
@@ -223,7 +223,7 @@ $languageNames = [
'hr' => 'croato',
'hsb' => 'alto sorabo',
'hsn' => 'xiang',
- 'ht' => 'haitiano',
+ 'ht' => 'creolo haitiano',
'hu' => 'ungherese',
'hup' => 'hupa',
'hy' => 'armeno',
@@ -461,7 +461,7 @@ $languageNames = [
'rwk' => 'rwa',
'sa' => 'sanscrito',
'sad' => 'sandawe',
- 'sah' => 'yakut',
+ 'sah' => 'sacha',
'sam' => 'aramaico samaritano',
'saq' => 'samburu',
'sas' => 'sasak',
@@ -760,7 +760,8 @@ $currencyNames = [
'MDL' => 'leu moldavo',
'MGA' => 'ariary malgascio',
'MGF' => 'franco malgascio',
- 'MKD' => 'denar macedone',
+ 'MKD' => 'dinaro macedone',
+ 'MKN' => 'dinaro macedone (1992–1993)',
'MLF' => 'franco di Mali',
'MMK' => 'kyat di Myanmar',
'MNT' => 'tugrik mongolo',
@@ -883,7 +884,7 @@ $currencyNames = [
'ZAL' => 'rand sudafricano (finanziario)',
'ZAR' => 'rand sudafricano',
'ZMK' => 'kwacha dello Zambia (1968–2012)',
- 'ZMW' => 'kwacha dello Zambia',
+ 'ZMW' => 'kwacha zambiano',
'ZRN' => 'nuovo zaire dello Zaire',
'ZRZ' => 'zaire dello Zaire',
'ZWD' => 'dollaro dello Zimbabwe',
@@ -932,7 +933,7 @@ $currencySymbols = [
'HUF' => 'Ft',
'IDR' => 'Rp',
'ILS' => '₪',
- 'INR' => '₹',
+ 'INR' => 'INR',
'ISK' => 'kr',
'JMD' => '$',
'JPY' => 'JPY',
@@ -983,7 +984,7 @@ $currencySymbols = [
'UYU' => '$',
'VEF' => 'Bs',
'VES' => 'VES',
- 'VND' => '₫',
+ 'VND' => 'VND',
'XCD' => '$',
'ZAR' => 'R',
'ZMW' => 'ZK',
@@ -1063,7 +1064,7 @@ $countryNames = [
'ER' => 'Eritrea',
'ES' => 'Spagna',
'ET' => 'Etiopia',
- 'EU' => 'Unione Europea',
+ 'EU' => 'Unione europea',
'EZ' => 'Eurozona',
'FI' => 'Finlandia',
'FJ' => 'Figi',
@@ -1379,9 +1380,9 @@ $timeUnits = [
'second-other' => '{0} secondi',
'second-past-one' => '{0} secondo fa',
'second-past-other' => '{0} secondi fa',
- 'second-short-future-one' => 'tra {0} s',
+ 'second-short-future-one' => 'tra {0} sec.',
'second-short-future-other' => 'tra {0} sec.',
- 'second-short-past-one' => '{0} s fa',
+ 'second-short-past-one' => '{0} sec. fa',
'second-short-past-other' => '{0} sec. fa',
'sun-future-one' => 'tra {0} domenica',
'sun-future-other' => 'tra {0} domeniche',
diff --git a/MLEB/cldr/CldrNames/CldrNamesJa.php b/MLEB/cldr/CldrNames/CldrNamesJa.php
index 154142b3..294e863e 100644
--- a/MLEB/cldr/CldrNames/CldrNamesJa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesJa.php
@@ -387,7 +387,7 @@ $languageNames = [
'niu' => 'ニウーエイ語',
'njo' => 'アオ・ナガ語',
'nl' => 'オランダ語',
- 'nl-be' => 'フレミッシュ語',
+ 'nl-be' => 'フラマン語',
'nmg' => 'クワシオ語',
'nn' => 'ノルウェー語(ニーノシュク)',
'nnh' => 'ンジエムブーン語',
@@ -633,7 +633,7 @@ $currencyNames = [
'ARS' => 'アルゼンチン ペソ',
'ATS' => 'オーストリア シリング',
'AUD' => 'オーストラリア ドル',
- 'AWG' => 'アルバ ギルダー',
+ 'AWG' => 'アルバ フロリン',
'AZM' => 'アゼルバイジャン マナト (1993–2006)',
'AZN' => 'アゼルバイジャン マナト',
'BAD' => 'ボスニア・ヘルツェゴビナ ディナール (1992–1994)',
diff --git a/MLEB/cldr/CldrNames/CldrNamesJv.php b/MLEB/cldr/CldrNames/CldrNamesJv.php
index 0c5bed3d..e432717b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesJv.php
+++ b/MLEB/cldr/CldrNames/CldrNamesJv.php
@@ -123,6 +123,7 @@ $languageNames = [
'luo' => 'Luo',
'luy' => 'Luyia',
'lv' => 'Latvia',
+ 'mai' => 'Maithili',
'mas' => 'Masai',
'mer' => 'Meru',
'mfe' => 'Morisyen',
@@ -133,6 +134,7 @@ $languageNames = [
'mk' => 'Makedonia',
'ml' => 'Malayalam',
'mn' => 'Mongolia',
+ 'mni' => 'Manipuri',
'mr' => 'Marathi',
'ms' => 'Melayu',
'mt' => 'Malta',
@@ -157,6 +159,7 @@ $languageNames = [
'or' => 'Odia',
'os' => 'Ossetia',
'pa' => 'Punjab',
+ 'pcm' => 'Nigeria Pidgin',
'pl' => 'Polandia',
'prg' => 'Prusia',
'ps' => 'Pashto',
@@ -172,6 +175,7 @@ $languageNames = [
'sa' => 'Sanskerta',
'sah' => 'Sakha',
'saq' => 'Samburu',
+ 'sat' => 'Santali',
'sbp' => 'Sangu',
'sd' => 'Sindhi',
'se' => 'Sami Sisih Lor',
@@ -223,7 +227,7 @@ $languageNames = [
'yue' => 'Kanton',
'zgh' => 'Tamazight Moroko Standar',
'zh' => 'Tyonghwa',
- 'zh-hans' => 'Tyonghwa (Gampang)',
+ 'zh-hans' => 'Tyonghwa (Ringkes)',
'zh-hant' => 'Tyonghwa (Tradisional)',
'zu' => 'Zulu',
'zxx' => 'Konten tanpa linguistik',
@@ -508,7 +512,7 @@ $countryNames = [
'IE' => 'Républik Irlan',
'IL' => 'Israèl',
'IM' => 'Pulo Man',
- 'IN' => 'Indhi',
+ 'IN' => 'Indhia',
'IO' => 'Wilayah Inggris nang Segoro Hindia',
'IQ' => 'Irak',
'IR' => 'Iran',
@@ -524,7 +528,7 @@ $countryNames = [
'KI' => 'Kiribati',
'KM' => 'Komoro',
'KN' => 'Saint Kits lan Nèvis',
- 'KP' => 'Koréa Lèr',
+ 'KP' => 'Korea Lor',
'KR' => 'Koréa Kidul',
'KW' => 'Kuwait',
'KY' => 'Kapuloan Kéman',
@@ -547,7 +551,7 @@ $countryNames = [
'MF' => 'Santa Martin',
'MG' => 'Madagaskar',
'MH' => 'Kapuloan Marshall',
- 'MK' => 'Makédonia',
+ 'MK' => 'Républik Makédonia Lor',
'ML' => 'Mali',
'MM' => 'Myanmar (Burma)',
'MN' => 'Mongolia',
@@ -574,7 +578,7 @@ $countryNames = [
'NP' => 'Népal',
'NR' => 'Nauru',
'NU' => 'Niue',
- 'NZ' => 'Niu Sélan',
+ 'NZ' => 'Selandia Anyar',
'OM' => 'Oman',
'PA' => 'Panama',
'PE' => 'Peru',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKa.php b/MLEB/cldr/CldrNames/CldrNamesKa.php
index 21a8af4f..5bd8bb79 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKa.php
@@ -37,7 +37,7 @@ $languageNames = [
'ban' => 'ბალინური',
'bas' => 'ბასა',
'bax' => 'ბამუნი',
- 'be' => 'ბელორუსული',
+ 'be' => 'ბელარუსული',
'bej' => 'ბეჯა',
'bem' => 'ბემბა',
'bez' => 'ბენა',
@@ -635,7 +635,7 @@ $currencyNames = [
'NAD' => 'ნამიბიური დოლარი',
'NGN' => 'ნიგერიული ნაირა',
'NIC' => 'ნიკარაგუას კორდობა',
- 'NIO' => 'ნიკარაგუული კორდობა',
+ 'NIO' => 'ნიკარაგუას ოქროს კორდობა',
'NLG' => 'ჰოლანდიური გულდენი',
'NOK' => 'ნორვეგიული კრონა',
'NPR' => 'ნეპალური რუპია',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKab.php b/MLEB/cldr/CldrNames/CldrNamesKab.php
index 426c4b92..c8b367a1 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKab.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKab.php
@@ -84,15 +84,15 @@ $languageNames = [
'eka' => 'Takajukt',
'el' => 'Tagrikit',
'en' => 'Taglizit',
- 'en-au' => 'Taglizit n Ustṛalya',
+ 'en-au' => 'Taglizit n Ustralya',
'en-ca' => 'Taglizit n Kanada',
'en-gb' => 'Taglizit n Briṭanya',
'en-us' => 'Taglizit n Marikan',
'eo' => 'Taspirantit',
'es' => 'Taspenyulit',
- 'es-419' => 'Taspanit n Temrikt Talaṭinit',
- 'es-es' => 'Taspanit n Turuft',
- 'es-mx' => 'Taspanit n Miksik',
+ 'es-419' => 'Taspenyulit n Temrikt Talaṭinit',
+ 'es-es' => 'Taspenyulit n Turuft',
+ 'es-mx' => 'Taspenyulit n Miksik',
'et' => 'Tasṭunit',
'eu' => 'Tabaskit',
'ewo' => 'Tawundut',
@@ -277,8 +277,8 @@ $languageNames = [
'prg' => 'Taprusit',
'ps' => 'Tapactut',
'pt' => 'Tapurtugalit',
- 'pt-br' => 'Tapuṛṭugit (Brizil)',
- 'pt-pt' => 'Tapuṛṭugit (Purtugal)',
+ 'pt-br' => 'Tapurtugalit n Brizil',
+ 'pt-pt' => 'Tapurtugalit n Purtugal',
'qu' => 'Takicwit',
'quc' => 'Takict',
'rap' => 'Tarapanwit',
@@ -417,17 +417,17 @@ $currencyNames = [
'AZN' => 'Amanat Aziri',
'BAD' => 'Adinar Abusni',
'BAM' => 'Amark yettwaseklaten n Busni',
- 'BBD' => 'Adulaṛ n Barbuda',
- 'BDT' => 'Ataka n Bingladic',
+ 'BBD' => 'Adular n Barbuda',
+ 'BDT' => 'Ataka n Bangladec',
'BEC' => 'Afrank n Biljik (yettwaselkaten)',
'BEF' => 'Afrank n Biljik',
'BEL' => 'Afrank n Biljik (adriman)',
'BGL' => 'Alev n Bulgar (1962–1999)',
- 'BGN' => 'Alev n Bulgar',
+ 'BGN' => 'Alev n Bulgari',
'BHD' => 'Adinar Abaḥrini',
'BIF' => 'Afrank Aburandi',
- 'BMD' => 'Adulaṛ n Birmud',
- 'BND' => 'adular n Brunay',
+ 'BMD' => 'Adular n Birmud',
+ 'BND' => 'Adular n Brunay',
'BOB' => 'Abulivyanu n Bulivi',
'BOL' => 'Abulivyanu n Bulivi (1863–1963)',
'BOP' => 'Apisu n Bulivi',
@@ -459,14 +459,14 @@ $currencyNames = [
'CNY' => 'Ayuwan Renminbi Acinwa',
'COP' => 'Apisu n Kulumbi',
'COU' => 'Aferdis n wazal ilaw n Kulumbi',
- 'CRC' => 'Akulun n Kustarika',
+ 'CRC' => 'Akulun n Kusta Rika',
'CSD' => 'Adinar n Ṣirbya-Muntinigru',
'CSK' => 'Akurun iǧehden Ačikusluvak',
'CUC' => 'Apisu n Kuba yettwaselkaten',
'CUP' => 'Apisu n Kuba',
'CVE' => 'Akabuviradinu Askudi',
'CYP' => 'Apawnd n Cipr',
- 'CZK' => 'Akurun n Čik',
+ 'CZK' => 'Akurun n Čček',
'DDM' => 'Amark n Walman n usammar',
'DEM' => 'Amark n Walman',
'DJF' => 'Afrank Ajibuti',
@@ -492,7 +492,7 @@ $currencyNames = [
'GEL' => 'Alari n Jyurjya',
'GHC' => 'Asidi Aɣani',
'GHS' => 'Asidi n Ɣana',
- 'GIP' => 'Apawnd n Jibraltar',
+ 'GIP' => 'Apund n Jibraltar',
'GMD' => 'Adalasi Agambi',
'GNF' => 'Afrank n Ɣinya',
'GNS' => 'Afrank Aɣini',
@@ -505,35 +505,35 @@ $currencyNames = [
'HKD' => 'Adular n Hung Kung',
'HNL' => 'Alampir n Hunduras',
'HRD' => 'Adinar n Kaṛwasya',
- 'HRK' => 'Akuna n Kaṛwasya',
+ 'HRK' => 'Akuna n Kerwasya',
'HTG' => 'Agurd n Hayti',
- 'HUF' => 'Afurint n Hungaṛya',
+ 'HUF' => 'Afurint Ahungri',
'IDR' => 'Arupi n Indunisya',
'IEP' => 'Apawnd n Irland',
'ILP' => 'Apawnd n Izrayil',
'ILR' => 'Acikil n Izrayil(1980–1985)',
'ILS' => 'Acikil amaynut n Izrayil',
'INR' => 'Arupi Ahendi',
- 'IQD' => 'Adinar n Ɛiṛaq',
+ 'IQD' => 'Adinar Aɛiraqi',
'IRR' => 'Ariyal n Iran',
'ISK' => 'Akurun n Island',
'ITL' => 'Alir n Ṭelyan',
'JMD' => 'Adular n Jamayik',
- 'JOD' => 'Adinar Jurdan',
+ 'JOD' => 'Adinar Urdun',
'JPY' => 'Ayen Ajappuni',
'KES' => 'Aciling Akini',
'KGS' => 'Asum n Kirigistan',
'KHR' => 'Ariyil n Kambuj',
'KMF' => 'Afrank Akamiruni',
- 'KPW' => 'Awun n Tkurit n ugafa',
+ 'KPW' => 'Awun n Kurya n Ugafa',
'KRH' => 'Ahwan n Tkirit n unẓul (1953–1962)',
'KRO' => 'Ahwan n Tkirit n unẓul (1945–1953)',
- 'KRW' => 'Ahwan n Tkirit n unẓul',
+ 'KRW' => 'Awun n Kurya n Unẓul',
'KWD' => 'Adinarn Kuwayt',
'KYD' => 'Adular n tegzirin Kayman',
'KZT' => 'Atunj n Kazaxistan',
'LAK' => 'Akip n Laws',
- 'LBP' => 'Apawnd n Liban',
+ 'LBP' => 'Apund n Lubnan',
'LKR' => 'Arupi n Srilanka',
'LRD' => 'Adular Alibiri',
'LSL' => 'Aluṭi Alizuṭi',
@@ -547,10 +547,10 @@ $currencyNames = [
'LYD' => 'Adinar Alibi',
'MAD' => 'Adirham Amerruki',
'MAF' => 'Afrank n Meṛṛuk',
- 'MDL' => 'Alu n Muldavya',
+ 'MDL' => 'Alu n Mulduvi',
'MGA' => 'Aryari Amalgac',
'MGF' => 'Afrank n Madakaskaṛ',
- 'MKD' => 'Adenar n Masidunya',
+ 'MKD' => 'Adnar n Masidunya',
'MLF' => 'Afrank n Mali',
'MMK' => 'Akyat n Myanmar',
'MNT' => 'Atugrik n Mungulya',
@@ -569,7 +569,7 @@ $currencyNames = [
'MYR' => 'Aringgit n Malizya',
'MZE' => 'Askudu n Muzumbik',
'MZM' => 'Amitikal Amuzembiqi',
- 'MZN' => 'Amitikal n Muzumbik',
+ 'MZN' => 'Amitikal amuzembiq',
'NAD' => 'Adular Anamibi',
'NGN' => 'Anayra Anijiri',
'NIC' => 'Akurduba n Nikaragwa (1912–1988)',
@@ -599,7 +599,7 @@ $currencyNames = [
'RUR' => 'Arubl n Rrus (1991–1998)',
'RWF' => 'Afrank Aruwandi',
'SAR' => 'Aryal Asuɛudi',
- 'SBD' => 'Adular n tegzirin Salumun',
+ 'SBD' => 'Adular n Tegzirin n Salumun',
'SCR' => 'Arupi Aseycili',
'SDD' => 'Adinar n Sudan (1992–2007)',
'SDG' => 'Apund Asudani',
@@ -613,12 +613,12 @@ $currencyNames = [
'SOS' => 'Aciling Aṣumali',
'SRD' => 'Adular n Surinam',
'SRG' => 'Aflurin n Surinam',
- 'SSP' => 'Apawnd n Sudan n Unẓul',
+ 'SSP' => 'Apund n Sudan n Unẓul',
'STD' => 'Asw Ṭum d Udubra Amenzay (1977–2017)',
'STN' => 'Asw Ṭum d Udubra Amenzay',
'SUR' => 'Arubl n Suvyat',
'SVC' => 'Akulun n Salvadur',
- 'SYP' => 'Apawnd n Surya',
+ 'SYP' => 'Apund n Surya',
'SZL' => 'Alilangini',
'THB' => 'Abaht n Tayland',
'TJR' => 'Arubl n Ṭajikistan',
@@ -626,14 +626,14 @@ $currencyNames = [
'TMM' => 'Amanat n Ṭurkmanistan',
'TMT' => 'Amanat amaynut n Ṭurkmanistan',
'TND' => 'Adinar Atunsi',
- 'TOP' => 'Apanga n Ṭunga',
+ 'TOP' => 'Apanga n Tunga',
'TPE' => 'Askudu n Timur',
'TRL' => 'Apawnd n Ṭurk (1844–2005)',
- 'TRY' => 'Apawnd n Ṭurk',
- 'TTD' => 'Adular n Triniti-d-Ṭubagu',
+ 'TRY' => 'Apund n Ṭurk',
+ 'TTD' => 'Adular n Trinidad d Tubagu',
'TWD' => 'Adular amaynut n Taywan',
'TZS' => 'Aciling Aṭanẓani',
- 'UAH' => 'Ahrivnya n Ukrin',
+ 'UAH' => 'Ahrivnya n Ukran',
'UAK' => 'Akarbuvanit n Ukrin (1992–1996)',
'UGS' => 'Aciling n Uganda (1966–1987)',
'UGX' => 'Aciling Awgandi',
@@ -646,7 +646,7 @@ $currencyNames = [
'UZS' => 'Asum n Uzbikistan',
'VEB' => 'Abulivaṛ n Vinizwila (1871–2008)',
'VEF' => 'Abulivaṛ n Vinizwila (2008–2018)',
- 'VES' => 'Abulivaṛ n Vinizwila',
+ 'VES' => 'Abulivar n Vinizwila',
'VND' => 'Adung n Vyitnam',
'VNN' => 'Adung n Vyitnam (1978–1985)',
'VUV' => 'Avatu n Vanuyatu',
@@ -770,7 +770,7 @@ $currencySymbols = [
'FJD' => '$FJ',
'FKP' => '£FK',
'FRF' => 'F',
- 'GBP' => '£GB',
+ 'GBP' => '£',
'GEK' => 'GEK',
'GEL' => 'GEL',
'GHC' => 'GHC',
@@ -881,7 +881,7 @@ $currencySymbols = [
'SRG' => 'SRG',
'SSP' => 'SSP',
'STD' => 'STD',
- 'STN' => 'Db',
+ 'STN' => 'STN',
'SVC' => 'SVC',
'SYP' => 'SYP',
'SZL' => 'SZL',
@@ -899,7 +899,7 @@ $currencySymbols = [
'UAH' => 'UAH',
'UGS' => 'UGS',
'UGX' => 'UGX',
- 'USD' => '$US',
+ 'USD' => '$',
'USN' => 'USN',
'USS' => 'USS',
'UYI' => 'UYI',
@@ -908,6 +908,7 @@ $currencySymbols = [
'UZS' => 'UZS',
'VEB' => 'VEB',
'VEF' => 'VEF',
+ 'VES' => 'VES',
'VND' => '₫',
'VNN' => 'VNN',
'VUV' => 'VUV',
@@ -955,7 +956,7 @@ $countryNames = [
'AL' => 'Lalbani',
'AM' => 'Arminya',
'AO' => 'Ungula',
- 'AQ' => 'Antaṛktik',
+ 'AQ' => 'Anṭarktik',
'AR' => 'Arjuntin',
'AS' => 'Samwa Tamarikanit',
'AT' => 'Ustriya',
@@ -1000,12 +1001,12 @@ $countryNames = [
'CR' => 'Kusta Rika',
'CU' => 'Kuba',
'CV' => 'Tigzirin n yixef azegzaw',
- 'CW' => 'Kuṛaṣaw',
+ 'CW' => 'Kurasaw',
'CX' => 'Tigzrin n Kristmaṣ',
'CY' => 'Cipr',
'CZ' => 'Čček',
'DE' => 'Lalman',
- 'DG' => 'Digu Gaṛsya',
+ 'DG' => 'Dyigu Garsiya',
'DJ' => 'Ǧibuti',
'DK' => 'Denmark',
'DM' => 'Duminik',
@@ -1028,7 +1029,7 @@ $countryNames = [
'FO' => 'Tigzirin n Faṛwi',
'FR' => 'Fransa',
'GA' => 'Gabun',
- 'GB' => 'Tag.Yed',
+ 'GB' => 'TY',
'GD' => 'Grunad',
'GE' => 'Jiyurji',
'GF' => 'Ɣana tafransist',
@@ -1041,13 +1042,13 @@ $countryNames = [
'GP' => 'Gwadalupi',
'GQ' => 'Ɣinya Tasebgast',
'GR' => 'Lagris',
- 'GS' => 'Tigzirin n Jyuṛjya n Unzul akked Sandwič n Unẓul',
+ 'GS' => 'Tigzirin n Jyuṛjya n Unẓul akked Sandwič n Unẓul',
'GT' => 'Gwatimala',
'GU' => 'Gwam',
'GW' => 'Ɣinya-Bisaw',
'GY' => 'Guwana',
'HK' => 'Hung Kung',
- 'HM' => 'Tigzirin Heard akked McDonald',
+ 'HM' => 'Tigzirin n Hird d Makdunalt',
'HN' => 'Hunduras',
'HR' => 'Kerwasya',
'HT' => 'Hayti',
@@ -1063,7 +1064,7 @@ $countryNames = [
'IR' => 'Iran',
'IS' => 'Island',
'IT' => 'Ṭelyan',
- 'JE' => 'Jiṛzi',
+ 'JE' => 'Jirzi',
'JM' => 'Jamyika',
'JO' => 'Lajurdani',
'JP' => 'Jappu',
@@ -1096,6 +1097,7 @@ $countryNames = [
'MF' => 'San Maṛtan',
'MG' => 'Madaɣecqer',
'MH' => 'Tigzirin n Marcal',
+ 'MK' => 'Masidunya n ugafa',
'ML' => 'Mali',
'MM' => 'Myanmar',
'MN' => 'Mungulya',
@@ -1169,7 +1171,7 @@ $countryNames = [
'TA' => 'Tristan da Kunha',
'TC' => 'Ṭurk d Tegzirin n Kaykus',
'TD' => 'Čad',
- 'TF' => 'Timura n umalu tifṛansisiyin',
+ 'TF' => 'Timura tifransisin n unẓul',
'TG' => 'Ṭugu',
'TH' => 'Ṭayland',
'TJ' => 'Tajikistan',
@@ -1199,6 +1201,8 @@ $countryNames = [
'VU' => 'Vanwatu',
'WF' => 'Wallis d Futuna',
'WS' => 'Samwa',
+ 'XA' => 'Azun iɣdebba',
+ 'XB' => 'Seg uyfus-seg uẓelmaḍ',
'XK' => 'Kuṣuvu',
'YE' => 'Lyamen',
'YT' => 'Mayuṭ',
@@ -1208,8 +1212,8 @@ $countryNames = [
];
$timeUnits = [
- 'century-one' => '{0} n lqern',
- 'century-other' => '{0} n leqrun',
+ 'century-one' => '{0} n tasut',
+ 'century-other' => '{0} n tasutin',
'day-future-one' => 'deg {0} n wass',
'day-future-other' => 'deg {0} n wussan',
'day-narrow-future-one' => 'deg {0} n wass',
@@ -1224,6 +1228,8 @@ $timeUnits = [
'day-short-future-other' => 'deg {0} n wussan',
'day-short-past-one' => '{0} n wass aya',
'day-short-past-other' => '{0} n wussan aya',
+ 'decade-one' => '{0} n tmerwa',
+ 'decade-other' => '{0} n tmerwatin',
'fri-future-one' => 'Deg {0} Sem',
'fri-future-other' => 'Deg {0} Sem',
'fri-narrow-future-one' => 'Deg {0} Sm.',
@@ -1243,7 +1249,7 @@ $timeUnits = [
'hour-narrow-past-one' => '{0} sr. aya',
'hour-narrow-past-other' => '{0} sr. aya',
'hour-one' => '{0} n usrag',
- 'hour-other' => '{0} n isragen',
+ 'hour-other' => '{0} n yisragen',
'hour-past-one' => '{0} n usrag aya',
'hour-past-other' => '{0} n isragen aya',
'hour-short-future-one' => 'deg {0} sr.',
@@ -1326,8 +1332,8 @@ $timeUnits = [
'second-narrow-future-other' => 'deg {0} tsn.',
'second-narrow-past-one' => '{0} tsn. aya',
'second-narrow-past-other' => '{0} tsn. aya',
- 'second-one' => '{0} n tasint',
- 'second-other' => '{0} n tisinin',
+ 'second-one' => '{0} n tsint',
+ 'second-other' => '{0} n tsinin',
'second-past-one' => '{0} n tasint aya',
'second-past-other' => '{0} n tasinin aya',
'second-short-future-one' => 'deg {0} tsn.',
@@ -1388,8 +1394,8 @@ $timeUnits = [
'week-narrow-future-other' => 'deg {0} mls.',
'week-narrow-past-one' => '{0} mls. aya',
'week-narrow-past-other' => '{0} mls. aya',
- 'week-one' => '{0} n umalas',
- 'week-other' => '{0} n imalasen',
+ 'week-one' => '{0} n yimalas',
+ 'week-other' => '{0} n yimalasen',
'week-past-one' => '{0} n umalas aya',
'week-past-other' => '{0} n imalasen aya',
'week-short-future-one' => 'deg {0} mls.',
@@ -1403,7 +1409,7 @@ $timeUnits = [
'year-narrow-past-one' => '{0} sg. aya',
'year-narrow-past-other' => '{0} sg. aya',
'year-one' => '{0} n useggas',
- 'year-other' => '{0} n iseggasen',
+ 'year-other' => '{0} n yiseggasen',
'year-past-one' => '{0} n useggas aya',
'year-past-other' => '{0} n iseggasen aya',
'year-short-future-one' => 'deg {0} sg.',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKk_cyrl.php b/MLEB/cldr/CldrNames/CldrNamesKk_cyrl.php
index 0370ea49..c70bd8e7 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKk_cyrl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKk_cyrl.php
@@ -957,7 +957,7 @@ $countryNames = [
'TD' => 'Чад',
'TF' => 'Францияның оңтүстік аймақтары',
'TG' => 'Того',
- 'TH' => 'Тайланд',
+ 'TH' => 'Таиланд',
'TJ' => 'Тәжікстан',
'TK' => 'Токелау',
'TL' => 'Тимор-Лесте',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKm.php b/MLEB/cldr/CldrNames/CldrNamesKm.php
index a7e1578a..13e3ff94 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKm.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKm.php
@@ -33,7 +33,7 @@ $languageNames = [
'be' => 'បេឡារុស',
'bem' => 'បេមបា',
'bez' => 'បេណា',
- 'bg' => 'ប៊ុលហ្គារី',
+ 'bg' => 'ប៊ុលហ្ការី',
'bgn' => 'បាឡូជីខាងលិច',
'bho' => 'បូចពូរី',
'bi' => 'ប៊ីស្លាម៉ា',
@@ -42,7 +42,7 @@ $languageNames = [
'bm' => 'បាម្បារា',
'bn' => 'បង់ក្លាដែស',
'bo' => 'ទីបេ',
- 'br' => 'ប្រីស្តុន',
+ 'br' => 'ប្រ៊ីស្តុន',
'brx' => 'បូដូ',
'bs' => 'បូស្នី',
'bug' => 'ប៊ុកហ្គី',
@@ -51,7 +51,7 @@ $languageNames = [
'ccp' => 'ចាក់ម៉ា',
'ce' => 'ឈីឆេន',
'ceb' => 'ស៊ីប៊ូអាណូ',
- 'cgg' => 'ឈីហ្គា',
+ 'cgg' => 'ឈីហ្កា',
'ch' => 'ឈីម៉ូរ៉ូ',
'chk' => 'ឈូគី',
'chm' => 'ម៉ារី',
@@ -62,7 +62,7 @@ $languageNames = [
'co' => 'កូស៊ីខាន',
'crs' => 'សេសេលវ៉ាគ្រីអូល (បារាំង)',
'cs' => 'ឆែក',
- 'cu' => 'ឈឺជស្លាវិក',
+ 'cu' => 'ឈើជស្លាវិក',
'cv' => 'ឈូវ៉ាស',
'cy' => 'វេល',
'da' => 'ដាណឺម៉ាក',
@@ -70,7 +70,6 @@ $languageNames = [
'dar' => 'ដាចវ៉ា',
'dav' => 'តៃតា',
'de' => 'អាល្លឺម៉ង់',
- 'de-ch' => 'អាល្លឺម៉ង់ (ស្វ៊ីស)',
'dgr' => 'ដូគ្រីប',
'dje' => 'ហ្សាម៉ា',
'dsb' => 'សូប៊ីក្រោម',
@@ -95,12 +94,11 @@ $languageNames = [
'fa-af' => 'ដារី',
'ff' => 'ហ្វ៊ូឡា',
'fi' => 'ហ្វាំងឡង់',
- 'fil' => 'ហ្វីលីពីន',
+ 'fil' => 'ហ្វ៊ីលីពីន',
'fj' => 'ហ៊្វីជី',
'fo' => 'ហ្វារូស',
'fon' => 'ហ្វ៊ុន',
'fr' => 'បារាំង',
- 'fr-ch' => 'បារាំង (ស្វ៊ីស)',
'fur' => 'ហ៊្វ្រូលាន',
'fy' => 'ហ្វ្រីស៊ានខាងលិច',
'ga' => 'អៀរឡង់',
@@ -109,16 +107,16 @@ $languageNames = [
'gd' => 'ស្កុតហ្កែលិគ',
'gez' => 'ជីស',
'gil' => 'ហ្គីលបឺទ',
- 'gl' => 'ហ្គាលីស្យាន',
+ 'gl' => 'ហ្កាលីស្យាន',
'gn' => 'ហ្គូរ៉ានី',
'gor' => 'ហ្គូរុនតាឡូ',
'gsw' => 'អាល្លឺម៉ង (ស្វីស)',
- 'gu' => 'ហ្កុយ៉ារាទី',
+ 'gu' => 'ហ្គុយ៉ារ៉ាទី',
'guz' => 'ហ្គូស៊ី',
'gv' => 'មេន',
'gwi' => 'ហ្គីចឈីន',
'ha' => 'ហូសា',
- 'haw' => 'ហាវៃ',
+ 'haw' => 'ហាវ៉ៃ',
'he' => 'ហេប្រឺ',
'hi' => 'ហិណ្ឌី',
'hil' => 'ហ៊ីលីហ្គេណុន',
@@ -130,7 +128,7 @@ $languageNames = [
'hup' => 'ហ៊ូប៉ា',
'hy' => 'អាមេនី',
'hz' => 'ហឺរីរ៉ូ',
- 'ia' => 'អីនធើលីង',
+ 'ia' => 'អ៊ីនធើលីង',
'iba' => 'អ៊ីបាន',
'ibb' => 'អាយប៊ីប៊ីអូ',
'id' => 'ឥណ្ឌូណេស៊ី',
@@ -190,7 +188,7 @@ $languageNames = [
'lag' => 'ឡានហ្គី',
'lb' => 'លុចសំបួ',
'lez' => 'ឡេសហ្គី',
- 'lg' => 'ហ្គាន់ដា',
+ 'lg' => 'ហ្កាន់ដា',
'li' => 'លីមប៊ូស',
'lkt' => 'ឡាកូតា',
'ln' => 'លីនកាឡា',
@@ -277,6 +275,7 @@ $languageNames = [
'prg' => 'ព្រូស៊ាន',
'ps' => 'បាស្តូ',
'pt' => 'ព័រទុយហ្គាល់',
+ 'pt-br' => 'ព័រទុយហ្កាល់ (ប្រេស៊ីល)',
'pt-pt' => 'ព័រទុយហ្គាល់ (អឺរ៉ុប)',
'qu' => 'ហ្គិកឈួ',
'quc' => 'គីចឈី',
@@ -316,7 +315,7 @@ $languageNames = [
'sm' => 'សាម័រ',
'sma' => 'សាមីខាងត្បូង',
'smj' => 'លូលីសាមី',
- 'smn' => 'អ៊ីណារីសាម៉ី',
+ 'smn' => 'អ៊ីណារីសាមី',
'sms' => 'ស្កុលសាមី',
'sn' => 'សូណា',
'snk' => 'សូនីនគេ',
@@ -414,7 +413,7 @@ $currencyNames = [
'BHD' => 'ឌីណា​បារ៉ែន',
'BIF' => 'ហ្វ្រង់​ប៊ូរុនឌី',
'BMD' => 'ដុល្លារ​ប៊ឺមុយដា',
- 'BND' => 'ដុល្លារ​ប្រុយណេ',
+ 'BND' => 'ដុល្លារព្រុយណេ',
'BOB' => 'បូលីវីណូ​បូលីវី',
'BRL' => 'រៀល​ប្រេស៊ីល',
'BSD' => 'ដុល្លារ​បាហាម៉ា',
@@ -427,8 +426,8 @@ $currencyNames = [
'CDF' => 'ហ្វ្រង់​កុងហ្គោ',
'CHF' => 'ហ្វ្រង់ស្វីស',
'CLP' => 'ប៉េសូឈីលី',
- 'CNH' => 'យ៉ន់ចិន (ក្រៅប្រទេស)',
- 'CNY' => 'យ៉ន់​ចិន',
+ 'CNH' => 'យ័នចិន (ក្រៅប្រទេស)',
+ 'CNY' => 'យ័នចិន',
'COP' => 'ប៉េសូកូឡុំប៊ី',
'CRC' => 'កូឡុង​កូស្តារីកា',
'CUC' => 'ប៉េសូ​គុយបាអាច​បម្លែង​បាន',
@@ -500,7 +499,7 @@ $currencyNames = [
'MZN' => 'មីទីខល​ម៉ូសំប៊ិក',
'NAD' => 'ដុល្លារ​ណាមីប៊ី',
'NGN' => 'ណៃរ៉ា​នីហ្សេរីយ៉ា',
- 'NIO' => 'ខឌូបា​នីការ៉ាហ្គា',
+ 'NIO' => 'ខឌូបា​នីការ៉ាហ្កា',
'NOK' => 'ក្រូណេ​ន័រវ៉េ',
'NPR' => 'រូពីនេប៉ាល់',
'NZD' => 'ដុល្លារ​នូវែលសេឡង់',
@@ -727,7 +726,7 @@ $countryNames = [
'AC' => 'កោះ​អាសេនសិន',
'AD' => 'អង់ដូរ៉ា',
'AE' => 'អេមីរ៉ាត​អារ៉ាប់​រួម',
- 'AF' => 'អាហ្វហ្គានីស្ថាន',
+ 'AF' => 'អាហ្វហ្កានីស្ថាន',
'AG' => 'អង់ទីហ្គា និង បាប៊ុយដា',
'AI' => 'អង់ហ្គីឡា',
'AL' => 'អាល់បានី',
@@ -741,12 +740,12 @@ $countryNames = [
'AW' => 'អារូបា',
'AX' => 'កោះ​អាឡង់',
'AZ' => 'អាស៊ែបៃហ្សង់',
- 'BA' => 'បូស្នី និងហឺហ្សីហ្គូវីណា',
+ 'BA' => 'បូស្ន៊ី និងហឺហ្ស៊ីហ្គូវីណា',
'BB' => 'បាបាដុស',
'BD' => 'បង់ក្លាដែស',
'BE' => 'បែលហ្ស៊ិក',
'BF' => 'បួគីណាហ្វាសូ',
- 'BG' => 'ប៊ុលហ្គារី',
+ 'BG' => 'ប៊ុលហ្ការី',
'BH' => 'បារ៉ែន',
'BI' => 'ប៊ូរុនឌី',
'BJ' => 'បេណាំង',
@@ -767,7 +766,7 @@ $countryNames = [
'CD' => 'កុងហ្គោ- គីនស្ហាសា',
'CF' => 'សាធារណរដ្ឋអាហ្វ្រិកកណ្ដាល',
'CG' => 'កុងហ្គោ - ប្រាហ្សាវីល',
- 'CH' => 'ស្វីស',
+ 'CH' => 'ស្វ៊ីស',
'CI' => 'កូតឌីវ័រ',
'CK' => 'កោះ​ខូក',
'CL' => 'ស៊ីលី',
@@ -781,7 +780,7 @@ $countryNames = [
'CW' => 'កូរ៉ាកៅ',
'CX' => 'កោះ​គ្រីស្មាស',
'CY' => 'ស៊ីប',
- 'CZ' => 'ឆែគា',
+ 'CZ' => 'ឆែក',
'DE' => 'អាល្លឺម៉ង់',
'DG' => 'ឌៀហ្គោហ្គាស៊ី',
'DJ' => 'ជីប៊ូទី',
@@ -824,8 +823,8 @@ $countryNames = [
'GU' => 'ហ្គាំ',
'GW' => 'ហ្គីណេប៊ីស្សូ',
'GY' => 'ហ្គីយ៉ាន',
- 'HK' => 'ហុងកុង តំបន់រដ្ឋបាលពិសេសចិន',
- 'HM' => 'កោះ​ហឺដ និង​ម៉ាក់ដូណាល់',
+ 'HK' => 'ហុងកុង',
+ 'HM' => 'កោះ​ហឺដនិង​ម៉ាក់ដូណាល់',
'HN' => 'ហុងឌូរ៉ាស',
'HR' => 'ក្រូអាស៊ី',
'HT' => 'ហៃទី',
@@ -841,7 +840,7 @@ $countryNames = [
'IR' => 'អ៊ីរ៉ង់',
'IS' => 'អ៊ីស្លង់',
'IT' => 'អ៊ីតាលី',
- 'JE' => 'ជឺស៊ី',
+ 'JE' => 'ជើស៊ី',
'JM' => 'ហ្សាម៉ាអ៊ីក',
'JO' => 'ហ៊្សកដានី',
'JP' => 'ជប៉ុន',
@@ -907,14 +906,14 @@ $countryNames = [
'PE' => 'ប៉េរូ',
'PF' => 'ប៉ូលី​ណេស៊ី​បារាំង',
'PG' => 'ប៉ាពូអាស៊ី​នូវែលហ្គីណេ',
- 'PH' => 'ហ្វីលីពីន',
+ 'PH' => 'ហ្វ៊ីលីពីន',
'PK' => 'ប៉ាគីស្ថាន',
'PL' => 'ប៉ូឡូញ',
'PM' => 'សង់ព្យែរ និង​មីគីឡុង',
'PN' => 'កោះ​ភីតកាន',
'PR' => 'ព័រតូរីកូ',
- 'PS' => 'ប៉ាលេស្ទីន',
- 'PT' => 'ព័រទុយហ្គាល់',
+ 'PS' => 'ប៉ាឡេស្ទីន',
+ 'PT' => 'ព័រទុយហ្កាល់',
'PW' => 'ផៅឡូ',
'PY' => 'ប៉ារ៉ាហ្គាយ',
'QA' => 'កាតា',
@@ -1012,7 +1011,7 @@ $timeUnits = [
'hour-short-future-other' => '{0} ម៉ោងទៀត',
'hour-short-past-other' => '{0} ម៉ោង​មុន',
'microsecond-other' => '{0} មីក្រូ​វិនាទី',
- 'millisecond-other' => '{0} មិល្លី​វិនាទី',
+ 'millisecond-other' => '{0} មីលី​វិនាទី',
'minute-future-other' => '{0} នាទីទៀត',
'minute-narrow-future-other' => '{0} នាទីទៀត',
'minute-narrow-past-other' => '{0} នាទី​​មុន',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKn.php b/MLEB/cldr/CldrNames/CldrNamesKn.php
index cb78b5c0..f2bb0dd8 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKn.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKn.php
@@ -63,7 +63,7 @@ $languageNames = [
'car' => 'ಕಾರಿಬ್',
'cch' => 'ಅಟ್ಸಮ್',
'ccp' => 'ಚಕ್ಮಾ',
- 'ce' => 'ಚೆಚನ್',
+ 'ce' => 'ಚಚೆನ್',
'ceb' => 'ಸೆಬುವಾನೊ',
'cgg' => 'ಚಿಗಾ',
'ch' => 'ಕಮೊರೊ',
@@ -897,7 +897,7 @@ $countryNames = [
'CF' => 'ಮಧ್ಯ ಆಫ್ರಿಕಾ ಗಣರಾಜ್ಯ',
'CG' => 'ಕಾಂಗೋ - ಬ್ರಾಜಾವಿಲ್ಲೇ',
'CH' => 'ಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್',
- 'CI' => 'ಕೋತ್‌ ದಿವಾರ್‍',
+ 'CI' => 'ಕೋತ್ ದ್‘ಇವಾರ್',
'CK' => 'ಕುಕ್ ದ್ವೀಪಗಳು',
'CL' => 'ಚಿಲಿ',
'CM' => 'ಕ್ಯಾಮರೂನ್',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKo.php b/MLEB/cldr/CldrNames/CldrNamesKo.php
index 07c907e2..efec3e18 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKo.php
@@ -129,7 +129,6 @@ $languageNames = [
'el' => '그리스어',
'elx' => '엘람어',
'en' => '영어',
- 'en-au' => '영어(호주)',
'enm' => '중세 영어',
'eo' => '에스페란토어',
'es' => '스페인어',
@@ -432,7 +431,7 @@ $languageNames = [
'shi' => '타셸히트어',
'shn' => '샨어',
'shu' => '차디언 아라비아어',
- 'si' => '스리랑카어',
+ 'si' => '싱할라어',
'sid' => '시다모어',
'sk' => '슬로바키아어',
'sl' => '슬로베니아어',
@@ -638,7 +637,7 @@ $currencyNames = [
'FJD' => '피지 달러',
'FKP' => '포클랜드제도 파운드',
'FRF' => '프랑스 프랑',
- 'GBP' => '파운드',
+ 'GBP' => '영국 파운드',
'GEK' => '그루지야 지폐 라리트',
'GEL' => '조지아 라리',
'GHC' => '가나 시디 (1979–2007)',
@@ -1051,7 +1050,7 @@ $countryNames = [
'CM' => '카메룬',
'CN' => '중국',
'CO' => '콜롬비아',
- 'CP' => '클립퍼튼 섬',
+ 'CP' => '클리퍼턴섬',
'CR' => '코스타리카',
'CU' => '쿠바',
'CV' => '카보베르데',
@@ -1111,7 +1110,7 @@ $countryNames = [
'ID' => '인도네시아',
'IE' => '아일랜드',
'IL' => '이스라엘',
- 'IM' => '맨 섬',
+ 'IM' => '맨섬',
'IN' => '인도',
'IO' => '영국령 인도양 식민지',
'IQ' => '이라크',
@@ -1188,7 +1187,7 @@ $countryNames = [
'PK' => '파키스탄',
'PL' => '폴란드',
'PM' => '생피에르 미클롱',
- 'PN' => '핏케언 섬',
+ 'PN' => '핏케언 제도',
'PR' => '푸에르토리코',
'PS' => '팔레스타인',
'PT' => '포르투갈',
@@ -1196,7 +1195,7 @@ $countryNames = [
'PY' => '파라과이',
'QA' => '카타르',
'QO' => '오세아니아 외곽',
- 'RE' => '리유니온',
+ 'RE' => '레위니옹',
'RO' => '루마니아',
'RS' => '세르비아',
'RU' => '러시아',
diff --git a/MLEB/cldr/CldrNames/CldrNamesKy.php b/MLEB/cldr/CldrNames/CldrNamesKy.php
index 9ce2e60c..6bb2cb77 100644
--- a/MLEB/cldr/CldrNames/CldrNamesKy.php
+++ b/MLEB/cldr/CldrNames/CldrNamesKy.php
@@ -46,8 +46,8 @@ $languageNames = [
'bs' => 'боснийче',
'bug' => 'бугийче',
'byn' => 'блинче',
- 'ca' => 'каталонча',
- 'ccp' => 'Чакма',
+ 'ca' => 'каталончо',
+ 'ccp' => 'чакма',
'ce' => 'чеченче',
'ceb' => 'себуанча',
'cgg' => 'чигача',
@@ -279,7 +279,6 @@ $languageNames = [
'prg' => 'пруссча',
'ps' => 'пуштуча',
'pt' => 'португалча',
- 'pt-br' => 'Бразилиялык Португал тили',
'pt-pt' => 'португалча (Европа)',
'qu' => 'кечуача',
'quc' => 'кичече',
@@ -429,7 +428,7 @@ $currencyNames = [
'CDF' => 'Конго франкы',
'CHF' => 'швейцария франкы',
'CLP' => 'чили песосу',
- 'CNH' => 'Кытай юаны (офшор)',
+ 'CNH' => 'Кытай юаны (оффшор)',
'CNY' => 'Кытай юаны',
'COP' => 'колумбия песосу',
'CRC' => 'коста-рика колону',
@@ -473,8 +472,8 @@ $currencyNames = [
'KGS' => 'Кыргызстан сому',
'KHR' => 'Камбожа риели',
'KMF' => 'Коморос франкы',
- 'KPW' => 'Түндүк Корея уону',
- 'KRW' => 'Түштүк Корея уону',
+ 'KPW' => 'Түндүк Корея вону',
+ 'KRW' => 'Түштүк Корея вону',
'KWD' => 'Кувейт динары',
'KYD' => 'кайман доллары',
'KZT' => 'Казакстан теңгеси',
@@ -879,7 +878,7 @@ $countryNames = [
'ML' => 'Мали',
'MM' => 'Мьянма (Бирма)',
'MN' => 'Монголия',
- 'MO' => 'Макау',
+ 'MO' => 'Макао',
'MP' => 'Түндүк Мариана аралдары',
'MQ' => 'Мартиника',
'MR' => 'Мавритания',
diff --git a/MLEB/cldr/CldrNames/CldrNamesLo.php b/MLEB/cldr/CldrNames/CldrNamesLo.php
index 095d1d87..ad9a5656 100644
--- a/MLEB/cldr/CldrNames/CldrNamesLo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesLo.php
@@ -200,7 +200,7 @@ $languageNames = [
'id' => 'ອິນໂດເນຊຽນ',
'ie' => 'ອິນເຕີລິງກຣີ',
'ig' => 'ອິກໂບ',
- 'ii' => 'ເຊສວຍຢີ',
+ 'ii' => 'ເສສວນ ອີ',
'ik' => 'ອິນນູປຽກ',
'ilo' => 'ໄອໂລໂກ',
'inh' => 'ອິນກັຊ',
@@ -1179,7 +1179,7 @@ $countryNames = [
'PM' => 'ເຊນ ປີແອ ມິເກວລອນ',
'PN' => 'ໝູ່ເກາະພິດແຄນ',
'PR' => 'ເພືອໂຕ ຣິໂກ',
- 'PS' => 'ປາເລສຕາຍ',
+ 'PS' => 'ປາເລດສະຕິນ',
'PT' => 'ພອລທູໂກ',
'PW' => 'ປາລາວ',
'PY' => 'ພາຣາກວຍ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesLt.php b/MLEB/cldr/CldrNames/CldrNamesLt.php
index 09e3d55a..87d93a83 100644
--- a/MLEB/cldr/CldrNames/CldrNamesLt.php
+++ b/MLEB/cldr/CldrNames/CldrNamesLt.php
@@ -1309,7 +1309,7 @@ $countryNames = [
'SX' => 'Sint Martenas',
'SY' => 'Sirija',
'SZ' => 'Svazilandas',
- 'TA' => 'Tristanas da Kunja',
+ 'TA' => 'Tristano da Kunjos',
'TC' => 'Terkso ir Kaikoso Salos',
'TD' => 'Čadas',
'TF' => 'Prancūzijos Pietų sritys',
diff --git a/MLEB/cldr/CldrNames/CldrNamesLv.php b/MLEB/cldr/CldrNames/CldrNamesLv.php
index a9123840..5cbc5367 100644
--- a/MLEB/cldr/CldrNames/CldrNamesLv.php
+++ b/MLEB/cldr/CldrNames/CldrNamesLv.php
@@ -1005,7 +1005,7 @@ $countryNames = [
'ID' => 'Indonēzija',
'IE' => 'Īrija',
'IL' => 'Izraēla',
- 'IM' => 'Mena',
+ 'IM' => 'Menas sala',
'IN' => 'Indija',
'IO' => 'Indijas okeāna Britu teritorija',
'IQ' => 'Irāka',
@@ -1116,7 +1116,7 @@ $countryNames = [
'SX' => 'Sintmārtena',
'SY' => 'Sīrija',
'SZ' => 'Svatini',
- 'TA' => 'Tristana da Kuņas salas',
+ 'TA' => 'Tristana da Kuņjas salu teritorijas',
'TC' => 'Tērksas un Kaikosas salas',
'TD' => 'Čada',
'TF' => 'Francijas Dienvidjūru teritorija',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMi.php b/MLEB/cldr/CldrNames/CldrNamesMi.php
index c699e177..0e041c89 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMi.php
@@ -18,7 +18,7 @@ $languageNames = [
'fr-ch' => 'Wīwī Huiterangi',
'it' => 'Ītariana',
'ja' => 'Hapanihi',
- 'mi' => 'Māori',
+ 'mi' => 'te reo Māori',
'pt' => 'Pōtikī',
'pt-br' => 'Pōtikī Parahi',
'pt-pt' => 'Pōtikī Uropi',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMk.php b/MLEB/cldr/CldrNames/CldrNamesMk.php
index 3fb89a5f..23c60254 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMk.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMk.php
@@ -24,7 +24,7 @@ $languageNames = [
'ang' => 'староанглиски',
'anp' => 'ангика',
'ar' => 'арапски',
- 'ar-001' => 'литературен арапски',
+ 'ar-001' => 'современ стандардизиран арапски',
'arc' => 'арамејски',
'arn' => 'мапучки',
'aro' => 'араона',
@@ -99,7 +99,7 @@ $languageNames = [
'chn' => 'чинучки жаргон',
'cho' => 'чоктавски',
'chp' => 'чипевјански',
- 'chr' => 'черокиски',
+ 'chr' => 'чероки',
'chy' => 'чејенски',
'ckb' => 'централнокурдски',
'co' => 'корзикански',
@@ -119,7 +119,7 @@ $languageNames = [
'dav' => 'таита',
'de' => 'германски',
'de-at' => 'австриски германски',
- 'de-ch' => 'швајцарски високо-германски',
+ 'de-ch' => 'швајцарски горногермански',
'del' => 'делавер',
'den' => 'слејви',
'dgr' => 'догрипски',
@@ -152,7 +152,7 @@ $languageNames = [
'eo' => 'есперанто',
'es' => 'шпански',
'es-419' => 'латиноамерикански шпански',
- 'es-es' => 'шпански (во Европа)',
+ 'es-es' => 'шпански (Европа)',
'es-mx' => 'мексикански шпански',
'esu' => 'централнојупички',
'et' => 'естонски',
@@ -440,7 +440,7 @@ $languageNames = [
'ps' => 'паштунски',
'pt' => 'португалски',
'pt-br' => 'бразилски португалски',
- 'pt-pt' => 'португалски (во Европа)',
+ 'pt-pt' => 'португалски (Европа)',
'qu' => 'кечуански',
'quc' => 'киче',
'qug' => 'кичвански',
@@ -500,7 +500,7 @@ $languageNames = [
'sm' => 'самоански',
'sma' => 'јужен сами',
'smj' => 'луле сами',
- 'smn' => 'инари сами',
+ 'smn' => 'инариски сами',
'sms' => 'сколт сами',
'sn' => 'шона',
'snk' => 'сонинке',
@@ -666,7 +666,7 @@ $currencyNames = [
'COP' => 'Колумбиски пезос',
'CRC' => 'Костарикански колон',
'CSK' => 'Чехословачка цврста корона',
- 'CUC' => 'Кубански пезос (конвертибилен)',
+ 'CUC' => 'Кубански конвертибилен пезос',
'CUP' => 'Кубански пезос',
'CVE' => 'Зелено’ртски ескудо',
'CYP' => 'Кипарска фунта',
@@ -721,7 +721,7 @@ $currencyNames = [
'KPW' => 'Северно корејски вон',
'KRW' => 'Јужно корејски вон',
'KWD' => 'Кувајтски динар',
- 'KYD' => 'Долар на кајмански острови',
+ 'KYD' => 'Кајмански долар',
'KZT' => 'Казахстанска тенга',
'LAK' => 'Лаоски кип',
'LBP' => 'Либанска фунта',
@@ -748,7 +748,7 @@ $currencyNames = [
'MTL' => 'Малтешка лира',
'MTP' => 'Малтешка фунта',
'MUR' => 'Мавританска рупија',
- 'MVR' => 'Малдивиска руфија',
+ 'MVR' => 'Малдивска руфија',
'MWK' => 'Малависка квача',
'MXN' => 'Мексикански пезос',
'MXP' => 'Мексикански сребрен пезос (1861–1992)',
@@ -833,7 +833,7 @@ $currencyNames = [
'VUV' => 'Ванатски вату',
'WST' => 'Самоанска тала',
'XAF' => 'Централноафрикански франк',
- 'XCD' => 'Источно карипски долар',
+ 'XCD' => 'Источнокарипски долар',
'XOF' => 'Западноафрикански франк',
'XPF' => 'ЦФП франк',
'XXX' => 'Непозната валута',
@@ -1115,7 +1115,7 @@ $countryNames = [
'GU' => 'Гуам',
'GW' => 'Гвинеја-Бисау',
'GY' => 'Гвајана',
- 'HK' => 'Хонг Конг',
+ 'HK' => 'Хонгконг',
'HM' => 'Остров Херд и Острови Мекдоналд',
'HN' => 'Хондурас',
'HR' => 'Хрватска',
@@ -1223,7 +1223,7 @@ $countryNames = [
'SG' => 'Сингапур',
'SH' => 'Света Елена',
'SI' => 'Словенија',
- 'SJ' => 'Свалбард и Жан Мејен',
+ 'SJ' => 'Свалбард и Јан Мајен',
'SK' => 'Словачка',
'SL' => 'Сиера Леоне',
'SM' => 'Сан Марино',
@@ -1244,7 +1244,7 @@ $countryNames = [
'TH' => 'Тајланд',
'TJ' => 'Таџикистан',
'TK' => 'Токелау',
- 'TL' => 'Источен Тимор (Тимор Лесте)',
+ 'TL' => 'Тимор Лесте',
'TM' => 'Туркменистан',
'TN' => 'Тунис',
'TO' => 'Тонга',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMl.php b/MLEB/cldr/CldrNames/CldrNamesMl.php
index 4515a5be..cc7eaa15 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMl.php
@@ -138,6 +138,7 @@ $languageNames = [
'eu' => 'ബാസ്‌ക്',
'ewo' => 'എവോൻഡോ',
'fa' => 'പേർഷ്യൻ',
+ 'fa-af' => 'ഡാരി',
'fan' => 'ഫങ്',
'fat' => 'ഫാന്റി',
'ff' => 'ഫുല',
@@ -217,7 +218,7 @@ $languageNames = [
'jmc' => 'മചേം',
'jpr' => 'ജൂഡിയോ-പേർഷ്യൻ',
'jrb' => 'ജൂഡിയോ-അറബിക്',
- 'jv' => 'ജാവാനീസ്',
+ 'jv' => 'ജാവനീസ്',
'ka' => 'ജോർജിയൻ',
'kaa' => 'കര-കാൽപ്പക്',
'kab' => 'കബൈൽ',
@@ -1062,7 +1063,7 @@ $countryNames = [
'FO' => 'ഫറോ ദ്വീപുകൾ',
'FR' => 'ഫ്രാൻസ്',
'GA' => 'ഗാബൺ',
- 'GB' => 'യു.കെ.',
+ 'GB' => 'യുണൈറ്റഡ് കിംഗ്ഡം',
'GD' => 'ഗ്രനേഡ',
'GE' => 'ജോർജ്ജിയ',
'GF' => 'ഫ്രഞ്ച് ഗയാന',
@@ -1200,7 +1201,7 @@ $countryNames = [
'SV' => 'എൽ സാൽവദോർ',
'SX' => 'സിന്റ് മാർട്ടെൻ',
'SY' => 'സിറിയ',
- 'SZ' => 'സ്വാസിലാന്റ്',
+ 'SZ' => 'സ്വാസിലൻഡ്',
'TA' => 'ട്രിസ്റ്റൻ ഡ കൂന',
'TC' => 'ടർക്ക്‌സും കെയ്‌ക്കോ ദ്വീപുകളും',
'TD' => 'ഛാഡ്',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMni.php b/MLEB/cldr/CldrNames/CldrNamesMni.php
index 4843fba6..6a2fd28d 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMni.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMni.php
@@ -11,6 +11,8 @@ $languageNames = [
'en-us' => 'অমেরিকান ইংলিস',
'es' => 'স্পেনিস',
'es-419' => 'লেটিন অমেরিকান স্পেনিস',
+ 'es-es' => 'য়ুরোপিয়ান স্পেনিস',
+ 'es-mx' => 'মেক্সিকান স্পেনিস',
'fr' => 'ফ্রেঞ্চ',
'fr-ca' => 'কানাদিয়ান ফ্রেঞ্চ',
'fr-ch' => 'স্বিজ ফ্রেঞ্চ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMr.php b/MLEB/cldr/CldrNames/CldrNamesMr.php
index bb17d6f5..383970d3 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMr.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMr.php
@@ -104,7 +104,7 @@ $languageNames = [
'dua' => 'दुआला',
'dum' => 'मिडल डच',
'dv' => 'दिवेही',
- 'dyo' => 'जोला-फोंयी',
+ 'dyo' => 'जोला-फॉन्यी',
'dyu' => 'ड्युला',
'dz' => 'झोंगखा',
'dzg' => 'दाझागा',
@@ -130,6 +130,7 @@ $languageNames = [
'eu' => 'बास्क',
'ewo' => 'इवोन्डो',
'fa' => 'फारसी',
+ 'fa-af' => 'दारी',
'fan' => 'फँग',
'fat' => 'फन्टी',
'ff' => 'फुलाह',
@@ -154,7 +155,7 @@ $languageNames = [
'gan' => 'गॅन चिनी',
'gay' => 'गायो',
'gba' => 'बाया',
- 'gd' => 'स्कॉट्स गेलिक',
+ 'gd' => 'स्कॉटिश गेलिक',
'gez' => 'गीझ',
'gil' => 'जिल्बरटीज',
'gl' => 'गॅलिशियन',
@@ -184,7 +185,7 @@ $languageNames = [
'hr' => 'क्रोएशियन',
'hsb' => 'अप्पर सॉर्बियन',
'hsn' => 'शियांग चिनी',
- 'ht' => 'हैतीयन',
+ 'ht' => 'हैतीयन क्रेओल',
'hu' => 'हंगेरियन',
'hup' => 'हूपा',
'hy' => 'आर्मेनियन',
@@ -430,7 +431,7 @@ $languageNames = [
'srr' => 'सेरेर',
'ss' => 'स्वाती',
'ssy' => 'साहो',
- 'st' => 'सेसोथो',
+ 'st' => 'दक्षिणी सोथो',
'su' => 'सुंदानीज',
'suk' => 'सुकुमा',
'sus' => 'सुसु',
@@ -473,7 +474,7 @@ $languageNames = [
'twq' => 'तासाव्हाक',
'ty' => 'ताहितीयन',
'tyv' => 'टुवीनियन',
- 'tzm' => 'मध्य ऍटलास तॅमॅझायट',
+ 'tzm' => 'मध्य अ‍ॅटलास तॅमाझाइट',
'udm' => 'उदमुर्त',
'ug' => 'उइगुर',
'uga' => 'युगॅरिटिक',
@@ -554,7 +555,7 @@ $currencyNames = [
'CNH' => 'चिनी युआन (ऑफशोर)',
'CNY' => 'चीनी युआन',
'COP' => 'कोलंबियन पेसो',
- 'CRC' => 'कोस्टा रिका कोलोन',
+ 'CRC' => 'कोस्टारिकन कोलोन',
'CUC' => 'क्यूबन विनिमय पेसो',
'CUP' => 'क्यूबन पेसो',
'CVE' => 'केप व्हर्डेयन एस्कुडो',
@@ -896,7 +897,7 @@ $countryNames = [
'CF' => 'केंद्रीय अफ्रिकी प्रजासत्ताक',
'CG' => 'काँगो - ब्राझाविले',
'CH' => 'स्वित्झर्लंड',
- 'CI' => 'आयव्हरी कोस्ट',
+ 'CI' => 'Côte d’Ivoire',
'CK' => 'कुक बेटे',
'CL' => 'चिली',
'CM' => 'कॅमेरून',
@@ -964,7 +965,7 @@ $countryNames = [
'IL' => 'इस्त्राइल',
'IM' => 'आयल ऑफ मॅन',
'IN' => 'भारत',
- 'IO' => 'ब्रिटिश हिंदी महासागर क्षेत्र',
+ 'IO' => 'ब्रिटिश हिंद महासागर प्रदेश',
'IQ' => 'इराक',
'IR' => 'इराण',
'IS' => 'आइसलँड',
@@ -993,7 +994,7 @@ $countryNames = [
'LS' => 'लेसोथो',
'LT' => 'लिथुआनिया',
'LU' => 'लक्झेंबर्ग',
- 'LV' => 'लात्विया',
+ 'LV' => 'लाटव्हिया',
'LY' => 'लिबिया',
'MA' => 'मोरोक्को',
'MC' => 'मोनॅको',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMs.php b/MLEB/cldr/CldrNames/CldrNamesMs.php
index 957f8311..1ea04b5c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMs.php
@@ -52,7 +52,7 @@ $languageNames = [
'bkm' => 'Kom',
'bla' => 'Siksika',
'bm' => 'Bambara',
- 'bn' => 'Benggala',
+ 'bn' => 'Benggali',
'bo' => 'Tibet',
'bpy' => 'Bishnupriya',
'br' => 'Breton',
diff --git a/MLEB/cldr/CldrNames/CldrNamesMy.php b/MLEB/cldr/CldrNames/CldrNamesMy.php
index 5e0ff53f..2e626390 100644
--- a/MLEB/cldr/CldrNames/CldrNamesMy.php
+++ b/MLEB/cldr/CldrNames/CldrNamesMy.php
@@ -22,7 +22,7 @@ $languageNames = [
'arp' => 'အာရာပါဟို',
'as' => 'အာသံ',
'asa' => 'အာစု',
- 'ast' => 'အက်စတူရီယန်း',
+ 'ast' => 'အက်စ်တိုးရီးယား',
'av' => 'အာဗာရစ်ခ်',
'awa' => 'အာဝါဒီ',
'ay' => 'အိုင်မာရ',
@@ -90,7 +90,7 @@ $languageNames = [
'eka' => 'အီကာဂျုခ်',
'el' => 'ဂရိ',
'en' => 'အင်္ဂလိပ်',
- 'en-au' => 'ဩစတြေးလျှ အင်္ဂလိပ်',
+ 'en-au' => 'ဩစတြေးလျ အင်္ဂလိပ်',
'en-ca' => 'ကနေဒါ အင်္ဂလိပ်',
'en-gb' => 'ဗြိတိသျှ အင်္ဂလိပ်',
'en-us' => 'အမေရိကန် အင်္ဂလိပ်',
@@ -408,7 +408,7 @@ $languageNames = [
'ybb' => 'ရမ်ဘာ',
'yi' => 'ဂျူး',
'yo' => 'ယိုရူဘာ',
- 'yue' => 'ကွမ်တုံ',
+ 'yue' => 'ကွမ်းတုံ',
'zgh' => 'မိုရိုကို တမဇိုက်',
'zh' => 'တရုတ်',
'zu' => 'ဇူးလူး',
@@ -430,7 +430,7 @@ $currencyNames = [
'AWG' => 'အရူးဗာ ဖလိုရင်း',
'AZN' => 'အဇာဘိုင်ဂျန် မာနတ်',
'BAM' => 'ဘော့စနီးယားနှင့် ဟာဇီဂိုဘီးနား ငွေလဲနိုင်သော မတ်က်',
- 'BBD' => 'ဘာဘေးဒီယန်း ဒေါ်လာ',
+ 'BBD' => 'ဘာဘေးဒိုးစ် ဒေါ်လာ',
'BDT' => 'ဘင်္ဂလားဒေ့ရှ် တာကာ',
'BEF' => 'ဘယ်လ်ဂျီယမ် ဖရန့်',
'BGN' => 'ဘူလ်ဂေးရီးယား လက်ဖ်',
@@ -905,7 +905,7 @@ $countryNames = [
'LK' => 'သီရိလင်္ကာ',
'LR' => 'လိုက်ဘေးရီးယား',
'LS' => 'လီဆိုသို',
- 'LT' => 'လစ်သူယေးနီးယား',
+ 'LT' => 'လစ်သူဝေးနီးယား',
'LU' => 'လူဇင်ဘတ်',
'LV' => 'လတ်ဗီးယား',
'LY' => 'လစ်ဗျား',
diff --git a/MLEB/cldr/CldrNames/CldrNamesNb.php b/MLEB/cldr/CldrNames/CldrNamesNb.php
index b7561fbb..e3256490 100644
--- a/MLEB/cldr/CldrNames/CldrNamesNb.php
+++ b/MLEB/cldr/CldrNames/CldrNamesNb.php
@@ -1254,7 +1254,7 @@ $countryNames = [
'BZ' => 'Belize',
'CA' => 'Canada',
'CC' => 'Kokosøyene',
- 'CD' => 'Kongo-Kinshasa',
+ 'CD' => 'Kongo',
'CF' => 'Den sentralafrikanske republikk',
'CG' => 'Kongo-Brazzaville',
'CH' => 'Sveits',
@@ -1469,7 +1469,7 @@ $countryNames = [
'WF' => 'Wallis og Futuna',
'WS' => 'Samoa',
'XA' => 'pseudospråk – aksenter',
- 'XB' => 'pseudospråk – RTL',
+ 'XB' => 'pseudospråk – tekst begge veier',
'XK' => 'Kosovo',
'YE' => 'Jemen',
'YT' => 'Mayotte',
diff --git a/MLEB/cldr/CldrNames/CldrNamesNe.php b/MLEB/cldr/CldrNames/CldrNamesNe.php
index 940da725..014b7ee9 100644
--- a/MLEB/cldr/CldrNames/CldrNamesNe.php
+++ b/MLEB/cldr/CldrNames/CldrNamesNe.php
@@ -408,7 +408,7 @@ $languageNames = [
'oj' => 'ओजिब्वा',
'om' => 'ओरोमो',
'or' => 'उडिया',
- 'os' => 'अोस्सेटिक',
+ 'os' => 'ओस्सेटिक',
'osa' => 'ओसागे',
'ota' => 'अटोमन तुर्की',
'pa' => 'पंजाबी',
@@ -907,7 +907,7 @@ $countryNames = [
'AR' => 'अर्जेन्टिना',
'AS' => 'अमेरिकी समोआ',
'AT' => 'अष्ट्रिया',
- 'AU' => 'अष्ट्रेलिया',
+ 'AU' => 'अस्ट्रेलिया',
'AW' => 'अरुबा',
'AX' => 'अलान्ड टापुहरु',
'AZ' => 'अजरबैजान',
@@ -1083,7 +1083,7 @@ $countryNames = [
'PM' => 'सेन्ट पिर्रे र मिक्केलोन',
'PN' => 'पिटकाइर्न टापुहरु',
'PR' => 'पुएर्टो रिको',
- 'PS' => 'प्यालेसटाइन',
+ 'PS' => 'प्‍यालेस्टाइन',
'PT' => 'पोर्चुगल',
'PW' => 'पलाउ',
'PY' => 'प्याराग्वे',
diff --git a/MLEB/cldr/CldrNames/CldrNamesNl.php b/MLEB/cldr/CldrNames/CldrNamesNl.php
index 3285b961..c45d08ba 100644
--- a/MLEB/cldr/CldrNames/CldrNamesNl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesNl.php
@@ -50,7 +50,7 @@ $languageNames = [
'bax' => 'Bamoun',
'bbc' => 'Batak Toba',
'bbj' => 'Ghomala’',
- 'be' => 'Wit-Russisch',
+ 'be' => 'Belarussisch',
'bej' => 'Beja',
'bem' => 'Bemba',
'bew' => 'Betawi',
@@ -357,7 +357,7 @@ $languageNames = [
'ms' => 'Maleis',
'mt' => 'Maltees',
'mua' => 'Mundang',
- 'mul' => 'Meerdere talen',
+ 'mul' => 'meerdere talen',
'mus' => 'Creek',
'mwl' => 'Mirandees',
'mwr' => 'Marwari',
@@ -656,7 +656,7 @@ $currencyNames = [
'BUK' => 'Birmese kyat',
'BWP' => 'Botswaanse pula',
'BYB' => 'Wit-Russische nieuwe roebel (1994–1999)',
- 'BYN' => 'Wit-Russische roebel',
+ 'BYN' => 'Belarussische roebel',
'BYR' => 'Wit-Russische roebel (2000–2016)',
'BZD' => 'Belizaanse dollar',
'CAD' => 'Canadese dollar',
@@ -1433,7 +1433,7 @@ $countryNames = [
'SV' => 'El Salvador',
'SX' => 'Sint-Maarten',
'SY' => 'Syrië',
- 'SZ' => 'eSwatini',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Turks- en Caicoseilanden',
'TD' => 'Tsjaad',
diff --git a/MLEB/cldr/CldrNames/CldrNamesNn.php b/MLEB/cldr/CldrNames/CldrNamesNn.php
index 73139bc2..1ae07d5a 100644
--- a/MLEB/cldr/CldrNames/CldrNamesNn.php
+++ b/MLEB/cldr/CldrNames/CldrNamesNn.php
@@ -63,6 +63,7 @@ $languageNames = [
'cad' => 'caddo',
'car' => 'carib',
'cch' => 'atsam',
+ 'ccp' => 'chakma',
'ce' => 'tsjetsjensk',
'ceb' => 'cebuano',
'cgg' => 'kiga',
@@ -114,7 +115,6 @@ $languageNames = [
'el' => 'gresk',
'elx' => 'elamite',
'en' => 'engelsk',
- 'en-gb' => 'britisk engelsk',
'enm' => 'mellomengelsk',
'eo' => 'esperanto',
'es' => 'spansk',
@@ -122,6 +122,7 @@ $languageNames = [
'eu' => 'baskisk',
'ewo' => 'ewondo',
'fa' => 'persisk',
+ 'fa-af' => 'dari',
'fan' => 'fang',
'fat' => 'fanti',
'ff' => 'fulfulde',
@@ -144,7 +145,7 @@ $languageNames = [
'gd' => 'skotsk-gælisk',
'gez' => 'geez',
'gil' => 'gilbertese',
- 'gl' => 'galicisk',
+ 'gl' => 'galisisk',
'gmh' => 'mellomhøgtysk',
'gn' => 'guarani',
'goh' => 'gammalhøgtysk',
@@ -275,7 +276,7 @@ $languageNames = [
'mfe' => 'morisyen',
'mg' => 'madagassisk',
'mga' => 'mellomirsk',
- 'mgh' => 'Makhuwa-Meetto',
+ 'mgh' => 'makhuwa-meetto',
'mgo' => 'meta’',
'mh' => 'marshallesisk',
'mi' => 'maori',
@@ -302,7 +303,7 @@ $languageNames = [
'na' => 'nauru',
'nap' => 'napolitansk',
'naq' => 'nama',
- 'nb' => 'bokmål',
+ 'nb' => 'norsk bokmål',
'nd' => 'nord-ndebele',
'nds' => 'lågtysk',
'nds-nl' => 'lågsaksisk',
@@ -314,7 +315,7 @@ $languageNames = [
'nl' => 'nederlandsk',
'nl-be' => 'flamsk',
'nmg' => 'kwasio',
- 'nn' => 'nynorsk',
+ 'nn' => 'norsk nynorsk',
'nnh' => 'ngiemboon',
'no' => 'norsk',
'nog' => 'nogai',
@@ -384,7 +385,7 @@ $languageNames = [
'se' => 'nordsamisk',
'seh' => 'sena',
'sel' => 'selkupisk',
- 'ses' => 'Koyraboro Senni',
+ 'ses' => 'koyraboro senni',
'sg' => 'sango',
'sga' => 'gammalirsk',
'sh' => 'serbokroatisk',
@@ -543,7 +544,7 @@ $currencyNames = [
'BUK' => 'burmesisk kyat',
'BWP' => 'botswanske pula',
'BYB' => 'kviterussiske nye rublar (1994–1999)',
- 'BYN' => 'kviterussiske rublar',
+ 'BYN' => 'nye kviterussiske rublar',
'BYR' => 'kviterussiske rublar (2000–2016)',
'BZD' => 'beliziske dollar',
'CAD' => 'kanadiske dollar',
@@ -553,6 +554,7 @@ $currencyNames = [
'CHW' => 'WIR franc',
'CLF' => 'chilenske unidades de fomento',
'CLP' => 'chilenske pesos',
+ 'CNH' => 'kinesiske yuan (offshore)',
'CNY' => 'kinesiske yuan',
'COP' => 'kolombianske pesos',
'COU' => 'unidad de valor real',
@@ -608,7 +610,7 @@ $currencyNames = [
'IDR' => 'indonesiske rupiar',
'IEP' => 'irske pund',
'ILP' => 'israelske pund',
- 'ILS' => 'israelske nye sheklar',
+ 'ILS' => 'nye israelske sheklar',
'INR' => 'indiske rupiar',
'IQD' => 'irakiske dinarar',
'IRR' => 'iranske rial',
@@ -653,7 +655,7 @@ $currencyNames = [
'MRU' => 'mauritanske ouguiya',
'MTL' => 'maltesiske lira',
'MTP' => 'maltesiske pund',
- 'MUR' => 'mauritanske rupiar',
+ 'MUR' => 'mauritiske rupiar',
'MVR' => 'maldiviske rufiyaa',
'MWK' => 'malawiske kwacha',
'MXN' => 'meksikanske pesos',
@@ -712,7 +714,7 @@ $currencyNames = [
'SUR' => 'sovjetiske rublar',
'SVC' => 'salvadoranske colon',
'SYP' => 'syriske pund',
- 'SZL' => 'swazilandske lilangeni',
+ 'SZL' => 'eswatinisk lilangeni',
'THB' => 'thailandske baht',
'TJR' => 'tadsjikiske rublar',
'TJS' => 'tadsjikiske somoni',
@@ -780,6 +782,7 @@ $currencyNames = [
$currencySymbols = [
'AED' => 'AED',
'AFN' => 'AFN',
+ 'ALL' => 'ALL',
'AMD' => 'AMD',
'ANG' => 'ANG',
'AOA' => 'AOA',
@@ -806,6 +809,7 @@ $currencySymbols = [
'CDF' => 'CDF',
'CHF' => 'CHF',
'CLP' => 'CLP',
+ 'CNH' => 'CNH',
'CNY' => 'CNY',
'COP' => 'COP',
'CRC' => 'CRC',
@@ -867,7 +871,9 @@ $currencySymbols = [
'MNT' => 'MNT',
'MOP' => 'MOP',
'MRO' => 'MRO',
+ 'MRU' => 'MRU',
'MUR' => 'MUR',
+ 'MVR' => 'MVR',
'MWK' => 'MWK',
'MXN' => 'MXN',
'MYR' => 'MYR',
@@ -903,7 +909,7 @@ $currencySymbols = [
'SRD' => 'SRD',
'SSP' => 'SSP',
'STD' => 'STD',
- 'STN' => 'Db',
+ 'STN' => 'STN',
'SYP' => 'SYP',
'SZL' => 'SZL',
'THB' => 'THB',
@@ -921,6 +927,7 @@ $currencySymbols = [
'UYU' => 'UYU',
'UZS' => 'UZS',
'VEF' => 'VEF',
+ 'VES' => 'VES',
'VND' => 'VND',
'VUV' => 'VUV',
'WST' => 'WST',
@@ -1007,6 +1014,7 @@ $countryNames = [
'ER' => 'Eritrea',
'ES' => 'Spania',
'ET' => 'Etiopia',
+ 'EU' => 'Den europeiske unionen',
'EZ' => 'eurosona',
'FI' => 'Finland',
'FJ' => 'Fiji',
@@ -1028,7 +1036,7 @@ $countryNames = [
'GP' => 'Guadeloupe',
'GQ' => 'Ekvatorial-Guinea',
'GR' => 'Hellas',
- 'GS' => 'Sør-Georgia og Sør-Sandwichøyene',
+ 'GS' => 'Sør-Georgia og Sør-Sandwichøyane',
'GT' => 'Guatemala',
'GU' => 'Guam',
'GW' => 'Guinea-Bissau',
@@ -1045,7 +1053,7 @@ $countryNames = [
'IL' => 'Israel',
'IM' => 'Man',
'IN' => 'India',
- 'IO' => 'Det britiske territoriet I Indiahavet',
+ 'IO' => 'Det britiske territoriet i Indiahavet',
'IQ' => 'Irak',
'IR' => 'Iran',
'IS' => 'Island',
@@ -1080,7 +1088,7 @@ $countryNames = [
'MC' => 'Monaco',
'MD' => 'Moldova',
'ME' => 'Montenegro',
- 'MF' => 'Saint Martin',
+ 'MF' => 'Saint-Martin',
'MG' => 'Madagaskar',
'MH' => 'Marshalløyane',
'MK' => 'Nord-Makedonia',
@@ -1153,7 +1161,7 @@ $countryNames = [
'SV' => 'El Salvador',
'SX' => 'Sint Maarten',
'SY' => 'Syria',
- 'SZ' => 'Swaziland',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Turks- og Caicosøyane',
'TD' => 'Tsjad',
@@ -1162,7 +1170,7 @@ $countryNames = [
'TH' => 'Thailand',
'TJ' => 'Tadsjikistan',
'TK' => 'Tokelau',
- 'TL' => 'Timor-Leste (Aust-Timor)',
+ 'TL' => 'Aust-Timor',
'TM' => 'Turkmenistan',
'TN' => 'Tunisia',
'TO' => 'Tonga',
@@ -1187,6 +1195,8 @@ $countryNames = [
'VU' => 'Vanuatu',
'WF' => 'Wallis og Futuna',
'WS' => 'Samoa',
+ 'XA' => 'pseudospråk – aksentar',
+ 'XB' => 'pseudospråk – RTL',
'XK' => 'Kosovo',
'YE' => 'Jemen',
'YT' => 'Mayotte',
@@ -1212,6 +1222,8 @@ $timeUnits = [
'day-short-future-other' => 'om {0} d.',
'day-short-past-one' => 'for {0} d. sidan',
'day-short-past-other' => 'for {0} d. sidan',
+ 'decade-one' => '{0} tiår',
+ 'decade-other' => '{0} tiår',
'fri-future-one' => 'om {0} fredag',
'fri-future-other' => 'om {0} fredagar',
'fri-narrow-future-one' => 'om {0} fr.',
@@ -1231,7 +1243,7 @@ $timeUnits = [
'hour-narrow-past-one' => '–{0} t',
'hour-narrow-past-other' => '–{0} t',
'hour-one' => '{0} time',
- 'hour-other' => '{0} timar',
+ 'hour-other' => '{0} timer',
'hour-past-one' => 'for {0} time sidan',
'hour-past-other' => 'for {0} timar sidan',
'hour-short-future-one' => 'om {0} t',
diff --git a/MLEB/cldr/CldrNames/CldrNamesPa.php b/MLEB/cldr/CldrNames/CldrNamesPa.php
index 3acf656e..85dbb995 100644
--- a/MLEB/cldr/CldrNames/CldrNamesPa.php
+++ b/MLEB/cldr/CldrNames/CldrNamesPa.php
@@ -192,7 +192,7 @@ $languageNames = [
'ks' => 'ਕਸ਼ਮੀਰੀ',
'ksb' => 'ਸ਼ੰਬਾਲਾ',
'ksf' => 'ਬਫ਼ੀਆ',
- 'ksh' => 'ਕਲੋਗਨੀਅਨ',
+ 'ksh' => 'ਕਲੋਨੀਅਨ',
'ku' => 'ਕੁਰਦਿਸ਼',
'kum' => 'ਕੁਮੀਕ',
'kv' => 'ਕੋਮੀ',
@@ -404,9 +404,7 @@ $languageNames = [
'yo' => 'ਯੋਰੂਬਾ',
'yue' => 'ਕੈਂਟੋਨੀਜ਼',
'zgh' => 'ਮਿਆਰੀ ਮੋਰੋਕੇਨ ਟਾਮਾਜ਼ਿਕ',
- 'zh' => 'ਚੀਨੀ (ਮੈਂਡਰਿਨ)',
- 'zh-hans' => 'ਚੀਨੀ (ਸਰਲ)',
- 'zh-hant' => 'ਚੀਨੀ (ਰਵਾਇਤੀ)',
+ 'zh' => 'ਚੀਨੀ',
'zu' => 'ਜ਼ੁਲੂ',
'zun' => 'ਜ਼ੂਨੀ',
'zxx' => 'ਬੋਲੀ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਗਰੀ ਨਹੀਂ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesPl.php b/MLEB/cldr/CldrNames/CldrNamesPl.php
index c93e63ee..c9e1fbf1 100644
--- a/MLEB/cldr/CldrNames/CldrNamesPl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesPl.php
@@ -90,7 +90,7 @@ $languageNames = [
'cch' => 'atsam',
'ccp' => 'czakma',
'ce' => 'czeczeński',
- 'ceb' => 'cebuano',
+ 'ceb' => 'cebuański',
'cgg' => 'chiga',
'ch' => 'czamorro',
'chb' => 'czibcza',
@@ -119,8 +119,8 @@ $languageNames = [
'dar' => 'dargwijski',
'dav' => 'taita',
'de' => 'niemiecki',
- 'de-at' => 'austriacki niemiecki',
- 'de-ch' => 'szwajcarski wysokoniemiecki',
+ 'de-at' => 'niemiecki austriacki',
+ 'de-ch' => 'wysokoniemiecki szwajcarski',
'del' => 'delaware',
'den' => 'slave',
'dgr' => 'dogrib',
@@ -145,10 +145,10 @@ $languageNames = [
'el' => 'grecki',
'elx' => 'elamicki',
'en' => 'angielski',
- 'en-au' => 'australijski angielski',
- 'en-ca' => 'kanadyjski angielski',
- 'en-gb' => 'brytyjski angielski',
- 'en-us' => 'amerykański angielski',
+ 'en-au' => 'angielski australijski',
+ 'en-ca' => 'angielski kanadyjski',
+ 'en-gb' => 'angielski brytyjski',
+ 'en-us' => 'angielski amerykański',
'enm' => 'średnioangielski',
'eo' => 'esperanto',
'es' => 'hiszpański',
@@ -166,14 +166,14 @@ $languageNames = [
'fat' => 'fanti',
'ff' => 'fulani',
'fi' => 'fiński',
- 'fil' => 'filipino',
+ 'fil' => 'filipiński',
'fit' => 'meänkieli',
'fj' => 'fidżijski',
'fo' => 'farerski',
'fon' => 'fon',
'fr' => 'francuski',
- 'fr-ca' => 'kanadyjski francuski',
- 'fr-ch' => 'szwajcarski francuski',
+ 'fr-ca' => 'francuski kanadyjski',
+ 'fr-ch' => 'francuski szwajcarski',
'frc' => 'cajuński',
'frm' => 'średniofrancuski',
'fro' => 'starofrancuski',
@@ -642,7 +642,7 @@ $currencyNames = [
'AZN' => 'manat azerski',
'BAD' => 'dinar Bośni i Hercegowiny',
'BAM' => 'marka zamienna Bośni i Hercegowiny',
- 'BBD' => 'dolar Barbadosu',
+ 'BBD' => 'dolar barbadoski',
'BDT' => 'taka bengalska',
'BEC' => 'frank belgijski (zamienny)',
'BEF' => 'frank belgijski',
@@ -842,7 +842,7 @@ $currencyNames = [
'TPE' => 'escudo timorskie',
'TRL' => 'lira turecka (1922–2005)',
'TRY' => 'lira turecka',
- 'TTD' => 'dolar Trynidadu i Tobago',
+ 'TTD' => 'dolar trynidadzki',
'TWD' => 'nowy dolar tajwański',
'TZS' => 'szyling tanzański',
'UAH' => 'hrywna ukraińska',
@@ -1315,12 +1315,12 @@ $timeUnits = [
'century-many' => '{0} wieków',
'century-one' => '{0} wiek',
'century-other' => '{0} wieku',
- 'day-few' => '{0} dni',
+ 'day-few' => '{0} doby',
'day-future-few' => 'za {0} dni',
'day-future-many' => 'za {0} dni',
'day-future-one' => 'za {0} dzień',
'day-future-other' => 'za {0} dnia',
- 'day-many' => '{0} dni',
+ 'day-many' => '{0} dób',
'day-narrow-future-few' => 'za {0} dni',
'day-narrow-future-many' => 'za {0} dni',
'day-narrow-future-one' => 'za {0} dzień',
@@ -1329,8 +1329,8 @@ $timeUnits = [
'day-narrow-past-many' => '{0} dni temu',
'day-narrow-past-one' => '{0} dzień temu',
'day-narrow-past-other' => '{0} dnia temu',
- 'day-one' => '{0} dzień',
- 'day-other' => '{0} dnia',
+ 'day-one' => '{0} dobo',
+ 'day-other' => '{0} doby',
'day-past-few' => '{0} dni temu',
'day-past-many' => '{0} dni temu',
'day-past-one' => '{0} dzień temu',
@@ -1385,7 +1385,7 @@ $timeUnits = [
'hour-narrow-past-many' => '{0} g. temu',
'hour-narrow-past-one' => '{0} g. temu',
'hour-narrow-past-other' => '{0} g. temu',
- 'hour-one' => '{0} godzina',
+ 'hour-one' => '{0} godzino',
'hour-other' => '{0} godziny',
'hour-past-few' => '{0} godziny temu',
'hour-past-many' => '{0} godzin temu',
@@ -1421,7 +1421,7 @@ $timeUnits = [
'minute-narrow-past-many' => '{0} min temu',
'minute-narrow-past-one' => '{0} min temu',
'minute-narrow-past-other' => '{0} min temu',
- 'minute-one' => '{0} minuta',
+ 'minute-one' => '{0} minuto',
'minute-other' => '{0} minuty',
'minute-past-few' => '{0} minuty temu',
'minute-past-many' => '{0} minut temu',
@@ -1473,7 +1473,7 @@ $timeUnits = [
'month-narrow-past-many' => '{0} mies. temu',
'month-narrow-past-one' => '{0} mies. temu',
'month-narrow-past-other' => '{0} mies. temu',
- 'month-one' => '{0} miesiąc',
+ 'month-one' => '{0} miesiącu',
'month-other' => '{0} miesiąca',
'month-past-few' => '{0} miesiące temu',
'month-past-many' => '{0} miesięcy temu',
@@ -1553,7 +1553,7 @@ $timeUnits = [
'second-narrow-past-many' => '{0} s temu',
'second-narrow-past-one' => '{0} s temu',
'second-narrow-past-other' => '{0} s temu',
- 'second-one' => '{0} sekunda',
+ 'second-one' => '{0} sekundo',
'second-other' => '{0} sekundy',
'second-past-few' => '{0} sekundy temu',
'second-past-many' => '{0} sekund temu',
@@ -1677,7 +1677,7 @@ $timeUnits = [
'week-narrow-past-many' => '{0} tyg. temu',
'week-narrow-past-one' => '{0} tydz. temu',
'week-narrow-past-other' => '{0} tyg. temu',
- 'week-one' => '{0} tydzień',
+ 'week-one' => '{0} tygodniu',
'week-other' => '{0} tygodnia',
'week-past-few' => '{0} tygodnie temu',
'week-past-many' => '{0} tygodni temu',
@@ -1705,7 +1705,7 @@ $timeUnits = [
'year-narrow-past-many' => '{0} lat temu',
'year-narrow-past-one' => '{0} rok temu',
'year-narrow-past-other' => '{0} roku temu',
- 'year-one' => '{0} rok',
+ 'year-one' => '{0} roku',
'year-other' => '{0} roku',
'year-past-few' => '{0} lata temu',
'year-past-many' => '{0} lat temu',
diff --git a/MLEB/cldr/CldrNames/CldrNamesPs.php b/MLEB/cldr/CldrNames/CldrNamesPs.php
index ab622b93..d717770d 100644
--- a/MLEB/cldr/CldrNames/CldrNamesPs.php
+++ b/MLEB/cldr/CldrNames/CldrNamesPs.php
@@ -70,7 +70,7 @@ $languageNames = [
'dav' => 'ټایټا',
'de' => 'الماني',
'de-at' => 'اتريشي آلماني',
- 'de-ch' => 'سوئس لوی جرمن',
+ 'de-ch' => 'سویس های جرمن',
'dgr' => 'داگرب',
'dje' => 'زرما',
'dsb' => 'کښته سربيايي',
@@ -130,7 +130,7 @@ $languageNames = [
'hr' => 'کروايشيايي',
'hsb' => 'پورته سربيايي',
'ht' => 'هيټي کريول',
- 'hu' => 'هنگري',
+ 'hu' => 'هنګري',
'hup' => 'ھوپا',
'hy' => 'آرمينيايي',
'hz' => 'هیرورو',
@@ -244,7 +244,7 @@ $languageNames = [
'na' => 'نایرو',
'nap' => 'نيپالين',
'naq' => 'ناما',
- 'nb' => 'ناروې بوکمال',
+ 'nb' => 'ناروېئي (بوکمال)',
'nd' => 'شمالي نديبل',
'nds' => 'کښته آلماني',
'ne' => 'نېپالي',
@@ -257,7 +257,7 @@ $languageNames = [
'nmg' => 'کواسیو',
'nn' => 'ناروېئي (نائنورسک)',
'nnh' => 'نایجیمون',
- 'no' => 'ناروېئې',
+ 'no' => 'ناروېئي',
'nog' => 'نوګی',
'nqo' => 'نکو',
'nr' => 'سويلي نديبيل',
@@ -488,7 +488,7 @@ $currencyNames = [
'MKD' => 'مسيډونايي دينار',
'MMK' => 'ميانماري کيات',
'MNT' => 'منګوليايي توګريک',
- 'MOP' => 'مکانيز پټاکا',
+ 'MOP' => 'مکانيس پټاکا',
'MRU' => 'موريشيسي ډالر',
'MUR' => 'موريشيسي روپۍ',
'MVR' => 'مالديپي روپيا',
@@ -532,7 +532,7 @@ $currencyNames = [
'THB' => 'تهايي بات',
'TJS' => 'تاجکستاني سوموني',
'TMT' => 'ترکمانستاني منت',
- 'TND' => 'تونسي دينار',
+ 'TND' => 'تيونسې دينار',
'TOP' => 'ټونګن پانګا',
'TRY' => 'ترکي ليرا',
'TTD' => 'ټرينيډاډ او ټوباګو ډالر',
@@ -581,7 +581,7 @@ $countryNames = [
'AO' => 'انګولا',
'AQ' => 'انتارکتیکا',
'AR' => 'ارجنټاين',
- 'AS' => 'امریکایی سمو',
+ 'AS' => 'امریکایی ساماوا',
'AT' => 'اتریش',
'AU' => 'آسټرالیا',
'AW' => 'آروبا',
@@ -662,8 +662,8 @@ $countryNames = [
'GL' => 'ګرینلینډ',
'GM' => 'ګامبیا',
'GN' => 'ګینه',
- 'GP' => 'ګالډیپ',
- 'GQ' => 'استوایی ګینه',
+ 'GP' => 'ګوادلوپ',
+ 'GQ' => 'استوایی ګیني',
'GR' => 'یونان',
'GS' => 'سويلي جارجيا او سويلي سېنډوچ ټاپوګان',
'GT' => 'ګواتیمالا',
@@ -682,7 +682,7 @@ $countryNames = [
'IL' => 'اسراييل',
'IM' => 'د آئل آف مین',
'IN' => 'هند',
- 'IO' => 'د بريتانوي هند سمندري سيمه',
+ 'IO' => 'د برتانوي هند سمندري سيمه',
'IQ' => 'عراق',
'IR' => 'ايران',
'IS' => 'آیسلینډ',
@@ -738,7 +738,7 @@ $countryNames = [
'MZ' => 'موزمبيق',
'NA' => 'نیمبیا',
'NC' => 'نوی کالیډونیا',
- 'NE' => 'نیجر',
+ 'NE' => 'نايجير',
'NF' => 'نارفولک ټاپوګان',
'NG' => 'نایجیریا',
'NI' => 'نکاراګوا',
@@ -823,9 +823,9 @@ $countryNames = [
'VN' => 'وېتنام',
'VU' => 'واناتو',
'WF' => 'والیس او فوتونا',
- 'WS' => 'ساموا',
+ 'WS' => 'ساماوا',
'XA' => 'جعلي خج',
- 'XB' => 'جعلي بيدي',
+ 'XB' => 'سیډو بیډی',
'XK' => 'کوسوو',
'YE' => 'یمن',
'YT' => 'مايوټ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesPt.php b/MLEB/cldr/CldrNames/CldrNamesPt.php
index 8fadf20b..b9216f5d 100644
--- a/MLEB/cldr/CldrNames/CldrNamesPt.php
+++ b/MLEB/cldr/CldrNames/CldrNamesPt.php
@@ -17,14 +17,12 @@ $languageNames = [
'chn' => 'jargão chinook',
'chr' => 'cherokee',
'chy' => 'cheyenne',
- 'ckb' => 'sorani curdo',
'co' => 'córsico',
'crs' => 'francês crioulo seselwa',
'cs' => 'checo',
'cv' => 'chuvash',
'de-at' => 'alemão austríaco',
'de-ch' => 'alto alemão suíço',
- 'ee' => 'ewe',
'efi' => 'efik',
'egy' => 'egípcio clássico',
'en-au' => 'inglês australiano',
@@ -57,6 +55,7 @@ $languageNames = [
'lou' => 'crioulo de Louisiana',
'lrc' => 'luri do norte',
'mak' => 'makassarês',
+ 'mfe' => 'crioulo mauriciano',
'mk' => 'macedónio',
'moh' => 'mohawk',
'mr' => 'marata',
@@ -69,7 +68,6 @@ $languageNames = [
'nn' => 'norueguês nynorsk',
'non' => 'nórdico antigo',
'oc' => 'occitano',
- 'or' => 'oriya',
'os' => 'ossético',
'pag' => 'língua pangasinesa',
'pam' => 'pampango',
@@ -88,13 +86,14 @@ $languageNames = [
'sma' => 'sami do sul',
'smn' => 'inari sami',
'sn' => 'shona',
+ 'st' => 'sesoto',
'te' => 'telugu',
'tem' => 'temne',
'tg' => 'tajique',
'tk' => 'turcomano',
'to' => 'tonga',
'tt' => 'tatar',
- 'tzm' => 'tamazight do Atlas Central',
+ 'tzm' => 'tamazigue do Atlas Central',
'uz' => 'usbeque',
'wo' => 'uólofe',
'xh' => 'xosa',
@@ -318,8 +317,7 @@ $countryNames = [
'EE' => 'Estónia',
'EH' => 'Sara Ocidental',
'EZ' => 'Zona Euro',
- 'FK' => 'Ilhas Malvinas (Falkland)',
- 'FO' => 'Ilhas Faroé',
+ 'FK' => 'Ilhas Falkland',
'GB' => 'GB',
'GG' => 'Guernesey',
'GL' => 'Gronelândia',
@@ -334,7 +332,6 @@ $countryNames = [
'LK' => 'Sri Lanca',
'LV' => 'Letónia',
'MC' => 'Mónaco',
- 'MD' => 'Moldávia',
'MG' => 'Madagáscar',
'MK' => 'Macedónia do Norte',
'MS' => 'Monserrate',
@@ -371,8 +368,8 @@ $timeUnits = [
'day-future-other' => 'dentro de {0} dias',
'day-narrow-future-one' => '+{0} dia',
'day-narrow-future-other' => '+{0} dias',
- 'day-narrow-past-one' => 'há {0} dias',
- 'day-narrow-past-other' => 'há {0} dias',
+ 'day-narrow-past-one' => '-{0} dia',
+ 'day-narrow-past-other' => '-{0} dias',
'day-short-future-one' => 'dentro de {0} dia',
'day-short-future-other' => 'dentro de {0} dias',
'fri-future-one' => 'dentro de {0} sexta-feira',
diff --git a/MLEB/cldr/CldrNames/CldrNamesPt_br.php b/MLEB/cldr/CldrNames/CldrNamesPt_br.php
index 583153ba..bb5b13f5 100644
--- a/MLEB/cldr/CldrNames/CldrNamesPt_br.php
+++ b/MLEB/cldr/CldrNames/CldrNamesPt_br.php
@@ -118,7 +118,7 @@ $languageNames = [
'dz' => 'dzonga',
'dzg' => 'dazaga',
'ebu' => 'embu',
- 'ee' => 'eve',
+ 'ee' => 'ewe',
'efi' => 'efique',
'egy' => 'egípcio arcaico',
'eka' => 'ekajuk',
@@ -423,7 +423,7 @@ $languageNames = [
'sm' => 'samoano',
'sma' => 'sami meridional',
'smj' => 'sami de Lule',
- 'smn' => 'sami de Inari',
+ 'smn' => 'lapão de Inari',
'sms' => 'sami de Skolt',
'sn' => 'xona',
'snk' => 'soninquê',
@@ -478,7 +478,7 @@ $languageNames = [
'twq' => 'tasawaq',
'ty' => 'taitiano',
'tyv' => 'tuviniano',
- 'tzm' => 'tamazirte do Atlas Central',
+ 'tzm' => 'tamazight do Atlas Central',
'udm' => 'udmurte',
'ug' => 'uigur',
'uga' => 'ugarítico',
@@ -672,7 +672,7 @@ $currencyNames = [
'KZT' => 'Tenge cazaque',
'LAK' => 'Kip laosiano',
'LBP' => 'Libra libanesa',
- 'LKR' => 'Rupia do Sri Lanka',
+ 'LKR' => 'Rupia cingalesa',
'LRD' => 'Dólar liberiano',
'LSL' => 'Loti do Lesoto',
'LTL' => 'Litas lituano',
@@ -693,9 +693,9 @@ $currencyNames = [
'MKD' => 'Dinar macedônio',
'MKN' => 'Dinar macedônio (1992–1993)',
'MLF' => 'Franco de Mali',
- 'MMK' => 'Quiat de Myanmar',
+ 'MMK' => 'Quiate mianmarense',
'MNT' => 'Tugrik mongol',
- 'MOP' => 'Pataca de Macau',
+ 'MOP' => 'Pataca macaense',
'MRO' => 'Ouguiya mauritana (1973–2017)',
'MRU' => 'Ouguiya mauritana',
'MTL' => 'Lira maltesa',
@@ -1015,7 +1015,7 @@ $countryNames = [
'BE' => 'Bélgica',
'BF' => 'Burquina Faso',
'BG' => 'Bulgária',
- 'BH' => 'Bahrein',
+ 'BH' => 'Barein',
'BI' => 'Burundi',
'BJ' => 'Benin',
'BL' => 'São Bartolomeu',
@@ -1071,7 +1071,7 @@ $countryNames = [
'FJ' => 'Fiji',
'FK' => 'Ilhas Malvinas',
'FM' => 'Micronésia',
- 'FO' => 'Ilhas Faroe',
+ 'FO' => 'Ilhas Faroé',
'FR' => 'França',
'GA' => 'Gabão',
'GB' => 'Reino Unido',
@@ -1137,7 +1137,7 @@ $countryNames = [
'LY' => 'Líbia',
'MA' => 'Marrocos',
'MC' => 'Mônaco',
- 'MD' => 'Moldova',
+ 'MD' => 'Moldávia',
'ME' => 'Montenegro',
'MF' => 'São Martinho',
'MG' => 'Madagascar',
diff --git a/MLEB/cldr/CldrNames/CldrNamesQu.php b/MLEB/cldr/CldrNames/CldrNamesQu.php
index 4173731b..d06af36c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesQu.php
+++ b/MLEB/cldr/CldrNames/CldrNamesQu.php
@@ -55,6 +55,7 @@ $languageNames = [
'eu' => 'Euskera Simi',
'ewo' => 'Ewondo Simi',
'fa' => 'Persa Simi',
+ 'fa-af' => 'Dari Simi',
'ff' => 'Fulah Simi',
'fi' => 'Fines Simi',
'fil' => 'Filipino Simi',
@@ -125,6 +126,7 @@ $languageNames = [
'luo' => 'Luo Simi',
'luy' => 'Luyia Simi',
'lv' => 'Leton Simi',
+ 'mai' => 'Maithili Simi',
'mas' => 'Masai Simi',
'mer' => 'Meru Simi',
'mfe' => 'Mauriciano Simi',
@@ -135,6 +137,7 @@ $languageNames = [
'mk' => 'Macedonio Simi',
'ml' => 'Malayalam Simi',
'mn' => 'Mongol Simi',
+ 'mni' => 'Manipuri Simi',
'moh' => 'Mohawk Simi',
'mr' => 'Marathi Simi',
'ms' => 'Malayo Simi',
@@ -164,6 +167,7 @@ $languageNames = [
'os' => 'Osetio Simi',
'pa' => 'Punyabi Simi',
'pap' => 'Papiamento Simi',
+ 'pcm' => 'Pidgin Nigeriano Simi',
'pl' => 'Polaco Simi',
'prg' => 'Prusiano Simi',
'ps' => 'Pashto Simi',
@@ -180,6 +184,7 @@ $languageNames = [
'sa' => 'Sanscrito Simi',
'sah' => 'Sakha Simi',
'saq' => 'Samburu Simi',
+ 'sat' => 'Santali Simi',
'sbp' => 'Sangu Simi',
'sd' => 'Sindhi Simi',
'se' => 'Chincha Sami Simi',
@@ -240,17 +245,20 @@ $languageNames = [
'zh-hans' => 'Chino Simplificado Simi',
'zh-hant' => 'Chino Tradicional Simi',
'zu' => 'Isizulu Simi',
- 'zxx' => 'Sin contenido linguístico',
+ 'zxx' => 'Manaraq simi yachana',
];
$currencyNames = [
+ 'AED' => 'Dirham de Emiratos Árabes Unidos',
'AFN' => 'Afgani Afgano',
'ALL' => 'Lek albanés',
+ 'AMD' => 'Dram Armenio',
'ANG' => 'Florín Antillano Neerlandés',
'AOA' => 'Kwanza Angoleño',
'ARS' => 'Peso Argentino',
'AUD' => 'Dólar Australiano',
'AWG' => 'Florín Arubeño',
+ 'AZN' => 'Manat Azerbaiyano',
'BAM' => 'Marco Bosnioherzegovino',
'BBD' => 'Dólar de Barbados',
'BDT' => 'Taka Bangladesí',
@@ -400,12 +408,15 @@ $currencyNames = [
];
$currencySymbols = [
+ 'AED' => 'AED',
'AFN' => 'AFN',
'ALL' => 'ALL',
+ 'AMD' => 'AMD',
'ANG' => 'ANG',
'AOA' => 'AOA',
'ARS' => 'ARS',
'AWG' => 'AWG',
+ 'AZN' => 'AZN',
'BAM' => 'BAM',
'BBD' => 'BBG',
'BDT' => 'BDT',
@@ -610,6 +621,8 @@ $countryNames = [
'ER' => 'Eritrea',
'ES' => 'España',
'ET' => 'Etiopía',
+ 'EU' => 'Union Europea',
+ 'EZ' => 'Eurozona',
'FI' => 'Finlandia',
'FJ' => 'Fiyi',
'FK' => 'Islas Malvinas',
@@ -635,7 +648,7 @@ $countryNames = [
'GU' => 'Guam',
'GW' => 'Guinea-Bisáu',
'GY' => 'Guyana',
- 'HK' => 'Hong Kong (RAE)',
+ 'HK' => 'Hong Kong',
'HM' => 'Islas Heard y McDonald',
'HN' => 'Honduras',
'HR' => 'Croacia',
@@ -689,7 +702,7 @@ $countryNames = [
'ML' => 'Malí',
'MM' => 'Myanmar',
'MN' => 'Mongolia',
- 'MO' => 'Macao RAE',
+ 'MO' => 'Macao',
'MP' => 'Islas Marianas del Norte',
'MQ' => 'Martinica',
'MR' => 'Mauritania',
@@ -724,11 +737,12 @@ $countryNames = [
'PM' => 'San Pedro y Miquelón',
'PN' => 'Islas Pitcairn',
'PR' => 'Puerto Rico',
- 'PS' => 'Palestina Kamachikuq',
+ 'PS' => 'Palestina',
'PT' => 'Portugal',
'PW' => 'Palaos',
'PY' => 'Paraguay',
'QA' => 'Qatar',
+ 'QO' => 'Oceanía Periférica',
'RE' => 'Reunión',
'RO' => 'Rumania',
'RS' => 'Serbia',
@@ -775,6 +789,7 @@ $countryNames = [
'UA' => 'Ucrania',
'UG' => 'Uganda',
'UM' => 'Islas menores alejadas de los EE.UU.',
+ 'UN' => 'Naciones Unidas',
'US' => 'Estados Unidos',
'UY' => 'Uruguay',
'UZ' => 'Uzbekistán',
@@ -787,6 +802,8 @@ $countryNames = [
'VU' => 'Vanuatu',
'WF' => 'Wallis y Futuna',
'WS' => 'Samoa',
+ 'XA' => 'Seudo-Acentos',
+ 'XB' => 'Seudo-Bidi',
'XK' => 'Kosovo',
'YE' => 'Yemen',
'YT' => 'Mayotte',
diff --git a/MLEB/cldr/CldrNames/CldrNamesRm.php b/MLEB/cldr/CldrNames/CldrNamesRm.php
index e0465ce3..3cdac155 100644
--- a/MLEB/cldr/CldrNames/CldrNamesRm.php
+++ b/MLEB/cldr/CldrNames/CldrNamesRm.php
@@ -10,6 +10,7 @@ $languageNames = [
'ae' => 'avestic',
'af' => 'afrikaans',
'afh' => 'afrihili',
+ 'agq' => 'aghem',
'ain' => 'ainu',
'ak' => 'akan',
'akk' => 'accadic',
@@ -20,11 +21,13 @@ $languageNames = [
'ang' => 'englais vegl',
'anp' => 'angika',
'ar' => 'arab',
+ 'ar-001' => 'arab modern standardisà',
'arc' => 'arameic',
'arn' => 'araucanic',
'arp' => 'arapaho',
'arw' => 'arawak',
'as' => 'assami',
+ 'asa' => 'asu',
'ast' => 'asturian',
'av' => 'avaric',
'awa' => 'awadhi',
@@ -37,6 +40,7 @@ $languageNames = [
'be' => 'bieloruss',
'bej' => 'bedscha',
'bem' => 'bemba',
+ 'bez' => 'bena',
'bg' => 'bulgar',
'bho' => 'bhojpuri',
'bi' => 'bislama',
@@ -48,6 +52,7 @@ $languageNames = [
'bo' => 'tibetan',
'br' => 'breton',
'bra' => 'braj',
+ 'brx' => 'bodo',
'bs' => 'bosniac',
'bua' => 'buriat',
'bug' => 'bugi',
@@ -56,8 +61,10 @@ $languageNames = [
'cad' => 'caddo',
'car' => 'caribic',
'cch' => 'atsam',
+ 'ccp' => 'chakma',
'ce' => 'tschetschen',
'ceb' => 'cebuano',
+ 'cgg' => 'chiga',
'ch' => 'chamorro',
'chb' => 'chibcha',
'chg' => 'tschagataic',
@@ -68,6 +75,7 @@ $languageNames = [
'chp' => 'chipewyan',
'chr' => 'cherokee',
'chy' => 'cheyenne',
+ 'ckb' => 'curd central',
'co' => 'cors',
'cop' => 'coptic',
'cr' => 'cree',
@@ -80,19 +88,24 @@ $languageNames = [
'da' => 'danais',
'dak' => 'dakota',
'dar' => 'dargwa',
+ 'dav' => 'taita',
'de' => 'tudestg',
'de-at' => 'tudestg austriac',
+ 'de-ch' => 'tudestg da scrittira svizzer',
'del' => 'delaware',
'den' => 'slavey',
'dgr' => 'dogrib',
'din' => 'dinka',
+ 'dje' => 'zarma',
'doi' => 'dogri',
'dsb' => 'bass sorb',
'dua' => 'duala',
'dum' => 'ollandais mesaun',
'dv' => 'maledivic',
+ 'dyo' => 'jola-fonyi',
'dyu' => 'diula',
'dz' => 'dzongkha',
+ 'ebu' => 'embu',
'ee' => 'ewe',
'efi' => 'efik',
'egy' => 'egipzian vegl',
@@ -108,19 +121,20 @@ $languageNames = [
'eo' => 'esperanto',
'es' => 'spagnol',
'es-419' => 'spagnol latinamerican',
- 'es-es' => 'spagnol iberic',
+ 'es-es' => 'spagnol europeic',
'es-mx' => 'spagnol mexican',
'et' => 'eston',
'eu' => 'basc',
'ewo' => 'ewondo',
'fa' => 'persian',
+ 'fa-af' => 'dari',
'fan' => 'fang',
'fat' => 'fanti',
'ff' => 'fulah',
'fi' => 'finlandais',
'fil' => 'filippino',
'fj' => 'fidschian',
- 'fo' => 'ferrais',
+ 'fo' => 'feroais',
'fon' => 'fon',
'fr' => 'franzos',
'fr-ca' => 'franzos canadais',
@@ -149,6 +163,7 @@ $languageNames = [
'grc' => 'grec vegl',
'gsw' => 'tudestg svizzer',
'gu' => 'gujarati',
+ 'guz' => 'gusii',
'gv' => 'manx',
'gwi' => 'gwichʼin',
'ha' => 'haussa',
@@ -162,7 +177,7 @@ $languageNames = [
'ho' => 'hiri motu',
'hr' => 'croat',
'hsb' => 'aut sorb',
- 'ht' => 'haitian',
+ 'ht' => 'creol haitian',
'hu' => 'ungarais',
'hup' => 'hupa',
'hy' => 'armen',
@@ -182,6 +197,8 @@ $languageNames = [
'iu' => 'inuktitut',
'ja' => 'giapunais',
'jbo' => 'lojban',
+ 'jgo' => 'ngomba',
+ 'jmc' => 'machame',
'jpr' => 'giudaic-persian',
'jrb' => 'giudaic-arab',
'jv' => 'javanais',
@@ -194,14 +211,19 @@ $languageNames = [
'kaw' => 'kawi',
'kbd' => 'kabardic',
'kcg' => 'tyap',
+ 'kde' => 'makonde',
+ 'kea' => 'cabverdian',
'kfo' => 'koro',
'kg' => 'kongo',
'kha' => 'khasi',
'kho' => 'khotanais',
+ 'khq' => 'koyra chiini',
'ki' => 'kikuyu',
'kj' => 'kuanyama',
'kk' => 'casac',
+ 'kkj' => 'kako',
'kl' => 'grönlandais',
+ 'kln' => 'kalenjin',
'km' => 'cambodschan',
'kmb' => 'kimbundu',
'kn' => 'kannada',
@@ -214,6 +236,9 @@ $languageNames = [
'krl' => 'carelian',
'kru' => 'kurukh',
'ks' => 'kashmiri',
+ 'ksb' => 'shambala',
+ 'ksf' => 'bafia',
+ 'ksh' => 'colognais',
'ku' => 'curd',
'kum' => 'kumuk',
'kut' => 'kutenai',
@@ -222,16 +247,19 @@ $languageNames = [
'ky' => 'kirghis',
'la' => 'latin',
'lad' => 'ladino',
+ 'lag' => 'langi',
'lah' => 'lahnda',
'lam' => 'lamba',
'lb' => 'luxemburgais',
'lez' => 'lezghian',
'lg' => 'ganda',
'li' => 'limburgais',
+ 'lkt' => 'lakota',
'ln' => 'lingala',
'lo' => 'laot',
'lol' => 'lomongo',
'loz' => 'lozi',
+ 'lrc' => 'luri dal nord',
'lt' => 'lituan',
'lu' => 'luba-katanga',
'lua' => 'luba-lulua',
@@ -239,6 +267,7 @@ $languageNames = [
'lun' => 'lunda',
'luo' => 'luo',
'lus' => 'lushai',
+ 'luy' => 'luyia',
'lv' => 'letton',
'mad' => 'madurais',
'mag' => 'magahi',
@@ -249,8 +278,12 @@ $languageNames = [
'mdf' => 'moksha',
'mdr' => 'mandar',
'men' => 'mende',
+ 'mer' => 'meru',
+ 'mfe' => 'morisyen',
'mg' => 'malagassi',
'mga' => 'irlandais mesaun',
+ 'mgh' => 'makhuwa-meetto',
+ 'mgo' => 'meta’',
'mh' => 'marschallais',
'mi' => 'maori',
'mic' => 'micmac',
@@ -265,14 +298,17 @@ $languageNames = [
'mr' => 'marathi',
'ms' => 'malaic',
'mt' => 'maltais',
+ 'mua' => 'mundang',
'mul' => 'pluriling',
'mus' => 'creek',
'mwl' => 'mirandais',
'mwr' => 'marwari',
'my' => 'birman',
'myv' => 'erzya',
+ 'mzn' => 'mazanderani',
'na' => 'nauru',
'nap' => 'neapolitan',
+ 'naq' => 'nama',
'nb' => 'norvegais bokmål',
'nd' => 'ndebele dal nord',
'nds' => 'bass tudestg',
@@ -283,13 +319,16 @@ $languageNames = [
'niu' => 'niue',
'nl' => 'ollandais',
'nl-be' => 'flam',
+ 'nmg' => 'kwasio',
'nn' => 'norvegiais nynorsk',
+ 'nnh' => 'ngienboon',
'no' => 'norvegiais',
'nog' => 'nogai',
'non' => 'nordic vegl',
'nqo' => 'n’ko',
'nr' => 'ndebele dal sid',
'nso' => 'sotho dal nord',
+ 'nus' => 'nuer',
'nv' => 'navajo',
'nwc' => 'newari classic',
'ny' => 'nyanja',
@@ -310,16 +349,18 @@ $languageNames = [
'pam' => 'pampanga',
'pap' => 'papiamento',
'pau' => 'palau',
+ 'pcm' => 'pidgin nigerian',
'peo' => 'persian vegl',
'phn' => 'fenizian',
'pi' => 'pali',
'pl' => 'polac',
'pon' => 'ponapean',
+ 'prg' => 'prussian',
'pro' => 'provenzal vegl',
'ps' => 'paschto',
'pt' => 'portugais',
'pt-br' => 'portugais brasilian',
- 'pt-pt' => 'portugais iberian',
+ 'pt-pt' => 'portugais europeic',
'qu' => 'quechua',
'raj' => 'rajasthani',
'rap' => 'rapanui',
@@ -328,25 +369,32 @@ $languageNames = [
'rn' => 'rundi',
'ro' => 'rumen',
'ro-md' => 'moldav',
+ 'rof' => 'rombo',
'rom' => 'romani',
'ru' => 'russ',
'rup' => 'aromunic',
'rw' => 'kinyarwanda',
+ 'rwk' => 'rwa',
'sa' => 'sanscrit',
'sad' => 'sandawe',
'sah' => 'jakut',
'sam' => 'arameic samaritan',
+ 'saq' => 'samburu',
'sas' => 'sasak',
'sat' => 'santali',
+ 'sbp' => 'sangu',
'sc' => 'sard',
'scn' => 'sicilian',
'sco' => 'scot',
'sd' => 'sindhi',
'se' => 'sami dal nord',
+ 'seh' => 'sena',
'sel' => 'selkup',
+ 'ses' => 'koyraboro senni',
'sg' => 'sango',
'sga' => 'irlandais vegl',
'sh' => 'serbo-croat',
+ 'shi' => 'tachelit',
'shn' => 'shan',
'si' => 'singalais',
'sid' => 'sidamo',
@@ -373,11 +421,13 @@ $languageNames = [
'sux' => 'sumeric',
'sv' => 'svedais',
'sw' => 'suahili',
+ 'sw-cd' => 'suahili dal Congo',
'syc' => 'siric classic',
'syr' => 'siric',
'ta' => 'tamil',
'te' => 'telugu',
'tem' => 'temne',
+ 'teo' => 'teso',
'ter' => 'tereno',
'tet' => 'tetum',
'tg' => 'tadjik',
@@ -402,14 +452,16 @@ $languageNames = [
'tum' => 'tumbuka',
'tvl' => 'tuvalu',
'tw' => 'twi',
+ 'twq' => 'tasawaq',
'ty' => 'tahitian',
'tyv' => 'tuvinian',
+ 'tzm' => 'tamazight',
'udm' => 'udmurt',
'ug' => 'uiguric',
'uga' => 'ugaritic',
'uk' => 'ucranais',
'umb' => 'mbundu',
- 'und' => 'linguas betg determinadas',
+ 'und' => 'lingua nunenconuschenta',
'ur' => 'urdu',
'uz' => 'usbec',
'vai' => 'vai',
@@ -417,21 +469,27 @@ $languageNames = [
'vi' => 'vietnamais',
'vo' => 'volapuk',
'vot' => 'votic',
+ 'vun' => 'vunjo',
'wa' => 'vallon',
+ 'wae' => 'gualser',
'wal' => 'walamo',
'war' => 'waray',
'was' => 'washo',
'wo' => 'wolof',
'xal' => 'kalmuk',
'xh' => 'xhosa',
+ 'xog' => 'soga',
'yao' => 'yao',
'yap' => 'yapais',
+ 'yav' => 'yangben',
'yi' => 'jiddic',
'yo' => 'yoruba',
+ 'yue' => 'cantonais',
'za' => 'zhuang',
'zap' => 'zapotec',
'zbl' => 'simbols da Bliss',
'zen' => 'zenaga',
+ 'zgh' => 'marocan tamazight standardisà',
'zh' => 'chinais',
'zh-hans' => 'chinais simplifitgà',
'zh-hant' => 'chinais tradiziunal',
@@ -444,16 +502,16 @@ $languageNames = [
$currencyNames = [
'ADP' => 'peseta andorrana',
'AED' => 'dirham dals Emirats Arabs Unids',
- 'AFA' => 'afghani (1927–2002)',
- 'AFN' => 'afghani',
+ 'AFA' => 'afgani afgan (1927–2002)',
+ 'AFN' => 'afgani afgan',
'ALK' => 'lek albanais (1947–1961)',
- 'ALL' => 'lek',
+ 'ALL' => 'lek albanais',
'AMD' => 'dram armen',
- 'ANG' => 'flurin da las Antillas Olandaisas',
+ 'ANG' => 'flurin da las Antillas Ollandaisas',
'AOA' => 'kwanza angolan',
- 'AOK' => 'kwanza angolan (1977–1990)',
- 'AON' => 'nov kwanza angolan',
- 'AOR' => 'kwanza angolan reajustado',
+ 'AOK' => 'kwanza angolan (1977–1991)',
+ 'AON' => 'nov kwanza angolan (1990–2000)',
+ 'AOR' => 'kwanza angolan reagiustà (1995–1999)',
'ARA' => 'austral argentin',
'ARL' => 'peso argentin ley',
'ARM' => 'peso argentin moneda nacional',
@@ -462,25 +520,25 @@ $currencyNames = [
'ATS' => 'schilling austriac',
'AUD' => 'dollar australian',
'AWG' => 'flurin da l’Aruba',
- 'AZM' => 'manat aserbaidschanic (1993–2006)',
- 'AZN' => 'manat aserbaidschanic',
- 'BAD' => 'dinar da la Bosnia ed Erzegovina',
- 'BAM' => 'marc convertibel bosniac',
- 'BAN' => 'nov dinar da la Bosnia ed Erzegovina',
+ 'AZM' => 'manat aserbaidschan (1993–2006)',
+ 'AZN' => 'manat aserbaidschan',
+ 'BAD' => 'dinar da la Bosnia-Erzegovina (1992–1994)',
+ 'BAM' => 'marc convertibel da la Bosnia-Erzegovina',
+ 'BAN' => 'nov dinar da la Bosnia-Erzegovina (1994–1997)',
'BBD' => 'dollar da Barbados',
'BDT' => 'taka bangladais',
'BEC' => 'franc beltg (convertibel)',
'BEF' => 'franc beltg',
'BEL' => 'franc beltg (finanzial)',
- 'BGL' => 'lev bulgar',
+ 'BGL' => 'lev bulgar dir',
'BGM' => 'lev bulgar socialistic',
- 'BGN' => 'nov lev bulgar',
- 'BGO' => 'vegl lev bulgar',
+ 'BGN' => 'lev bulgar',
+ 'BGO' => 'lev bulgar (1879–1952)',
'BHD' => 'dinar dal Bahrain',
'BIF' => 'franc dal Burundi',
'BMD' => 'dollar da las Bermudas',
'BND' => 'dollar dal Brunei',
- 'BOB' => 'boliviano',
+ 'BOB' => 'boliviano bolivian',
'BOL' => 'vegl boliviano',
'BOP' => 'peso bolivian',
'BOV' => 'mvdol bolivian',
@@ -493,9 +551,9 @@ $currencyNames = [
'BRZ' => 'vegl cruzeiro brasilian',
'BSD' => 'dollar da las Bahamas',
'BTN' => 'ngultrum butanais',
- 'BUK' => 'Kyat burmais',
+ 'BUK' => 'kyat burmais',
'BWP' => 'pula da la Botswana',
- 'BYB' => 'nov rubel bieloruss (1994–1999)',
+ 'BYB' => 'rubel bieloruss (1994–1999)',
'BYN' => 'rubel bieloruss',
'BYR' => 'rubel bieloruss (2000–2016)',
'BZD' => 'dollar dal Belize',
@@ -507,12 +565,15 @@ $currencyNames = [
'CLE' => 'escudo chilen',
'CLF' => 'unidades de fomento chilenas',
'CLP' => 'peso chilen',
- 'CNY' => 'yuan renminbi chinais',
+ 'CNH' => 'yuan chinais (offshore)',
+ 'CNX' => 'dollar da la banca populara chinaisa',
+ 'CNY' => 'yuan chinais',
'COP' => 'peso columbian',
'COU' => 'unidad de valor real',
'CRC' => 'colon da la Costa Rica',
- 'CSD' => 'vegl dinar serb',
+ 'CSD' => 'dinar serb (2002–2006)',
'CSK' => 'cruna tschecoslovaca',
+ 'CUC' => 'peso cuban convertibel',
'CUP' => 'peso cuban',
'CVE' => 'escudo dal Cap Verd',
'CYP' => 'glivra cipriota',
@@ -537,7 +598,7 @@ $currencyNames = [
'FJD' => 'dollar dal Fidschi',
'FKP' => 'glivra dal Falkland',
'FRF' => 'franc franzos',
- 'GBP' => 'glivra sterlina',
+ 'GBP' => 'glivra britannica',
'GEK' => 'kupon larit georgian',
'GEL' => 'lari georgian',
'GHC' => 'cedi ghanais (1979–2007)',
@@ -561,8 +622,8 @@ $currencyNames = [
'IDR' => 'rupia indonaisa',
'IEP' => 'glivra indonaisa',
'ILP' => 'glivra israeliana',
- 'ILR' => 'vegl sheqel israelian',
- 'ILS' => 'sheqel',
+ 'ILR' => 'schekel israelian (1980–1985)',
+ 'ILS' => 'nov schekel israelian',
'INR' => 'rupia indica',
'IQD' => 'dinar iracais',
'IRR' => 'rial iranais',
@@ -573,16 +634,16 @@ $currencyNames = [
'JOD' => 'dinar jordanic',
'JPY' => 'yen giapunais',
'KES' => 'schilling kenian',
- 'KGS' => 'som kirghis',
+ 'KGS' => 'som kirgis',
'KHR' => 'riel cambodschan',
'KMF' => 'franc comorian',
'KPW' => 'won da la Corea dal Nord',
- 'KRH' => 'hwan da la Corea dal Sid',
- 'KRO' => 'vegl won da la Corea dal Sid',
+ 'KRH' => 'hwan da la Corea dal Sid (1953–1962)',
+ 'KRO' => 'won da la Corea dal Sid (1945–1953)',
'KRW' => 'won da la Corea dal Sid',
'KWD' => 'dinar dal Kuwait',
'KYD' => 'dollar da las Inslas Cayman',
- 'KZT' => 'tenge casac',
+ 'KZT' => 'tenge kasac',
'LAK' => 'kip laot',
'LBP' => 'glivra libanaisa',
'LKR' => 'rupia da la Sri Lanka',
@@ -598,15 +659,15 @@ $currencyNames = [
'LYD' => 'dinar libic',
'MAD' => 'dirham marocan',
'MAF' => 'franc marocan',
- 'MCF' => 'franc monegas',
+ 'MCF' => 'franc monegass',
'MDC' => 'cupon moldav',
'MDL' => 'leu moldav',
'MGA' => 'ariary madagasc',
'MGF' => 'franc madagasc',
- 'MKD' => 'dinar da la Macedonia',
- 'MKN' => 'vegl dinar macedon',
+ 'MKD' => 'dinar macedon',
+ 'MKN' => 'dinar macedon (1992–1993)',
'MLF' => 'franc dal Mali',
- 'MMK' => 'Kyat dal Myanmar',
+ 'MMK' => 'kyat dal Myanmar',
'MNT' => 'tugrik mongolic',
'MOP' => 'pataca dal Macao',
'MRO' => 'ouguiya da la Mauretania (1973–2017)',
@@ -614,20 +675,20 @@ $currencyNames = [
'MTL' => 'lira maltaisa',
'MTP' => 'glivra maltaisa',
'MUR' => 'rupia dal Mauritius',
- 'MVP' => 'rupia da las Maledivas',
+ 'MVP' => 'rupia da las Maledivas (1947–1981)',
'MVR' => 'rufiyaa da las Maledivas',
'MWK' => 'kwacha dal Malawi',
'MXN' => 'peso mexican',
'MXP' => 'peso d’argient mexican (1861–1992)',
'MXV' => 'unidad de inversion mexicana (UDI)',
- 'MYR' => 'ringgit da la Malaisia',
- 'MZE' => 'escudo dal mozambican',
- 'MZM' => 'vegl metical mozambican',
- 'MZN' => 'metical dal mozambican',
+ 'MYR' => 'ringgit malaisic',
+ 'MZE' => 'escudo dal Mosambic',
+ 'MZM' => 'metical dal Mosambic (1980–2006)',
+ 'MZN' => 'metical dal Mosambic',
'NAD' => 'dollar namibian',
'NGN' => 'naira nigeriana',
'NIC' => 'cordoba nicaraguan',
- 'NIO' => 'cordoba oro nicaraguan',
+ 'NIO' => 'córdoba nicaraguan',
'NLG' => 'flurin ollandais',
'NOK' => 'cruna norvegiaisa',
'NPR' => 'rupia nepalaisa',
@@ -644,20 +705,20 @@ $currencyNames = [
'PLZ' => 'zloty polac (1950–1995)',
'PTE' => 'escudo portugais',
'PYG' => 'guarani paraguaian',
- 'QAR' => 'riyal da Katar',
+ 'QAR' => 'rial da Katar',
'RHD' => 'dollar rodesian',
- 'ROL' => 'vegl leu rumen',
+ 'ROL' => 'leu rumen (1952–2006)',
'RON' => 'leu rumen',
'RSD' => 'dinar serb',
- 'RUB' => 'rubel russ (nov)',
+ 'RUB' => 'rubel russ',
'RUR' => 'rubel russ (vegl)',
'RWF' => 'franc ruandais',
'SAR' => 'riyal saudit',
- 'SBD' => 'dollar da las Salomonas',
+ 'SBD' => 'dollar da las Inslas da Salomon',
'SCR' => 'rupia da las Seychellas',
- 'SDD' => 'dinar sudanais',
+ 'SDD' => 'dinar sudanais (1992–2007)',
'SDG' => 'glivra sudanaisa',
- 'SDP' => 'glivra sudanaisa (1956–2007)',
+ 'SDP' => 'glivra sudanaisa (1957–1998)',
'SEK' => 'cruna svedaisa',
'SGD' => 'dollar dal Singapur',
'SHP' => 'glivra da Sontg’Elena',
@@ -667,6 +728,7 @@ $currencyNames = [
'SOS' => 'schilling somalian',
'SRD' => 'dollar surinam',
'SRG' => 'flurin surinam',
+ 'SSP' => 'glivra sidsudanaisa',
'STD' => 'dobra da São Tomé e Principe (1977–2017)',
'STN' => 'dobra da São Tomé e Principe',
'SUR' => 'rubel sovietic',
@@ -674,36 +736,37 @@ $currencyNames = [
'SYP' => 'glivra siriana',
'SZL' => 'lilangeni dal Swaziland',
'THB' => 'baht tailandais',
- 'TJR' => 'rubel dal Tadschikistan',
- 'TJS' => 'somoni dal Tadschikistan',
- 'TMM' => 'manat turkmen',
+ 'TJR' => 'rubel tadschic',
+ 'TJS' => 'somoni tadschic',
+ 'TMM' => 'manat turkmen (1993–2009)',
+ 'TMT' => 'manat turkmen',
'TND' => 'dinar tunesian',
- 'TOP' => 'pa’anga da Tonga',
- 'TPE' => 'escudo da Timor',
- 'TRL' => 'lira tirca',
- 'TRY' => 'nova lira tirca',
+ 'TOP' => 'paʻanga da Tonga',
+ 'TPE' => 'escudo dal Timor',
+ 'TRL' => 'lira tirca (1922–2005)',
+ 'TRY' => 'lira tirca',
'TTD' => 'dollar da Trinidad e Tobago',
'TWD' => 'nov dollar taiwanais',
'TZS' => 'schilling tansanian',
- 'UAH' => 'hryvnia ucranais',
- 'UAK' => 'karbovanetz ucranais',
- 'UGS' => 'schilling ucranais',
+ 'UAH' => 'hryvnia ucranaisa',
+ 'UAK' => 'karbovanets ucranais',
+ 'UGS' => 'schilling ugandais (1966–1987)',
'UGX' => 'schilling ugandais',
- 'USD' => 'dollar dals Stadis Unids da l’America',
+ 'USD' => 'dollar da l’USA',
'USN' => 'dollar dals Stadis Unids da l’America (proxim di)',
'USS' => 'dollar dals Stadis Unids da l’America (medem di)',
'UYI' => 'peso da l’Uruguay (unidades indexadas)',
'UYP' => 'nov peso da l’Uruguay (1975–1993)',
'UYU' => 'peso da l’Uruguay',
- 'UZS' => 'sum usbec',
+ 'UZS' => 'som usbec',
'VEB' => 'bolivar venezuelan (1871–2008)',
'VEF' => 'bolivar venezuelan (2008–2018)',
- 'VES' => 'bolivar venezuelan',
+ 'VES' => 'bolívar venezuelan',
'VND' => 'dong vietnamais',
- 'VNN' => 'vegl dong vietnamais',
+ 'VNN' => 'dong vietnamais (1978–1985)',
'VUV' => 'vatu dal Vanuatu',
'WST' => 'tala da la Samoa',
- 'XAF' => 'franc CFA BEAC',
+ 'XAF' => 'franc CFA da l’Africa Centrala',
'XAG' => 'argient',
'XAU' => 'aur',
'XBA' => 'unitad europeica cumponida',
@@ -714,26 +777,29 @@ $currencyNames = [
'XEU' => 'unitad monetara europeica',
'XFO' => 'franc d’aur franzos',
'XFU' => 'franc UIC franzos',
- 'XOF' => 'franc CFA BCEAO',
+ 'XOF' => 'franc CFA da l’Africa dal Vest',
'XPD' => 'palladi',
'XPF' => 'franc CFP',
'XPT' => 'platin',
'XRE' => 'fonds RINET',
+ 'XSU' => 'zutger',
'XTS' => 'code per verifitgar la valuta',
'XXX' => 'valuta nunenconuschenta',
- 'YDD' => 'dinar dal Jemen',
- 'YER' => 'rial dal Jemen',
- 'YUD' => 'dinar jugoslav (1966–1990)',
- 'YUM' => 'nov dinar jugoslav',
- 'YUN' => 'dinar jugoslav convertibel',
- 'YUR' => 'dinar jugoslav refurmà',
+ 'YDD' => 'dinar jemenit',
+ 'YER' => 'rial jemenit',
+ 'YUD' => 'dinar jugoslav dir (1966–1990)',
+ 'YUM' => 'nov dinar jugoslav (1994–2002)',
+ 'YUN' => 'dinar jugoslav convertibel (1990–1992)',
+ 'YUR' => 'dinar jugoslav refurmà (1992–1993)',
'ZAL' => 'rand sidafrican (finanzial)',
'ZAR' => 'rand sidafrican',
- 'ZMK' => 'kwacha da la sambia (1968–2012)',
+ 'ZMK' => 'kwacha da la Sambia (1968–2012)',
'ZMW' => 'kwacha da la sambia',
- 'ZRN' => 'nov zaire dal Zaire',
+ 'ZRN' => 'nov zaire dal Zaire (1993–1998)',
'ZRZ' => 'zaire dal Zaire',
- 'ZWD' => 'dollar dal Simbabwe',
+ 'ZWD' => 'dollar dal Simbabwe (1980–2008)',
+ 'ZWL' => 'dollar dal Simbabwe (2009)',
+ 'ZWR' => 'dollar dal Simbabwe (2008)',
];
$currencySymbols = [
@@ -760,11 +826,14 @@ $currencySymbols = [
'SEK' => 'SEK',
'TRY' => 'TRY',
'USD' => '$',
+ 'XAF' => 'FCFA',
'XCD' => 'EC$',
'XEU' => 'XEU',
+ 'XOF' => 'CFA',
];
$countryNames = [
+ 'AC' => 'Insla d’Ascensiun',
'AD' => 'Andorra',
'AE' => 'Emirats Arabs Unids',
'AF' => 'Afghanistan',
@@ -794,6 +863,7 @@ $countryNames = [
'BM' => 'Bermudas',
'BN' => 'Brunei',
'BO' => 'Bolivia',
+ 'BQ' => 'Antillas Ollandaisas',
'BR' => 'Brasilia',
'BS' => 'Bahamas',
'BT' => 'Bhutan',
@@ -803,7 +873,7 @@ $countryNames = [
'BZ' => 'Belize',
'CA' => 'Canada',
'CC' => 'Inslas Cocos',
- 'CD' => 'Republica Democratica dal Congo',
+ 'CD' => 'Congo - Kinshasa',
'CF' => 'Republica Centralafricana',
'CG' => 'Congo',
'CH' => 'Svizra',
@@ -813,18 +883,22 @@ $countryNames = [
'CM' => 'Camerun',
'CN' => 'China',
'CO' => 'Columbia',
+ 'CP' => 'Insla da Clipperton',
'CR' => 'Costa Rica',
'CU' => 'Cuba',
'CV' => 'Cap Verd',
- 'CX' => 'Insla da Christmas',
+ 'CW' => 'Curaçao',
+ 'CX' => 'Insla da Nadal',
'CY' => 'Cipra',
- 'CZ' => 'Republica Tscheca',
+ 'CZ' => 'Tschechia',
'DE' => 'Germania',
+ 'DG' => 'Diego Garcia',
'DJ' => 'Dschibuti',
'DK' => 'Danemarc',
'DM' => 'Dominica',
'DO' => 'Republica Dominicana',
'DZ' => 'Algeria',
+ 'EA' => 'Ceuta e Melilla',
'EC' => 'Ecuador',
'EE' => 'Estonia',
'EG' => 'Egipta',
@@ -832,7 +906,8 @@ $countryNames = [
'ER' => 'Eritrea',
'ES' => 'Spagna',
'ET' => 'Etiopia',
- 'EU' => 'Uniun europeica',
+ 'EU' => 'Uniun Europeica',
+ 'EZ' => 'zona da l’euro',
'FI' => 'Finlanda',
'FJ' => 'Fidschi',
'FK' => 'Inslas dal Falkland',
@@ -840,7 +915,7 @@ $countryNames = [
'FO' => 'Inslas Feroe',
'FR' => 'Frantscha',
'GA' => 'Gabun',
- 'GB' => 'Reginavel Unì',
+ 'GB' => 'GB',
'GD' => 'Grenada',
'GE' => 'Georgia',
'GF' => 'Guyana Franzosa',
@@ -858,12 +933,13 @@ $countryNames = [
'GU' => 'Guam',
'GW' => 'Guinea-Bissau',
'GY' => 'Guyana',
- 'HK' => 'Regiun d’administraziun speziala da Hongkong, China',
+ 'HK' => 'Hong Kong',
'HM' => 'Inslas da Heard e da McDonald',
'HN' => 'Honduras',
'HR' => 'Croazia',
'HT' => 'Haiti',
'HU' => 'Ungaria',
+ 'IC' => 'Inslas Canarias',
'ID' => 'Indonesia',
'IE' => 'Irlanda',
'IL' => 'Israel',
@@ -879,7 +955,7 @@ $countryNames = [
'JO' => 'Jordania',
'JP' => 'Giapun',
'KE' => 'Kenia',
- 'KG' => 'Kirghisistan',
+ 'KG' => 'Kirgisistan',
'KH' => 'Cambodscha',
'KI' => 'Kiribati',
'KM' => 'Comoras',
@@ -907,10 +983,11 @@ $countryNames = [
'MF' => 'Saint Martin',
'MG' => 'Madagascar',
'MH' => 'Inslas da Marshall',
+ 'MK' => 'Macedonia dal Nord',
'ML' => 'Mali',
- 'MM' => 'Myanmar',
+ 'MM' => 'Myanmar (Burma)',
'MN' => 'Mongolia',
- 'MO' => 'Regiun d’administraziun speziala Macao, China',
+ 'MO' => 'Macao',
'MP' => 'Inslas Mariannas dal Nord',
'MQ' => 'Martinique',
'MR' => 'Mauretania',
@@ -945,7 +1022,7 @@ $countryNames = [
'PM' => 'Saint Pierre e Miquelon',
'PN' => 'Pitcairn',
'PR' => 'Puerto Rico',
- 'PS' => 'Territori Palestinais',
+ 'PS' => 'Palestina',
'PT' => 'Portugal',
'PW' => 'Palau',
'PY' => 'Paraguai',
@@ -957,7 +1034,7 @@ $countryNames = [
'RU' => 'Russia',
'RW' => 'Ruanda',
'SA' => 'Arabia Saudita',
- 'SB' => 'Salomonas',
+ 'SB' => 'Inslas Salomonas',
'SC' => 'Seychellas',
'SD' => 'Sudan',
'SE' => 'Svezia',
@@ -972,10 +1049,12 @@ $countryNames = [
'SO' => 'Somalia',
'SR' => 'Surinam',
'SS' => 'Sudan dal Sid',
- 'ST' => 'São Tomé e Principe',
+ 'ST' => 'São Tomé & Príncipe',
'SV' => 'El Salvador',
+ 'SX' => 'Sint Maarten',
'SY' => 'Siria',
- 'SZ' => 'Swaziland',
+ 'SZ' => 'Eswatini',
+ 'TA' => 'Tristan da Cunha',
'TC' => 'Inslas Turks e Caicos',
'TD' => 'Tschad',
'TF' => 'Territoris Franzos Meridiunals',
@@ -994,8 +1073,9 @@ $countryNames = [
'TZ' => 'Tansania',
'UA' => 'Ucraina',
'UG' => 'Uganda',
- 'UM' => 'Inslas pitschnas perifericas dals Stadis Unids da l’America',
- 'US' => 'Stadis Unids da l’America',
+ 'UM' => 'Inslas Pitschnas Perifericas dals Stadis Unids da l’America',
+ 'UN' => 'Naziuns Unidas',
+ 'US' => 'US',
'UY' => 'Uruguay',
'UZ' => 'Usbekistan',
'VA' => 'Citad dal Vatican',
@@ -1005,8 +1085,11 @@ $countryNames = [
'VI' => 'Inslas Virginas Americanas',
'VN' => 'Vietnam',
'VU' => 'Vanuatu',
- 'WF' => 'Wallis e Futuna',
+ 'WF' => 'Wallis & Futuna',
'WS' => 'Samoa',
+ 'XA' => 'accents pseudo',
+ 'XB' => 'pseudo-bidirecziunal',
+ 'XK' => 'Cosovo',
'YE' => 'Jemen',
'YT' => 'Mayotte',
'ZA' => 'Africa dal Sid',
@@ -1027,6 +1110,8 @@ $timeUnits = [
'month-other' => '{0} mais',
'second-one' => '{0} secunda',
'second-other' => '{0} secundas',
+ 'sun-short-future-one' => '+{0} dumengia',
+ 'sun-short-future-other' => 'en {0} du',
'week-one' => '{0} emna',
'week-other' => '{0} emnas',
'year-one' => '{0} onn',
diff --git a/MLEB/cldr/CldrNames/CldrNamesRo.php b/MLEB/cldr/CldrNames/CldrNamesRo.php
index 9e6750a5..a1c32a46 100644
--- a/MLEB/cldr/CldrNames/CldrNamesRo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesRo.php
@@ -139,7 +139,7 @@ $languageNames = [
'fi' => 'finlandeză',
'fil' => 'filipineză',
'fj' => 'fijiană',
- 'fo' => 'faroeză',
+ 'fo' => 'feroeză',
'fon' => 'fon',
'fr' => 'franceză',
'frc' => 'franceză cajun',
@@ -478,7 +478,7 @@ $languageNames = [
'twq' => 'tasawaq',
'ty' => 'tahitiană',
'tyv' => 'tuvană',
- 'tzm' => 'tamazight din Altasul Central',
+ 'tzm' => 'tamazight din Atlasul Central',
'udm' => 'udmurt',
'ug' => 'uigură',
'uga' => 'ugaritică',
@@ -529,9 +529,9 @@ $currencyNames = [
'ADP' => 'pesetă andorrană',
'AED' => 'dirham din Emiratele Arabe Unite',
'AFN' => 'afgani afgan',
- 'ALL' => 'leka albaneză',
+ 'ALL' => 'lek',
'AMD' => 'dram armenesc',
- 'ANG' => 'gulden din Antilele Olandeze',
+ 'ANG' => 'gulden neerlandez antilez',
'AOA' => 'kwanza angoleză',
'ARP' => 'peso argentinian (1983–1985)',
'ARS' => 'peso argentinian',
@@ -541,22 +541,22 @@ $currencyNames = [
'AZM' => 'manat azer (1993–2006)',
'AZN' => 'manat azer',
'BAD' => 'dinar Bosnia-Herțegovina (1992–1994)',
- 'BAM' => 'marcă convertibilă din Bosnia și Herțegovina',
+ 'BAM' => 'marcă convertibilă',
'BBD' => 'dolar din Barbados',
'BDT' => 'taka din Bangladesh',
'BEC' => 'franc belgian (convertibil)',
'BEF' => 'franc belgian',
'BEL' => 'franc belgian (financiar)',
- 'BGN' => 'leva bulgărească',
+ 'BGN' => 'leva',
'BHD' => 'dinar din Bahrain',
'BIF' => 'franc burundez',
'BMD' => 'dolar din Bermuda',
'BND' => 'dolar din Brunei',
- 'BOB' => 'boliviano bolivian',
+ 'BOB' => 'boliviano',
'BOP' => 'peso bolivian',
'BOV' => 'mvdol bolivian',
'BRE' => 'cruzeiro brazilian (1990–1993)',
- 'BRL' => 'real brazilian',
+ 'BRL' => 'real',
'BRR' => 'cruzeiro brazilian (1993–1994)',
'BSD' => 'dolar din Bahamas',
'BTN' => 'ngultrum din Bhutan',
@@ -572,7 +572,7 @@ $currencyNames = [
'CNH' => 'yuan chinezesc (offshore)',
'CNY' => 'yuan chinezesc',
'COP' => 'peso columbian',
- 'CRC' => 'colon costarican',
+ 'CRC' => 'colón costarican',
'CSD' => 'dinar Serbia și Muntenegru (2002–2006)',
'CUC' => 'peso cubanez convertibil',
'CUP' => 'peso cubanez',
@@ -612,9 +612,9 @@ $currencyNames = [
'HKD' => 'dolar din Hong Kong',
'HNL' => 'lempira honduriană',
'HRD' => 'dinar croat',
- 'HRK' => 'kuna croată',
+ 'HRK' => 'kuna',
'HTG' => 'gourde din Haiti',
- 'HUF' => 'forint maghiar',
+ 'HUF' => 'forint',
'IDR' => 'rupie indoneziană',
'IEP' => 'liră irlandeză',
'ILP' => 'liră israeliană',
@@ -653,7 +653,7 @@ $currencyNames = [
'MDL' => 'leu moldovenesc',
'MGA' => 'ariary malgaș',
'MGF' => 'franc Madagascar',
- 'MKD' => 'dinar macedonean',
+ 'MKD' => 'denar',
'MLF' => 'franc Mali',
'MMK' => 'kyat din Myanmar',
'MNT' => 'tugrik mongol',
@@ -673,7 +673,7 @@ $currencyNames = [
'NAD' => 'dolar namibian',
'NGN' => 'naira nigeriană',
'NIC' => 'cordoba nicaraguană (1988–1991)',
- 'NIO' => 'cordoba nicaraguană',
+ 'NIO' => 'córdoba oro',
'NLG' => 'gulden olandez',
'NOK' => 'coroană norvegiană',
'NPR' => 'rupie nepaleză',
@@ -681,14 +681,14 @@ $currencyNames = [
'OMR' => 'rial omanez',
'PAB' => 'balboa panameză',
'PEI' => 'inti peruvian',
- 'PEN' => 'sol peruvian',
+ 'PEN' => 'sol',
'PES' => 'sol peruvian (1863–1965)',
'PGK' => 'kina din Papua-Noua Guinee',
'PHP' => 'peso filipinez',
'PKR' => 'rupie pakistaneză',
- 'PLN' => 'zlot polonez',
+ 'PLN' => 'zlot',
'PLZ' => 'zlot polonez (1950–1995)',
- 'PYG' => 'guarani paraguayan',
+ 'PYG' => 'guarani',
'QAR' => 'rial qatarian',
'RHD' => 'dolar rhodesian',
'ROL' => 'leu românesc (1952–2006)',
@@ -727,10 +727,10 @@ $currencyNames = [
'TOP' => 'pa’anga tongană',
'TRL' => 'liră turcească (1922–2005)',
'TRY' => 'liră turcească',
- 'TTD' => 'dolar din Trinidad-Tobago',
+ 'TTD' => 'dolar din Trinidad și Tobago',
'TWD' => 'dolar nou din Taiwan',
'TZS' => 'șiling tanzanian',
- 'UAH' => 'hryvna ucraineană',
+ 'UAH' => 'grivnă',
'UAK' => 'carboavă ucraineană',
'UGS' => 'șiling ugandez (1966–1987)',
'UGX' => 'șiling ugandez',
@@ -742,7 +742,7 @@ $currencyNames = [
'UZS' => 'sum Uzbekistan',
'VEB' => 'bolivar Venezuela (1871–2008)',
'VEF' => 'bolivar venezuelean (2008–2018)',
- 'VES' => 'bolivar venezuelean',
+ 'VES' => 'bolívar soberano',
'VND' => 'dong vietnamez',
'VUV' => 'vatu din Vanuatu',
'WST' => 'tala samoană',
@@ -753,7 +753,7 @@ $currencyNames = [
'XBB' => 'unitate monetară europeană',
'XBC' => 'unitate de cont europeană (XBC)',
'XBD' => 'unitate de cont europeană (XBD)',
- 'XCD' => 'dolar din Caraibele de Est',
+ 'XCD' => 'dolar est-caraib',
'XDR' => 'drepturi speciale de tragere',
'XEU' => 'unitate de monedă europeană',
'XFO' => 'franc francez de aur',
@@ -1164,7 +1164,7 @@ $countryNames = [
'SV' => 'El Salvador',
'SX' => 'Sint-Maarten',
'SY' => 'Siria',
- 'SZ' => 'eSwatini',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Insulele Turks și Caicos',
'TD' => 'Ciad',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSa.php b/MLEB/cldr/CldrNames/CldrNamesSa.php
new file mode 100644
index 00000000..1e9fb6d5
--- /dev/null
+++ b/MLEB/cldr/CldrNames/CldrNamesSa.php
@@ -0,0 +1,82 @@
+<?php
+
+$languageNames = [
+ 'aa' => 'अफर',
+ 'ab' => 'अब्खासियन्',
+ 'ace' => 'अचिनीस्',
+ 'ach' => 'अचोलि',
+ 'ada' => 'अडङ्गमे',
+ 'af' => 'अफ्रिक्कान्स्',
+ 'afh' => 'अफ्रिहिलि',
+ 'ain' => 'अयिनु',
+ 'ak' => 'अकन्',
+ 'akk' => 'अक्काटियान्',
+ 'ale' => 'अलियुट्',
+ 'am' => 'अंहाऱिक्',
+ 'anp' => 'अङ्गिक',
+ 'ar' => 'अऱबिक्',
+ 'de' => 'जर्मनभाषा:',
+ 'de-at' => 'ऑस्ट्रियाई जर्मनभाषा:',
+ 'de-ch' => 'स्विस उच्च जर्मनभाषा:',
+ 'egy' => 'प्राचीन ईजिप्त्यन्',
+ 'en' => 'आङ्ग्लभाषा',
+ 'en-au' => 'ऑस्ट्रेलियादेशः आङ्ग्लभाषा',
+ 'en-ca' => 'कनाडादेशः आङ्ग्लभाषा',
+ 'en-gb' => 'आङ्ग्लदेशीय आङ्ग्लभाषा:',
+ 'en-us' => 'अमेरिकादेशीय आङ्ग्लभाषा:',
+ 'es' => 'स्पेनीय भाषा:',
+ 'es-419' => 'लैटिन अमेरिकादेशीय स्पेनीय भाषा:',
+ 'es-es' => 'फिरङ्गिन् स्पेनीय भाषा:',
+ 'es-mx' => 'मैक्सिकन स्पेनीय भाषा:',
+ 'fr' => 'फ़्रांसदेशीय भाषा:',
+ 'fr-ca' => 'कनाडादेशः फ़्रांसदेशीय भाषा:',
+ 'fr-ch' => 'स्विस फ़्रांसदेशीय भाषा:',
+ 'grc' => 'पुरातन यवन भाषा',
+ 'it' => 'इटलीदेशीय भाषा:',
+ 'ja' => 'सूर्यमूलीय भाषा:',
+ 'nb' => 'नोर्वीजियन् बॊकामल्',
+ 'pt' => 'पुर्तगालदेशीय भाषा:',
+ 'pt-br' => 'ब्राज़ीली पुर्तगालदेशीय भाषा:',
+ 'pt-pt' => 'फिरङ्गिन् पुर्तगालदेशीय भाषा:',
+ 'ru' => 'रष्यदेशीय भाषा:',
+ 'sa' => 'संस्कृत भाषा',
+ 'sq' => 'अल्बेनियन्',
+ 'und' => 'अज्ञात भाषा:',
+ 'zh' => 'चीनी',
+ 'zh-hans' => 'सरलीकृत चीनी',
+ 'zh-hant' => 'परम्परागत चीनी',
+];
+
+$currencyNames = [
+ 'BRL' => 'ब्राजीली रियाल',
+ 'CNY' => 'चीनी युआन',
+ 'EUR' => 'फिरङ्गिन् मुद्रा',
+ 'GBP' => 'आङ्ग्लदेशीयः पाउंड',
+ 'INR' => 'भारतीय रूप्यकम्',
+ 'JPY' => 'जापानी येन',
+ 'RUB' => 'रष्यदेशीय रूबल',
+ 'USD' => 'यूएस डॉलर',
+ 'XXX' => 'अज्ञात मुद्रा',
+];
+
+$currencySymbols = [
+ 'BRL' => 'R$',
+ 'CNY' => '¥',
+ 'GBP' => '£',
+ 'INR' => '₹',
+ 'JPY' => '¥',
+ 'USD' => 'US$',
+];
+
+$countryNames = [
+ 'BR' => 'ब्राजील',
+ 'CN' => 'चीन:',
+ 'DE' => 'जर्मनीदेश:',
+ 'FR' => 'फ़्रांस:',
+ 'GB' => 'संयुक्त राष्ट्र:',
+ 'IN' => 'भारतः',
+ 'IT' => 'इटली:',
+ 'JP' => 'जापन:',
+ 'RU' => 'रष्यदेश:',
+ 'US' => 'संयुक्त राज्य:',
+];
diff --git a/MLEB/cldr/CldrNames/CldrNamesSd.php b/MLEB/cldr/CldrNames/CldrNamesSd.php
index c5b42abf..188e6d75 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSd.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSd.php
@@ -26,8 +26,8 @@ $languageNames = [
'awa' => 'اواڌي',
'ay' => 'ایمارا',
'az' => 'آزربائيجاني',
- 'ba' => 'بشڪر',
- 'ban' => 'بالي',
+ 'ba' => 'ڪينيڊا',
+ 'ban' => 'بالينيس',
'bas' => 'باسا',
'be' => 'بيلاروسي',
'bem' => 'بيمبا',
@@ -89,12 +89,12 @@ $languageNames = [
'en-gb' => 'برطانوي انگريزي',
'en-us' => 'آمريڪي انگريزي',
'eo' => 'ايسپرانٽو',
- 'es' => 'اسپيني',
+ 'es' => 'هسپانوي',
'es-419' => 'لاطيني آمريڪي اسپينش',
'es-es' => 'يورپي اسپيني',
'es-mx' => 'ميڪسيڪين اسپيني',
'et' => 'ايستونائي',
- 'eu' => 'باسڪي',
+ 'eu' => 'باسق',
'ewo' => 'اوانڊو',
'fa' => 'فارسي',
'fa-af' => 'دري',
@@ -104,7 +104,7 @@ $languageNames = [
'fj' => 'فجي',
'fo' => 'فيروايس',
'fon' => 'فون',
- 'fr' => 'فرانسي',
+ 'fr' => 'فرانسيسي',
'fr-ca' => 'ڪينيڊيائي فرانسيسي',
'fr-ch' => 'سوئس فرانسيسي',
'fur' => 'فرائي لئين',
@@ -152,7 +152,7 @@ $languageNames = [
'jgo' => 'نغومبا',
'jmc' => 'ميڪم',
'jv' => 'جاونيز',
- 'ka' => 'جارجين',
+ 'ka' => 'جارجيائي',
'kab' => 'ڪبائل',
'kac' => 'ڪچن',
'kaj' => 'پوڪيپسي',
@@ -314,7 +314,7 @@ $languageNames = [
'si' => 'سنهالا',
'sk' => 'سلواڪي',
'sl' => 'سلوويني',
- 'sm' => 'ساموآن',
+ 'sm' => 'سموئا',
'sma' => 'ڏکڻ سامي',
'smj' => 'لولي سامي',
'smn' => 'اناري سامي',
@@ -330,7 +330,7 @@ $languageNames = [
'st' => 'ڏکڻ سوٿي',
'su' => 'سوڊاني',
'suk' => 'سڪوما',
- 'sv' => 'سويڊني',
+ 'sv' => 'سويڊش',
'sw' => 'سواحيلي',
'sw-cd' => 'ڪونگو سواحيلي',
'swb' => 'ڪمورين',
@@ -340,19 +340,19 @@ $languageNames = [
'tem' => 'تمني',
'teo' => 'تيسو',
'tet' => 'تيتم',
- 'tg' => 'تاجڪي',
+ 'tg' => 'تاجڪ',
'th' => 'ٿائي',
'ti' => 'تگرينيائي',
'tig' => 'تگري',
- 'tk' => 'ترڪماني',
+ 'tk' => 'ترڪمين',
'tlh' => 'ڪلون',
'tn' => 'تسوانا',
'to' => 'تونگن',
'tpi' => 'تاڪ پسن',
- 'tr' => 'ترڪ',
+ 'tr' => 'ترڪش',
'trv' => 'تاروڪو',
'ts' => 'سونگا',
- 'tt' => 'تاتري',
+ 'tt' => 'تاتار',
'tum' => 'تمبوڪا',
'tvl' => 'توالو',
'twq' => 'تساوڪي',
@@ -375,7 +375,7 @@ $languageNames = [
'wae' => 'والسر',
'wal' => 'وولايٽا',
'war' => 'واري',
- 'wo' => 'وولف',
+ 'wo' => 'وولوف',
'xal' => 'ڪيلمڪ',
'xh' => 'زھوسا',
'xog' => 'سوگا',
@@ -721,7 +721,7 @@ $countryNames = [
'AD' => 'اندورا',
'AE' => 'متحده عرب امارات',
'AF' => 'افغانستان',
- 'AG' => 'انٽيگئا و بربودا',
+ 'AG' => 'انٽيگا ۽ باربوڊا',
'AI' => 'انگويلا',
'AL' => 'البانيا',
'AM' => 'ارمینیا',
@@ -729,12 +729,12 @@ $countryNames = [
'AQ' => 'انٽارڪٽيڪا',
'AR' => 'ارجنٽينا',
'AS' => 'آمريڪي ساموا',
- 'AT' => 'آشٽريا',
+ 'AT' => 'آسٽريا',
'AU' => 'آسٽريليا',
'AW' => 'عروبا',
'AX' => 'الند ٻيٽ',
'AZ' => 'آذربائيجان',
- 'BA' => 'بوسنیا اور هرزیگوینا',
+ 'BA' => 'بوسنيا ۽ ھرزيگوينا',
'BB' => 'باربڊوس',
'BD' => 'بنگلاديش',
'BE' => 'بيلجيم',
@@ -749,26 +749,26 @@ $countryNames = [
'BO' => 'بوليويا',
'BQ' => 'ڪيريبين نيدرلينڊ',
'BR' => 'برازيل',
- 'BS' => 'بهاماس',
+ 'BS' => 'باهاماس',
'BT' => 'ڀوٽان',
'BV' => 'بووٽ ٻيٽ',
'BW' => 'بوٽسوانا',
'BY' => 'بیلارس',
'BZ' => 'بيليز',
- 'CA' => 'ڪئناڊا',
+ 'CA' => 'ڪينيڊا',
'CC' => 'ڪوڪوس ٻيٽ',
'CD' => 'ڪانگو -ڪنشاسا',
'CF' => 'وچ آفريقي جمهوريه',
'CG' => 'ڪانگو - برازاویل',
'CH' => 'سوئزرلينڊ',
- 'CI' => 'آئيوري ڪنارو',
+ 'CI' => 'ڪوٽ ڊي وار',
'CK' => 'ڪوڪ ٻيٽ',
'CL' => 'چلي',
'CM' => 'ڪيمرون',
'CN' => 'چين',
'CO' => 'ڪولمبيا',
'CP' => 'ڪلپرٽن ٻيٽ',
- 'CR' => 'ڪوسٽا رڪا',
+ 'CR' => 'ڪوسٽا ريڪا',
'CU' => 'ڪيوبا',
'CV' => 'ڪيپ وردي',
'CW' => 'ڪيوراسائو',
@@ -822,13 +822,13 @@ $countryNames = [
'HN' => 'هنڊورس',
'HR' => 'ڪروئيشيا',
'HT' => 'هيٽي',
- 'HU' => 'چيڪ جهموريه',
+ 'HU' => 'هنگري',
'IC' => 'ڪينري ٻيٽ',
'ID' => 'انڊونيشيا',
'IE' => 'آئرلينڊ',
'IL' => 'اسرائيل',
'IM' => 'انسانن جو ٻيٽ',
- 'IN' => 'انڊيا',
+ 'IN' => 'ڀارت',
'IO' => 'برطانوي هندي سمنڊ خطو',
'IQ' => 'عراق',
'IR' => 'ايران',
@@ -857,22 +857,22 @@ $countryNames = [
'LR' => 'لائبیریا',
'LS' => 'ليسوٿو',
'LT' => 'لٿونيا',
- 'LU' => 'لیگزمبرگ',
+ 'LU' => 'لگزمبرگ',
'LV' => 'لاتويا',
'LY' => 'لبيا',
- 'MA' => 'موروڪو',
+ 'MA' => 'مراڪش',
'MC' => 'موناڪو',
'MD' => 'مالدووا',
'ME' => 'مونٽي نيگرو',
'MF' => 'سينٽ مارٽن',
- 'MG' => 'مداگيسڪر',
- 'MH' => 'مارشل ڀيٽ',
- 'MK' => 'شمالي مقدونيا',
+ 'MG' => 'مدگاسڪر',
+ 'MH' => 'مارشل ٻيٽ',
+ 'MK' => 'اتر مقدونيا',
'ML' => 'مالي',
'MM' => 'ميانمار (برما)',
'MN' => 'منگوليا',
'MO' => 'مڪائو',
- 'MP' => 'اتر مرينا ٻيٽ',
+ 'MP' => 'اتريان ماريانا ٻيٽ',
'MQ' => 'مارتينڪ',
'MR' => 'موريتانيا',
'MS' => 'مونٽسراٽ',
@@ -922,7 +922,7 @@ $countryNames = [
'SC' => 'شي شلز',
'SD' => 'سوڊان',
'SE' => 'سوئيڊن',
- 'SG' => 'سينگاپور',
+ 'SG' => 'سنگاپور',
'SH' => 'سينٽ ھيلينا',
'SI' => 'سلوینیا',
'SJ' => 'سوالبارڊ ۽ جان ماین',
@@ -942,7 +942,7 @@ $countryNames = [
'TC' => 'ترڪ ۽ ڪيڪوس ٻيٽ',
'TD' => 'چاڊ',
'TF' => 'فرانسيسي ڏاکڻي علائقا',
- 'TG' => 'توگو',
+ 'TG' => 'ٽوگو',
'TH' => 'ٿائيليند',
'TJ' => 'تاجڪستان',
'TK' => 'ٽوڪلائو',
@@ -957,20 +957,20 @@ $countryNames = [
'TZ' => 'تنزانيا',
'UA' => 'يوڪرين',
'UG' => 'يوگنڊا',
- 'UM' => 'آمريڪي ٻاهريون ٻيٽ',
- 'UN' => 'اقوام متحده',
+ 'UM' => 'آمريڪي خارجي ٻيٽ',
+ 'UN' => 'گڏيل قومون',
'US' => 'يوايس',
'UY' => 'يوروگوءِ',
'UZ' => 'ازبڪستان',
'VA' => 'ويٽڪين سٽي',
'VC' => 'سینٽ ونسنت ۽ گریناڊینز',
- 'VE' => 'وينزيلا',
+ 'VE' => 'وينزويلا',
'VG' => 'برطانوي ورجن ٻيٽ',
'VI' => 'آمريڪي ورجن ٻيٽ',
'VN' => 'ويتنام',
'VU' => 'وينيٽيو',
'WF' => 'والس ۽ فتونا',
- 'WS' => 'سموئا',
+ 'WS' => 'ساموا',
'XA' => 'سوڊو-لهجا',
'XB' => 'سوڊو-بي ڊي',
'XK' => 'ڪوسووو',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSi.php b/MLEB/cldr/CldrNames/CldrNamesSi.php
index 3d630d66..b82f272e 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSi.php
@@ -7,7 +7,7 @@ $languageNames = [
'ada' => 'අඩන්ග්මෙ',
'ady' => 'අඩිඝෙ',
'aeb' => 'ටියුනිසියනු අරාබි',
- 'af' => 'අෆ්රිකාන්ස්',
+ 'af' => 'අෆ්‍රිකාන්ස්',
'agq' => 'ඇගම්',
'ain' => 'අයිනු',
'ak' => 'අකාන්',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSk.php b/MLEB/cldr/CldrNames/CldrNamesSk.php
index fa4e26d8..353e3f68 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSk.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSk.php
@@ -485,7 +485,7 @@ $languageNames = [
'twq' => 'tasawaq',
'ty' => 'tahitčina',
'tyv' => 'tuviančina',
- 'tzm' => 'tuaregčina (stredomarocká)',
+ 'tzm' => 'tamazight (stredomarocký)',
'udm' => 'udmurtčina',
'ug' => 'ujgurčina',
'uga' => 'ugaritčina',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSl.php b/MLEB/cldr/CldrNames/CldrNamesSl.php
index 21e36d76..6ea292b9 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSl.php
@@ -117,11 +117,12 @@ $languageNames = [
'en' => 'angleščina',
'en-au' => 'avstralska angleščina',
'en-ca' => 'kanadska angleščina',
- 'en-gb' => 'angleščina (VB)',
- 'en-us' => 'angleščina (ZDA)',
+ 'en-gb' => 'britanska angleščina',
+ 'en-us' => 'ameriška angleščina',
'enm' => 'srednja angleščina',
'eo' => 'esperanto',
'es' => 'španščina',
+ 'es-419' => 'latinskoameriška španščina',
'es-es' => 'evropska španščina',
'es-mx' => 'mehiška španščina',
'et' => 'estonščina',
@@ -173,7 +174,7 @@ $languageNames = [
'hai' => 'haidščina',
'haw' => 'havajščina',
'he' => 'hebrejščina',
- 'hi' => 'hindujščina',
+ 'hi' => 'hindijščina',
'hil' => 'hiligajnonščina',
'hit' => 'hetitščina',
'hmn' => 'hmonščina',
@@ -286,7 +287,7 @@ $languageNames = [
'men' => 'mende',
'mer' => 'meru',
'mfe' => 'morisjenščina',
- 'mg' => 'malagaščina',
+ 'mg' => 'malgaščina',
'mga' => 'srednja irščina',
'mgh' => 'makuva-meto',
'mgo' => 'meta',
@@ -478,7 +479,7 @@ $languageNames = [
'vai' => 'vajščina',
've' => 'venda',
'vi' => 'vietnamščina',
- 'vo' => 'volapuk',
+ 'vo' => 'volapik',
'vot' => 'votjaščina',
'vun' => 'vunjo',
'wa' => 'valonščina',
@@ -562,7 +563,7 @@ $currencyNames = [
'BYR' => 'beloruski rubelj (2000–2016)',
'BZD' => 'belizejski dolar',
'CAD' => 'kanadski dolar',
- 'CDF' => 'kongoški frank',
+ 'CDF' => 'kongovski frank',
'CHE' => 'evro WIR',
'CHF' => 'švicarski frank',
'CHW' => 'frank WIR',
@@ -996,7 +997,7 @@ $countryNames = [
'CA' => 'Kanada',
'CC' => 'Kokosovi otoki',
'CD' => 'Demokratična republika Kongo',
- 'CF' => 'Centralnoafriška republika',
+ 'CF' => 'Srednjeafriška republika',
'CG' => 'Kongo - Brazzaville',
'CH' => 'Švica',
'CI' => 'Slonokoščena obala',
@@ -1109,7 +1110,7 @@ $countryNames = [
'ML' => 'Mali',
'MM' => 'Mjanmar (Burma)',
'MN' => 'Mongolija',
- 'MO' => 'Posebno administrativno območje LR Kitajske Macao',
+ 'MO' => 'Macao',
'MP' => 'Severni Marianski otoki',
'MQ' => 'Martinik',
'MR' => 'Mavretanija',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSo.php b/MLEB/cldr/CldrNames/CldrNamesSo.php
index 2c35f4e8..0b1e62b3 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSo.php
@@ -61,7 +61,7 @@ $languageNames = [
'fa-af' => 'Faarsi',
'ff' => 'Fuulah',
'fi' => 'Finishka',
- 'fil' => 'Tagalog',
+ 'fil' => 'Filibiino',
'fo' => 'Farowsi',
'fr' => 'Faransiis',
'fr-ca' => 'Faransiiska Kanada',
@@ -145,6 +145,7 @@ $languageNames = [
'mk' => 'Masadooniyaan',
'ml' => 'Malayalam',
'mn' => 'Mangooli',
+ 'mni' => 'Maniburi',
'mr' => 'Maarati',
'ms' => 'Malaay',
'mt' => 'Maltiis',
@@ -171,6 +172,7 @@ $languageNames = [
'or' => 'Oodhiya',
'os' => 'Oseetic',
'pa' => 'Bunjaabi',
+ 'pcm' => 'Bidjinka Nayjeeriya',
'pl' => 'Boolish',
'prg' => 'Brashiyaanki Hore',
'ps' => 'Bashtuu',
@@ -188,6 +190,7 @@ $languageNames = [
'sa' => 'Sanskrit',
'sah' => 'Saaqa',
'saq' => 'Sambuuru',
+ 'sat' => 'Santali',
'sbp' => 'Sangu',
'sd' => 'Siindhi',
'se' => 'Koonfurta Saami',
@@ -430,7 +433,7 @@ $currencySymbols = [
$countryNames = [
'AC' => 'Jasiiradda Asensiyoon',
'AD' => 'Andora',
- 'AE' => 'Imaaraadka Carabta ee Midoobay',
+ 'AE' => 'Midawga Imaaraatka Carabta',
'AF' => 'Afgaanistaan',
'AG' => 'Antigua & Barbuuda',
'AI' => 'Anguula',
@@ -447,7 +450,7 @@ $countryNames = [
'AZ' => 'Asarbajan',
'BA' => 'Boosniya & Harsegofina',
'BB' => 'Baarbadoos',
- 'BD' => 'Bangladesh',
+ 'BD' => 'Bangaladhesh',
'BE' => 'Biljam',
'BF' => 'Burkiina Faaso',
'BG' => 'Bulgaariya',
@@ -456,7 +459,7 @@ $countryNames = [
'BJ' => 'Biniin',
'BL' => 'St. Baathelemiy',
'BM' => 'Barmuuda',
- 'BN' => 'Buruneeya',
+ 'BN' => 'Buruneey',
'BO' => 'Boliifiya',
'BQ' => 'Karibiyaan Nadarlands',
'BR' => 'Baraasiil',
@@ -580,7 +583,7 @@ $countryNames = [
'MH' => 'Jasiiradda Maarshal',
'MK' => 'Masedooniya Waqooyi',
'ML' => 'Maali',
- 'MM' => 'Miyanmar',
+ 'MM' => 'Mayanmar',
'MN' => 'Mongooliya',
'MO' => 'Makaaw',
'MP' => 'Jasiiradda Waqooyiga Mariaana',
@@ -589,10 +592,10 @@ $countryNames = [
'MS' => 'Montserrat',
'MT' => 'Maalta',
'MU' => 'Mawrishiyaas',
- 'MV' => 'Maaldiqeen',
+ 'MV' => 'Maaldiifis',
'MW' => 'Malaawi',
'MX' => 'Meksiko',
- 'MY' => 'Malaysia',
+ 'MY' => 'Malaysiya',
'MZ' => 'Musambiik',
'NA' => 'Namiibiya',
'NC' => 'Jasiiradda Niyuu Kaledooniya',
@@ -610,7 +613,7 @@ $countryNames = [
'PA' => 'Baanama',
'PE' => 'Beeru',
'PF' => 'Booliyneesiya Faransiiska',
- 'PG' => 'Babua Niyuu Gini',
+ 'PG' => 'Babwa Niyuu Gini',
'PH' => 'Filibiin',
'PK' => 'Bakistaan',
'PL' => 'Booland',
@@ -634,7 +637,7 @@ $countryNames = [
'SD' => 'Suudaan',
'SE' => 'Iswidhan',
'SG' => 'Singaboor',
- 'SH' => 'Saint Helena',
+ 'SH' => 'Saynt Helena',
'SI' => 'Islofeeniya',
'SJ' => 'Jasiiradda Sfaldbaad & Jaan Mayen',
'SK' => 'Islofaakiya',
@@ -672,7 +675,7 @@ $countryNames = [
'UN' => 'Qaramada Midoobay',
'US' => 'Maraykanka',
'UY' => 'Uruguwaay',
- 'UZ' => 'Uusbakistaan',
+ 'UZ' => 'Usbakistan',
'VA' => 'Faatikaan',
'VC' => 'St. Finsent & Girenadiins',
'VE' => 'Fenisuweela',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSr_ec.php b/MLEB/cldr/CldrNames/CldrNamesSr_ec.php
index 8c63e669..903267e8 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSr_ec.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSr_ec.php
@@ -92,6 +92,7 @@ $languageNames = [
'dar' => 'даргински',
'dav' => 'таита',
'de' => 'немачки',
+ 'de-at' => 'аустријски немачки',
'de-ch' => 'швајцарски високи немачки',
'del' => 'делаверски',
'den' => 'слејви',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSu.php b/MLEB/cldr/CldrNames/CldrNamesSu.php
index 61deca03..35edde29 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSu.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSu.php
@@ -7,7 +7,6 @@ $languageNames = [
'en' => 'Inggris',
'en-au' => 'Inggris Australia',
'en-ca' => 'Inggris Kanada',
- 'en-gb' => 'Inggris Inggris',
'en-us' => 'Inggris Amerika',
'es' => 'Spanyol',
'es-419' => 'Spanyol Amérika Latin',
@@ -23,7 +22,7 @@ $languageNames = [
'pt-pt' => 'Portugis Éropa',
'ru' => 'Rusia',
'su' => 'Basa Sunda',
- 'und' => 'Teu Dipikaterang',
+ 'und' => 'Basa teu dikenal',
'zh' => 'Tiongkok',
'zh-hans' => 'Tiongkok Sederhana',
'zh-hant' => 'Tiongkok Tradisional',
@@ -39,6 +38,7 @@ $currencyNames = [
'JPY' => 'Yén Jepang',
'RUB' => 'Rubel Rusia',
'USD' => 'Dolar A.S.',
+ 'XXX' => 'Mata Uang Teu Dikenal',
];
$currencySymbols = [
@@ -58,7 +58,7 @@ $countryNames = [
'CN' => 'Tiongkok',
'DE' => 'Jérman',
'FR' => 'Prancis',
- 'GB' => 'Inggris Raya',
+ 'GB' => 'Britania Raya',
'IN' => 'India',
'IT' => 'Italia',
'JP' => 'Jepang',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSv.php b/MLEB/cldr/CldrNames/CldrNamesSv.php
index ad8d8a7a..37d536ca 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSv.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSv.php
@@ -426,7 +426,7 @@ $languageNames = [
'pap' => 'papiamento',
'pau' => 'palau',
'pcd' => 'pikardiska',
- 'pcm' => 'Nigeria-pidgin',
+ 'pcm' => 'nigeriansk pidgin',
'pdc' => 'Pennsylvaniatyska',
'pdt' => 'mennonitisk lågtyska',
'peo' => 'fornpersiska',
@@ -485,7 +485,7 @@ $languageNames = [
'seh' => 'sena',
'sei' => 'seri',
'sel' => 'selkup',
- 'ses' => 'Gao-songhai',
+ 'ses' => 'songhai',
'sg' => 'sango',
'sga' => 'forniriska',
'sgs' => 'samogitiska',
@@ -622,13 +622,13 @@ $languageNames = [
$currencyNames = [
'ADP' => 'andorransk peseta',
- 'AED' => 'Förenade Arabemiratens dirham',
+ 'AED' => 'emiratisk dirham',
'AFA' => 'afghani (1927–2002)',
'AFN' => 'afghansk afghani',
'ALK' => 'albansk lek (1946–1965)',
'ALL' => 'albansk lek',
'AMD' => 'armenisk dram',
- 'ANG' => 'Nederländska Antillernas gulden',
+ 'ANG' => 'Antillergulden',
'AOA' => 'angolansk kwanza',
'AOK' => 'angolansk kwanza (1977–1990)',
'AON' => 'angolansk ny kwanza (1990–2000)',
@@ -646,7 +646,7 @@ $currencyNames = [
'BAD' => 'bosnisk-hercegovinsk dinar (1992–1994)',
'BAM' => 'bosnisk-hercegovinsk mark (konvertibel)',
'BAN' => 'bosnisk-hercegovinsk dinar (1994–1998)',
- 'BBD' => 'Barbados-dollar',
+ 'BBD' => 'barbadisk dollar',
'BDT' => 'bangladeshisk taka',
'BEC' => 'belgisk franc (konvertibel)',
'BEF' => 'belgisk franc',
@@ -657,7 +657,7 @@ $currencyNames = [
'BGO' => 'bulgarisk lev (1881–1952)',
'BHD' => 'bahrainsk dinar',
'BIF' => 'burundisk franc',
- 'BMD' => 'Bermuda-dollar',
+ 'BMD' => 'bermudisk dollar',
'BND' => 'bruneisk dollar',
'BOB' => 'boliviansk boliviano',
'BOL' => 'boliviansk boliviano (1864–1963)',
@@ -751,7 +751,7 @@ $currencyNames = [
'ISJ' => 'isländsk gammal krona',
'ISK' => 'isländsk krona',
'ITL' => 'italiensk lire',
- 'JMD' => 'Jamaica-dollar',
+ 'JMD' => 'jamaicansk dollar',
'JOD' => 'jordansk dinar',
'JPY' => 'japansk yen',
'KES' => 'kenyansk shilling',
@@ -763,7 +763,7 @@ $currencyNames = [
'KRO' => 'sydkoreansk won (1945–1953)',
'KRW' => 'sydkoreansk won',
'KWD' => 'kuwaitisk dinar',
- 'KYD' => 'Cayman-dollar',
+ 'KYD' => 'caymansk dollar',
'KZT' => 'kazakisk tenge',
'LAK' => 'laotisk kip',
'LBP' => 'libanesiskt pund',
@@ -842,7 +842,7 @@ $currencyNames = [
'SDP' => 'sudanskt pund (1916–1992)',
'SEK' => 'svensk krona',
'SGD' => 'singaporiansk dollar',
- 'SHP' => 'S:t Helena-pund',
+ 'SHP' => 'sankthelenskt pund',
'SIT' => 'slovensk tolar',
'SKK' => 'slovakisk koruna',
'SLL' => 'sierraleonsk leone',
@@ -866,14 +866,14 @@ $currencyNames = [
'TPE' => 'östtimoresisk escudo',
'TRL' => 'turkisk lire (1922–2005)',
'TRY' => 'turkisk lira',
- 'TTD' => 'Trinidad och Tobago-dollar',
- 'TWD' => 'Taiwandollar',
+ 'TTD' => 'Trinidaddollar',
+ 'TWD' => 'taiwanesisk dollar',
'TZS' => 'tanzanisk shilling',
'UAH' => 'ukrainsk hryvnia',
'UAK' => 'ukrainsk karbovanetz',
'UGS' => 'ugandisk shilling (1966–1987)',
'UGX' => 'ugandisk shilling',
- 'USD' => 'US-dollar',
+ 'USD' => 'amerikansk dollar',
'USN' => 'US-dollar (nästa dag)',
'USS' => 'US-dollar (samma dag)',
'UYI' => 'uruguayansk peso en unidades indexadas',
@@ -1179,7 +1179,7 @@ $countryNames = [
'ES' => 'Spanien',
'ET' => 'Etiopien',
'EU' => 'Europeiska unionen',
- 'EZ' => 'eurozonen',
+ 'EZ' => 'euroområdet',
'FI' => 'Finland',
'FJ' => 'Fiji',
'FK' => 'Falklandsöarna',
@@ -1333,7 +1333,7 @@ $countryNames = [
'TG' => 'Togo',
'TH' => 'Thailand',
'TJ' => 'Tadzjikistan',
- 'TK' => 'Tokelau',
+ 'TK' => 'Tokelauöarna',
'TL' => 'Östtimor',
'TM' => 'Turkmenistan',
'TN' => 'Tunisien',
diff --git a/MLEB/cldr/CldrNames/CldrNamesSw.php b/MLEB/cldr/CldrNames/CldrNamesSw.php
index 183d859b..55f81eb0 100644
--- a/MLEB/cldr/CldrNames/CldrNamesSw.php
+++ b/MLEB/cldr/CldrNames/CldrNamesSw.php
@@ -108,6 +108,7 @@ $languageNames = [
'eu' => 'Kibaski',
'ewo' => 'Kiewondo',
'fa' => 'Kiajemi',
+ 'fa-af' => 'Kiajemi (Afganistani)',
'ff' => 'Kifulani',
'fi' => 'Kifini',
'fil' => 'Kifilipino',
@@ -144,7 +145,7 @@ $languageNames = [
'hil' => 'Kihiligaynon',
'hit' => 'Kihiti',
'hmn' => 'Kihmong',
- 'hr' => 'Kikroeshia',
+ 'hr' => 'Kikorasia',
'hsb' => 'Kisobia cha Ukanda wa Juu',
'ht' => 'Kihaiti',
'hu' => 'Kihungaria',
@@ -182,7 +183,7 @@ $languageNames = [
'kfo' => 'Kikoro',
'kg' => 'Kikongo',
'kha' => 'Kikhasi',
- 'khq' => 'Koyra Chiini',
+ 'khq' => 'Kikoyra Chiini',
'ki' => 'Kikikuyu',
'kj' => 'Kikwanyama',
'kk' => 'Kikazakh',
@@ -259,7 +260,7 @@ $languageNames = [
'ms' => 'Kimalei',
'mt' => 'Kimalta',
'mua' => 'Kimundang',
- 'mul' => 'Lugha Nyingi',
+ 'mul' => 'Lugha nyingi',
'mus' => 'Kikriki',
'mwl' => 'Kimirandi',
'my' => 'Kiburma',
@@ -309,6 +310,7 @@ $languageNames = [
'prg' => 'Kiprussia',
'ps' => 'Kipashto',
'pt' => 'Kireno',
+ 'pt-br' => 'Kireno (Brazili)',
'pt-pt' => 'Kireno (Ulaya)',
'qu' => 'Kikechua',
'quc' => 'Kʼicheʼ',
@@ -338,7 +340,7 @@ $languageNames = [
'sdh' => 'Kikurdi cha Kusini',
'se' => 'Kisami cha Kaskazini',
'seh' => 'Kisena',
- 'ses' => 'Koyraboro Senni',
+ 'ses' => 'Kikoyraboro Senni',
'sg' => 'Kisango',
'sh' => 'Kiserbia-kroeshia',
'shi' => 'Kitachelhit',
@@ -389,7 +391,7 @@ $languageNames = [
'tum' => 'Kitumbuka',
'tvl' => 'Kituvalu',
'tw' => 'Twi',
- 'twq' => 'Kitasawaq',
+ 'twq' => 'Kitasawak',
'ty' => 'Kitahiti',
'tyv' => 'Kituva',
'tzm' => 'Kitamazighati cha Atlasi ya Kati',
@@ -397,7 +399,7 @@ $languageNames = [
'ug' => 'Kiuyghur',
'uk' => 'Kiukraini',
'umb' => 'Umbundu',
- 'und' => 'Lugha Isiyojulikana',
+ 'und' => 'Lugha isiyojulikana',
'ur' => 'Kiurdu',
'uz' => 'Kiuzbeki',
'vai' => 'Kivai',
@@ -437,7 +439,7 @@ $currencyNames = [
'AMD' => 'Dram ya Armenia',
'ANG' => 'Guilder ya Antili za Kiholanzi',
'AOA' => 'Kwanza ya Angola',
- 'ARS' => 'Peso ya Argentina',
+ 'ARS' => 'Peso ya Ajentina',
'AUD' => 'Dola ya Australia',
'AWG' => 'Florin ya Aruba',
'AZN' => 'Manat ya Azerbaijan',
@@ -445,7 +447,7 @@ $currencyNames = [
'BBD' => 'Dola ya Barbados',
'BDT' => 'Taka ya Bangladesh',
'BGN' => 'Lev ya Bulgaria',
- 'BHD' => 'Dinar ya Bahrain',
+ 'BHD' => 'Dinari ya Bahareni',
'BIF' => 'Faranga ya Burundi',
'BMD' => 'Dola ya Bermuda',
'BND' => 'Dola ya Brunei',
@@ -463,15 +465,15 @@ $currencyNames = [
'CLP' => 'Peso ya Chile',
'CNH' => 'Yuan ya Uchina (huru)',
'CNY' => 'Yuan ya Uchina',
- 'COP' => 'Peso ya Colombia',
- 'CRC' => 'Colon ya Costa Rica',
- 'CUC' => 'Peso ya Cuba Inayoweza Kubadilishwa',
- 'CUP' => 'Peso ya Cuba',
+ 'COP' => 'Peso ya Kolombia',
+ 'CRC' => 'Colon ya Kostarika',
+ 'CUC' => 'Peso ya Kuba Inayoweza Kubadilishwa',
+ 'CUP' => 'Peso ya Kuba',
'CVE' => 'Eskudo ya Cape Verde',
- 'CZK' => 'koruna ya Jamhuri ya Czech',
- 'DJF' => 'Faranga ya Djibouti',
+ 'CZK' => 'Koruna ya Jamhuri ya Czech',
+ 'DJF' => 'Faranga ya Jibuti',
'DKK' => 'Krone ya Denmark',
- 'DOP' => 'Peso ya Dominica',
+ 'DOP' => 'Peso ya Dominika',
'DZD' => 'Dinar ya Aljeria',
'EGP' => 'Pauni ya Misri',
'ERN' => 'Nakfa ya Eritrea',
@@ -480,7 +482,7 @@ $currencyNames = [
'FJD' => 'Dola ya Fiji',
'FKP' => 'Pauni ya Visiwa vya Falkland',
'GBP' => 'Pauni ya Uingereza',
- 'GEL' => 'Lari ya Georgia',
+ 'GEL' => 'Lari ya Jojia',
'GHC' => 'Sedi ya Ghana',
'GHS' => 'Cedi ya Ghana',
'GIP' => 'Pauni ya Gibraltar',
@@ -491,25 +493,25 @@ $currencyNames = [
'GYD' => 'Dola ya Guyana',
'HKD' => 'Dola ya Hong Kong',
'HNL' => 'Lempira ya Hondurasi',
- 'HRK' => 'Kuna ya Croatia',
+ 'HRK' => 'Kuna ya Korasia',
'HTG' => 'Gourde ya Haiti',
'HUF' => 'Forint ya Hungaria',
'IDR' => 'Rupiah ya Indonesia',
'ILS' => 'Shekeli Mpya ya Israel',
'INR' => 'Rupia ya India',
- 'IQD' => 'Dinar ya Iraq',
+ 'IQD' => 'Dinari ya Iraki',
'IRR' => 'Rial ya Iran',
'ISK' => 'Krona ya Aisilandi',
- 'JMD' => 'Dola ya Jamaica',
- 'JOD' => 'Dinar ya Jordan',
- 'JPY' => 'Yen ya Ujapani',
+ 'JMD' => 'Dola ya Jamaika',
+ 'JOD' => 'Dinari ya Jordan',
+ 'JPY' => 'Yen ya Japani',
'KES' => 'Shilingi ya Kenya',
'KGS' => 'Som ya Kyrgystan',
- 'KHR' => 'Riel ya Cambodia',
- 'KMF' => 'Faranga ya Comoros',
+ 'KHR' => 'Riel ya Kambodia',
+ 'KMF' => 'Faranga ya Komoro',
'KPW' => 'Won ya Korea Kaskazini',
'KRW' => 'Won ya Korea Kusini',
- 'KWD' => 'Dinar ya Kuwait',
+ 'KWD' => 'Dinari ya Kuwait',
'KYD' => 'Dola ya Visiwa vya Cayman',
'KZT' => 'Tenge ya Kazakhstan',
'LAK' => 'Kip ya Laosi',
@@ -520,28 +522,28 @@ $currencyNames = [
'LTL' => 'Litas ya Lithuania',
'LVL' => 'Lats ya Lativia',
'LYD' => 'Dinari ya Libya',
- 'MAD' => 'Dirham ya Morocco',
+ 'MAD' => 'Dirham ya Moroko',
'MDL' => 'Leu ya Moldova',
- 'MGA' => 'Ariari ya Madagascar',
- 'MKD' => 'Denar ya Macedonia',
+ 'MGA' => 'Ariari ya Madagaska',
+ 'MKD' => 'Denar ya Masedonia',
'MMK' => 'Kyat ya Myanmar',
'MNT' => 'Tugrik ya Mongolia',
'MOP' => 'Pataca ya Macau',
'MRO' => 'Ouguiya ya Mauritania (1973–2017)',
- 'MRU' => 'Ouguiya ya Mauritania',
- 'MUR' => 'Rupia ya Mauritius',
+ 'MRU' => 'Ouguiya ya Moritania',
+ 'MUR' => 'Rupia ya Morisi',
'MVR' => 'Rufiyaa ya Maldives',
'MWK' => 'Kwacha ya Malawi',
- 'MXN' => 'Peso ya Mexico',
+ 'MXN' => 'Peso ya Meksiko',
'MYR' => 'Ringgit ya Malaysia',
'MZM' => 'Metikali ya Msumbiji (1980–2006)',
'MZN' => 'Metikali ya Msumbiji',
'NAD' => 'Dola ya Namibia',
'NGN' => 'Naira ya Nigeria',
- 'NIO' => 'Cordoba ya Nicaragua',
- 'NOK' => 'Krone ya Norway',
+ 'NIO' => 'Cordoba ya Nikaragwa',
+ 'NOK' => 'Krone ya Norwe',
'NPR' => 'Rupia ya Nepal',
- 'NZD' => 'Dola ya New Zealand',
+ 'NZD' => 'Dola ya Nyuzilandi',
'OMR' => 'Rial ya Omani',
'PAB' => 'Balboa ya Panama',
'PEN' => 'Sol ya Peru',
@@ -549,7 +551,7 @@ $currencyNames = [
'PHP' => 'Peso ya Ufilipino',
'PKR' => 'Rupia ya Pakistan',
'PLN' => 'Zloty ya Poland',
- 'PYG' => 'Guarani ya Paraguay',
+ 'PYG' => 'Guarani ya Paragwai',
'QAR' => 'Rial ya Qatar',
'RON' => 'Leu ya Romania',
'RSD' => 'Dinar ya Serbia',
@@ -563,14 +565,14 @@ $currencyNames = [
'SEK' => 'Krona ya Uswidi',
'SGD' => 'Dola ya Singapore',
'SHP' => 'Pauni ya St. Helena',
- 'SLL' => 'Leone',
+ 'SLL' => 'Leone ya Siera Leoni',
'SOS' => 'Shilingi ya Somalia',
'SRD' => 'Dola ya Suriname',
'SSP' => 'Pauni ya Sudan Kusini',
'STD' => 'Dobra ya Sao Tome na Principe (1977–2017)',
'STN' => 'Dobra ya Sao Tome na Principe',
'SYP' => 'Pauni ya Syria',
- 'SZL' => 'Lilangeni',
+ 'SZL' => 'Lilangeni ya Uswazi',
'THB' => 'Baht ya Tailandi',
'TJS' => 'Somoni ya Tajikistan',
'TMT' => 'Manat ya Turkmenistan',
@@ -583,7 +585,7 @@ $currencyNames = [
'UAH' => 'Hryvnia ya Ukraine',
'UGX' => 'Shilingi ya Uganda',
'USD' => 'Dola ya Marekani',
- 'UYU' => 'Peso ya Uruguay',
+ 'UYU' => 'Peso ya Urugwai',
'UZS' => 'Som ya Uzbekistan',
'VEF' => 'Bolivar ya Venezuela (2008–2018)',
'VES' => 'Bolivar ya Venezuela',
@@ -591,7 +593,7 @@ $currencyNames = [
'VUV' => 'Vatu ya Vanuatu',
'WST' => 'Tala ya Samoa',
'XAF' => 'Faranga ya Afrika ya Kati CFA',
- 'XCD' => 'Dola ya Caribbean Mashariki',
+ 'XCD' => 'Dola ya Karibi Mashariki',
'XOF' => 'Faranga ya Afrika Magharibi CFA',
'XPF' => 'Faranga ya CFP',
'XXX' => 'Sarafu isiyojulikana',
@@ -819,16 +821,16 @@ $countryNames = [
'CO' => 'Kolombia',
'CP' => 'Kisiwa cha Clipperton',
'CR' => 'Kostarika',
- 'CU' => 'Cuba',
+ 'CU' => 'Kuba',
'CV' => 'Cape Verde',
'CW' => 'Curacao',
'CX' => 'Kisiwa cha Krismasi',
- 'CY' => 'Cyprus',
+ 'CY' => 'Saiprasi',
'CZ' => 'Chechia',
'DE' => 'Ujerumani',
'DG' => 'Diego Garcia',
'DJ' => 'Jibuti',
- 'DK' => 'Denmark',
+ 'DK' => 'Denmaki',
'DM' => 'Dominika',
'DO' => 'Jamhuri ya Dominika',
'DZ' => 'Aljeria',
@@ -845,7 +847,7 @@ $countryNames = [
'FI' => 'Ufini',
'FJ' => 'Fiji',
'FK' => 'Visiwa vya Falkland',
- 'FM' => 'Micronesia',
+ 'FM' => 'Mikronesia',
'FO' => 'Visiwa vya Faroe',
'FR' => 'Ufaransa',
'GA' => 'Gabon',
@@ -928,7 +930,7 @@ $countryNames = [
'MS' => 'Montserrat',
'MT' => 'Malta',
'MU' => 'Morisi',
- 'MV' => 'Maldives',
+ 'MV' => 'Maldivi',
'MW' => 'Malawi',
'MX' => 'Meksiko',
'MY' => 'Malesia',
@@ -983,11 +985,11 @@ $countryNames = [
'SO' => 'Somalia',
'SR' => 'Suriname',
'SS' => 'Sudan Kusini',
- 'ST' => 'São Tomé na Príncipe',
+ 'ST' => 'Sao Tome na Principe',
'SV' => 'El Salvador',
'SX' => 'Sint Maarten',
'SY' => 'Syria',
- 'SZ' => 'Uswazi',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Visiwa vya Turks na Caicos',
'TD' => 'Chad',
@@ -1017,7 +1019,7 @@ $countryNames = [
'VE' => 'Venezuela',
'VG' => 'Visiwa vya Virgin, Uingereza',
'VI' => 'Visiwa vya Virgin, Marekani',
- 'VN' => 'Vietnam',
+ 'VN' => 'Vietnamu',
'VU' => 'Vanuatu',
'WF' => 'Wallis na Futuna',
'WS' => 'Samoa',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTe.php b/MLEB/cldr/CldrNames/CldrNamesTe.php
index a30ed2db..766913f0 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTe.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTe.php
@@ -68,7 +68,7 @@ $languageNames = [
'ccp' => 'చక్మా',
'ce' => 'చెచెన్',
'ceb' => 'సెబువానో',
- 'cgg' => 'ఛిగా',
+ 'cgg' => 'చిగా',
'ch' => 'చమర్రో',
'chb' => 'చిబ్చా',
'chg' => 'చాగటై',
@@ -118,7 +118,7 @@ $languageNames = [
'eka' => 'ఏకాజక్',
'el' => 'గ్రీక్',
'elx' => 'ఎలామైట్',
- 'en' => 'ఆంగ్లం',
+ 'en' => 'ఇంగ్లీష్',
'en-au' => 'ఆస్ట్రేలియన్ ఇంగ్లీష్',
'en-ca' => 'కెనడియన్ ఇంగ్లీష్',
'en-gb' => 'బ్రిటిష్ ఇంగ్లీష్',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTg_cyrl.php b/MLEB/cldr/CldrNames/CldrNamesTg_cyrl.php
index fe05a975..ab765e2b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTg_cyrl.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTg_cyrl.php
@@ -152,7 +152,7 @@ $languageNames = [
'to' => 'тонганӣ',
'tr' => 'туркӣ',
'tt' => 'тоторӣ',
- 'tzm' => 'тамазайти атласи марказӣ',
+ 'tzm' => 'тамазайти Атласи Марказӣ',
'ug' => 'ӯйғурӣ',
'uk' => 'украинӣ',
'und' => 'забони номаълум',
@@ -442,3 +442,94 @@ $countryNames = [
'ZM' => 'Замбия',
'ZW' => 'Зимбабве',
];
+
+$timeUnits = [
+ 'day-future-other' => 'пас аз {0} рӯз',
+ 'day-narrow-future-other' => 'пас аз {0} рӯз',
+ 'day-narrow-past-other' => '{0} рӯз пеш',
+ 'day-past-other' => '{0} рӯз пеш',
+ 'day-short-future-other' => 'пас аз {0} рӯз',
+ 'day-short-past-other' => '{0} рӯз пеш',
+ 'fri-future-other' => 'пас аз {0} ҷумъа',
+ 'fri-narrow-future-other' => 'пас аз {0} ҷмъ',
+ 'fri-narrow-past-other' => '{0} ҷмъ пеш',
+ 'fri-past-other' => '{0} ҷумъа пеш',
+ 'fri-short-future-other' => 'пас аз {0} ҷмъ',
+ 'fri-short-past-other' => '{0} ҷмъ пеш',
+ 'hour-future-other' => 'пас аз {0} соат',
+ 'hour-narrow-future-other' => 'пас аз {0} ст.',
+ 'hour-narrow-past-other' => '{0} ст. пеш',
+ 'hour-past-other' => '{0} соат пеш',
+ 'hour-short-future-other' => 'пас аз {0} ст.',
+ 'hour-short-past-other' => '{0} ст. пеш',
+ 'minute-future-other' => 'пас аз {0} дақиқа',
+ 'minute-narrow-future-other' => 'пас аз {0} дақ.',
+ 'minute-narrow-past-other' => '{0} дақ. пеш',
+ 'minute-past-other' => '{0} дақиқа пеш',
+ 'minute-short-future-other' => 'пас аз {0} дақ.',
+ 'minute-short-past-other' => '{0} дақ. пеш',
+ 'mon-future-other' => 'пас аз {0} душанбе',
+ 'mon-narrow-future-other' => 'пас аз {0} дшб',
+ 'mon-narrow-past-other' => '{0} дшб пеш',
+ 'mon-past-other' => '{0} душанбе пеш',
+ 'mon-short-future-other' => 'пас аз {0} дшб',
+ 'mon-short-past-other' => '{0} дшб пеш',
+ 'month-future-other' => 'пас аз {0} моҳ',
+ 'month-narrow-future-other' => 'пас аз {0} м.',
+ 'month-narrow-past-other' => '{0} м. пеш',
+ 'month-past-other' => '{0} моҳ пеш',
+ 'month-short-future-other' => 'пас аз {0} м.',
+ 'month-short-past-other' => '{0} м. пеш',
+ 'quarter-future-other' => 'пас аз {0} чоряк',
+ 'quarter-past-other' => '{0} чоряк пеш',
+ 'quarter-short-future-other' => 'пас аз {0} чр.',
+ 'quarter-short-past-other' => '{0} чр. пеш',
+ 'sat-future-other' => 'пас аз {0} шанбе',
+ 'sat-narrow-future-other' => 'пас аз {0} шнб',
+ 'sat-narrow-past-other' => '{0} шнб пеш',
+ 'sat-past-other' => '{0} шанбе пеш',
+ 'sat-short-future-other' => 'пас аз {0} шнб',
+ 'sat-short-past-other' => '{0} шнб пеш',
+ 'second-future-other' => 'пас аз {0} сония',
+ 'second-narrow-future-other' => 'пас аз {0} сон.',
+ 'second-narrow-past-other' => '{0} сон. пеш',
+ 'second-past-other' => '{0} сония пеш',
+ 'second-short-future-other' => 'пас аз {0} сон.',
+ 'second-short-past-other' => '{0} сон. пеш',
+ 'sun-future-other' => 'пас аз {0} якшанбе',
+ 'sun-narrow-future-other' => 'пас аз {0} яшб',
+ 'sun-narrow-past-other' => '{0} ябш пеш',
+ 'sun-past-other' => '{0} якшанбе пеш',
+ 'sun-short-future-other' => 'пас аз {0} яшб',
+ 'sun-short-past-other' => '{0} яшб. пеш',
+ 'thu-future-other' => 'пас аз {0} панҷшанбе',
+ 'thu-narrow-future-other' => 'пас аз {0} пшб',
+ 'thu-narrow-past-other' => '{0} пшб пеш',
+ 'thu-past-other' => '{0} панҷшанбе пеш',
+ 'thu-short-future-other' => 'пас аз {0} пшб',
+ 'thu-short-past-other' => '{0} пшб пеш',
+ 'tue-future-other' => 'пас аз {0} сешанбе',
+ 'tue-narrow-future-other' => 'пас аз {0} сшб',
+ 'tue-narrow-past-other' => '{0} сшб пеш',
+ 'tue-past-other' => '{0} сешанбе пеш',
+ 'tue-short-future-other' => 'пас аз {0} сшб',
+ 'tue-short-past-other' => '{0} сшб пеш',
+ 'wed-future-other' => 'пас аз {0} чоршанбе',
+ 'wed-narrow-future-other' => 'пас аз {0} чшб',
+ 'wed-narrow-past-other' => '{0} чшб пеш',
+ 'wed-past-other' => '{0} чоршанбе пеш',
+ 'wed-short-future-other' => 'пас аз {0} чшб',
+ 'wed-short-past-other' => '{0} чшб пеш',
+ 'week-future-other' => 'пас аз {0} ҳафта',
+ 'week-narrow-future-other' => 'пас аз {0} ҳ.',
+ 'week-narrow-past-other' => '{0} ҳ. пеш',
+ 'week-past-other' => '{0} ҳафта пеш',
+ 'week-short-future-other' => 'пас аз {0} ҳ.',
+ 'week-short-past-other' => '{0} ҳ. пеш',
+ 'year-future-other' => 'пас аз {0} сол',
+ 'year-narrow-future-other' => 'пас аз {0} с.',
+ 'year-narrow-past-other' => '{0} с. пеш',
+ 'year-past-other' => '{0} сол пеш',
+ 'year-short-future-other' => 'пас аз {0} с.',
+ 'year-short-past-other' => '{0} с. пеш',
+];
diff --git a/MLEB/cldr/CldrNames/CldrNamesTh.php b/MLEB/cldr/CldrNames/CldrNamesTh.php
index 0bdb11e6..b2454136 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTh.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTh.php
@@ -148,7 +148,7 @@ $languageNames = [
'en-au' => 'อังกฤษ - ออสเตรเลีย',
'en-ca' => 'อังกฤษ - แคนาดา',
'en-gb' => 'อังกฤษ - สหราชอาณาจักร',
- 'en-us' => 'อังกฤษ - อเมริกัน',
+ 'en-us' => 'อังกฤษ - สหรัฐอเมริกา',
'enm' => 'อังกฤษกลาง',
'eo' => 'เอสเปรันโต',
'es' => 'สเปน',
@@ -612,8 +612,8 @@ $languageNames = [
'zen' => 'เซนากา',
'zgh' => 'ทามาไซต์โมร็อกโกมาตรฐาน',
'zh' => 'จีน',
- 'zh-hans' => 'จีนประยุกต์',
- 'zh-hant' => 'จีนดั้งเดิม',
+ 'zh-hans' => 'จีนตัวย่อ',
+ 'zh-hant' => 'จีนตัวเต็ม',
'zu' => 'ซูลู',
'zun' => 'ซูนิ',
'zxx' => 'ไม่มีข้อมูลภาษา',
@@ -1373,7 +1373,7 @@ $countryNames = [
'MH' => 'หมู่เกาะมาร์แชลล์',
'MK' => 'มาซิโดเนียเหนือ',
'ML' => 'มาลี',
- 'MM' => 'เมียนมาร์ (พม่า)',
+ 'MM' => 'เมียนมา (พม่า)',
'MN' => 'มองโกเลีย',
'MO' => 'มาเก๊า',
'MP' => 'หมู่เกาะนอร์เทิร์นมาเรียนา',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTi.php b/MLEB/cldr/CldrNames/CldrNamesTi.php
index 3e1c1db2..fda60142 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTi.php
@@ -1,97 +1,98 @@
<?php
$languageNames = [
- 'af' => 'አፍሪቃንሰኛ',
- 'am' => 'አምሐረኛ',
- 'ar' => 'ዓረበኛ',
- 'az' => 'አዜርባይጃንኛ',
- 'be' => 'ቤላራሻኛ',
+ 'af' => 'ኣፍሪከንስ',
+ 'am' => 'ኣምሓርኛ',
+ 'ar' => 'ዓረብ',
+ 'az' => 'ኣዘርባጃን',
+ 'be' => 'ቤላሩስ',
'bg' => 'ቡልጋሪኛ',
- 'bn' => 'በንጋሊኛ',
+ 'bn' => 'ባንጋላ',
'br' => 'ብሬቶን',
'bs' => 'ቦስኒያን',
'ca' => 'ካታላን',
- 'cs' => 'ቼክኛ',
+ 'cs' => 'ቼክ',
'cy' => 'ወልሽ',
- 'da' => 'ዴኒሽ',
+ 'da' => 'ዳኒሽ',
'de' => 'ጀርመን',
- 'el' => 'ግሪከኛ',
- 'en' => 'እንግሊዝኛ',
+ 'el' => 'ግሪክ',
+ 'en' => 'እንግሊዝ',
'eo' => 'ኤስፐራንቶ',
'es' => 'ስፓኒሽ',
+ 'es-419' => 'ስፓኒሽ (የላቲን አሜሪካ)',
'et' => 'ኤስቶኒአን',
- 'eu' => 'ባስክኛ',
- 'fa' => 'ፐርሲያኛ',
+ 'eu' => 'ባስክ',
+ 'fa' => 'ፋርስ',
'fi' => 'ፊኒሽ',
- 'fil' => 'ታጋሎገኛ',
- 'fo' => 'ፋሮኛ',
- 'fr' => 'ፈረንሳይኛ',
- 'fy' => 'ፍሪሰኛ',
+ 'fil' => 'ፊሊፕን',
+ 'fo' => 'ፋሮስ',
+ 'fr' => 'ፈረንሳይን',
+ 'fy' => 'ምዕራባዊ ፍሪሰኛ',
'ga' => 'አይሪሽ',
- 'gd' => 'እስኮትስ ጌልክኛ',
- 'gl' => 'ጋለቪኛ',
+ 'gd' => 'ስኮቲሽ ጋአሊክ',
+ 'gl' => 'ጋሊሻን',
'gn' => 'ጓራኒ',
- 'gu' => 'ጉጃራቲኛ',
- 'he' => 'ዕብራስጥ',
- 'hi' => 'ሕንደኛ',
- 'hr' => 'ክሮሽያንኛ',
- 'hu' => 'ሀንጋሪኛ',
+ 'gu' => 'ጉጃራቲ',
+ 'he' => 'እብራይስጥ',
+ 'hi' => 'ህንዲ',
+ 'hr' => 'ሮኤሽያን',
+ 'hu' => 'ሃንጋሪ',
'ia' => 'ኢንቴር ቋንቋ',
- 'id' => 'እንዶኑሲኛ',
- 'is' => 'አይስላንደኛ',
- 'it' => 'ጣሊያንኛ',
- 'ja' => 'ጃፓንኛ',
- 'jv' => 'ጃቫንኛ',
- 'ka' => 'ጊዮርጊያኛ',
+ 'id' => 'ኢንዶኔዥያን',
+ 'is' => 'ኣይስላንዲክ',
+ 'it' => 'ጥልያን',
+ 'ja' => 'ጃፓን',
+ 'jv' => 'ጃቫን',
+ 'ka' => 'ጆርጅየን',
'kn' => 'ካማደኛ',
'ko' => 'ኮሪያኛ',
'ku' => 'ኩርድሽ',
'ky' => 'ኪሩጋዚ',
'la' => 'ላቲንኛ',
- 'lt' => 'ሊቱአኒየን',
+ 'lt' => 'ሊቱወኒየን',
'lv' => 'ላቲቪያን',
- 'mk' => 'ማክዶኒኛ',
- 'ml' => 'ማላያላምኛ',
+ 'mk' => 'መቆዶኒኛ',
+ 'ml' => 'ማላይያላም',
'mr' => 'ማራቲኛ',
- 'ms' => 'ማላይኛ',
- 'mt' => 'ማልቲስኛ',
- 'ne' => 'ኔፖሊኛ',
+ 'ms' => 'ማላይ',
+ 'mt' => 'ማልተዘ',
+ 'ne' => 'ኔፓሊ',
'nl' => 'ደች',
- 'nn' => 'ኖርዌይኛ (ናይ ኝኖርስክ)',
- 'no' => 'ኖርዌጂያን',
+ 'nn' => 'ርዌጂያን (ናይ ኝኖርስክ)',
+ 'no' => 'ርዌጂያን',
'oc' => 'ኦኪታንኛ',
- 'or' => 'ኦሪያ',
- 'pa' => 'ፑንጃቢኛ',
+ 'or' => 'ኦዲያ',
+ 'pa' => 'ፑንጃቢ',
'pl' => 'ፖሊሽ',
'ps' => 'ፓሽቶ',
- 'pt' => 'ፖርቱጋሊኛ',
- 'pt-br' => 'ፖርቱጋልኛ (ናይ ብራዚል)',
- 'pt-pt' => 'ፖርቱጋልኛ (ናይ ፖርቱጋል)',
+ 'pt' => 'ፖርቹጋል',
+ 'pt-br' => 'ፖርቹጋል (ናይ ብራዚል)',
+ 'pt-pt' => 'ፖርቹጋል (ናይ ፖርቱጋል)',
'ro' => 'ሮማኒያን',
- 'ru' => 'ራሽኛ',
+ 'ru' => 'ሩስያ',
'sh' => 'ሰርቦ- ክሮዊታን',
- 'si' => 'ስንሃልኛ',
- 'sk' => 'ስሎቨክኛ',
- 'sl' => 'ስቁቪኛ',
- 'sq' => 'አልቤኒኛ',
- 'sr' => 'ሰርቢኛ',
+ 'si' => 'ሲንሃላ',
+ 'sk' => 'ስሎቫክ',
+ 'sl' => 'ስሎቪኒያ',
+ 'sq' => 'ኣልበንየን',
+ 'sr' => 'ሰርብያኛ',
'st' => 'ሰሴቶ',
- 'su' => 'ሱዳንኛ',
+ 'su' => 'ሱዳን',
'sv' => 'ስዊድንኛ',
- 'sw' => 'ሰዋሂሊኛ',
+ 'sw' => 'ስዋሂሊ',
'ta' => 'ታሚልኛ',
'te' => 'ተሉጉኛ',
'th' => 'ታይኛ',
- 'ti' => 'ትግርኛ',
- 'tk' => 'ናይ ቱርኪ ሰብዓይ (ቱርካዊ)',
+ 'ti' => 'ትግር',
+ 'tk' => 'ቱርክሜን',
'tlh' => 'ክሊንግኦንኛ',
- 'tr' => 'ቱርከኛ',
+ 'tr' => 'ቱርክ',
'tw' => 'ትዊ',
- 'uk' => 'ዩክረኒኛ',
- 'ur' => 'ኡርዱኛ',
- 'uz' => 'ኡዝበክኛ',
- 'vi' => 'ቪትናምኛ',
- 'xh' => 'ዞሳኛ',
+ 'uk' => 'ዩክሬን',
+ 'ur' => 'ኡርዱ',
+ 'uz' => 'ኡዝቤክ',
+ 'vi' => 'ቬትናም',
+ 'xh' => 'ኢሲቆሳ',
'yi' => 'ዪዲሽ',
'zu' => 'ዙሉኛ',
];
@@ -114,53 +115,53 @@ $currencySymbols = [
$countryNames = [
'AC' => 'አሴንሽን ደሴት',
- 'AD' => 'አንዶራ',
+ 'AD' => 'ኣንዶራ',
'AE' => 'ሕቡራት ኢማራት ዓረብ',
- 'AF' => 'አፍጋኒስታን',
- 'AG' => 'ኣንቲጓን ባሩዳን',
- 'AI' => 'አንጉኢላ',
- 'AL' => 'አልባኒያ',
- 'AM' => 'አርሜኒያ',
- 'AO' => 'አንጐላ',
- 'AQ' => 'አንታርክቲካ',
- 'AR' => 'አርጀንቲና',
- 'AS' => 'ናይ ኣሜሪካ ሳሞኣ',
+ 'AF' => 'ኣፍጋኒስታን',
+ 'AG' => 'ኣንቲጓን ባርቡዳን',
+ 'AI' => 'ኣንጊላ',
+ 'AL' => 'ኣልቤኒያ',
+ 'AM' => 'ኣርሜኒያ',
+ 'AO' => 'ኣንጎላ',
+ 'AQ' => 'ኣንታርክቲካ',
+ 'AR' => 'ኣርጀንቲና',
+ 'AS' => 'ኣሜሪካ ሳሞኣ',
'AT' => 'ኦስትሪያ',
- 'AU' => 'አውስትሬሊያ',
- 'AW' => 'አሩባ',
+ 'AU' => 'ኣውስትራሊያ',
+ 'AW' => 'ኣሩባ',
'AX' => 'ደሴታት ኣላንድ',
- 'AZ' => 'አዘርባጃን',
+ 'AZ' => 'ኣዘርበጃን',
'BA' => 'ቦዝንያን ሄርዘጎቪናን',
- 'BB' => 'ባርቤዶስ',
+ 'BB' => 'ባርባዶስ',
'BD' => 'ባንግላዲሽ',
- 'BE' => 'ቤልጄም',
+ 'BE' => 'ቤልጀም',
'BF' => 'ቡርኪና ፋሶ',
- 'BG' => 'ቡልጌሪያ',
- 'BH' => 'ባህሬን',
- 'BI' => 'ብሩንዲ',
+ 'BG' => 'ቡልጋሪያ',
+ 'BH' => 'ባሕሬን',
+ 'BI' => 'ቡሩንዲ',
'BJ' => 'ቤኒን',
'BL' => 'ቅዱስ ባርተለሚይ',
'BM' => 'ቤርሙዳ',
- 'BN' => 'ብሩኒ',
+ 'BN' => 'ብሩነይ',
'BO' => 'ቦሊቪያ',
'BQ' => 'ካሪቢያን ኔዘርላንድስ',
'BR' => 'ብራዚል',
'BS' => 'ባሃማስ',
- 'BT' => 'ቡህታን',
- 'BV' => 'ደሴታት ቦውቬት',
+ 'BT' => 'ቡታን',
+ 'BV' => 'ደሴት ቡቬት',
'BW' => 'ቦትስዋና',
'BY' => 'ቤላሩስ',
- 'BZ' => 'ቤሊዘ',
+ 'BZ' => 'ቤሊዝ',
'CA' => 'ካናዳ',
'CC' => 'ኮኮስ ኬሊንግ ደሴቶች',
'CD' => 'ኮንጎ',
- 'CF' => 'ማእከላይ ኣፍሪቃ ሪፓብሊክ',
+ 'CF' => 'ማእከላዊ አፍሪቃ ሪፖብሊክ',
'CG' => 'ኮንጎ ሪፓብሊክ',
'CH' => 'ስዊዘርላንድ',
'CI' => 'ኮት ዲቯር',
'CK' => 'ደሴታት ኩክ',
'CL' => 'ቺሊ',
- 'CM' => 'ካሜሩን',
+ 'CM' => 'ካሜሮን',
'CN' => 'ቻይና',
'CO' => 'ኮሎምቢያ',
'CP' => 'ክሊፐርቶን ደሴት',
@@ -168,7 +169,7 @@ $countryNames = [
'CU' => 'ኩባ',
'CV' => 'ኬፕ ቬርዴ',
'CW' => 'ኩራካዎ',
- 'CX' => 'ደሴታት ክሪስትማስ',
+ 'CX' => 'ደሴት ክሪስማስ',
'CY' => 'ሳይፕረስ',
'CZ' => 'ቼክ ሪፓብሊክ',
'DE' => 'ጀርመን',
@@ -177,7 +178,7 @@ $countryNames = [
'DK' => 'ዴንማርክ',
'DM' => 'ዶሚኒካ',
'DO' => 'ዶመኒካ ሪፓብሊክ',
- 'DZ' => 'አልጄሪያ',
+ 'DZ' => 'ኣልጀሪያ',
'EA' => 'ሲውታን ሜሊላን',
'EC' => 'ኢኳዶር',
'EE' => 'ኤስቶኒያ',
@@ -223,10 +224,10 @@ $countryNames = [
'IL' => 'እስራኤል',
'IM' => 'አይል ኦፍ ማን',
'IN' => 'ህንዲ',
- 'IO' => 'ናይ ብሪጣንያ ህንዳዊ ውቅያኖስ ግዝኣት',
+ 'IO' => 'ናይ ብሪጣኒያ ህንዲ ውቅያኖስ ግዝኣት',
'IQ' => 'ኢራቅ',
'IR' => 'ኢራን',
- 'IS' => 'አይስላንድ',
+ 'IS' => 'ኣየርላንድ',
'IT' => 'ጣሊያን',
'JE' => 'ጀርሲ',
'JM' => 'ጃማይካ',
@@ -241,7 +242,7 @@ $countryNames = [
'KP' => 'ሰሜን ኮሪያ',
'KR' => 'ደቡብ ኮሪያ',
'KW' => 'ክዌት',
- 'KY' => 'ካይማን ደሴቶች',
+ 'KY' => 'ደሴታት ኬይማን',
'KZ' => 'ካዛኪስታን',
'LA' => 'ላኦስ',
'LB' => 'ሊባኖስ',
@@ -265,7 +266,7 @@ $countryNames = [
'ML' => 'ማሊ',
'MM' => 'ማያንማር',
'MN' => 'ሞንጎሊያ',
- 'MO' => 'ማካው',
+ 'MO' => 'ማካዎ',
'MP' => 'ደሴታት ሰሜናዊ ማሪያና',
'MQ' => 'ማርቲኒክ',
'MR' => 'ሞሪቴኒያ',
@@ -319,7 +320,7 @@ $countryNames = [
'SG' => 'ሲንጋፖር',
'SH' => 'ሴንት ሄለና',
'SI' => 'ስሎቬኒያ',
- 'SJ' => 'ስቫልባርድን ዣን ማየን ደሴታት',
+ 'SJ' => 'ስቫልባርድን ጃን ማየንን',
'SK' => 'ስሎቫኪያ',
'SL' => 'ሴራሊዮን',
'SM' => 'ሳን ማሪኖ',
@@ -331,7 +332,7 @@ $countryNames = [
'SV' => 'ኤል ሳልቫዶር',
'SX' => 'ሲንት ማርቲን',
'SY' => 'ሲሪያ',
- 'SZ' => 'ሱዋዚላንድ',
+ 'SZ' => 'ኢስዋቲኒ',
'TA' => 'ትሪስን ዳ ኩንሃ',
'TC' => 'ደሴታት ቱርክን ካይኮስን',
'TD' => 'ጫድ',
@@ -358,7 +359,7 @@ $countryNames = [
'VA' => 'ቫቲካን',
'VC' => 'ቅዱስ ቪንሴንትን ግሬናዲንስን',
'VE' => 'ቬንዙዌላ',
- 'VG' => 'ቨርጂን ደሴታት እንግሊዝ',
+ 'VG' => 'ደሴታት ቨርጂን ብሪጣኒያ',
'VI' => 'ቨርጂን ደሴታት ኣሜሪካ',
'VN' => 'ቬትናም',
'VU' => 'ቫኑአቱ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTk.php b/MLEB/cldr/CldrNames/CldrNamesTk.php
index b5c5d54f..65135272 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTk.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTk.php
@@ -42,7 +42,7 @@ $languageNames = [
'bo' => 'tibet dili',
'br' => 'breton dili',
'brx' => 'bodo dili',
- 'bs' => 'boşnak dili',
+ 'bs' => 'bosniýa dili',
'bug' => 'bugiý dili',
'byn' => 'blin dili',
'ca' => 'katalan dili',
@@ -156,7 +156,7 @@ $languageNames = [
'kea' => 'kabuwerdianu dili',
'kfo' => 'koro dili',
'kha' => 'khasi dili',
- 'khq' => 'koýra-Çini dili',
+ 'khq' => 'koýra-çini dili',
'ki' => 'kikuýu dili',
'kj' => 'kwanýama dili',
'kk' => 'gazak dili',
@@ -267,7 +267,7 @@ $languageNames = [
'pam' => 'kapampangan dili',
'pap' => 'papýamento dili',
'pau' => 'palau dili',
- 'pcm' => 'nigeriý-pijin dili',
+ 'pcm' => 'nigeriýa-pijin dili',
'pl' => 'polýak dili',
'prg' => 'prussiýa dili',
'ps' => 'peştun dili',
@@ -856,13 +856,13 @@ $countryNames = [
'MA' => 'Marokko',
'MC' => 'Monako',
'MD' => 'Moldowa',
- 'ME' => 'Montenegro',
+ 'ME' => 'Çernogoriýa',
'MF' => 'Sen-Marten',
'MG' => 'Madagaskar',
'MH' => 'Marşall adalary',
'MK' => 'Demirgazyk Makedoniýa',
'ML' => 'Mali',
- 'MM' => 'Mýanma (Burma)',
+ 'MM' => 'Mýanma (Birma)',
'MN' => 'Mongoliýa',
'MO' => 'Makao',
'MP' => 'Demirgazyk Mariana adalary',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTo.php b/MLEB/cldr/CldrNames/CldrNamesTo.php
index 5e05e05a..10a8dd20 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTo.php
@@ -151,9 +151,9 @@ $languageNames = [
'enm' => 'lea fakapālangi-lotoloto',
'eo' => 'lea fakaʻesipulanito',
'es' => 'lea fakasipēnisi',
- 'es-419' => 'lea fakasipēnisi lātini-ʻamelika',
- 'es-es' => 'lea fakasipēnisi-‘iulope',
- 'es-mx' => 'lea fakasipēnisi-mekisikou',
+ 'es-419' => 'lea fakasipeini-lātini-ʻamelika',
+ 'es-es' => 'lea fakasipeini-ʻeulope',
+ 'es-mx' => 'lea fakasipeini-mekisikou',
'esu' => 'lea fakaiūpiki-loloto',
'et' => 'lea fakaʻesitōnia',
'eu' => 'lea fakapāsiki',
@@ -620,6 +620,7 @@ $languageNames = [
$currencyNames = [
'AUD' => 'Tola fakaʻaositelēlia',
+ 'EUR' => 'ʻEulo',
'FJD' => 'Tola fakafisi',
'NZD' => 'Tola fakanuʻusila',
'PGK' => 'Kina fakapapuaniukini',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTr.php b/MLEB/cldr/CldrNames/CldrNamesTr.php
index f9ffc26a..d32dcf6e 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTr.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTr.php
@@ -416,7 +416,7 @@ $languageNames = [
'oc' => 'Oksitan dili',
'oj' => 'Ojibva dili',
'om' => 'Oromo dili',
- 'or' => 'Oriya Dili',
+ 'or' => 'Oriya dili',
'os' => 'Osetçe',
'osa' => 'Osage',
'ota' => 'Osmanlı Türkçesi',
diff --git a/MLEB/cldr/CldrNames/CldrNamesTt.php b/MLEB/cldr/CldrNames/CldrNamesTt.php
index b890afd6..1e0ef806 100644
--- a/MLEB/cldr/CldrNames/CldrNamesTt.php
+++ b/MLEB/cldr/CldrNames/CldrNamesTt.php
@@ -153,7 +153,7 @@ $languageNames = [
'wo' => 'волоф',
'yi' => 'идиш',
'yo' => 'йоруба',
- 'zh' => 'кытай (тәрҗемә киңәше: аерым алганда, мандарин кытайчасы)',
+ 'zh' => 'кытай',
'zh-hans' => 'гадиләштерелгән кытай',
'zh-hant' => 'традицион кытай',
];
@@ -424,3 +424,95 @@ $countryNames = [
'ZM' => 'Замбия',
'ZW' => 'Зимбабве',
];
+
+$timeUnits = [
+ 'day-future-other' => '{0} көннән',
+ 'day-narrow-future-other' => '{0} көннән',
+ 'day-narrow-past-other' => '{0} көн элек',
+ 'day-past-other' => '{0} көн элек',
+ 'day-short-future-other' => '{0} көннән',
+ 'day-short-past-other' => '{0} көн элек',
+ 'fri-future-other' => '{0} җомга узгач',
+ 'fri-narrow-future-other' => '{0} җом. узгач',
+ 'fri-narrow-past-other' => '{0} җом. элек',
+ 'fri-past-other' => '{0} җомга элек',
+ 'fri-short-future-other' => '{0} җом. узгач',
+ 'fri-short-past-other' => '{0} җом. элек',
+ 'hour-future-other' => '{0} сәгатьтән',
+ 'hour-narrow-future-other' => '{0} сәг.',
+ 'hour-narrow-past-other' => '{0} сәг. элек',
+ 'hour-past-other' => '{0} сәгать элек',
+ 'hour-short-future-other' => '{0} сәг.',
+ 'hour-short-past-other' => '{0} сәг. элек',
+ 'minute-future-other' => '{0} минуттан',
+ 'minute-narrow-future-other' => '{0} мин.',
+ 'minute-narrow-past-other' => '{0} мин. элек',
+ 'minute-past-other' => '{0} минут элек',
+ 'minute-short-future-other' => '{0} мин.',
+ 'minute-short-past-other' => '{0} мин. элек',
+ 'mon-future-other' => '{0} дүшәмбе узгач',
+ 'mon-narrow-future-other' => '{0} дүш. узгач',
+ 'mon-narrow-past-other' => '{0} дүш. элек',
+ 'mon-past-other' => '{0} дүшәмбе элек',
+ 'mon-short-future-other' => '{0} дүш. узгач',
+ 'mon-short-past-other' => '{0} дүш. элек',
+ 'month-future-other' => '{0} айдан',
+ 'month-narrow-future-other' => '{0} айдан',
+ 'month-narrow-past-other' => '{0} ай элек',
+ 'month-past-other' => '{0} ай элек',
+ 'month-short-future-other' => '{0} айдан',
+ 'month-short-past-other' => '{0} ай элек',
+ 'quarter-future-other' => '{0} кварталдан',
+ 'quarter-narrow-future-other' => '{0} кв.',
+ 'quarter-narrow-past-other' => '{0} кв. элек',
+ 'quarter-past-other' => '{0} квартал элек',
+ 'quarter-short-future-other' => '{0} кв.',
+ 'quarter-short-past-other' => '{0} кв. элек',
+ 'sat-future-other' => '{0} шимбә узгач',
+ 'sat-narrow-past-other' => '{0} шим. элек',
+ 'sat-past-other' => '{0} шимбә элек',
+ 'sat-short-future-other' => '{0} шим. узгач',
+ 'sat-short-past-other' => '{0} шим. элек',
+ 'second-future-other' => '{0} секундтан',
+ 'second-narrow-future-other' => '{0} с.',
+ 'second-narrow-past-other' => '{0} с. элек',
+ 'second-past-other' => '{0} секунд элек',
+ 'second-short-future-other' => '{0} с.',
+ 'second-short-past-other' => '{0} с. элек',
+ 'sun-future-other' => '{0} якшәмбе узгач',
+ 'sun-narrow-future-other' => '{0} якш. узгач',
+ 'sun-narrow-past-other' => '{0} якш. элек',
+ 'sun-past-other' => '{0} якшәмбе элек',
+ 'sun-short-future-other' => '{0} якш. узгач',
+ 'sun-short-past-other' => '{0} якш. элек',
+ 'thu-future-other' => '{0} пәнҗешәмбе узгач',
+ 'thu-narrow-future-other' => '{0} пәнҗ. узгач',
+ 'thu-narrow-past-other' => '{0} пәнҗ. элек',
+ 'thu-past-other' => '{0} пәнҗешәмбе элек',
+ 'thu-short-future-other' => '{0} пәнҗ. узгач',
+ 'thu-short-past-other' => '{0} пәнҗ. элек',
+ 'tue-future-other' => '{0} сишәмбе узгач',
+ 'tue-narrow-future-other' => '{0} сиш. узгач',
+ 'tue-narrow-past-other' => '{0} сиш. элек',
+ 'tue-past-other' => '{0} сишәмбе элек',
+ 'tue-short-future-other' => '{0} сиш. узгач',
+ 'tue-short-past-other' => '{0} сиш. элек',
+ 'wed-future-other' => '{0} чәршәмбе узгач',
+ 'wed-narrow-future-other' => '{0} чәр. узгач',
+ 'wed-narrow-past-other' => '{0} чәр. элек',
+ 'wed-past-other' => '{0} чәршәмбе элек',
+ 'wed-short-future-other' => '{0} чәр. узгач',
+ 'wed-short-past-other' => '{0} чәр. элек',
+ 'week-future-other' => '{0} атнадан',
+ 'week-narrow-future-other' => '{0} атнадан',
+ 'week-narrow-past-other' => '{0} атна элек',
+ 'week-past-other' => '{0} атна элек',
+ 'week-short-future-other' => '{0} атнадан',
+ 'week-short-past-other' => '{0} атна элек',
+ 'year-future-other' => '{0} елдан',
+ 'year-narrow-future-other' => '{0} елдан',
+ 'year-narrow-past-other' => '{0} ел элек',
+ 'year-past-other' => '{0} ел элек',
+ 'year-short-future-other' => '{0} елдан',
+ 'year-short-past-other' => '{0} ел элек',
+];
diff --git a/MLEB/cldr/CldrNames/CldrNamesUk.php b/MLEB/cldr/CldrNames/CldrNamesUk.php
index 761d53d4..a6caef2b 100644
--- a/MLEB/cldr/CldrNames/CldrNamesUk.php
+++ b/MLEB/cldr/CldrNames/CldrNamesUk.php
@@ -33,7 +33,7 @@ $languageNames = [
'as' => 'асамська',
'asa' => 'асу',
'ase' => 'американська мова рухів',
- 'ast' => 'астурська',
+ 'ast' => 'астурійська',
'av' => 'аварська',
'awa' => 'авадхі',
'ay' => 'аймара',
@@ -64,7 +64,7 @@ $languageNames = [
'bkm' => 'ком',
'bla' => 'сіксіка',
'bm' => 'бамбара',
- 'bn' => 'банґла',
+ 'bn' => 'бенгальська',
'bo' => 'тибетська',
'bqi' => 'бахтіарі',
'br' => 'бретонська',
@@ -113,7 +113,7 @@ $languageNames = [
'dav' => 'таіта',
'de' => 'німецька',
'de-at' => 'австрійська німецька',
- 'de-ch' => 'верхньонімецька (Швейцарія)',
+ 'de-ch' => 'швейцарська верхньонімецька',
'del' => 'делаварська',
'den' => 'слейв',
'dgr' => 'догрибська',
@@ -139,12 +139,12 @@ $languageNames = [
'en-au' => 'австралійська англійська',
'en-ca' => 'канадська англійська',
'en-gb' => 'британська англійська',
- 'en-us' => 'англійська (США)',
+ 'en-us' => 'американська англійська',
'enm' => 'середньоанглійська',
'eo' => 'есперанто',
'es' => 'іспанська',
'es-419' => 'латиноамериканська іспанська',
- 'es-es' => 'іспанська (Європа)',
+ 'es-es' => 'європейська іспанська',
'es-mx' => 'мексиканська іспанська',
'et' => 'естонська',
'eu' => 'баскська',
@@ -176,7 +176,7 @@ $languageNames = [
'gan' => 'ґань',
'gay' => 'гайо',
'gba' => 'гбайя',
- 'gd' => 'гаельська',
+ 'gd' => 'шотландська гельська',
'gez' => 'гєез',
'gil' => 'гільбертська',
'gl' => 'галісійська',
@@ -188,7 +188,7 @@ $languageNames = [
'got' => 'готська',
'grb' => 'гребо',
'grc' => 'давньогрецька',
- 'gsw' => 'німецька (Швейцарія)',
+ 'gsw' => 'швейцарська німецька',
'gu' => 'гуджараті',
'guz' => 'гусії',
'gv' => 'менкська',
@@ -206,7 +206,7 @@ $languageNames = [
'hr' => 'хорватська',
'hsb' => 'верхньолужицька',
'hsn' => 'сянська китайська',
- 'ht' => 'гаїтянська',
+ 'ht' => 'гаїтянська креольська',
'hu' => 'угорська',
'hup' => 'хупа',
'hy' => 'вірменська',
@@ -217,7 +217,7 @@ $languageNames = [
'id' => 'індонезійська',
'ie' => 'інтерлінгве',
'ig' => 'ігбо',
- 'ii' => 'сичуань',
+ 'ii' => 'сичуаньська ї',
'ik' => 'інупіак',
'ilo' => 'ілоканська',
'inh' => 'інгуська',
@@ -270,12 +270,12 @@ $languageNames = [
'ks' => 'кашмірська',
'ksb' => 'шамбала',
'ksf' => 'бафіа',
- 'ksh' => 'колоніан',
+ 'ksh' => 'кельнська',
'ku' => 'курдська',
'kum' => 'кумицька',
'kut' => 'кутенаї',
'kv' => 'комі',
- 'kw' => 'корнійська',
+ 'kw' => 'корнська',
'ky' => 'киргизька',
'la' => 'латинська',
'lad' => 'ладіно',
@@ -301,7 +301,7 @@ $languageNames = [
'luo' => 'луо',
'lus' => 'мізо',
'luy' => 'луйя',
- 'lv' => 'латвійська',
+ 'lv' => 'латиська',
'mad' => 'мадурська',
'maf' => 'мафа',
'mag' => 'магадхі',
@@ -394,12 +394,12 @@ $languageNames = [
'pi' => 'палі',
'pl' => 'польська',
'pon' => 'понапе',
- 'prg' => 'пруська',
+ 'prg' => 'прусська',
'pro' => 'давньопровансальська',
'ps' => 'пушту',
- 'pt' => 'портуґальська',
- 'pt-br' => 'португальська (Бразилія)',
- 'pt-pt' => 'європейська портуґальська',
+ 'pt' => 'португальська',
+ 'pt-br' => 'бразильська португальська',
+ 'pt-pt' => 'європейська португальська',
'qu' => 'кечуа',
'quc' => 'кіче',
'raj' => 'раджастхані',
@@ -417,7 +417,7 @@ $languageNames = [
'rwk' => 'рва',
'sa' => 'санскрит',
'sad' => 'сандаве',
- 'sah' => 'якутська',
+ 'sah' => 'саха',
'sam' => 'самаритянська арамейська',
'saq' => 'самбуру',
'sas' => 'сасакська',
@@ -427,7 +427,7 @@ $languageNames = [
'sc' => 'сардинська',
'scn' => 'сицилійська',
'sco' => 'шотландська',
- 'sd' => 'сіндхі',
+ 'sd' => 'синдхі',
'sdh' => 'південнокурдська',
'se' => 'північносаамська',
'see' => 'сенека',
@@ -459,7 +459,7 @@ $languageNames = [
'srr' => 'серер',
'ss' => 'сісваті',
'ssy' => 'сахо',
- 'st' => 'сото південна',
+ 'st' => 'південна сото',
'su' => 'сунданська',
'suk' => 'сукума',
'sus' => 'сусу',
@@ -488,7 +488,7 @@ $languageNames = [
'tli' => 'тлінгіт',
'tmh' => 'тамашек',
'tn' => 'тсвана',
- 'to' => 'тонґанська',
+ 'to' => 'тонганська',
'tog' => 'ньяса тонга',
'tpi' => 'ток-пісін',
'tr' => 'турецька',
@@ -514,11 +514,11 @@ $languageNames = [
'vai' => 'ваї',
've' => 'венда',
'vi' => 'вʼєтнамська',
- 'vo' => 'волапʼюк',
+ 'vo' => 'волапюк',
'vot' => 'водська',
'vun' => 'вуньо',
'wa' => 'валлонська',
- 'wae' => 'валзерська',
+ 'wae' => 'вальзерська',
'wal' => 'волайтта',
'war' => 'варай',
'was' => 'вашо',
@@ -773,11 +773,11 @@ $currencyNames = [
'TMM' => 'туркменський манат (1993–2009)',
'TMT' => 'туркменський манат',
'TND' => 'туніський динар',
- 'TOP' => 'тонґанська паанга',
+ 'TOP' => 'тонганська паанга',
'TPE' => 'тіморський ескудо',
'TRL' => 'турецька ліра (1922–2005)',
'TRY' => 'турецька ліра',
- 'TTD' => 'долар Трінідаду і Тобаґо',
+ 'TTD' => 'долар Тринідаду і Тобаго',
'TWD' => 'новий тайванський долар',
'TZS' => 'танзанійський шилінг',
'UAH' => 'українська гривня',
@@ -1003,8 +1003,8 @@ $countryNames = [
'AD' => 'Андорра',
'AE' => 'Обʼєднані Арабські Емірати',
'AF' => 'Афганістан',
- 'AG' => 'Антиґуа і Барбуда',
- 'AI' => 'Анґілья',
+ 'AG' => 'Антигуа і Барбуда',
+ 'AI' => 'Ангілья',
'AL' => 'Албанія',
'AM' => 'Вірменія',
'AO' => 'Ангола',
@@ -1016,21 +1016,21 @@ $countryNames = [
'AW' => 'Аруба',
'AX' => 'Аландські Острови',
'AZ' => 'Азербайджан',
- 'BA' => 'Боснія і Герцеґовина',
+ 'BA' => 'Боснія і Герцеговина',
'BB' => 'Барбадос',
'BD' => 'Бангладеш',
- 'BE' => 'Бельґія',
+ 'BE' => 'Бельгія',
'BF' => 'Буркіна-Фасо',
'BG' => 'Болгарія',
'BH' => 'Бахрейн',
'BI' => 'Бурунді',
'BJ' => 'Бенін',
- 'BL' => 'Сен-Бартельмі',
+ 'BL' => 'Сен-Бартелемі',
'BM' => 'Бермудські Острови',
'BN' => 'Бруней',
'BO' => 'Болівія',
- 'BQ' => 'Нідерландські Карибські острови',
- 'BR' => 'Бразілія',
+ 'BQ' => 'Карибські Нідерланди',
+ 'BR' => 'Бразилія',
'BS' => 'Багамські Острови',
'BT' => 'Бутан',
'BV' => 'Острів Буве',
@@ -1038,19 +1038,19 @@ $countryNames = [
'BY' => 'Білорусь',
'BZ' => 'Беліз',
'CA' => 'Канада',
- 'CC' => 'Кокосові (Кілінґ) Острови',
+ 'CC' => 'Кокосові (Кілінг) Острови',
'CD' => 'Конго – Кіншаса',
'CF' => 'Центральноафриканська Республіка',
'CG' => 'Конго – Браззавіль',
'CH' => 'Швейцарія',
'CI' => 'Кот-дʼІвуар',
'CK' => 'Острови Кука',
- 'CL' => 'Чілі',
+ 'CL' => 'Чилі',
'CM' => 'Камерун',
'CN' => 'Китай',
'CO' => 'Колумбія',
'CP' => 'Острів Кліппертон',
- 'CR' => 'Коста-Ріка',
+ 'CR' => 'Коста-Рика',
'CU' => 'Куба',
'CV' => 'Кабо-Верде',
'CW' => 'Кюрасао',
@@ -1082,23 +1082,23 @@ $countryNames = [
'FR' => 'Франція',
'GA' => 'Габон',
'GB' => 'Велика Британія',
- 'GD' => 'Ґренада',
+ 'GD' => 'Гренада',
'GE' => 'Грузія',
- 'GF' => 'Французька Ґвіана',
- 'GG' => 'Ґернсі',
+ 'GF' => 'Французька Гвіана',
+ 'GG' => 'Гернсі',
'GH' => 'Гана',
- 'GI' => 'Ґібралтар',
- 'GL' => 'Ґренландія',
+ 'GI' => 'Гібралтар',
+ 'GL' => 'Гренландія',
'GM' => 'Гамбія',
'GN' => 'Гвінея',
- 'GP' => 'Ґваделупа',
+ 'GP' => 'Гваделупа',
'GQ' => 'Екваторіальна Гвінея',
'GR' => 'Греція',
'GS' => 'Південна Джорджія та Південні Сандвічеві Острови',
- 'GT' => 'Ґватемала',
- 'GU' => 'Ґуам',
+ 'GT' => 'Гватемала',
+ 'GU' => 'Гуам',
'GW' => 'Гвінея-Бісау',
- 'GY' => 'Ґайана',
+ 'GY' => 'Гаяна',
'HK' => 'Гонконг',
'HM' => 'Острови Герд і Макдоналд',
'HN' => 'Гондурас',
@@ -1123,7 +1123,7 @@ $countryNames = [
'KE' => 'Кенія',
'KG' => 'Киргизстан',
'KH' => 'Камбоджа',
- 'KI' => 'Кірібаті',
+ 'KI' => 'Кірибаті',
'KM' => 'Комори',
'KN' => 'Сент-Кітс і Невіс',
'KP' => 'Північна Корея',
@@ -1139,7 +1139,7 @@ $countryNames = [
'LR' => 'Ліберія',
'LS' => 'Лесото',
'LT' => 'Литва',
- 'LU' => 'Люксембурґ',
+ 'LU' => 'Люксембург',
'LV' => 'Латвія',
'LY' => 'Лівія',
'MA' => 'Марокко',
@@ -1155,11 +1155,11 @@ $countryNames = [
'MN' => 'Монголія',
'MO' => 'Макао',
'MP' => 'Північні Маріанські Острови',
- 'MQ' => 'Мартініка',
+ 'MQ' => 'Мартиніка',
'MR' => 'Мавританія',
'MS' => 'Монтсеррат',
'MT' => 'Мальта',
- 'MU' => 'Маврікій',
+ 'MU' => 'Маврикій',
'MV' => 'Мальдіви',
'MW' => 'Малаві',
'MX' => 'Мексика',
@@ -1170,9 +1170,9 @@ $countryNames = [
'NE' => 'Нігер',
'NF' => 'Острів Норфолк',
'NG' => 'Нігерія',
- 'NI' => 'Нікараґуа',
+ 'NI' => 'Нікарагуа',
'NL' => 'Нідерланди',
- 'NO' => 'Норвеґія',
+ 'NO' => 'Норвегія',
'NP' => 'Непал',
'NR' => 'Науру',
'NU' => 'Ніуе',
@@ -1181,17 +1181,17 @@ $countryNames = [
'PA' => 'Панама',
'PE' => 'Перу',
'PF' => 'Французька Полінезія',
- 'PG' => 'Папуа-Нова Ґвінея',
+ 'PG' => 'Папуа-Нова Гвінея',
'PH' => 'Філіппіни',
'PK' => 'Пакистан',
'PL' => 'Польща',
'PM' => 'Сен-Пʼєр і Мікелон',
'PN' => 'Острови Піткерн',
- 'PR' => 'Пуерто-Ріко',
+ 'PR' => 'Пуерто-Рико',
'PS' => 'Палестина',
- 'PT' => 'Портуґалія',
+ 'PT' => 'Португалія',
'PW' => 'Палау',
- 'PY' => 'Параґвай',
+ 'PY' => 'Парагвай',
'QA' => 'Катар',
'QO' => 'Віддалена Океанія',
'RE' => 'Реюньйон',
@@ -1210,12 +1210,12 @@ $countryNames = [
'SJ' => 'Шпіцберген та Ян-Маєн',
'SK' => 'Словаччина',
'SL' => 'Сьєрра-Леоне',
- 'SM' => 'Сан-Маріно',
+ 'SM' => 'Сан-Марино',
'SN' => 'Сенегал',
'SO' => 'Сомалі',
- 'SR' => 'Сурінам',
+ 'SR' => 'Суринам',
'SS' => 'Південний Судан',
- 'ST' => 'Сан-Томе і Прінсіпі',
+ 'ST' => 'Сан-Томе і Принсіпі',
'SV' => 'Сальвадор',
'SX' => 'Сінт-Мартен',
'SY' => 'Сирія',
@@ -1231,9 +1231,9 @@ $countryNames = [
'TL' => 'Тімор-Лешті',
'TM' => 'Туркменістан',
'TN' => 'Туніс',
- 'TO' => 'Тонґа',
+ 'TO' => 'Тонга',
'TR' => 'Туреччина',
- 'TT' => 'Трінідад і Тобаґо',
+ 'TT' => 'Тринідад і Тобаго',
'TV' => 'Тувалу',
'TW' => 'Тайвань',
'TZ' => 'Танзанія',
@@ -1242,13 +1242,13 @@ $countryNames = [
'UM' => 'Віддалені острови США',
'UN' => 'ООН',
'US' => 'США',
- 'UY' => 'Уруґвай',
+ 'UY' => 'Уругвай',
'UZ' => 'Узбекистан',
'VA' => 'Ватикан',
- 'VC' => 'Сент-Вінсент і Ґренадіни',
+ 'VC' => 'Сент-Вінсент і Гренадіни',
'VE' => 'Венесуела',
'VG' => 'Британські Віргінські острови',
- 'VI' => 'Віргінські острови, США',
+ 'VI' => 'Віргінські Острови (США)',
'VN' => 'Вʼєтнам',
'VU' => 'Вануату',
'WF' => 'Уолліс і Футуна',
@@ -1296,22 +1296,22 @@ $timeUnits = [
'day-short-past-many' => '{0} дн. тому',
'day-short-past-one' => '{0} дн. тому',
'day-short-past-other' => '{0} дн. тому',
- 'decade-few' => '{0} декади',
- 'decade-many' => '{0} декад',
- 'decade-one' => '{0} декада',
- 'decade-other' => '{0} декади',
+ 'decade-few' => '{0} десятиріччя',
+ 'decade-many' => '{0} десятиріч',
+ 'decade-one' => '{0} десятиріччя',
+ 'decade-other' => '{0} десятиріччя',
'fri-future-few' => 'через {0} пʼятниці',
'fri-future-many' => 'через {0} пʼятниць',
'fri-future-one' => 'через {0} пʼятницю',
'fri-future-other' => 'через {0} пʼятниці',
- 'fri-narrow-future-few' => 'через {0} пʼятниці',
- 'fri-narrow-future-many' => 'через {0} пʼятниць',
- 'fri-narrow-future-one' => 'через {0} пʼятницю',
- 'fri-narrow-future-other' => 'через {0} пʼятниці',
- 'fri-narrow-past-few' => '{0} пʼятниці тому',
- 'fri-narrow-past-many' => '{0} пʼятниць тому',
- 'fri-narrow-past-one' => '{0} пʼятницю тому',
- 'fri-narrow-past-other' => '{0} пʼятниці тому',
+ 'fri-narrow-future-few' => 'через {0} пт',
+ 'fri-narrow-future-many' => 'через {0} пт',
+ 'fri-narrow-future-one' => 'через {0} пт',
+ 'fri-narrow-future-other' => 'через {0} пт',
+ 'fri-narrow-past-few' => '{0} пт тому',
+ 'fri-narrow-past-many' => '{0} пт тому',
+ 'fri-narrow-past-one' => '{0} пт тому',
+ 'fri-narrow-past-other' => '{0} пт тому',
'fri-past-few' => '{0} пʼятниці тому',
'fri-past-many' => '{0} пʼятниць тому',
'fri-past-one' => '{0} пʼятницю тому',
diff --git a/MLEB/cldr/CldrNames/CldrNamesUr.php b/MLEB/cldr/CldrNames/CldrNamesUr.php
index 32f53b97..d5d7e8ad 100644
--- a/MLEB/cldr/CldrNames/CldrNamesUr.php
+++ b/MLEB/cldr/CldrNames/CldrNamesUr.php
@@ -113,7 +113,7 @@ $languageNames = [
'frc' => 'کاجن فرانسیسی',
'fur' => 'فریولیائی',
'fy' => 'مغربی فریسیئن',
- 'ga' => 'آئیرِش',
+ 'ga' => 'آئرش',
'gaa' => 'گا',
'gag' => 'غاغاوز',
'gan' => 'gan',
@@ -456,7 +456,7 @@ $currencyNames = [
'DZD' => 'الجیریائی دینار',
'EEK' => 'ایسٹونین کرون',
'EGP' => 'مصری پاؤنڈ',
- 'ERN' => 'اریٹیریا کا نافکا',
+ 'ERN' => 'اریٹیریائی ناکفا',
'ETB' => 'ایتھوپیائی بِرّ',
'EUR' => 'یورو',
'FJD' => 'فجی کا ڈالر',
@@ -544,7 +544,7 @@ $currencyNames = [
'SHP' => 'سینٹ ہیلینا پاؤنڈ',
'SIT' => 'سلوانین ٹولر',
'SKK' => 'سلووک کرونا',
- 'SLL' => 'سیئرا لیون لیون',
+ 'SLL' => 'سیئرا لیونین لیون',
'SOS' => 'صومالی شلنگ',
'SRD' => 'سورینامی ڈالر',
'SSP' => 'جنوبی سوڈانی پاؤنڈ',
@@ -1003,7 +1003,7 @@ $countryNames = [
'WF' => 'ویلیز اور فیوٹیونا',
'WS' => 'ساموآ',
'XA' => 'بناوٹی لہجے',
- 'XB' => 'مصنوعی بیڑی',
+ 'XB' => 'بناوٹی دو سمتی',
'XK' => 'کوسووو',
'YE' => 'یمن',
'YT' => 'مایوٹ',
diff --git a/MLEB/cldr/CldrNames/CldrNamesVi.php b/MLEB/cldr/CldrNames/CldrNamesVi.php
index e98a8d28..a599ab04 100644
--- a/MLEB/cldr/CldrNames/CldrNamesVi.php
+++ b/MLEB/cldr/CldrNames/CldrNamesVi.php
@@ -207,7 +207,7 @@ $languageNames = [
'hif' => 'Tiếng Fiji Hindi',
'hil' => 'Tiếng Hiligaynon',
'hit' => 'Tiếng Hittite',
- 'hmn' => 'Tiếng Hmông',
+ 'hmn' => 'Tiếng H’Mông',
'ho' => 'Tiếng Hiri Motu',
'hr' => 'Tiếng Croatia',
'hsb' => 'Tiếng Thượng Sorbia',
@@ -916,6 +916,7 @@ $currencySymbols = [
'ISK' => 'ISK',
'JMD' => 'JMD',
'JOD' => 'JOD',
+ 'JPY' => '¥',
'KES' => 'KES',
'KGS' => 'KGS',
'KHR' => 'KHR',
@@ -1220,7 +1221,7 @@ $countryNames = [
'SV' => 'El Salvador',
'SX' => 'Sint Maarten',
'SY' => 'Syria',
- 'SZ' => 'Swaziland',
+ 'SZ' => 'Eswatini',
'TA' => 'Tristan da Cunha',
'TC' => 'Quần đảo Turks và Caicos',
'TD' => 'Chad',
@@ -1249,7 +1250,7 @@ $countryNames = [
'VC' => 'St. Vincent và Grenadines',
'VE' => 'Venezuela',
'VG' => 'Quần đảo Virgin thuộc Anh',
- 'VI' => 'Quần đảo Virgin thuộc Mỹ',
+ 'VI' => 'Quần đảo Virgin thuộc Hoa Kỳ',
'VN' => 'Việt Nam',
'VU' => 'Vanuatu',
'WF' => 'Wallis và Futuna',
diff --git a/MLEB/cldr/CldrNames/CldrNamesWo.php b/MLEB/cldr/CldrNames/CldrNamesWo.php
index 2c5d9412..87318d60 100644
--- a/MLEB/cldr/CldrNames/CldrNamesWo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesWo.php
@@ -25,14 +25,22 @@ $languageNames = [
'cy' => 'Wels',
'da' => 'Danuwa',
'de' => 'Almaa',
+ 'de-at' => 'Almaa bu Ótiriis',
+ 'de-ch' => 'Almaa bu Kawe bu Swis',
'dsb' => 'Sorab-Suuf',
'dv' => 'Diweyi',
'dz' => 'Dsongkaa',
'el' => 'Gereg',
'en' => 'Àngale',
+ 'en-au' => 'Àngale bu Óstraali',
+ 'en-ca' => 'Àngale bu Kanadaa',
+ 'en-gb' => 'Àngale bu Grànd Brëtaañ',
+ 'en-us' => 'Àngale bu Amerik',
'eo' => 'Esperantoo',
'es' => 'Español',
- 'es-419' => 'Español (Amerik Latin)',
+ 'es-419' => 'Español bu Amerik Latin',
+ 'es-es' => 'Español bu Tugël',
+ 'es-mx' => 'Español bu Meksik',
'et' => 'Estoñiye',
'eu' => 'Bask',
'fa' => 'Pers',
@@ -41,6 +49,8 @@ $languageNames = [
'fil' => 'Filipiye',
'fo' => 'Feroos',
'fr' => 'Farañse',
+ 'fr-ca' => 'Frañse bu Kanadaa',
+ 'fr-ch' => 'Frañse bu Swis',
'ga' => 'Irlànde',
'gd' => 'Galuwaa bu Ekos',
'gl' => 'Galisiye',
@@ -105,6 +115,8 @@ $languageNames = [
'pl' => 'Polone',
'ps' => 'Pasto',
'pt' => 'Purtugees',
+ 'pt-br' => 'Purtugees bu Bresil',
+ 'pt-pt' => 'Portugees bu Tugël',
'qu' => 'Kesuwa',
'quc' => 'Kishe',
'rm' => 'Romaas',
@@ -424,3 +436,96 @@ $countryNames = [
'ZM' => 'Sàmbi',
'ZW' => 'Simbabwe',
];
+
+$timeUnits = [
+ 'day-future-other' => 'fileek {0} fan',
+ 'day-narrow-future-other' => 'fileek {0} fan',
+ 'day-narrow-past-other' => '{0} fan ci ginaaw',
+ 'day-past-other' => '{0} fan ci ginaaw',
+ 'day-short-future-other' => 'fileek {0} fan',
+ 'day-short-past-other' => '{0} fan ci ginaaw',
+ 'fri-future-other' => 'fileek {0} àjjuma',
+ 'fri-narrow-future-other' => 'fileek {0} àj.',
+ 'fri-narrow-past-other' => '{0} àj. ci ginaaw',
+ 'fri-past-other' => '{0} àjjuma ci ginaaw',
+ 'fri-short-future-other' => 'fileek {0} àjj.',
+ 'fri-short-past-other' => '{0} àjj. ci ginaaw',
+ 'hour-future-other' => 'fileek {0} waxtu',
+ 'hour-narrow-future-other' => 'fileek {0} wax.',
+ 'hour-narrow-past-other' => '{0} wax. ci ginaaw',
+ 'hour-past-other' => '{0} waxtu ci ginaaw',
+ 'hour-short-future-other' => 'fileek {0} wax.',
+ 'hour-short-past-other' => '{0} wax. ci ginaaw',
+ 'minute-future-other' => 'fileek {0} simili',
+ 'minute-narrow-future-other' => 'fileek {0} sim.',
+ 'minute-narrow-past-other' => '{0} sim. ci ginaaw',
+ 'minute-past-other' => '{0} simili ci ginaaw',
+ 'minute-short-future-other' => 'fileek {0} sim.',
+ 'minute-short-past-other' => '{0} sim. ci ginaaw',
+ 'mon-future-other' => 'fileek {0} altine',
+ 'mon-narrow-future-other' => 'fileek {0} alt.',
+ 'mon-narrow-past-other' => '{0} alt. ci ginaaw',
+ 'mon-past-other' => '{0} altine ci ginaaw',
+ 'mon-short-future-other' => 'fileek {0} alti.',
+ 'mon-short-past-other' => '{0} alti. ci ginaaw',
+ 'month-future-other' => 'fileek {0} weer',
+ 'month-narrow-future-other' => 'fileek {0} we.',
+ 'month-narrow-past-other' => '{0} we. ci ginaaw',
+ 'month-past-other' => '{0} weer ci ginaaw',
+ 'month-short-future-other' => 'fileek {0} we.',
+ 'month-short-past-other' => '{0} we. ci ginaaw',
+ 'quarter-future-other' => 'fileek {0} trimestre',
+ 'quarter-narrow-future-other' => 'fileek {0} trim.',
+ 'quarter-narrow-past-other' => '{0} trim. ci ginaaw',
+ 'quarter-past-other' => '{0} trimestre ci ginaaw',
+ 'quarter-short-future-other' => 'fileek {0} trim.',
+ 'quarter-short-past-other' => '{0} trim. ci ginaaw',
+ 'sat-future-other' => 'fileek {0} gàwwu',
+ 'sat-narrow-future-other' => 'fileek {0} gà.',
+ 'sat-narrow-past-other' => '{0} gà. ci ginaaw',
+ 'sat-past-other' => '{0} gàwwu ci ginaaw',
+ 'sat-short-future-other' => 'fileek {0} gàw.',
+ 'sat-short-past-other' => '{0} gàw. ci ginaaw',
+ 'second-future-other' => 'fileek {0} saa',
+ 'second-narrow-future-other' => 'fileek {0} saa',
+ 'second-narrow-past-other' => '{0} saa ci ginaaw',
+ 'second-past-other' => '{0} saa ci ginaaw',
+ 'second-short-future-other' => 'fileek {0} saa',
+ 'second-short-past-other' => '{0} saa ci ginaaw',
+ 'sun-future-other' => 'fileek {0} dibéer',
+ 'sun-narrow-future-other' => 'fileek {0} dib.',
+ 'sun-narrow-past-other' => '{0} dib. ci ginaaw',
+ 'sun-past-other' => '{0} dibéer ci ginaaw',
+ 'sun-short-future-other' => 'fileek {0} dib.',
+ 'sun-short-past-other' => '{0} dib. ci ginaaw',
+ 'thu-future-other' => 'fileek {0} alxamis',
+ 'thu-narrow-future-other' => 'fileek {0} alx.',
+ 'thu-narrow-past-other' => '{0} alx. ci ginaaw',
+ 'thu-past-other' => '{0} alxamis ci ginaaw',
+ 'thu-short-future-other' => 'fileek {0} alxa.',
+ 'thu-short-past-other' => '{0} alxa. ci ginaaw',
+ 'tue-future-other' => 'fileek {0} talaata',
+ 'tue-narrow-future-other' => 'fileek {0} ta.',
+ 'tue-narrow-past-other' => '{0} ta. ci ginaaw',
+ 'tue-past-other' => '{0} talaata ci ginaaw',
+ 'tue-short-future-other' => 'fileek {0} tal.',
+ 'tue-short-past-other' => '{0} tal. ci ginaaw',
+ 'wed-future-other' => 'fileek {0} àllarba',
+ 'wed-narrow-future-other' => 'fileek {0} àla.',
+ 'wed-narrow-past-other' => '{0} àla. ci ginaaw',
+ 'wed-past-other' => '{0} àllarba ci ginaaw',
+ 'wed-short-future-other' => 'fileek {0} àlla.',
+ 'wed-short-past-other' => '{0} àlla. ci ginaaw',
+ 'week-future-other' => 'fileek {0} ayi-bis',
+ 'week-narrow-future-other' => 'fileek {0} ayi-b.',
+ 'week-narrow-past-other' => '{0} ayi-b. ci ginaaw',
+ 'week-past-other' => '{0} ayi-bis ci ginaaw',
+ 'week-short-future-other' => 'fileek {0} ayi-b.',
+ 'week-short-past-other' => '{0} ayi-b. ci ginaaw',
+ 'year-future-other' => 'fileek {0} at',
+ 'year-narrow-future-other' => 'fileek {0} at',
+ 'year-narrow-past-other' => '{0} at ci ginaaw',
+ 'year-past-other' => '{0} at ci ginaaw',
+ 'year-short-future-other' => 'fileek {0} at',
+ 'year-short-past-other' => '{0} at ci ginaaw',
+];
diff --git a/MLEB/cldr/CldrNames/CldrNamesYo.php b/MLEB/cldr/CldrNames/CldrNamesYo.php
index ef085db2..893bdb9d 100644
--- a/MLEB/cldr/CldrNames/CldrNamesYo.php
+++ b/MLEB/cldr/CldrNames/CldrNamesYo.php
@@ -2,35 +2,35 @@
$languageNames = [
'af' => 'Èdè Afrikani',
- 'agq' => 'Ágẹ̀ẹ̀mù',
+ 'agq' => 'Èdè Ágẹ̀ẹ̀mù',
'ak' => 'Èdè Akani',
'am' => 'Èdè Amariki',
'ar' => 'Èdè Árábìkì',
- 'as' => 'Ti Assam',
- 'asa' => 'Asu',
- 'ast' => 'Asturian',
+ 'as' => 'Èdè Ti Assam',
+ 'asa' => 'Èdè Asu',
+ 'ast' => 'Èdè Asturian',
'az' => 'Èdè Azerbaijani',
- 'bas' => 'Basaa',
+ 'bas' => 'Èdè Basaa',
'be' => 'Èdè Belarusi',
- 'bem' => 'Béḿbà',
- 'bez' => 'Bẹ́nà',
+ 'bem' => 'Èdè Béḿbà',
+ 'bez' => 'Èdè Bẹ́nà',
'bg' => 'Èdè Bugaria',
- 'bm' => 'Báḿbàrà',
+ 'bm' => 'Èdè Báḿbàrà',
'bn' => 'Èdè Bengali',
'bo' => 'Tibetán',
'br' => 'Èdè Bretoni',
- 'brx' => 'Bódò',
+ 'brx' => 'Èdè Bódò',
'bs' => 'Èdè Bosnia',
'ca' => 'Èdè Catala',
- 'ccp' => 'Chakma',
- 'ce' => 'Chechen',
- 'ceb' => 'Cebuano',
- 'cgg' => 'Chiga',
- 'chr' => 'Shẹ́rókiì',
+ 'ccp' => 'Èdè Chakma',
+ 'ce' => 'Èdè Chechen',
+ 'ceb' => 'Èdè Cebuano',
+ 'cgg' => 'Èdè Chiga',
+ 'chr' => 'Èdè Shẹ́rókiì',
'ckb' => 'Ààrin Gbùngbùn Kurdish',
- 'co' => 'Corsican',
- 'cs' => 'Èdè seeki',
- 'cu' => 'Síláfííkì Ilé Ìjọ́sìn',
+ 'co' => 'Èdè Corsican',
+ 'cs' => 'Èdè Seeki',
+ 'cu' => 'Èdè Síláfííkì Ilé Ìjọ́sìn',
'cy' => 'Èdè Welshi',
'da' => 'Èdè Ilẹ̀ Denmark',
'dav' => 'Táítà',
@@ -38,12 +38,12 @@ $languageNames = [
'de-at' => 'Èdè Jámánì (Ọ́síríà )',
'de-ch' => 'Èdè Ilẹ̀ Jámánì (Orílẹ́ède swítsàlandì)',
'dje' => 'Ṣárúmà',
- 'dsb' => 'Ṣobíànù Ìpìlẹ̀',
- 'dua' => 'Duala',
+ 'dsb' => 'Ṣóbíánù Apá Ìṣàlẹ̀',
+ 'dua' => 'Èdè Duala',
'dyo' => 'Jola-Fonyi',
- 'dz' => 'Dzongkha',
- 'ebu' => 'Ẹmbù',
- 'ee' => 'Ewè',
+ 'dz' => 'Èdè Dzongkha',
+ 'ebu' => 'Èdè Ẹmbù',
+ 'ee' => 'Èdè Ewè',
'el' => 'Èdè Giriki',
'en' => 'Èdè Gẹ̀ẹ́sì',
'en-au' => 'Èdè Gẹ̀ẹ́sì (órílẹ̀-èdè Ọsirélíà)',
@@ -56,7 +56,7 @@ $languageNames = [
'es-mx' => 'Èdè Sípáníìṣì (orílẹ̀-èdè Mẹ́síkò)',
'et' => 'Èdè Estonia',
'eu' => 'Èdè Baski',
- 'ewo' => 'Èwóǹdò',
+ 'ewo' => 'Èdè Èwóǹdò',
'fa' => 'Èdè Pasia',
'ff' => 'Èdè Fúlàní',
'fi' => 'Èdè Finisi',
@@ -113,10 +113,10 @@ $languageNames = [
'kok' => 'Kónkánì',
'ks' => 'Kaṣímirì',
'ksb' => 'Ṣáńbálà',
- 'ksf' => 'Báfíà',
- 'ksh' => 'Colognian',
+ 'ksf' => 'Èdè Báfíà',
+ 'ksh' => 'Èdè Colognian',
'ku' => 'Kọdiṣì',
- 'kw' => 'Kọ́nììṣì',
+ 'kw' => 'Èdè Kọ́nììṣì',
'ky' => 'Kírígíìsì',
'la' => 'Èdè Latini',
'lag' => 'Láńgì',
@@ -200,7 +200,7 @@ $languageNames = [
'sq' => 'Èdè Albania',
'sr' => 'Èdè Serbia',
'st' => 'Èdè Sesoto',
- 'su' => 'Èdè Sudani',
+ 'su' => 'Èdè Sudanísì',
'sv' => 'Èdè Suwidiisi',
'sw' => 'Èdè Swahili',
'ta' => 'Èdè Tamili',
@@ -231,10 +231,11 @@ $languageNames = [
'yav' => 'Yangbẹn',
'yi' => 'Èdè Yiddishi',
'yo' => 'Èdè Yorùbá',
- 'yue' => 'Cantonese',
+ 'yue' => 'Èdè Cantonese',
'zgh' => 'Àfẹnùkò Támásáìtì ti Mòrókò',
- 'zh' => 'Èdè Mandarin tí wọ́n ń sọ lórílẹ̀-èdè Ṣáínà',
- 'zh-hant' => 'Èdè Ìbílẹ̀ Ṣáínà',
+ 'zh' => 'Edè Ṣáínà',
+ 'zh-hans' => 'Ẹdè Ṣáínà Onírọ̀rùn',
+ 'zh-hant' => 'Èdè Ṣáínà Ìbílẹ̀',
'zu' => 'Èdè Ṣulu',
'zxx' => 'Kò sí àkóònú elédè',
];
@@ -245,7 +246,7 @@ $currencyNames = [
'ALL' => 'Lẹ́kẹ̀ Àlìbéníà',
'AMD' => 'Dírààmù Àmẹ́níà',
'ANG' => 'Gílídà Netherlands Antillean',
- 'AOA' => 'Wansa ti Orílẹ́ède Àngólà',
+ 'AOA' => 'kíwánsà Angola',
'ARS' => 'Pẹ́sò Agẹntínà',
'AUD' => 'Dọla ti Orílẹ́ède Ástràlìá',
'AWG' => 'Fuloríìnì Àrúbà',
@@ -255,18 +256,18 @@ $currencyNames = [
'BDT' => 'Tákà Báńgíládẹ̀ẹ̀ṣì',
'BGN' => 'Owó Lẹ́fì Bọ̀lìgéríà',
'BHD' => 'Dina ti Orílẹ́ède Báránì',
- 'BIF' => 'Faransi ti Orílẹ́ède Bùùrúndì',
+ 'BIF' => 'Faransi Bùùrúndì',
'BMD' => 'Dọ́là Bẹ̀múdà',
'BND' => 'Dọ́là Bùrùnéì',
'BOB' => 'Bọlifiánò Bọ̀lífíà',
'BRL' => 'Owó ti Orílẹ̀-èdè Brazil',
'BSD' => 'Dọ́là Bàhámà',
'BTN' => 'Ìngọ́tírọ̀mù Bútàànì',
- 'BWP' => 'Pula ti Orílẹ́ède Bọ̀tìsúwánà',
+ 'BWP' => 'Pula Bọ̀tìsúwánà',
'BYN' => 'Rọ́bù Bẹ̀lárùùsì',
'BZD' => 'Dọ́là Bẹ̀lísè',
- 'CAD' => 'Dọla ti Orílẹ́ède Kánádà',
- 'CDF' => 'Faransi ti Orílẹ́ède Kóngò',
+ 'CAD' => 'Dọ́là Kánádà',
+ 'CDF' => 'Firanki Kongo',
'CHF' => 'Faransi ti Orílẹ́ède Siwisi',
'CLP' => 'Pẹ́sò Ṣílè',
'CNH' => 'Yúànì Sháínà',
@@ -275,25 +276,25 @@ $currencyNames = [
'CRC' => 'Kólọ́ọ̀nì Kosita Ríkà',
'CUC' => 'Pẹ́sò Yíyípadà Kúbà',
'CUP' => 'Pẹ́sò Kúbà',
- 'CVE' => 'Kabofediano ti Orílẹ́ède Esuodo',
+ 'CVE' => 'Èsìkúdò Kapú Faadì',
'CZK' => 'Koruna Ṣẹ́ẹ̀kì',
- 'DJF' => 'Faransi ti Orílẹ́ède Dibouti',
+ 'DJF' => 'Faransi Dibouti',
'DKK' => 'Kírónì Dáníṣì',
'DOP' => 'Pẹ́sò Dòníníkà',
'DZD' => 'Dina ti Orílẹ́ède Àlùgèríánì',
'EGP' => 'pọọn ti Orílẹ́ède Egipiti',
- 'ERN' => 'Nakifa ti Orílẹ́ède Eriteriani',
- 'ETB' => 'Biri ti Orílẹ́ède Eutopia',
+ 'ERN' => 'Nakifasì Eritira',
+ 'ETB' => 'Báà Etópíà',
'EUR' => 'owó Yúrò',
'FJD' => 'Dọ́là Fíjì',
'FKP' => 'Pọ́n-ùn Erékùsù Falkland',
'GBP' => 'Pọ́n-ùn ti Orilẹ̀-èdè Gẹ̀ẹ́sì',
'GEL' => 'Lárì Jọ́jíà',
'GHC' => 'ṣidi ti Orílẹ́ède Gana',
- 'GHS' => 'Sídì Ghanaian',
+ 'GHS' => 'sídì Gana',
'GIP' => 'Pọ́n-ùn Gibraltar',
- 'GMD' => 'Dalasi ti Orílẹ́ède Gamibia',
- 'GNF' => 'Fírànkì Gíníànì',
+ 'GMD' => 'Dalasi Gamibia',
+ 'GNF' => 'Fírànkì Gínì',
'GNS' => 'Faransi ti Orílẹ́ède Gini',
'GTQ' => 'Kúẹ́tísààlì Guatimílà',
'GYD' => 'Dọ́là Gùyánà',
@@ -311,10 +312,10 @@ $currencyNames = [
'JMD' => 'Dọ́là Jàmáíkà',
'JOD' => 'Dínárì Jọ́dàànì',
'JPY' => 'Yeni ti Orílẹ́ède Japani',
- 'KES' => 'ṣiili ti Orílẹ́ède Kenya',
+ 'KES' => 'Ṣiili Kenya',
'KGS' => 'Sómú Kirijísítàànì',
'KHR' => 'Ráyò Kàm̀bọ́díà',
- 'KMF' => 'Faransi ti Orílẹ́ède ṣomoriani',
+ 'KMF' => 'Faransi Komori',
'KPW' => 'Wọ́ọ̀nù Àríwá Kòríà',
'KRW' => 'Wọ́ọ̀nù Gúúsù Kòríà',
'KWD' => 'Dínárì Kuwaiti',
@@ -323,27 +324,27 @@ $currencyNames = [
'LAK' => 'Kíììpù Làótì',
'LBP' => 'Pọ́n-ùn Lebanese',
'LKR' => 'Rúpìì Siri Láńkà',
- 'LRD' => 'Dọla ti Orílẹ́ède Liberia',
+ 'LRD' => 'Dọla Liberia',
'LSL' => 'Loti ti Orílẹ́ède Lesoto',
- 'LYD' => 'Dina ti Orílẹ́ède Libiya',
- 'MAD' => 'Dirami ti Orílẹ́ède Moroko',
+ 'LYD' => 'Dínà Líbíyà',
+ 'MAD' => 'Dírámì Morokò',
'MDL' => 'Owó Léhù Moldovan',
- 'MGA' => 'Faransi ti Orílẹ́ède Malagasi',
+ 'MGA' => 'Faransi Malagasi',
'MKD' => 'Dẹ́nà Masidóníà',
'MMK' => 'Kíyàtì Myanmar',
'MNT' => 'Túgúrììkì Mòǹgólíà',
'MOP' => 'Pàtákà Màkáò',
'MRO' => 'Ouguiya ti Orílẹ́ède Maritania (1973–2017)',
'MRU' => 'Ouguiya ti Orílẹ́ède Maritania',
- 'MUR' => 'Rupi ti Orílẹ́ède Maritiusi',
+ 'MUR' => 'Rupi Maritusi',
'MVR' => 'Rúfìyá Mọ̀lìdífà',
- 'MWK' => 'Kaṣa ti Orílẹ́ède Malawi',
+ 'MWK' => 'Kásà Màláwì',
'MXN' => 'Pẹ́sò Mẹ́síkò',
'MYR' => 'Ríngìtì Màléṣíà',
'MZM' => 'Metika ti Orílẹ́ède Mosamibiki',
'MZN' => 'Mẹ́tíkààlì Mòsáḿbíìkì',
- 'NAD' => 'Dọla ti Orílẹ́ède Namibia',
- 'NGN' => 'Náìrà ti Orílẹ̀-èdè Nàìjíríà',
+ 'NAD' => 'Dọla Namibíà',
+ 'NGN' => 'Náírà Nàìjíríà',
'NIO' => 'Kọ̀dóbà Naikarágúà',
'NOK' => 'Kírónì Nọ́ọ́wè',
'NPR' => 'Rúpìì Nẹ̵́pààlì',
@@ -360,34 +361,34 @@ $currencyNames = [
'RON' => 'Léhù Ròméníà',
'RSD' => 'Dínárì Sàbíà',
'RUB' => 'Owó ruble ti ilẹ̀ Rọ́ṣíà',
- 'RWF' => 'Faransi ti Orílẹ́ède Ruwanda',
+ 'RWF' => 'Faransi Ruwanda',
'SAR' => 'Riya ti Orílẹ́ède Saudi',
'SBD' => 'Dọ́là Erékùsù Sọ́lómọ́nì',
- 'SCR' => 'Rupi ti Orílẹ́ède Sayiselesi',
- 'SDG' => 'Dina ti Orílẹ́ède Sudani',
+ 'SCR' => 'Rúpì Sayiselesi',
+ 'SDG' => 'Pọ́n-ùn Sùdáànì',
'SDP' => 'Pọọun ti Orílẹ́ède Sudani',
'SEK' => 'Kòrónà Súwídìn',
'SGD' => 'Dọ́là Síngápọ̀',
- 'SHP' => 'Pọọun ti Orílẹ́ède ̣Elena',
- 'SLL' => 'Lioni',
- 'SOS' => 'Sile ti Orílẹ́ède Somali',
+ 'SHP' => 'Pọ́n-un Elena',
+ 'SLL' => 'Líónì Sira Líonì',
+ 'SOS' => 'Ṣílè Somali',
'SRD' => 'Dọ́là Súrínámì',
- 'SSP' => 'Pọ́n-ùn Gúúsù Sùdáànì',
+ 'SSP' => 'Pọ́n-un Gúúsù Sùdáànì',
'STD' => 'Dobira ti Orílẹ́ède Sao tome Ati Pirisipe (1977–2017)',
- 'STN' => 'Dobira ti Orílẹ́ède Sao tome Ati Pirisipe',
+ 'STN' => 'Dọbíra Sao tome àti Pirisipi',
'SYP' => 'Pọ́n-ùn Sírìà',
- 'SZL' => 'Lilangeni',
+ 'SZL' => 'Lilangeni Suwasi',
'THB' => 'Báàtì Tháì',
'TJS' => 'Sómónì Tajikístàànì',
'TMT' => 'Mánààtì Tọkimẹnístàànì',
- 'TND' => 'Dina ti Orílẹ́ède Tunisia',
+ 'TND' => 'Dínà Tuniṣíà',
'TOP' => 'Pàángà Tóńgà',
'TRY' => 'Lírà Tọ́kì',
'TTD' => 'Dọ́là Trinidad & Tobago',
'TWD' => 'Dọ́là Tàìwánì Tuntun',
- 'TZS' => 'Sile ti Orílẹ́ède Tansania',
+ 'TZS' => 'Sile Tansania',
'UAH' => 'Ọrifiníyà Yukiréníà',
- 'UGX' => 'Siile ti Orílẹ́ède Uganda',
+ 'UGX' => 'Ṣile Uganda',
'USD' => 'Dọ́là',
'UYU' => 'Pẹ́sò Úrúgúwè',
'UZS' => 'Sómú Usibẹkísítàànì',
@@ -395,15 +396,15 @@ $currencyNames = [
'VND' => 'Dáhùn Vietnamese',
'VUV' => 'Fátù Vanuatu',
'WST' => 'Tálà Sàmóà',
- 'XAF' => 'Faransi ti Orílẹ́ède BEKA',
+ 'XAF' => 'Firanki àárín Afíríkà',
'XCD' => 'Dọ́là Ilà Oòrùn Karíbíà',
- 'XOF' => 'Faransi ti Orílẹ́ède BIKEAO',
+ 'XOF' => 'Faransì ìwọ̀-oorùn Afíríkà',
'XPF' => 'Fírànkì CFP',
'XXX' => 'owóníná àìmọ̀',
'YER' => 'Ráyò Yẹ́mẹ̀nì',
- 'ZAR' => 'Randi ti Orílẹ́ède Ariwa Afirika',
+ 'ZAR' => 'Rándì Gúúsù Afíríkà',
'ZMK' => 'Kawaṣa ti Orílẹ́ède Saabia (1968–2012)',
- 'ZMW' => 'Kawaṣa ti Orílẹ́ède Saabia',
+ 'ZMW' => 'Kàwasà Sámbíà',
'ZWD' => 'Dọla ti Orílẹ́ède Siibabuwe',
];
@@ -416,267 +417,267 @@ $currencySymbols = [
$countryNames = [
'AC' => 'Erékùsù Ascension',
- 'AD' => 'Orílẹ́ède Ààndórà',
- 'AE' => 'Orílẹ́ède Ẹmirate ti Awọn Arabu',
- 'AF' => 'Orílẹ́ède Àfùgànístánì',
- 'AG' => 'Orílẹ́ède Ààntígúà àti Báríbúdà',
- 'AI' => 'Orílẹ́ède Ààngúlílà',
- 'AL' => 'Orílẹ́ède Àlùbàníánì',
- 'AM' => 'Orílẹ́ède Améníà',
- 'AO' => 'Orílẹ́ède Ààngólà',
+ 'AD' => 'Ààndórà',
+ 'AE' => 'Ẹmirate ti Awọn Arabu',
+ 'AF' => 'Àfùgànístánì',
+ 'AG' => 'Ààntígúà àti Báríbúdà',
+ 'AI' => 'Ààngúlílà',
+ 'AL' => 'Àlùbàníánì',
+ 'AM' => 'Améníà',
+ 'AO' => 'Ààngólà',
'AQ' => 'Antakítíkà',
- 'AR' => 'Orílẹ́ède Agentínà',
+ 'AR' => 'Agentínà',
'AS' => 'Sámóánì ti Orílẹ́ède Àméríkà',
- 'AT' => 'Orílẹ́ède Asítíríà',
- 'AU' => 'Orílẹ́ède Ástràlìá',
- 'AW' => 'Orílẹ́ède Árúbà',
+ 'AT' => 'Asítíríà',
+ 'AU' => 'Ástràlìá',
+ 'AW' => 'Árúbà',
'AX' => 'Àwọn Erékùsù ti Åland',
- 'AZ' => 'Orílẹ́ède Asẹ́bájánì',
- 'BA' => 'Orílẹ́ède Bọ̀síníà àti Ẹtisẹgófínà',
- 'BB' => 'Orílẹ́ède Bábádósì',
- 'BD' => 'Orílẹ́ède Bángáládésì',
- 'BE' => 'Orílẹ́ède Bégíọ́mù',
- 'BF' => 'Orílẹ́ède Bùùkíná Fasò',
- 'BG' => 'Orílẹ́ède Bùùgáríà',
- 'BH' => 'Orílẹ́ède Báránì',
- 'BI' => 'Orílẹ́ède Bùùrúndì',
- 'BJ' => 'Orílẹ́ède Bẹ̀nẹ̀',
+ 'AZ' => 'Asẹ́bájánì',
+ 'BA' => 'Bọ̀síníà àti Ẹtisẹgófínà',
+ 'BB' => 'Bábádósì',
+ 'BD' => 'Bángáládésì',
+ 'BE' => 'Bégíọ́mù',
+ 'BF' => 'Bùùkíná Fasò',
+ 'BG' => 'Bùùgáríà',
+ 'BH' => 'Báránì',
+ 'BI' => 'Bùùrúndì',
+ 'BJ' => 'Bẹ̀nẹ̀',
'BL' => 'St. Barthélemy',
- 'BM' => 'Orílẹ́ède Bémúdà',
- 'BN' => 'Orílẹ́ède Búrúnẹ́lì',
- 'BO' => 'Orílẹ́ède Bọ̀lífíyà',
+ 'BM' => 'Bémúdà',
+ 'BN' => 'Búrúnẹ́lì',
+ 'BO' => 'Bọ̀lífíyà',
'BQ' => 'Caribbean Netherlands',
- 'BR' => 'Orilẹ̀-èdè Bàràsílì',
- 'BS' => 'Orílẹ́ède Bàhámásì',
- 'BT' => 'Orílẹ́ède Bútánì',
+ 'BR' => 'Bàràsílì',
+ 'BS' => 'Bàhámásì',
+ 'BT' => 'Bútánì',
'BV' => 'Erékùsù Bouvet',
- 'BW' => 'Orílẹ́ède Bọ̀tìsúwánà',
- 'BY' => 'Orílẹ́ède Bélárúsì',
- 'BZ' => 'Orílẹ́ède Bèlísẹ̀',
- 'CA' => 'Orílẹ́ède Kánádà',
+ 'BW' => 'Bọ̀tìsúwánà',
+ 'BY' => 'Bélárúsì',
+ 'BZ' => 'Bèlísẹ̀',
+ 'CA' => 'Kánádà',
'CC' => 'Erékùsù Cocos (Keeling)',
- 'CD' => 'Orilẹ́ède Kóngò',
- 'CF' => 'Orílẹ́ède Àrin gùngun Áfíríkà',
- 'CG' => 'Orílẹ́ède Kóngò',
- 'CH' => 'Orílẹ́ède switiṣilandi',
- 'CI' => 'Orílẹ́ède Kóútè forà',
- 'CK' => 'Orílẹ́ède Etíokun Kùúkù',
- 'CL' => 'Orílẹ́ède ṣílè',
- 'CM' => 'Orílẹ́ède Kamerúúnì',
- 'CN' => 'Orilẹ̀-èdè Ṣáínà',
- 'CO' => 'Orílẹ́ède Kòlómíbìa',
+ 'CD' => 'Kóńgò – Kinshasa',
+ 'CF' => 'Àrin gùngun Áfíríkà',
+ 'CG' => 'Kóńgò – Brazaville',
+ 'CH' => 'switiṣilandi',
+ 'CI' => 'Kóútè forà',
+ 'CK' => 'Etíokun Kùúkù',
+ 'CL' => 'Ṣílè',
+ 'CM' => 'Kamerúúnì',
+ 'CN' => 'Ṣáínà',
+ 'CO' => 'Kòlómíbìa',
'CP' => 'Erékùsù Clipperston',
- 'CR' => 'Orílẹ́ède Kuusita Ríkà',
- 'CU' => 'Orílẹ́ède Kúbà',
- 'CV' => 'Orílẹ́ède Etíokun Kápé féndè',
+ 'CR' => 'Kuusita Ríkà',
+ 'CU' => 'Kúbà',
+ 'CV' => 'Etíokun Kápé féndè',
'CW' => 'Curaçao',
'CX' => 'Erékùsù Christmas',
- 'CY' => 'Orílẹ́ède Kúrúsì',
- 'CZ' => 'Orílẹ́ède ṣẹ́ẹ́kì',
- 'DE' => 'Orílẹèdè Jámánì',
+ 'CY' => 'Kúrúsì',
+ 'CZ' => 'Ṣẹ́ẹ́kì',
+ 'DE' => 'Jámánì',
'DG' => 'Diego Gaṣia',
- 'DJ' => 'Orílẹ́ède Díbọ́ótì',
- 'DK' => 'Orílẹ́ède Dẹ́mákì',
- 'DM' => 'Orílẹ́ède Dòmíníkà',
- 'DO' => 'Orilẹ́ède Dòmíníkánì',
- 'DZ' => 'Orílẹ́ède Àlùgèríánì',
+ 'DJ' => 'Díbọ́ótì',
+ 'DK' => 'Dẹ́mákì',
+ 'DM' => 'Dòmíníkà',
+ 'DO' => 'Dòmíníkánì',
+ 'DZ' => 'Àlùgèríánì',
'EA' => 'Seuta àti Melilla',
- 'EC' => 'Orílẹ́ède Ekuádò',
- 'EE' => 'Orílẹ́ède Esitonia',
- 'EG' => 'Orílẹ́ède Égípítì',
+ 'EC' => 'Ekuádò',
+ 'EE' => 'Esitonia',
+ 'EG' => 'Égípítì',
'EH' => 'Ìwọ̀òòrùn Sàhárà',
- 'ER' => 'Orílẹ́ède Eritira',
- 'ES' => 'Orílẹ́ède Sipani',
- 'ET' => 'Orílẹ́ède Etopia',
- 'EU' => 'Ìṣọ̀kan Yúròpù',
- 'EZ' => 'Agbègbè Euro',
- 'FI' => 'Orílẹ́ède Filandi',
- 'FJ' => 'Orílẹ́ède Fiji',
- 'FK' => 'Orílẹ́ède Etikun Fakalandi',
- 'FM' => 'Orílẹ́ède Makoronesia',
+ 'ER' => 'Eritira',
+ 'ES' => 'Sipani',
+ 'ET' => 'Etopia',
+ 'EU' => 'Àpapọ̀ Yúróòpù',
+ 'EZ' => 'Agbègbè Yúrò',
+ 'FI' => 'Filandi',
+ 'FJ' => 'Fiji',
+ 'FK' => 'Etikun Fakalandi',
+ 'FM' => 'Makoronesia',
'FO' => 'Àwọn Erékùsù ti Faroe',
- 'FR' => 'Orílẹ́ède Faranse',
- 'GA' => 'Orílẹ́ède Gabon',
- 'GB' => 'Orílẹ́èdè Gẹ̀ẹ́sì',
- 'GD' => 'Orílẹ́ède Genada',
- 'GE' => 'Orílẹ́ède Gọgia',
- 'GF' => 'Orílẹ́ède Firenṣi Guana',
+ 'FR' => 'Faranse',
+ 'GA' => 'Gabon',
+ 'GB' => 'Gẹ̀ẹ́sì',
+ 'GD' => 'Genada',
+ 'GE' => 'Gọgia',
+ 'GF' => 'Firenṣi Guana',
'GG' => 'Guernsey',
- 'GH' => 'Orílẹ́ède Gana',
- 'GI' => 'Orílẹ́ède Gibaratara',
- 'GL' => 'Orílẹ́ède Gerelandi',
- 'GM' => 'Orílẹ́ède Gambia',
- 'GN' => 'Orílẹ́ède Gene',
- 'GP' => 'Orílẹ́ède Gadelope',
- 'GQ' => 'Orílẹ́ède Ekutoria Gini',
- 'GR' => 'Orílẹ́ède Geriisi',
+ 'GH' => 'Gana',
+ 'GI' => 'Gibaratara',
+ 'GL' => 'Gerelandi',
+ 'GM' => 'Gambia',
+ 'GN' => 'Gene',
+ 'GP' => 'Gadelope',
+ 'GQ' => 'Ekutoria Gini',
+ 'GR' => 'Geriisi',
'GS' => 'Gúúsù Georgia àti Gúúsù Àwọn Erékùsù Sandwich',
- 'GT' => 'Orílẹ́ède Guatemala',
- 'GU' => 'Orílẹ́ède Guamu',
- 'GW' => 'Orílẹ́ède Gene-Busau',
- 'GY' => 'Orílẹ́ède Guyana',
- 'HK' => 'Hong Kong SAR ti Ṣáìnà',
+ 'GT' => 'Guatemala',
+ 'GU' => 'Guamu',
+ 'GW' => 'Gene-Busau',
+ 'GY' => 'Guyana',
+ 'HK' => 'Hong Kong',
'HM' => 'Erékùsù Heard àti Erékùsù McDonald',
- 'HN' => 'Orílẹ́ède Hondurasi',
- 'HR' => 'Orílẹ́ède Kòróátíà',
- 'HT' => 'Orílẹ́ède Haati',
- 'HU' => 'Orílẹ́ède Hungari',
+ 'HN' => 'Hondurasi',
+ 'HR' => 'Kòróátíà',
+ 'HT' => 'Haati',
+ 'HU' => 'Hungari',
'IC' => 'Ẹrékùsù Kánárì',
- 'ID' => 'Orílẹ́ède Indonesia',
- 'IE' => 'Orílẹ́ède Ailandi',
- 'IL' => 'Orílẹ́ède Iserẹli',
+ 'ID' => 'Indonesia',
+ 'IE' => 'Ailandi',
+ 'IL' => 'Iserẹli',
'IM' => 'Isle of Man',
- 'IN' => 'Orílẹ́ède India',
- 'IO' => 'Orílẹ́ède Etíkun Índíánì ti Ìlú Bírítísì',
- 'IQ' => 'Orílẹ́ède Iraki',
- 'IR' => 'Orílẹ́ède Irani',
- 'IS' => 'Orílẹ́ède Aṣilandi',
- 'IT' => 'Orílẹ́ède Itáli',
+ 'IN' => 'India',
+ 'IO' => 'Etíkun Índíánì ti Ìlú Bírítísì',
+ 'IQ' => 'Iraki',
+ 'IR' => 'Irani',
+ 'IS' => 'Aṣilandi',
+ 'IT' => 'Itáli',
'JE' => 'Jersey',
- 'JM' => 'Orílẹ́ède Jamaika',
- 'JO' => 'Orílẹ́ède Jọdani',
- 'JP' => 'Orílẹ́ède Japani',
- 'KE' => 'Orílẹ́ède Kenya',
- 'KG' => 'Orílẹ́ède Kuriṣisitani',
- 'KH' => 'Orílẹ́ède Kàmùbódíà',
- 'KI' => 'Orílẹ́ède Kiribati',
- 'KM' => 'Orílẹ́ède Kòmòrósì',
- 'KN' => 'Orílẹ́ède Kiiti ati Neefi',
- 'KP' => 'Orílẹ́ède Guusu Kọria',
- 'KR' => 'Orílẹ́ède Ariwa Kọria',
- 'KW' => 'Orílẹ́ède Kuweti',
- 'KY' => 'Orílẹ́ède Etíokun Kámánì',
- 'KZ' => 'Orílẹ́ède Kaṣaṣatani',
- 'LA' => 'Orílẹ́ède Laosi',
- 'LB' => 'Orílẹ́ède Lebanoni',
- 'LC' => 'Orílẹ́ède Luṣia',
- 'LI' => 'Orílẹ́ède Lẹṣitẹnisiteni',
- 'LK' => 'Orílẹ́ède Siri Lanka',
- 'LR' => 'Orílẹ́ède Laberia',
- 'LS' => 'Orílẹ́ède Lesoto',
- 'LT' => 'Orílẹ́ède Lituania',
- 'LU' => 'Orílẹ́ède Lusemogi',
- 'LV' => 'Orílẹ́ède Latifia',
- 'LY' => 'Orílẹ́ède Libiya',
- 'MA' => 'Orílẹ́ède Moroko',
- 'MC' => 'Orílẹ́ède Monako',
- 'MD' => 'Orílẹ́ède Modofia',
+ 'JM' => 'Jamaika',
+ 'JO' => 'Jọdani',
+ 'JP' => 'Japani',
+ 'KE' => 'Kenya',
+ 'KG' => 'Kuriṣisitani',
+ 'KH' => 'Kàmùbódíà',
+ 'KI' => 'Kiribati',
+ 'KM' => 'Kòmòrósì',
+ 'KN' => 'Kiiti ati Neefi',
+ 'KP' => 'Guusu Kọria',
+ 'KR' => 'Ariwa Kọria',
+ 'KW' => 'Kuweti',
+ 'KY' => 'Etíokun Kámánì',
+ 'KZ' => 'Kaṣaṣatani',
+ 'LA' => 'Laosi',
+ 'LB' => 'Lebanoni',
+ 'LC' => 'Luṣia',
+ 'LI' => 'Lẹṣitẹnisiteni',
+ 'LK' => 'Siri Lanka',
+ 'LR' => 'Laberia',
+ 'LS' => 'Lesoto',
+ 'LT' => 'Lituania',
+ 'LU' => 'Lusemogi',
+ 'LV' => 'Latifia',
+ 'LY' => 'Libiya',
+ 'MA' => 'Moroko',
+ 'MC' => 'Monako',
+ 'MD' => 'Modofia',
'ME' => 'Montenegro',
'MF' => 'St. Martin',
- 'MG' => 'Orílẹ́ède Madasika',
- 'MH' => 'Orílẹ́ède Etikun Máṣali',
+ 'MG' => 'Madasika',
+ 'MH' => 'Etikun Máṣali',
'MK' => 'Àríwá Macedonia',
- 'ML' => 'Orílẹ́ède Mali',
- 'MM' => 'Orílẹ́ède Manamari',
- 'MN' => 'Orílẹ́ède Mogolia',
+ 'ML' => 'Mali',
+ 'MM' => 'Manamari',
+ 'MN' => 'Mogolia',
'MO' => 'Màkáò',
- 'MP' => 'Orílẹ́ède Etikun Guusu Mariana',
- 'MQ' => 'Orílẹ́ède Matinikuwi',
- 'MR' => 'Orílẹ́ède Maritania',
- 'MS' => 'Orílẹ́ède Motserati',
- 'MT' => 'Orílẹ́ède Malata',
- 'MU' => 'Orílẹ́ède Maritiusi',
- 'MV' => 'Orílẹ́ède Maladifi',
- 'MW' => 'Orílẹ́ède Malawi',
- 'MX' => 'Orílẹ́ède Mesiko',
- 'MY' => 'Orílẹ́ède Malasia',
- 'MZ' => 'Orílẹ́ède Moṣamibiku',
- 'NA' => 'Orílẹ́ède Namibia',
- 'NC' => 'Orílẹ́ède Kaledonia Titun',
- 'NE' => 'Orílẹ́ède Nàìjá',
- 'NF' => 'Orílẹ́ède Etikun Nọ́úfókì',
- 'NG' => 'Orilẹ̀-èdè Nàìjíríà',
- 'NI' => 'Orílẹ́ède NIkaragua',
- 'NL' => 'Orílẹ́ède Nedalandi',
- 'NO' => 'Orílẹ́ède Nọọwii',
- 'NP' => 'Orílẹ́ède Nepa',
- 'NR' => 'Orílẹ́ède Nauru',
- 'NU' => 'Orílẹ́ède Niue',
- 'NZ' => 'Orílẹ́ède ṣilandi Titun',
- 'OM' => 'Orílẹ́ède Ọọma',
- 'PA' => 'Orílẹ́ède Panama',
- 'PE' => 'Orílẹ́ède Peru',
- 'PF' => 'Orílẹ́ède Firenṣi Polinesia',
- 'PG' => 'Orílẹ́ède Paapu ti Giini',
- 'PH' => 'Orílẹ́ède filipini',
- 'PK' => 'Orílẹ́ède Pakisitan',
- 'PL' => 'Orílẹ́ède Polandi',
- 'PM' => 'Orílẹ́ède Pẹẹri ati mikuloni',
- 'PN' => 'Orílẹ́ède Pikarini',
- 'PR' => 'Orílẹ́ède Pọto Riko',
- 'PS' => 'Palẹsitín',
- 'PT' => 'Orílẹ́ède Pọ́túgà',
- 'PW' => 'Orílẹ́ède Paalu',
- 'PY' => 'Orílẹ́ède Paraguye',
- 'QA' => 'Orílẹ́ède Kota',
- 'QO' => 'Agbègbè Oceania',
- 'RE' => 'Orílẹ́ède Riuniyan',
- 'RO' => 'Orílẹ́ède Romaniya',
+ 'MP' => 'Etikun Guusu Mariana',
+ 'MQ' => 'Matinikuwi',
+ 'MR' => 'Maritania',
+ 'MS' => 'Motserati',
+ 'MT' => 'Malata',
+ 'MU' => 'Maritiusi',
+ 'MV' => 'Maladifi',
+ 'MW' => 'Malawi',
+ 'MX' => 'Mesiko',
+ 'MY' => 'Malasia',
+ 'MZ' => 'Moṣamibiku',
+ 'NA' => 'Namibia',
+ 'NC' => 'Kaledonia Titun',
+ 'NE' => 'Nàìjá',
+ 'NF' => 'Etikun Nọ́úfókì',
+ 'NG' => 'Nàìjíríà',
+ 'NI' => 'Nikaragua',
+ 'NL' => 'Nedalandi',
+ 'NO' => 'Nọọwii',
+ 'NP' => 'Nepa',
+ 'NR' => 'Nauru',
+ 'NU' => 'Niue',
+ 'NZ' => 'Ṣilandi Titun',
+ 'OM' => 'Ọọma',
+ 'PA' => 'Panama',
+ 'PE' => 'Peru',
+ 'PF' => 'Firenṣi Polinesia',
+ 'PG' => 'Paapu ti Giini',
+ 'PH' => 'Filipini',
+ 'PK' => 'Pakisitan',
+ 'PL' => 'Polandi',
+ 'PM' => 'Pẹẹri ati mikuloni',
+ 'PN' => 'Pikarini',
+ 'PR' => 'Pọto Riko',
+ 'PS' => 'Palẹsítínì',
+ 'PT' => 'Pọ́túgà',
+ 'PW' => 'Paalu',
+ 'PY' => 'Paraguye',
+ 'QA' => 'Kota',
+ 'QO' => 'Agbègbè Òṣọ́ọ́níà',
+ 'RE' => 'Riuniyan',
+ 'RO' => 'Romaniya',
'RS' => 'Serbia',
- 'RU' => 'Orílẹ́ède Rọṣia',
- 'RW' => 'Orílẹ́ède Ruwanda',
- 'SA' => 'Orílẹ́ède Saudi Arabia',
- 'SB' => 'Orílẹ́ède Etikun Solomoni',
- 'SC' => 'Orílẹ́ède seṣẹlẹsi',
- 'SD' => 'Orílẹ́ède Sudani',
- 'SE' => 'Orílẹ́ède Swidini',
- 'SG' => 'Orílẹ́ède Singapo',
- 'SH' => 'Orílẹ́ède Hẹlena',
- 'SI' => 'Orílẹ́ède Silofania',
+ 'RU' => 'Rọṣia',
+ 'RW' => 'Ruwanda',
+ 'SA' => 'Saudi Arabia',
+ 'SB' => 'Etikun Solomoni',
+ 'SC' => 'Ṣeṣẹlẹsi',
+ 'SD' => 'Sudani',
+ 'SE' => 'Swidini',
+ 'SG' => 'Singapo',
+ 'SH' => 'Hẹlena',
+ 'SI' => 'Silofania',
'SJ' => 'Svalbard & Jan Mayen',
- 'SK' => 'Orílẹ́ède Silofakia',
- 'SL' => 'Orílẹ́ède Siria looni',
- 'SM' => 'Orílẹ́ède Sani Marino',
- 'SN' => 'Orílẹ́ède Sẹnẹga',
- 'SO' => 'Orílẹ́ède Somalia',
- 'SR' => 'Orílẹ́ède Surinami',
+ 'SK' => 'Silofakia',
+ 'SL' => 'Siria looni',
+ 'SM' => 'Sani Marino',
+ 'SN' => 'Sẹnẹga',
+ 'SO' => 'Somalia',
+ 'SR' => 'Surinami',
'SS' => 'Gúúsù Sudan',
- 'ST' => 'Orílẹ́ède Sao tomi ati piriiṣipi',
- 'SV' => 'Orílẹ́ède Ẹẹsáfádò',
+ 'ST' => 'Sao tomi ati piriiṣipi',
+ 'SV' => 'Ẹẹsáfádò',
'SX' => 'Sint Maarten',
- 'SY' => 'Orílẹ́ède Siria',
- 'SZ' => 'Orílẹ́ède Saṣiland',
+ 'SY' => 'Siria',
+ 'SZ' => 'Saṣiland',
'TA' => 'Tristan da Kunha',
- 'TC' => 'Orílẹ́ède Tọọki ati Etikun Kakọsi',
- 'TD' => 'Orílẹ́ède ṣààdì',
+ 'TC' => 'Tọọki ati Etikun Kakọsi',
+ 'TD' => 'Ṣààdì',
'TF' => 'Agbègbè Gúúsù Faranṣé',
- 'TG' => 'Orílẹ́ède Togo',
- 'TH' => 'Orílẹ́ède Tailandi',
- 'TJ' => 'Orílẹ́ède Takisitani',
- 'TK' => 'Orílẹ́ède Tokelau',
- 'TL' => 'Orílẹ́ède ÌlàOòrùn Tímọ̀',
- 'TM' => 'Orílẹ́ède Tọọkimenisita',
- 'TN' => 'Orílẹ́ède Tuniṣia',
- 'TO' => 'Orílẹ́ède Tonga',
- 'TR' => 'Orílẹ́ède Tọọki',
- 'TT' => 'Orílẹ́ède Tirinida ati Tobaga',
- 'TV' => 'Orílẹ́ède Tufalu',
- 'TW' => 'Orílẹ́ède Taiwani',
- 'TZ' => 'Orílẹ́ède Tàǹsáníà',
- 'UA' => 'Orílẹ́ède Ukarini',
- 'UG' => 'Orílẹ́ède Uganda',
+ 'TG' => 'Togo',
+ 'TH' => 'Tailandi',
+ 'TJ' => 'Takisitani',
+ 'TK' => 'Tokelau',
+ 'TL' => 'ÌlàOòrùn Tímọ̀',
+ 'TM' => 'Tọọkimenisita',
+ 'TN' => 'Tuniṣia',
+ 'TO' => 'Tonga',
+ 'TR' => 'Tọọki',
+ 'TT' => 'Tirinida ati Tobaga',
+ 'TV' => 'Tufalu',
+ 'TW' => 'Taiwani',
+ 'TZ' => 'Tàǹsáníà',
+ 'UA' => 'Ukarini',
+ 'UG' => 'Uganda',
'UM' => 'Àwọn Erékùsù Kékèké Agbègbè US',
'UN' => 'Ìṣọ̀kan àgbáyé',
- 'US' => 'Orílẹ̀-èdè Amẹrikà',
- 'UY' => 'Orílẹ́ède Nruguayi',
- 'UZ' => 'Orílẹ́ède Nṣibẹkisitani',
+ 'US' => 'Amẹrikà',
+ 'UY' => 'Nruguayi',
+ 'UZ' => 'Nṣibẹkisitani',
'VA' => 'Ìlú Vatican',
- 'VC' => 'Orílẹ́ède Fisẹnnti ati Genadina',
- 'VE' => 'Orílẹ́ède Fẹnẹṣuẹla',
- 'VG' => 'Orílẹ́ède Etíkun Fágínì ti ìlú Bírítísì',
- 'VI' => 'Orílẹ́ède Etikun Fagini ti Amẹrika',
- 'VN' => 'Orílẹ́ède Fẹtinami',
- 'VU' => 'Orílẹ́ède Faniatu',
- 'WF' => 'Orílẹ́ède Wali ati futuna',
- 'WS' => 'Orílẹ́ède Samọ',
- 'XA' => 'Pseudo-Accents',
- 'XB' => 'Pseudo-Bidi',
+ 'VC' => 'Fisẹnnti ati Genadina',
+ 'VE' => 'Fẹnẹṣuẹla',
+ 'VG' => 'Etíkun Fágínì ti ìlú Bírítísì',
+ 'VI' => 'Etikun Fagini ti Amẹrika',
+ 'VN' => 'Fẹtinami',
+ 'VU' => 'Faniatu',
+ 'WF' => 'Wali ati futuna',
+ 'WS' => 'Samọ',
+ 'XA' => 'ìsọ̀rọ̀sí irọ́',
+ 'XB' => 'ibi irọ́',
'XK' => 'Kòsófò',
- 'YE' => 'Orílẹ́ède yemeni',
- 'YT' => 'Orílẹ́ède Mayote',
+ 'YE' => 'Yemeni',
+ 'YT' => 'Mayote',
'ZA' => 'Gúúṣù Áfíríkà',
- 'ZM' => 'Orílẹ́ède ṣamibia',
- 'ZW' => 'Orílẹ́ède ṣimibabe',
+ 'ZM' => 'Ṣamibia',
+ 'ZW' => 'Ṣimibabe',
];
$timeUnits = [
diff --git a/MLEB/cldr/CldrNames/CldrNamesZh_hans.php b/MLEB/cldr/CldrNames/CldrNamesZh_hans.php
index 4a921aaa..6b90b40c 100644
--- a/MLEB/cldr/CldrNames/CldrNamesZh_hans.php
+++ b/MLEB/cldr/CldrNames/CldrNamesZh_hans.php
@@ -111,7 +111,7 @@ $languageNames = [
'dje' => '哲尔马语',
'doi' => '多格拉语',
'dsb' => '下索布语',
- 'dua' => '都阿拉语',
+ 'dua' => '杜阿拉语',
'dum' => '中古荷兰语',
'dv' => '迪维希语',
'dyo' => '朱拉语',
@@ -138,7 +138,7 @@ $languageNames = [
'es-mx' => '墨西哥西班牙语',
'et' => '爱沙尼亚语',
'eu' => '巴斯克语',
- 'ewo' => '旺杜语',
+ 'ewo' => '埃翁多语',
'fa' => '波斯语',
'fa-af' => '达里语',
'fan' => '芳格语',
diff --git a/MLEB/cldr/CldrNames/CldrNamesZu.php b/MLEB/cldr/CldrNames/CldrNamesZu.php
index e529d080..1dcba9d1 100644
--- a/MLEB/cldr/CldrNames/CldrNamesZu.php
+++ b/MLEB/cldr/CldrNames/CldrNamesZu.php
@@ -74,6 +74,7 @@ $languageNames = [
'de-ch' => 'Isi-Swiss High German',
'dgr' => 'isi-Dogrib',
'dje' => 'isi-Zarma',
+ 'doi' => 'isi-Dogri',
'dsb' => 'isi-Lower Sorbian',
'dua' => 'isi-Duala',
'dv' => 'isi-Divehi',
@@ -94,7 +95,7 @@ $languageNames = [
'es' => 'isi-Spanish',
'es-419' => 'isi-Latin American Spanish',
'es-es' => 'isi-European Spanish',
- 'es-mx' => 'Isi-Mexican Spanish',
+ 'es-mx' => 'isi-Mexican Spanish',
'et' => 'isi-Estonia',
'eu' => 'isi-Basque',
'ewo' => 'isi-Ewondo',
@@ -109,6 +110,7 @@ $languageNames = [
'fr' => 'isi-French',
'fr-ca' => 'isi-Canadian French',
'fr-ch' => 'isi-Swiss French',
+ 'frc' => 'isi-Cajun French',
'fur' => 'isi-Friulian',
'fy' => 'isi-Western Frisian',
'ga' => 'isi-Irish',
@@ -208,6 +210,7 @@ $languageNames = [
'lkt' => 'isi-Lakota',
'ln' => 'isi-Lingala',
'lo' => 'isi-Lao',
+ 'lou' => 'isi-Louisiana Creole',
'loz' => 'isi-Lozi',
'lrc' => 'isi-Northern Luri',
'lt' => 'isi-Lithuanian',
@@ -404,7 +407,7 @@ $languageNames = [
'zgh' => 'isi-Moroccan Tamazight esivamile',
'zh' => 'isi-Chinese',
'zh-hans' => 'isi-Chinese (esenziwe-lula)',
- 'zh-hant' => 'isi-Chinese (Okosiko)',
+ 'zh-hant' => 'isi-Chinese (Sasendulo)',
'zu' => 'isiZulu',
'zun' => 'isi-Zuni',
'zxx' => 'akukho okuqukethwe kolimi',
@@ -442,7 +445,7 @@ $currencyNames = [
'CDF' => 'i-Congolese Franc',
'CHF' => 'i-Swiss Franc',
'CLP' => 'i-Chilean Peso',
- 'CNH' => 'i-Chinese yuan (offshore)',
+ 'CNH' => 'i-CNH',
'CNY' => 'i-Chinese Yuan',
'COP' => 'i-Colombian Peso',
'CRC' => 'i-Costa Rican Colón',
@@ -812,6 +815,7 @@ $countryNames = [
'ES' => 'i-Spain',
'ET' => 'i-Ethiopia',
'EU' => 'i-European Union',
+ 'EZ' => 'I-Eurozone',
'FI' => 'i-Finland',
'FJ' => 'i-Fiji',
'FK' => 'i-Falkland Islands',
diff --git a/MLEB/cldr/Gruntfile.js b/MLEB/cldr/Gruntfile.js
index 44a33377..c338ba60 100644
--- a/MLEB/cldr/Gruntfile.js
+++ b/MLEB/cldr/Gruntfile.js
@@ -5,7 +5,6 @@ module.exports = function ( grunt ) {
grunt.loadNpmTasks( 'grunt-banana-checker' );
grunt.loadNpmTasks( 'grunt-eslint' );
- grunt.loadNpmTasks( 'grunt-jsonlint' );
grunt.initConfig( {
eslint: {
@@ -13,21 +12,14 @@ module.exports = function ( grunt ) {
cache: true
},
all: [
- '**/*.js',
+ '**/*.{js,json}',
'!node_modules/**',
'!vendor/**'
]
},
- banana: conf.MessagesDirs,
- jsonlint: {
- all: [
- '**/*.json',
- '!node_modules/**',
- '!vendor/**'
- ]
- }
+ banana: conf.MessagesDirs
} );
- grunt.registerTask( 'test', [ 'eslint', 'jsonlint', 'banana' ] );
+ grunt.registerTask( 'test', [ 'eslint', 'banana' ] );
grunt.registerTask( 'default', 'test' );
};
diff --git a/MLEB/cldr/LocalNames/LocalNamesDe.php b/MLEB/cldr/LocalNames/LocalNamesDe.php
index d9ead706..08806035 100644
--- a/MLEB/cldr/LocalNames/LocalNamesDe.php
+++ b/MLEB/cldr/LocalNames/LocalNamesDe.php
@@ -7,25 +7,32 @@ $languageNames = [
*/
'abe' => 'Westliches Abenaki',
'abs' => 'Ambonesisches Malaysisch',
- 'abq' => 'Abasinisch', # used by Wikidata, T155367
- 'abq-latn' => 'Abasinisch', # used by Wikidata, T155424
+ # used by Wikidata, T155367
+ 'abq' => 'Abasinisch',
+ # used by Wikidata, T155424
+ 'abq-latn' => 'Abasinisch',
'ady-cyrl' => 'Adygeisch (kyrillisch Schrift)',
'aeb-arab' => 'Tunesisches Arabisch (arabische Schrift)',
'aeb-latn' => 'Tunesisches Arabisch (lateinische Schrift)',
- 'alc' => 'Kawesqar', # used by Wikidata, T190981
+ # used by Wikidata, T190981
+ 'alc' => 'Kawesqar',
'ami' => 'Amisisch',
'azb' => 'Südaserbaidschanisch',
'bat-smg' => 'Schemaitisch',
'bbc-latn' => 'Batak Toba (lateinische Schrift)',
'bcc' => 'Südliches Belutschi',
'bcl' => 'Zentralbikolano',
- 'bdr' => 'Westküsten-Bajau', # used by Wikidata, T234330
+ # used by Wikidata, T234330
+ 'bdr' => 'Westküsten-Bajau',
'be-tarask' => 'Weißrussisch (Taraschkewiza)',
- 'be-x-old' => 'Weißrussisch (Taraschkewiza)', # still the internal code of be-tarask.wikipedia.org
+ # still the internal code of be-tarask.wikipedia.org
+ 'be-x-old' => 'Weißrussisch (Taraschkewiza)',
'bgp' => 'Östliches Belutschi',
'bh' => 'Bhojpuri',
'bnn' => 'Bunun',
'bxr' => 'Russisches Burjatisch',
+ # used by Wikidata T266423
+ 'cal' => 'Karolinisch',
'cbk-zam' => 'Chavacano',
'cdo' => 'Min Dong',
'cja-arab' => 'Westliches Cham (arabische Schrift)',
@@ -39,23 +46,36 @@ $languageNames = [
'cjy-hans' => 'Jin (vereinfacht)',
'cjy-hant' => 'Jin (traditionell)',
'cjy' => 'Jin',
- 'ckt' => 'Tschuktschisch', # used by Wikidata, T240097
- 'clc' => 'Tschilcotin', # used by Wikidata, T222020
+ # used by Wikidata, T240097
+ 'ckt' => 'Tschuktschisch',
+ # used by Wikidata, T222020
+ 'clc' => 'Tschilcotin',
'cnr' => 'Montenegrinisch',
'crb' => 'Insel-Karibisch',
'crh-cyrl' => 'Krimtatarisch (kyrillische Schrift)',
'crh-latn' => 'Krimtatarisch (lateinische Schrift)',
'crh' => 'Krimtatarisch',
- 'dag' => 'Dagbani', # used by Wikidata, T240098
+ # used by Wikidata, T264532
+ 'crl' => 'Ost-Cree',
+ # used by Wikidata, T240098
+ 'dag' => 'Dagbani',
'de-formal' => 'Deutsch (Sie-Form)',
# 'dlc' => 'Dalecarlian', // German translation unassured
- 'dty' => 'Doteli', // https://d-nb.info/gnd/7543852-5
+ // https://d-nb.info/gnd/7543852-5
+ 'dty' => 'Doteli',
'eml' => 'Emilianisch',
- 'el-cy' => 'Zypriotisches Griechisch', # used by Wikidata, T198674
+ # used by Wikidata, T198674
+ 'el-cy' => 'Zypriotisches Griechisch',
+ # part of CldrNamesEn.php, missing in CLDR 38
+ 'en-au' => 'Australisches Englisch',
'en-ca' => 'Kanadisches Englisch',
'en-gb' => 'Britisches Englisch',
'en-uk' => 'Britisches Englisch',
'en-us' => 'Amerikanisches Englisch',
+ # part of CldrNamesEn.php, missing in CLDR 38
+ 'es-es' => 'Europäisches Spanisch',
+ # part of CldrNamesEn.php, missing in CLDR 38
+ 'es-mx' => 'Mexikanisches Spanisch',
'ett' => 'Etruskisch',
'fkv' => 'Kvenisch',
'fr-ca' => 'Kanadisches Französisch',
@@ -64,6 +84,8 @@ $languageNames = [
'gan-hans' => 'Gan (Vereinfachte Schrift)',
'gan-hant' => 'Gan (Traditionelle Schrift)',
'gcr' => 'Französisch-Guayana Kreolisch',
+ # used by Wikidata T217131
+ 'gml' => 'Mittelniederdeutsch',
'gmy' => 'Mykenisches Griechisch',
'gom-deva' => 'Goa-Konkani (Devanagari)',
'gom-latn' => 'Goa-Konkani (lateinische Schrift)',
@@ -74,6 +96,14 @@ $languageNames = [
'hyw' => 'Westarmenisch',
'ike-cans' => 'Inuktitut (kanadische Silbenschrift)',
'ike-latn' => 'Inuktitut (lateinische Schrift)',
+ # used by Wikidata, T195816
+ 'ja-hani' => 'Japanisch (Kanji-Schrift)',
+ # used by Wikidata, T195816
+ 'ja-hira' => 'Japanisch (Hiragana-Schrift)',
+ # used by Wikidata, T195816
+ 'ja-hrkt' => 'Japanisch (Kana-Schrift)',
+ # used by Wikidata, T195816
+ 'ja-kana' => 'Japanisch (Katakana-Schrift)',
'kbd-cyrl' => 'Kabardinisch (kyrillische Schrift)',
'kbp' => 'Kabiyé',
'kjh' => 'Chakassisch',
@@ -84,7 +114,8 @@ $languageNames = [
'kk-kz' => 'Kasachisch (Kasachstan)',
'kk-latn' => 'Kasachisch (lateinische Schrift)',
'kk-tr' => 'Kasachisch (Türkei)',
- 'kld' => 'Kamilaroi', # used by Wikidata, T198366
+ # used by Wikidata, T198366
+ 'kld' => 'Kamilaroi',
# 'knn' => 'Maharashtrian Konkani', // German translation unassured
'ko-kp' => 'Koreanisch (Nordkorea)',
'koy' => 'Koyukon',
@@ -93,12 +124,16 @@ $languageNames = [
'ku-arab' => 'Kurdisch (arabische Schrift)',
'ku-latn' => 'Kurdisch (lateinische Schrift)',
'lbe' => 'Lakisch',
- 'lcm' => 'Tungag', # used by Wikidata, T234761
+ # used by Wikidata, T234761
+ 'lcm' => 'Tungag',
'lki' => 'Leki',
+ # used by Wikidata, T254968
+ 'lij-mc' => 'Monegassisch',
'lld' => 'Ladinisch',
'luz' => 'Südliches Lori',
'map-bms' => 'Banyumasan',
- 'mfa' => 'Pattani-Malaiisch', # used by Wikidata, T235468
+ # used by Wikidata, T235468
+ 'mfa' => 'Pattani-Malaiisch',
'mhr' => 'Ostmari',
'mid' => 'Mandäisch',
'mis' => 'nicht unterstützte Sprache',
@@ -107,37 +142,63 @@ $languageNames = [
'mui' => 'Musi',
'nah' => 'Nahuatl',
'nod' => 'Lanna',
- 'nrf-gg' => 'Guernésiais', # used by Wikidata T165648
- 'nrf-je' => 'Jèrriais', # used by Wikidata T165648
+ # used by Wikidata T265782
+ 'non-runr' => 'Altnordisch (Runen-Schrift)',
+ # used by Wikidata T165648
+ 'nrf-gg' => 'Guernésiais',
+ # used by Wikidata T165648
+ 'nrf-je' => 'Jèrriais',
'nrm' => 'Normannisch',
'nsk' => 'Naskapi',
'nxm' => 'Numidisch',
# 'nys' => 'Nyunga', // German translation unassured
+ # used by Wikidata, T195816
+ 'ojp' => 'Altjapanisch',
+ # used by Wikidata, T195816
+ 'ojp-hani' => 'Altjapanisch (Kanji-Schrift)',
+ # used by Wikidata, T195816
+ 'ojp-hira' => 'Altjapanisch (Hiragana-Schrift)',
'olo' => 'Olonetzisch',
'otk' => 'Alttürkisch',
- 'pi-sidd' => 'Pali (Siddham-Schrift)', # used by Wikidata T230881
+ # used by Wikidata T155425
+ 'phn-latn' => 'Phönizisch (lateinische Schrift)',
+ # used by Wikidata T155425
+ 'phn-phnx' => 'Phönizisch (phönizische Schrift)',
+ # used by Wikidata T230881
+ 'pi-sidd' => 'Pali (Siddham-Schrift)',
'pih' => 'Pitcairn-Englisch',
'pnb' => 'Westliches Panjabi',
# 'ppu' => 'Papora-Hoanya', // German translation unassured
'prs' => 'Dari',
'pt-br' => 'Brasilianisches Portugiesisch',
+ # part of CldrNamesEn.php, missing in CLDR 38
+ 'pt-pt' => 'Europäisches Portugiesisch',
# 'pwn' => 'Paiwan', // German translation unassured
# 'pyu' => 'Puyuma', // German translation unassured
- 'qya' => 'Quenya', # used by Wikidata, T185194
+ # used by Wikidata, T185194
+ 'qya' => 'Quenya',
'rm-puter' => 'Oberengadinisch',
'rm-rumgr' => 'Rumantsch Grischun',
'rm-surmiran' => 'Surmeirisch',
'rm-sursilv' => 'Surselvisch',
'rm-sutsilv' => 'Sutselvisch',
'rm-vallader' => 'Vallader',
- 'rmc' => 'Karpathen-Romani', # T223524
- 'rmf' => 'Finnisches Romani', # T223524
- 'rmg' => 'Skandinavisches Romani', # T223524
- 'rml' => 'Baltisches Romani', # T223524
- 'rmn' => 'Balkan-Romani', # T223524
- 'rmo' => 'Sinte-Romani', # T223524
- 'rmw' => 'Welsh-Roman', # T223524
- 'rmy' => 'Vlax-Romani', # T223524
+ # T223524
+ 'rmc' => 'Karpathen-Romani',
+ # T223524
+ 'rmf' => 'Finnisches Romani',
+ # T223524
+ 'rmg' => 'Skandinavisches Romani',
+ # T223524
+ 'rml' => 'Baltisches Romani',
+ # T223524
+ 'rmn' => 'Balkan-Romani',
+ # T223524
+ 'rmo' => 'Sinte-Romani',
+ # T223524
+ 'rmw' => 'Welsh-Roman',
+ # T223524
+ 'rmy' => 'Vlax-Romani',
'roa-rup' => 'Aromunisch',
'roa-tara' => 'Tarandíne',
'ruq-cyrl' => 'Meglenorumänisch (kyrillische Schrift)',
@@ -145,20 +206,27 @@ $languageNames = [
'ruq-latn' => 'Meglenorumänisch (lateinische Schrift)',
'ruq' => 'Meglenorumänisch',
'rwr' => 'Marwari (Indien)',
- 'sa-sidd' => 'Sanskrit (Siddham-Schrift)', # used by Wikidata T230881
+ # used by Wikidata T230881
+ 'sa-sidd' => 'Sanskrit (Siddham-Schrift)',
+ # needs upstream fix
+ 'sh' => 'Serbokroatisch',
'shi-latn' => 'Taschelhit (lateinische Schrift)',
'shi-tfng' => 'Taschelhit (Tifinagh-Schrift)',
'shy-arab' => 'Shawiya (arabische Schrift)',
'shy-latn' => 'Shawiya (lateinische Schrift)',
'shy-tfng' => 'Shawiya (Tifinagh-Schrift)',
'shy' => 'Shawiya',
- 'sia' => 'Akkalasamisch', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sia' => 'Akkalasamisch',
'simple' => 'einfaches Englisch',
'sjd' => 'Kildinsamisch',
'sje' => 'Pitesamisch',
- 'sjk' => 'Kemisamisch', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
- 'sjn' => 'Sindarin', # used by Wikidata, T185194
- 'sjt' => 'Tersamisch', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sjk' => 'Kemisamisch',
+ # used by Wikidata, T185194
+ 'sjn' => 'Sindarin',
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sjt' => 'Tersamisch',
'sju' => 'Umesamisch',
'skr' => 'Saraiki',
'skr-arab' => 'Saraiki (arabische Schrift)',
@@ -169,7 +237,8 @@ $languageNames = [
'tg-cyrl' => 'Tadschikisch (kyrillische Schrift)',
'tg-latn' => 'Tadschikisch (lateinische Schrift)',
# 'tlb' => 'Tobelo', // German translation unassured
- 'tnq' => 'Taíno', # used by Wikidata T220284
+ # used by Wikidata T220284
+ 'tnq' => 'Taíno',
'tt-cyrl' => 'Tatarisch (kyrillische Schrift)',
'tt-latn' => 'Tatarisch (lateinische Schrift)',
'tzl' => 'Talossanisch',
@@ -179,10 +248,12 @@ $languageNames = [
'uun' => 'Pazeh',
'uz-cyrl' => 'Usbekisch (kyrillische Schrift)',
'uz-latn' => 'Usbekisch (lateinische Schrift)',
- 'wls' => 'Wallisianisch', # used by Wikidata, T239411
+ # used by Wikidata, T239411
+ 'wls' => 'Wallisianisch',
'xpu' => 'Punisch',
- 'xsy' => 'Saisiyat', # https://d-nb.info/gnd/1075555310
- 'ydd' => 'Ost-Jiddisch',
+ # https://d-nb.info/gnd/1075555310
+ 'xsy' => 'Saisiyat',
+ 'ydd' => 'Ostjiddisch',
'zh-classical' => 'klassisches Chinesisch',
'zh-cn' => 'Chinesisch (China)',
'zh-hk' => 'Chinesisch (Hongkong)',
diff --git a/MLEB/cldr/LocalNames/LocalNamesEn.php b/MLEB/cldr/LocalNames/LocalNamesEn.php
index b4216c2d..bbea6d62 100644
--- a/MLEB/cldr/LocalNames/LocalNamesEn.php
+++ b/MLEB/cldr/LocalNames/LocalNamesEn.php
@@ -3,26 +3,43 @@
$languageNames = [
# Not in CLDR 34. Used for MediaWiki localisation
'abe' => 'Western Abenaki',
- 'abq' => 'Abaza', # used by Wikidata, T155367
- 'abq-latn' => 'Abaza', # used by Wikidata, T155424
+ # used by Wikidata, T155367
+ 'abq' => 'Abaza',
+ # used by Wikidata, T155424
+ 'abq-latn' => 'Abaza',
'abs' => 'Ambonese Malay',
'ady-cyrl' => 'Adyghe (Cyrillic script)',
'aeb-arab' => 'Tunisian Arabic (Arabic script)',
'aeb-latn' => 'Tunisian Arabic (Latin script)',
- 'alc' => 'Kawésqar', # used by Wikidata, T190981
+ # used by Wikidata, T190981
+ 'alc' => 'Kawésqar',
'ami' => 'Amis',
'azb' => 'South Azerbaijani',
+ # used by Wikidata, T263946
+ 'bag' => 'Tuki',
'bat-smg' => 'Samogitian',
'bbc-latn' => 'Batak Toba (Latin script)',
'bcc' => 'Southern Balochi',
'bcl' => 'Central Bikol',
+ # used by Wikidata, T234330
+ 'bdr' => 'West Coast Bajau',
'be-tarask' => 'Belarusian (Taraškievica orthography)',
- 'be-x-old' => 'Belarusian (Taraškievica orthography)', # internal code of be-tarask.wikipedia.org
+ # internal code of be-tarask.wikipedia.org
+ 'be-x-old' => 'Belarusian (Taraškievica orthography)',
'bgp' => 'Eastern Balochi',
'bh' => 'Bhojpuri',
+ # used by Wikidata, T263946
+ 'bkc' => 'Baka',
+ # used by Wikidata, T263946
+ 'bkh' => 'Bakako',
'bnn' => 'Bunun',
- 'bdr' => 'West Coast Bajau', # used by Wikidata, T234330
+ # used by Wikidata, T263946
+ 'bqz' => 'Mka\'a',
'bxr' => 'Russia Buriat',
+ # used by Wikidata, T278854
+ 'cak' => 'Kaqchikel',
+ # used by Wikidata, T266423
+ 'cal' => 'Carolinian',
'cbk-zam' => 'Chavacano',
'cdo' => 'Min Dong Chinese',
'cja' => 'Western Cham',
@@ -36,37 +53,71 @@ $languageNames = [
'cjy' => 'Jinyu',
'cjy-hans' => 'Jinyu (Simplified)',
'cjy-hant' => 'Jinyu (Traditional)',
- 'ckt' => 'Chukchi', # used by Wikidata, T240097
- 'clc' => 'Chilcotin', # used by Wikidata, T222020
+ # used by Wikidata, T240097
+ 'ckt' => 'Chukchi',
+ # used by Wikidata, T222020
+ 'clc' => 'Chilcotin',
+ # used by Wikidata, T278853
+ 'cnh' => 'Hakha-Chin',
'cnr' => 'Montenegrin',
- 'crb' => 'Island Carib', # used by Wikidata, T220284
+ # used by Wikidata, T220284
+ 'crb' => 'Island Carib',
'crh-cyrl' => 'Crimean Tatar (Cyrillic script)',
'crh-latn' => 'Crimean Tatar (Latin script)',
- 'dag' => 'Dagbani', # used by Wikidata, T240098
+ # used by Wikidata, T264532
+ 'crl' => 'East Cree',
+ # used by Wikidata, T240098
+ 'dag' => 'Dagbani',
'de-formal' => 'German (formal address)',
'dlc' => 'Dalecarlian',
+ # used by Wikidata, T267915
+ 'dru' => 'Rukai',
'dty' => 'Doteli',
- 'el-cy' => 'Cypriot Greek', # used by Wikidata, T198674
+ # used by Wikidata, T198674
+ 'el-cy' => 'Cypriot Greek',
'eml' => 'Emiliano-Romagnolo',
+ # used by Wikidata, T263946
+ 'eto' => 'Eton',
'ett' => 'Etruscian',
+ # used by Wikidata, T263946
+ 'etu' => 'Ejagham',
'eya' => 'Eyak',
'fkv' => 'Kvensk',
+ # used by Wikidata, T263946
+ 'fmp' => 'Fe\'Fe\'',
'fos' => 'Siraya',
'fuf' => 'Pular',
'gan-hans' => 'Gan (Simplified)',
'gan-hant' => 'Gan (Traditional)',
'gcr' => 'Guianan Creole',
+ # used by Wikidata T217131
+ 'gml' => 'Middle Low German',
'gmy' => 'Mycenaean Greek',
'gom-deva' => 'Goan Konkani (Devanagari script)',
'gom-latn' => 'Goan Konkani (Latin script)',
+ # used by Wikidata, T263946
+ 'gya' => 'Gbaya',
'haz' => 'Hazaragi',
- 'hbo' => 'Biblical Hebrew', # used by Wikidata, T155368
+ # used by Wikidata, T155368
+ 'hbo' => 'Biblical Hebrew',
'hif-latn' => 'Fiji Hindi (Latin script)',
'hyw' => 'Western Armenian',
'ike-cans' => 'Eastern Canadian (Aboriginal syllabics)',
'ike-latn' => 'Eastern Canadian (Latin script)',
+ # used by Wikidata, T263946
+ 'isu' => 'Isu',
+ # used by Wikidata, T195816
+ 'ja-hani' => 'Japanese (Kanji script)',
+ # used by Wikidata, T195816
+ 'ja-hira' => 'Japanese (Hiragana script)',
+ # used by Wikidata, T195816
+ 'ja-hrkt' => 'Japanese (Kana script)',
+ # used by Wikidata, T195816
+ 'ja-kana' => 'Japanese (Katakana script)',
'kbd-cyrl' => 'Kabardian (Cyrillic script)',
'kbp' => 'Kabiye',
+ # used by Wikidata, T263946
+ 'ker' => 'Kera',
'kjh' => 'Khakas',
'kjp' => 'Eastern Pwo',
'kk-cn' => 'Kazakh (China)',
@@ -75,7 +126,8 @@ $languageNames = [
'kk-arab' => 'Kazakh (Arabic script)',
'kk-cyrl' => 'Kazakh (Cyrillic script)',
'kk-latn' => 'Kazakh (Latin script)',
- 'kld' => 'Gamilaraay', # used by Wikidata, T198366
+ # used by Wikidata, T198366
+ 'kld' => 'Gamilaraay',
'knn' => 'Maharashtrian Konkani',
'ko-kp' => 'Korean (North Korea)',
'koy' => 'Koyukon',
@@ -84,50 +136,100 @@ $languageNames = [
'ku-arab' => 'Kurdish (Arabic script)',
'ku-latn' => 'Kurdish (Latin script)',
'lbe' => 'Lak',
- 'lcm' => 'Tungag', # used by Wikidata, T234761
+ # used by Wikidata, T234761
+ 'lcm' => 'Tungag',
+ # used by Wikidata, T263946
+ 'lem' => 'Nomaande',
+ # used by Wikidata, T254968
+ 'lij-mc' => 'Monégasque',
'lki' => 'Laki',
'lld' => 'Ladin',
+ # used by Wikidata, T263946
+ 'lns' => 'Lamnso\'',
'luz' => 'Southern Luri',
- 'mfa' => 'Kelantan-Pattani Malay', # used by Wikidata, T235468
+ # used by Wikidata, T263946
+ 'mcp' => 'Maka',
+ # used by Wikidata, T235468
+ 'mfa' => 'Kelantan-Pattani Malay',
'mhr' => 'Eastern Mari',
'mid' => 'Mandaic',
'mis' => 'Unsupported language',
'mo' => 'Moldovan',
'moe' => 'Innu',
'mnw' => 'Mon',
+ # used by Wikidata, T270059
+ 'ms-arab' => 'Malay (Jawi script)',
'mui' => 'Musi',
+ # used by Wikidata, T180771
+ 'nan-hani' => 'Min Nan (Hanji)',
+ # used by Wikidata, T263946
+ 'nge' => 'Ngémba',
+ # used by Wikidata, T263946
+ 'nla' => 'Ngombala',
+ # used by Wikidata, T263946
+ 'nnz' => 'Nda\'Nda\'',
'nod' => 'Northern Thai',
- 'nrf-gg' => 'Guernésiais', # used by Wikidata T165648
- 'nrf-je' => 'Jèrriais', # used by Wikidata T165648
+ # used by Wikidata T265782
+ 'non-runr' => 'Old Norse (Runic script)',
+ # used by Wikidata T165648
+ 'nrf-gg' => 'Guernésiais',
+ # used by Wikidata T165648
+ 'nrf-je' => 'Jèrriais',
'nrm' => 'Norman',
- 'nsk' => 'Naskapi', # used by Wikidata T250246
+ # used by Wikidata T250246
+ 'nsk' => 'Naskapi',
'nxm' => 'Numidian',
- 'nys' => 'Nyungar', # used by Wikidata, added in InitialiseSettings.php
+ # used by Wikidata, added in InitialiseSettings.php
+ 'nys' => 'Nyungar',
+ # used by Wikidata, T195816
+ 'ojp' => 'Old Japanese',
+ # used by Wikidata, T195816
+ 'ojp-hani' => 'Old Japanese (Kanji script)',
+ # used by Wikidata, T195816
+ 'ojp-hira' => 'Old Japanese (Hiragana script)',
'olo' => 'Livvi-Karelian',
'ood' => "O'odham",
'otk' => 'Old Turkish',
- 'pi-sidd' => 'Pali (Siddham script)', # used by Wikidata T230881
+ # used by Wikidata T275682
+ 'pap-aw' => 'Papiamento (Aruba)',
+ # used by Wikidata T155425
+ 'phn-latn' => 'Phoenician (Latin script)',
+ # used by Wikidata T155425
+ 'phn-phnx' => 'Phoenician (Phoenician script)',
+ # used by Wikidata T230881
+ 'pi-sidd' => 'Pali (Siddham script)',
'pjt' => 'Pitjantjatjara',
'pnb' => 'Western Punjabi',
'ppu' => 'Papora-Hoanya',
'pwn' => 'Paiwan',
'pyu' => 'Puyuma',
'prs' => 'Dari',
- 'qya' => 'Quenya', # used by Wikidata, T185194
+ # used by Wikidata, T185194
+ 'qya' => 'Quenya',
+ # used by Wikidata, T267479
+ 'rah' => 'Rabha',
'rm-puter' => 'Putèr',
'rm-rumgr' => 'Rumantsch Grischun',
'rm-surmiran' => 'Surmiran',
'rm-sursilv' => 'Sursilvan',
'rm-sutsilv' => 'Sutsilvan',
'rm-vallader' => 'Vallader',
- 'rmc' => 'Carpathian Romani', # T223524
- 'rmf' => 'Finnish Kalo', # T223524
- 'rmg' => 'Traveller Norwegian', # T223524
- 'rml' => 'Baltic Romani', # T223524
- 'rmn' => 'Balkan Romani', # T223524
- 'rmo' => 'Sinte Romani', # T223524
- 'rmw' => 'Welsh-Romani', # T223524
- 'rmy' => 'Vlax Romani', # T223524
+ # T223524
+ 'rmc' => 'Carpathian Romani',
+ # T223524
+ 'rmf' => 'Finnish Kalo',
+ # T223524
+ 'rmg' => 'Traveller Norwegian',
+ # T223524
+ 'rml' => 'Baltic Romani',
+ # T223524
+ 'rmn' => 'Balkan Romani',
+ # T223524
+ 'rmo' => 'Sinte Romani',
+ # T223524
+ 'rmw' => 'Welsh-Romani',
+ # T223524
+ 'rmy' => 'Vlax Romani',
'roa-rup' => 'Aromanian',
'roa-tara' => 'Tarantino',
'ruq' => 'Megleno-Romanian',
@@ -135,8 +237,12 @@ $languageNames = [
'ruq-grek' => 'Megleno-Romanian (Greek script)',
'ruq-latn' => 'Megleno-Romanian (Latin script)',
'rwr' => 'Marwari (India)',
- 'sa-sidd' => 'Sanskrit (Siddham script)', # used by Wikidata T230881
- 'sia' => 'Akkala Sámi', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ # used by Wikidata T271215
+ 'ryu' => 'Okinawan',
+ # used by Wikidata T230881
+ 'sa-sidd' => 'Sanskrit (Siddham script)',
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sia' => 'Akkala Sámi',
'shi-latn' => 'Tachelhit (Latin script)',
'shi-tfng' => 'Tachelhit (Tifinagh script)',
'shy' => 'Shawiya',
@@ -145,22 +251,29 @@ $languageNames = [
'shy-tfng' => 'Shawiya (Tifinagh script)',
'sjd' => 'Kildin Sami',
'sje' => 'Pite Sami',
- 'sjk' => 'Kemi Sámi', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
- 'sjn' => 'Sindarin', # used by Wikidata, T185194
- 'sjt' => 'Ter Sámi', # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sjk' => 'Kemi Sámi',
+ # used by Wikidata, T185194
+ 'sjn' => 'Sindarin',
+ # used by Wikidata Change-Id: Iba40776d7f96445ae7dc2631438a6c07ac79ce9d
+ 'sjt' => 'Ter Sámi',
'sju' => 'Ume Sami',
'skr' => 'Saraiki',
'skr-arab' => 'Saraiki (Arabic script)',
'sr-ec' => 'Serbian (Cyrillic script)',
'sr-el' => 'Serbian (Latin script)',
- 'srq' => 'Sirionó', # used by Wikidata, added in InitialiseSettings.php
+ # used by Wikidata, added in InitialiseSettings.php
+ 'srq' => 'Sirionó',
'ssf' => 'Thao',
'tg-cyrl' => 'Tajik (Cyrillic script)',
'tg-latn' => 'Tajik (Latin script)',
'tlb' => 'Tobelo',
'tt-cyrl' => 'Tatar (Cyrillic script)',
'tt-latn' => 'Tatar (Latin script)',
- 'tnq' => 'Taíno', # used by Wikidata T220284
+ # used by Wikidata T220284
+ 'tnq' => 'Taíno',
+ # used by Wikidata, T263946
+ 'tvu' => 'Tunen',
'tzl' => 'Talossan',
'ug-arab' => 'Uyghur (Arabic script)',
'ug-latn' => 'Uyghur (Latin script)',
@@ -168,9 +281,18 @@ $languageNames = [
'uun' => 'Pazeh',
'uz-cyrl' => 'Uzbek (Cyrillic script)',
'uz-latn' => 'Uzbek (Latin script)',
- 'wls' => 'Wallisian', # used by Wikidata, T239411
+ # used by Wikidata, T263946
+ 'vut' => 'Vute',
+ # used by Wikidata, T263946
+ 'wes' => 'Pidgin',
+ # used by Wikidata, T239411
+ 'wls' => 'Wallisian',
'xpu' => 'Punic',
'xsy' => 'Saisiyat',
+ # used by Wikidata, T263946
+ 'yas' => 'Nugunu',
+ # used by Wikidata, T263946
+ 'yat' => 'Yambeta',
'ydd' => 'Eastern Yiddish',
'zh-classical' => 'Classical Chinese',
'zh-cn' => 'Chinese (China)',
@@ -180,7 +302,8 @@ $languageNames = [
'zh-my' => 'Chinese (Malaysia)',
'zh-sg' => 'Chinese (Singapore)',
'zh-tw' => 'Chinese (Taiwan)',
- 'zh-yue' => 'Cantonese', # language redirect
+ # language redirect
+ 'zh-yue' => 'Cantonese',
/* Upper case in CLDR, but should be lower case
* https://unicode-org.atlassian.net/browse/CLDR-9664
diff --git a/MLEB/cldr/LocalNames/LocalNamesFa.php b/MLEB/cldr/LocalNames/LocalNamesFa.php
index 371dbde3..21542458 100644
--- a/MLEB/cldr/LocalNames/LocalNamesFa.php
+++ b/MLEB/cldr/LocalNames/LocalNamesFa.php
@@ -14,12 +14,6 @@ $languageNames = [
*/
'bcc' => 'بلوچی جنوبی',
- /* Not in CLDR 27.0.1. Western Balochi language
- * https://www.ethnologue.com/language/bgn
- * Added 2015-01-18.
- */
- 'bgn' => 'بلوچی غربی',
-
/* Not in CLDR 27.0.1. Eastern Balochi language
* https://www.ethnologue.com/language/bgp
*/
@@ -156,11 +150,6 @@ $languageNames = [
*/
'ltg' => 'لاتگالی',
- /* Not in CLDR 27.0.1. Northern Luri language
- * https://www.ethnologue.com/language/lrc
- */
- 'lrc' => 'لری شمالی',
-
/* Not in CLDR 27.0.1. Southern Luri language
* https://www.ethnologue.com/language/luz
*/
@@ -184,12 +173,6 @@ $languageNames = [
*/
// 'mui' => 'Musi',
- /* Not in CLDR 27.0.1. Caspian language
- * https://www.ethnologue.com/language/mzn
- * Added 2008-03-01.
- */
- 'mzn' => 'مازندرانی',
-
/* Not in CLDR 27.0.1. Chinese language
* https://www.ethnologue.com/language/nan
* Added 2008-03-01.
@@ -265,18 +248,6 @@ $languageNames = [
'shy-latn' => 'شاویایی (خط لاتین)',
'shy-tfng' => 'شاویایی (خط تیفیناغی)',
- /* Not in CLDR 27.0.1.
- * https://iso639-3.sil.org/code/sli
- * Added 2008-09-02.
- */
- 'sli' => 'سیلزیایی پایین',
-
- /* Not in CLDR 27.0.1.
- * https://iso639-3.sil.org/code/szl
- * Added 2008-03-29.
- */
- 'szl' => 'سیلزیایی',
-
/* Not in CLDR 27.0.1. Tulu language
* https://iso639-3.sil.org/code/tcy
* Added 2008-08-23.
@@ -359,7 +330,8 @@ $languageNames = [
'zh-min-nan' => 'چینی (مین نان)',
'zh-sg' => 'چینی (سنگاپور)',
'zh-tw' => 'چینی (تایوان)',
- 'zh-yue' => 'کانتونی', # language redirect
+ # language redirect
+ 'zh-yue' => 'کانتونی',
/* additional list from Persian Wikipedia */
'simple' => 'انگلیسی ساده',
diff --git a/MLEB/cldr/LocalNames/LocalNamesFr.php b/MLEB/cldr/LocalNames/LocalNamesFr.php
index eda59bc5..2ac4f549 100644
--- a/MLEB/cldr/LocalNames/LocalNamesFr.php
+++ b/MLEB/cldr/LocalNames/LocalNamesFr.php
@@ -2,7 +2,9 @@
$languageNames = [
- /* Not in CLDR 29 */
+ /* Not in CLDR */
'atj' => 'atikamekw',
+ 'gcr' => 'créole guyanais',
+ 'hyw' => 'arménien occidental',
];
diff --git a/MLEB/cldr/LocalNames/LocalNamesHe.php b/MLEB/cldr/LocalNames/LocalNamesHe.php
deleted file mode 100644
index 1195a23d..00000000
--- a/MLEB/cldr/LocalNames/LocalNamesHe.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$languageNames = [
- /* Names that are misspelled in CLDR 28 */
- 'ceb' => 'סבואנו',
- 'no' => 'נורווגית',
-];
diff --git a/MLEB/cldr/LocalNames/LocalNamesJa.php b/MLEB/cldr/LocalNames/LocalNamesJa.php
index 695439b5..2396eff5 100644
--- a/MLEB/cldr/LocalNames/LocalNamesJa.php
+++ b/MLEB/cldr/LocalNames/LocalNamesJa.php
@@ -8,12 +8,6 @@ $languageNames = [
*/
'bcc' => '南バローチー語',
- /* Not in CLDR 27.0.1. Name used by Ethnologue:
- * https://www.ethnologue.com/language/bgn
- * Added 2015-01-18.
- */
- 'bgn' => '西バローチー語',
-
/* Not in CLDR 27.0.1. Eastern Balochi language
* https://www.ethnologue.com/language/bgp
*/
@@ -71,11 +65,6 @@ $languageNames = [
*/
'lki' => 'ラーク語',
- /* Not in CLDR 27.0.1. Northern Luri language
- * https://www.ethnologue.com/language/lrc
- */
- 'lrc' => '北ロル語',
-
/* Not in CLDR 27.0.1. Southern Luri language
* https://www.ethnologue.com/language/luz
*/
@@ -131,8 +120,6 @@ $languageNames = [
// 'de-formal' => 'German (formal address)',
// 'gan-hans' => 'Simplified Gan script',
// 'gan-hant' => 'Traditional Gan script',
- 'glk' => 'ギラキ語',
- 'got' => 'ゴート語',
// 'hif-latn' => 'Fiji Hindi (Latin script)',
// 'ike-cans' => 'Eastern Canadian (Aboriginal syllabics)',
// 'ike-latn' => 'Eastern Canadian (Latin script)',
@@ -163,7 +150,8 @@ $languageNames = [
'zh-min-nan' => '閩南語',
'zh-sg' => '中国語(シンガポール)',
'zh-tw' => '中国語(台湾)',
- 'zh-yue' => '広東語', # language redirect
+ # language redirect
+ 'zh-yue' => '広東語',
/* additional list from Japanese Wikipedia */
'als' => 'アレマン語',
diff --git a/MLEB/cldr/LocalNames/LocalNamesNds.php b/MLEB/cldr/LocalNames/LocalNamesNds.php
index 780d70e9..7367bd04 100644
--- a/MLEB/cldr/LocalNames/LocalNamesNds.php
+++ b/MLEB/cldr/LocalNames/LocalNamesNds.php
@@ -1,509 +1,87 @@
<?php
$languageNames = [
- 'aa' => 'Afar',
- 'ab' => 'Abchaasch',
- 'ace' => 'Aceh',
- 'ach' => 'Acholi',
- 'ada' => 'Adangme',
- 'ady' => 'Adygeisch',
- 'ae' => 'Avestsch',
'af' => 'Afrikaansch',
'afa' => 'Afro-Asiaatsche Spraken',
- 'afh' => 'Afrihili',
- 'ain' => 'Ainu',
- 'ak' => 'Akan',
- 'akk' => 'Akkadsch',
- 'ale' => 'Aleutsch',
'alg' => 'Algonkin-Spraken',
- 'alt' => 'Süüd-Altaisch',
- 'am' => 'Amhaarsch',
- 'an' => 'Aragoneesch',
- 'ang' => 'Ooldengelsch',
- 'anp' => 'Angika',
'apa' => 'Apache',
- 'ar' => 'Araabsch',
- 'arc' => 'Aramääsch',
- 'arn' => 'Araukaansch',
- 'arp' => 'Arapaho',
'art' => 'Kunstspraken',
- 'arw' => 'Arawak-Spraken',
- 'as' => 'Assameesch',
- 'ast' => 'Asturiaansch',
'ath' => 'Athabasksche Spraken',
'aus' => 'Austraalsche Spraken',
- 'av' => 'Awaarsch',
- 'awa' => 'Awadhi',
- 'ay' => 'Aymara',
- 'az' => 'Aserbaidschaansch',
- 'ba' => 'Baschkiersch',
'bad' => 'Banda',
'bai' => 'Bamileke',
- 'bal' => 'Belutschisch',
- 'ban' => 'Balineesch',
- 'bas' => 'Basaa',
'bat' => 'Baltsche Spraken',
- 'be' => 'Wittruss’sch',
- 'bej' => 'Bedscha',
- 'bem' => 'Bemba',
'ber' => 'Berberspraken',
- 'bg' => 'Bulgaarsch',
'bh' => 'Bihaarsch',
- 'bho' => 'Bhodschpuri',
- 'bi' => 'Bislama',
- 'bik' => 'Bikol',
- 'bin' => 'Bini',
- 'bla' => 'Siksika',
- 'bm' => 'Bambara',
- 'bn' => 'Bengaalsch',
'bnt' => 'Bantuspraken',
- 'bo' => 'Tibeetsch',
- 'br' => 'Bretoonsch',
- 'bra' => 'Braj-Bhakha',
- 'bs' => 'Bosnisch',
'btk' => 'Batak',
- 'bua' => 'Burjaatsch',
- 'bug' => 'Bugineesch',
- 'byn' => 'Blin',
- 'ca' => 'Katalaansch',
- 'cad' => 'Caddo',
'cai' => 'Indianerspraken in Zentralamerika',
- 'car' => 'Kariebsche Spraken',
'cau' => 'Kaukaasche Spraken',
- 'cch' => 'Atsam',
- 'ce' => 'Tschetscheensch',
- 'ceb' => 'Cebuano',
'cel' => 'Keltsche Spraken',
- 'ch' => 'Chamorro',
- 'chb' => 'Chibcha-Spraken',
- 'chg' => 'Tschagataisch',
- 'chk' => 'Trukeesch',
- 'chm' => 'Mari',
- 'chn' => 'Chinook',
- 'cho' => 'Choctaw',
- 'chp' => 'Chipewyan',
'chr' => 'Cherokee',
- 'chy' => 'Cheyenne',
'cmc' => 'Cham-Spraken',
'co' => 'Koorsch',
- 'cop' => 'Koptsch',
'cpe' => 'Kreoolsch-Engelsche Spraken',
'cpf' => 'Kreoolsch-Franzöösche Spraken',
'cpp' => 'Kreoolsch-Portugeesche Spraken',
- 'cr' => 'Cree',
- 'crh' => 'Krimtataarsch',
'crp' => 'Kreoolsche Spraken',
- 'cs' => 'Tschech’sch',
- 'csb' => 'Kaschuubsch',
- 'cu' => 'Karkenslaavsch',
'cus' => 'Kuschietsche Spraken',
- 'cv' => 'Tschuwasch’sch',
- 'cy' => 'Waliesch',
- 'da' => 'Däänsch',
- 'dak' => 'Dakota',
- 'dar' => 'Dargiensch',
'day' => 'Dajak',
'de' => 'Düütsch',
- 'de-at' => 'Öösterrieksch Hoochdüütsch',
- 'de-ch' => 'Swiezer Hoochdüütsch',
- 'del' => 'Delaware',
- 'den' => 'Slave',
- 'dgr' => 'Dogrib',
- 'din' => 'Dinka',
- 'doi' => 'Dogri',
'dra' => 'Drawiedsche Spraken',
- 'dsb' => 'Neddersorbsch',
- 'dua' => 'Duala',
- 'dum' => 'Middelnedderlandsch',
- 'dv' => 'Maledievsch',
- 'dyu' => 'Dyula',
- 'dz' => 'Bhutaansch',
- 'ee' => 'Ewe',
- 'efi' => 'Efik',
- 'egy' => 'Ägyptsch',
- 'eka' => 'Ekajuk',
- 'el' => 'Greeksch',
- 'elx' => 'Elaamsch',
- 'en' => 'Engelsch',
- 'en-au' => 'Austraalsch Engelsch',
- 'en-ca' => 'Kanaadsch Engelsch',
- 'en-gb' => 'Brietsch Engelsch',
- 'en-us' => 'Amerikaansch Engelsch',
- 'enm' => 'Middelengelsch',
- 'eo' => 'Esperanto',
- 'es' => 'Spaansch',
- 'es-419' => 'Latienamerikaansch Spaansch',
- 'es-es' => 'Ibeersch Spaansch',
'et' => 'Eestnisch',
- 'eu' => 'Basksch',
- 'ewo' => 'Ewondo',
- 'fa' => 'Pers’sch',
- 'fan' => 'Pangwe',
- 'fat' => 'Fanti',
- 'ff' => 'Ful',
- 'fi' => 'Finnsch',
- 'fil' => 'Philippiensch',
'fiu' => 'Finnougrische Spraken',
- 'fj' => 'Fidschiaansch',
- 'fo' => 'Färöösch',
- 'fon' => 'Fon',
- 'fr' => 'Franzöösch',
- 'fr-ca' => 'Kanaadsch Franzöösch',
- 'fr-ch' => 'Swiezer Franzöösch',
- 'frm' => 'Middelfranzöösch',
- 'fro' => 'Ooldfranzöösch',
- 'frr' => 'Noordfreesch',
- 'frs' => 'Saterfreesch',
- 'fur' => 'Friuulsch',
- 'fy' => 'Westfreesch',
- 'ga' => 'Iersch',
- 'gaa' => 'Ga',
- 'gay' => 'Gayo',
- 'gba' => 'Gbaya',
- 'gd' => 'Schottsch Gäälsch',
'gem' => 'Germaansche Spraken',
- 'gez' => 'Geez',
- 'gil' => 'Gilberteesch',
'gl' => 'Galizisch',
- 'gmh' => 'Middelhoochdüütsch',
- 'gn' => 'Guarani',
- 'goh' => 'Ooldhoochdüütsch',
- 'gon' => 'Gondi',
- 'gor' => 'Gorontalo',
- 'got' => 'Gootsch',
- 'grb' => 'Grebo',
- 'grc' => 'Ooldgreeksch',
- 'gsw' => 'Swiezerdüütsch',
'gu' => 'Gujarati',
- 'gv' => 'Manx',
- 'gwi' => 'Kutchin',
- 'ha' => 'Haussa',
- 'hai' => 'Haida',
- 'haw' => 'Hawaiiaansch',
- 'he' => 'Hebrääsch',
- 'hi' => 'Hindi',
- 'hil' => 'Hiligaynon',
'him' => 'Himachali',
- 'hit' => 'Hethitsch',
- 'hmn' => 'Miao-Spraken',
- 'ho' => 'Hiri-Motu',
- 'hr' => 'Kroaatsch',
- 'hsb' => 'Böversorbsch',
'ht' => 'Haitiaansch-Kreoolsch',
- 'hu' => 'Ungaarsch',
- 'hup' => 'Hupa',
- 'hy' => 'Armeensch',
- 'hz' => 'Herero',
- 'ia' => 'Interlingua',
- 'iba' => 'Iban',
- 'id' => 'Indoneesch',
- 'ie' => 'Interlingue',
- 'ig' => 'Igbo',
- 'ii' => 'Sichuan Yi',
'ijo' => 'Ijo',
- 'ik' => 'Inupiak',
- 'ilo' => 'Ilokano',
'inc' => 'Indoarische Spraken',
'ine' => 'Indogermaansche Spraken',
- 'inh' => 'Ingusch’sch',
- 'io' => 'Ido',
'ira' => 'Iraansche Spraken',
'iro' => 'Irokeesche Spraken',
'is' => 'Ieslandsch',
- 'it' => 'Italieensch',
- 'iu' => 'Inuktitut',
- 'ja' => 'Japaansch',
- 'jbo' => 'Lojban',
- 'jpr' => 'Jöödsch-Pers’sch',
- 'jrb' => 'Jöödsch-Araabsch',
- 'jv' => 'Javaansch',
- 'ka' => 'Georgsch',
- 'kaa' => 'Karakalpaksch',
- 'kab' => 'Kabyylsch',
- 'kac' => 'Kachin',
- 'kaj' => 'Jju',
- 'kam' => 'Kamba',
'kar' => 'Kareensch',
- 'kaw' => 'Kawi',
- 'kbd' => 'Kabardiensch',
- 'kcg' => 'Tyap',
- 'kfo' => 'Koro',
- 'kg' => 'Kongo',
- 'kha' => 'Khasi',
'khi' => 'Khoisan-Spraken',
- 'kho' => 'Saaksch',
- 'ki' => 'Kikuyu',
- 'kj' => 'Kwanyama',
- 'kk' => 'Kasach’sch',
'kl' => 'Gröönlandsch',
- 'km' => 'Kambodschaansch',
- 'kmb' => 'Kimbundu',
- 'kn' => 'Kannada',
- 'ko' => 'Koreaansch',
- 'kok' => 'Konkani',
- 'kos' => 'Kosraeaansch',
- 'kpe' => 'Kpelle',
- 'kr' => 'Kanuursch',
- 'krc' => 'Karatschaisch-Balkaarsch',
- 'krl' => 'Kareelsch',
'kro' => 'Kru-Spraken',
- 'kru' => 'Oraon',
- 'ks' => 'Kaschmiersch',
- 'ku' => 'Kurdsch',
- 'kum' => 'Kumücksch',
- 'kut' => 'Kutenai',
- 'kv' => 'Komi',
- 'kw' => 'Koornsch',
- 'ky' => 'Kirgiesch',
- 'la' => 'Latiensch',
- 'lad' => 'Ladiensch',
- 'lah' => 'Lahnda',
- 'lam' => 'Lamba',
- 'lb' => 'Luxemborgsch',
- 'lez' => 'Lesgisch',
'lg' => 'Ganda',
- 'li' => 'Limborgsch',
- 'ln' => 'Lingala',
- 'lo' => 'Laootsch',
- 'lol' => 'Mongo',
- 'loz' => 'Rotse',
- 'lt' => 'Litausch',
- 'lu' => 'Luba',
- 'lua' => 'Luba-Lulua',
- 'lui' => 'Luiseno',
- 'lun' => 'Lunda',
- 'luo' => 'Luo',
- 'lus' => 'Lushai',
- 'lv' => 'Lettsch',
- 'mad' => 'Madureesch',
- 'mag' => 'Magahi',
- 'mai' => 'Maithili',
- 'mak' => 'Makassarsch',
- 'man' => 'Manding',
'map' => 'Austroneesche Spraken',
- 'mas' => 'Massai',
- 'mdf' => 'Mokscha',
- 'mdr' => 'Mandareesch',
- 'men' => 'Mende',
- 'mg' => 'Madagassisch',
- 'mga' => 'Middeliersch',
- 'mh' => 'Marschalleesch',
- 'mi' => 'Maori',
- 'mic' => 'Micmac',
- 'min' => 'Minangkabau',
'mis' => 'Verschedene Spraken',
- 'mk' => 'Mazedoonsch',
'mkh' => 'Mon-Khmer-Spraken',
- 'ml' => 'Malayalam',
- 'mn' => 'Mongoolsch',
- 'mnc' => 'Mandschuursch',
- 'mni' => 'Manipuri',
'mno' => 'Manobo',
- 'mo' => 'Moldaawsch',
- 'moh' => 'Mohawk',
- 'mos' => 'Mossi',
- 'mr' => 'Marathi',
- 'ms' => 'Malaisch',
- 'mt' => 'Malteesch',
- 'mul' => 'Mehrsprakig',
'mun' => 'Munda-Spraken',
- 'mus' => 'Muskogee-Spraken',
- 'mwl' => 'Mirandeesch',
- 'mwr' => 'Marwari',
- 'my' => 'Birmaansch',
'myn' => 'Maya-Spraken',
- 'myv' => 'Erzya',
- 'na' => 'Nauruusch',
'nah' => 'Nahuatl',
'nai' => 'Indianerspraken in Noordamerika',
- 'nap' => 'Neapolitaansch',
- 'nb' => 'Norweegsch Bokmål',
- 'nd' => 'Noord-Ndebele',
'nds' => 'Plattdüütsch',
- 'ne' => 'Nepaleesch',
- 'new' => 'Newari',
- 'ng' => 'Ndonga',
- 'nia' => 'Nias',
'nic' => 'Nigerkordofaansche Spraken',
- 'niu' => 'Niue',
- 'nl' => 'Nedderlandsch',
- 'nl-be' => 'Fläämsch',
- 'nn' => 'Norweegsch Nynorsk',
- 'no' => 'Norweegsch',
- 'nog' => 'Nogai',
- 'non' => 'Ooldnoorsch',
- 'nqo' => 'N’Ko',
- 'nr' => 'Süüd-Ndebele',
- 'nso' => 'Noord-Sotho',
'nub' => 'Nuubsche Spraken',
- 'nv' => 'Navajo',
- 'nwc' => 'Oold-Newari',
- 'ny' => 'Nyanja',
- 'nym' => 'Nyamwezi',
- 'nyn' => 'Nyankole',
- 'nyo' => 'Nyoro',
- 'nzi' => 'Nzima',
- 'oc' => 'Okzitaansch',
- 'oj' => 'Ojibwa',
- 'om' => 'Oromo',
- 'or' => 'Orija',
- 'os' => 'Ossetsch',
- 'osa' => 'Osage',
- 'ota' => 'Osmaansch',
'oto' => 'Otomangue-Spraken',
'pa' => 'Pandschabsch',
'paa' => 'Papuaspraken',
- 'pag' => 'Pangasinan',
- 'pal' => 'Middelpers’sch',
- 'pam' => 'Pampanggan',
- 'pap' => 'Papiamento',
- 'pau' => 'Palausch',
- 'peo' => 'Ooldpers’sch',
'phi' => 'Philippinen-Austroneesche Spraken',
- 'phn' => 'Phönieksch',
- 'pi' => 'Pali',
- 'pl' => 'Poolsch',
- 'pon' => 'Ponapeaansch',
'pra' => 'Prakrit',
- 'pro' => 'Ooldprovenzaalsch',
- 'ps' => 'Paschtu',
- 'pt' => 'Portugeesch',
- 'pt-br' => 'Brasiliaansch Portugeesch',
- 'pt-pt' => 'Ibeersch Portugeesch',
- 'qu' => 'Quechua',
- 'raj' => 'Rajasthani',
- 'rap' => 'Oosterinsel-Spraak',
- 'rar' => 'Rarotongaansch',
- 'rm' => 'Rätoromaansch',
- 'rn' => 'Rundi',
- 'ro' => 'Rumäänsch',
'roa' => 'Romaansche Spraken',
- 'rom' => 'Romani',
'root' => 'Wortel',
- 'ru' => 'Russ’sch',
- 'rup' => 'Aromuunsch',
- 'rw' => 'Ruandsch',
- 'sa' => 'Sanskrit',
- 'sad' => 'Sandawe',
- 'sah' => 'Jakuutsch',
'sai' => 'Indianerspraken in Süüdamerika',
'sal' => 'Salish',
- 'sam' => 'Samaritaansch',
- 'sas' => 'Sasak',
- 'sat' => 'Santali',
- 'sc' => 'Sardsch',
- 'scn' => 'Siziliaansch',
- 'sco' => 'Schottsch',
- 'sd' => 'Sindhi',
- 'se' => 'Noord-Saamsch',
- 'sel' => 'Selkupsch',
'sem' => 'Semietsche Spraken',
- 'sg' => 'Sango',
- 'sga' => 'Oold-Iersch',
'sgn' => 'Tekenspraken',
- 'shn' => 'Schan',
- 'si' => 'Singhaleesch',
- 'sid' => 'Sidamo',
'sio' => 'Sioux-Spraken',
'sit' => 'Sinotibeetsche Spraken',
- 'sk' => 'Slowaaksch',
- 'sl' => 'Sloweensch',
'sla' => 'Slaavsche Spraken',
- 'sm' => 'Samoaansch',
- 'sma' => 'Süüd-Lappsch',
'smi' => 'Lappsch',
- 'smj' => 'Lule-Lappsch',
- 'smn' => 'Inari-Lappsch',
- 'sms' => 'Skolt-Lappsch',
- 'sn' => 'Schona',
- 'snk' => 'Soninke',
- 'so' => 'Somaalsch',
- 'sog' => 'Sogdisch',
'son' => 'Songhai',
- 'sq' => 'Albaansch',
- 'sr' => 'Serbsch',
- 'srn' => 'Surinaamsch',
- 'srr' => 'Serer',
- 'ss' => 'Swazi',
'ssa' => 'Nilosaharaansche Spraken',
- 'st' => 'Süüd-Sotho',
- 'su' => 'Sundaneesch',
- 'suk' => 'Sukuma',
- 'sus' => 'Susu',
- 'sux' => 'Sumersch',
- 'sv' => 'Sweedsch',
- 'sw' => 'Suaheli',
- 'syc' => 'Oold-Syyrsch',
- 'syr' => 'Syyrsch',
- 'ta' => 'Tamilsch',
'tai' => 'Thaispraken',
- 'te' => 'Telugu',
- 'tem' => 'Temne',
- 'ter' => 'Tereno',
- 'tet' => 'Tetum',
- 'tg' => 'Tadschiksch',
'th' => 'Thai',
- 'ti' => 'Tigrinja',
- 'tig' => 'Tigre',
- 'tiv' => 'Tiv',
- 'tk' => 'Turkmeensch',
- 'tkl' => 'Tokelausch',
- 'tl' => 'Tagalog',
- 'tlh' => 'Klingoonsch',
- 'tli' => 'Tlingit',
- 'tmh' => 'Tamaschek',
- 'tn' => 'Tswana',
- 'to' => 'Tongaasch',
- 'tog' => 'Tonga (Nyasa)',
- 'tpi' => 'Tok Pisin',
- 'tr' => 'Törksch',
- 'ts' => 'Tsonga',
- 'tsi' => 'Tsimshian',
- 'tt' => 'Tataarsch',
- 'tum' => 'Tumbuka',
'tup' => 'Tupi-Spraken',
'tut' => 'Altaische Spraken',
- 'tvl' => 'Elliceaansch',
- 'tw' => 'Twi',
- 'ty' => 'Tahitsch',
- 'tyv' => 'Tuwinsch',
- 'udm' => 'Udmurtsch',
- 'ug' => 'Uiguursch',
- 'uga' => 'Ugaritsch',
- 'uk' => 'Ukrainsch',
- 'umb' => 'Mbundu',
'und' => 'Unbestimmte Spraak',
- 'ur' => 'Urdu',
- 'uz' => 'Usbeeksch',
- 'vai' => 'Vai',
- 've' => 'Venda',
- 'vi' => 'Vietnameesch',
- 'vo' => 'Volapük',
- 'vot' => 'Wootsch',
- 'wa' => 'Walloonsch',
'wak' => 'Wakashaansch',
- 'wal' => 'Walamo',
- 'war' => 'Waray',
- 'was' => 'Washo',
'wen' => 'Sorbsch',
- 'wo' => 'Wolof',
- 'xal' => 'Kalmücksch',
- 'xh' => 'Xhosa',
- 'yao' => 'Yao',
- 'yap' => 'Yapeesch',
- 'yi' => 'Jiddisch',
- 'yo' => 'Yoruba',
'ypk' => 'Yupik',
- 'za' => 'Zhuang',
- 'zap' => 'Zapoteeksch',
- 'zbl' => 'Bliss-Symbolen',
- 'zen' => 'Zenaga',
- 'zh' => 'Chineesch',
- 'zh-hans' => 'Vereenfacht Chineesch',
- 'zh-hant' => 'Traditschonell Chineesch',
'znd' => 'Zande',
- 'zu' => 'Zulu',
- 'zun' => 'Zuni',
- 'zxx' => 'Keen Spraakinhold',
- 'zza' => 'Zaza',
];
diff --git a/MLEB/cldr/LocalNames/LocalNamesYo.php b/MLEB/cldr/LocalNames/LocalNamesYo.php
new file mode 100644
index 00000000..0f1c01eb
--- /dev/null
+++ b/MLEB/cldr/LocalNames/LocalNamesYo.php
@@ -0,0 +1,11 @@
+<?php
+
+$languageNames = [
+
+ /** Not in CLDR.
+ * But Wikipedias in these languages exist and/or used by Wikidata for monolingual text
+ */
+
+ # Reported upstream: https://unicode-org.atlassian.net/browse/CLDR-14280
+ 'es-419' => 'Èdè Sípáníìṣì (orílẹ̀-èdè Látìn-Amẹ́ríkà) ( Èdè Sípáníìshì (Látìn-Amẹ́ríkà))',
+];
diff --git a/MLEB/cldr/Makefile b/MLEB/cldr/Makefile
index 2bc56a98..bc4a7c85 100644
--- a/MLEB/cldr/Makefile
+++ b/MLEB/cldr/Makefile
@@ -1,6 +1,6 @@
.PHONY: help all clean test
-CORE=https://www.unicode.org/Public/cldr/37/core.zip
+CORE=https://www.unicode.org/Public/cldr/38/core.zip
help:
@echo "'make all' to download CLDR data and rebuild files."
diff --git a/MLEB/cldr/RELEASE-NOTES b/MLEB/cldr/RELEASE-NOTES
index 49c61176..25671fcd 100644
--- a/MLEB/cldr/RELEASE-NOTES
+++ b/MLEB/cldr/RELEASE-NOTES
@@ -1,5 +1,5 @@
-== cldr 2020.07 ==
-Released at 2020-07-24.
+== cldr 2021.06 ==
+Released at 2021-06-01.
=== Noteworthy changes ===
-* Update to cldr 37.
+* No updates.
diff --git a/MLEB/cldr/composer.json b/MLEB/cldr/composer.json
index 2bbaf407..b517f9fb 100644
--- a/MLEB/cldr/composer.json
+++ b/MLEB/cldr/composer.json
@@ -9,9 +9,9 @@
"composer/installers": ">=1.0.1"
},
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "31.0.0",
- "mediawiki/mediawiki-phan-config": "0.10.2",
- "mediawiki/minus-x": "1.1.0",
+ "mediawiki/mediawiki-codesniffer": "35.0.0",
+ "mediawiki/mediawiki-phan-config": "0.10.6",
+ "mediawiki/minus-x": "1.1.1",
"php-parallel-lint/php-console-highlighter": "0.5.0",
"php-parallel-lint/php-parallel-lint": "1.2.0"
},
@@ -24,6 +24,7 @@
"parallel-lint . --exclude node_modules --exclude vendor",
"phpcs -p -s",
"minus-x check ."
- ]
+ ],
+ "phan": "phan -d . --long-progress-bar"
}
}
diff --git a/MLEB/cldr/extension.json b/MLEB/cldr/extension.json
index beabfdf8..ce7460b2 100644
--- a/MLEB/cldr/extension.json
+++ b/MLEB/cldr/extension.json
@@ -1,6 +1,6 @@
{
"name": "CLDR",
- "version": "4.10.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2020.07]",
+ "version": "4.11.0 [https://www.mediawiki.org/wiki/MLEB MLEB 2021.06]",
"author": [
"Niklas Laxström",
"Siebrand Mazeland",
@@ -8,7 +8,7 @@
"Sam Reed"
],
"requires": {
- "MediaWiki": ">= 1.30.0"
+ "MediaWiki": ">= 1.34.0"
},
"url": "https://www.mediawiki.org/wiki/Extension:CLDR",
"descriptionmsg": "cldr-desc",
diff --git a/MLEB/cldr/i18n/en.json b/MLEB/cldr/i18n/en.json
index eb80b3be..b10f8256 100644
--- a/MLEB/cldr/i18n/en.json
+++ b/MLEB/cldr/i18n/en.json
@@ -3,4 +3,4 @@
"authors": []
},
"cldr-desc": "Extension which provides localised language names based on [http://cldr.unicode.org/index/downloads CLDR data]"
-} \ No newline at end of file
+}
diff --git a/MLEB/cldr/i18n/ug.json b/MLEB/cldr/i18n/ug.json
index cf1787f4..83c8afcd 100644
--- a/MLEB/cldr/i18n/ug.json
+++ b/MLEB/cldr/i18n/ug.json
@@ -5,4 +5,4 @@
]
},
"cldr-desc": "يەرلىكلەشتۈرۈلگەن تىل ئاتى كېينرەك تەمىنلىنىدۇ"
-} \ No newline at end of file
+}
diff --git a/MLEB/cldr/includes/CldrNames.php b/MLEB/cldr/includes/CldrNames.php
index 74d20322..c9094bef 100644
--- a/MLEB/cldr/includes/CldrNames.php
+++ b/MLEB/cldr/includes/CldrNames.php
@@ -1,5 +1,7 @@
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* A base class for querying translated names from CLDR data.
*
@@ -16,7 +18,8 @@ class CldrNames {
* @return string
*/
public static function getFileName( $code ) {
- return Language::getFileName( 'CldrNames', $code, '.php' );
+ return MediaWikiServices::getInstance()->getLanguageNameUtils()
+ ->getFileName( 'CldrNames', $code, '.php' );
}
/**
@@ -25,6 +28,7 @@ class CldrNames {
* @return string
*/
public static function getOverrideFileName( $code ) {
- return Language::getFileName( 'LocalNames', $code, '.php' );
+ return MediaWikiServices::getInstance()->getLanguageNameUtils()
+ ->getFileName( 'LocalNames', $code, '.php' );
}
}
diff --git a/MLEB/cldr/includes/CountryNames.php b/MLEB/cldr/includes/CountryNames.php
index 5e13d90b..65954f0f 100644
--- a/MLEB/cldr/includes/CountryNames.php
+++ b/MLEB/cldr/includes/CountryNames.php
@@ -1,5 +1,7 @@
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* A class for querying translated country names from CLDR data.
*
@@ -24,7 +26,7 @@ class CountryNames extends CldrNames {
$names = self::loadLanguage( $code );
// Load missing country names from fallback languages
- $fallbacks = Language::getFallbacksFor( $code );
+ $fallbacks = MediaWikiServices::getInstance()->getLanguageFallback()->getAll( $code );
foreach ( $fallbacks as $fallback ) {
// Overwrite the things in fallback with what we have already
$names = array_merge( self::loadLanguage( $fallback ), $names );
@@ -41,9 +43,12 @@ class CountryNames extends CldrNames {
*/
private static function loadLanguage( $code ) {
if ( !isset( self::$cache[$code] ) ) {
+
+ $langNameUtils = MediaWikiServices::getInstance()->getLanguageNameUtils();
+
/* Load override for wrong or missing entries in cldr */
$override = __DIR__ . '/../LocalNames/' . self::getOverrideFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $override ) ) {
+ if ( $langNameUtils->isValidBuiltInCode( $code ) && file_exists( $override ) ) {
$countryNames = false;
require $override;
// @phan-suppress-next-line PhanImpossibleCondition
@@ -53,14 +58,14 @@ class CountryNames extends CldrNames {
}
$filename = __DIR__ . '/../CldrNames/' . self::getFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
+ if ( $langNameUtils->isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
$countryNames = false;
require $filename;
// @phan-suppress-next-line PhanImpossibleCondition
if ( is_array( $countryNames ) ) {
if ( isset( self::$cache[$code] ) ) {
// Add to existing list of localized country names
- self::$cache[$code] = self::$cache[$code] + $countryNames;
+ self::$cache[$code] += $countryNames;
} else {
// No list exists, so create it
self::$cache[$code] = $countryNames;
diff --git a/MLEB/cldr/includes/CurrencyNames.php b/MLEB/cldr/includes/CurrencyNames.php
index 63747e4c..aa338ffb 100644
--- a/MLEB/cldr/includes/CurrencyNames.php
+++ b/MLEB/cldr/includes/CurrencyNames.php
@@ -1,5 +1,7 @@
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* A class for querying translated currency names from CLDR data.
*
@@ -24,7 +26,7 @@ class CurrencyNames extends CldrNames {
$names = self::loadLanguage( $code );
// Load missing currency names from fallback languages
- $fallbacks = Language::getFallbacksFor( $code );
+ $fallbacks = MediaWikiServices::getInstance()->getLanguageFallback()->getAll( $code );
foreach ( $fallbacks as $fallback ) {
// Overwrite the things in fallback with what we have already
$names = array_merge( self::loadLanguage( $fallback ), $names );
@@ -41,9 +43,12 @@ class CurrencyNames extends CldrNames {
*/
private static function loadLanguage( $code ) {
if ( !isset( self::$cache[$code] ) ) {
+
+ $langNameUtils = MediaWikiServices::getInstance()->getLanguageNameUtils();
+
/* Load override for wrong or missing entries in cldr */
$override = __DIR__ . '/../LocalNames/' . self::getOverrideFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $override ) ) {
+ if ( $langNameUtils->isValidBuiltInCode( $code ) && file_exists( $override ) ) {
$currencyNames = false;
require $override;
// @phan-suppress-next-line PhanImpossibleCondition
@@ -53,14 +58,14 @@ class CurrencyNames extends CldrNames {
}
$filename = __DIR__ . '/../CldrNames/' . self::getFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
+ if ( $langNameUtils->isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
$currencyNames = false;
require $filename;
// @phan-suppress-next-line PhanImpossibleCondition
if ( is_array( $currencyNames ) ) {
if ( isset( self::$cache[$code] ) ) {
// Add to existing list of localized currency names
- self::$cache[$code] = self::$cache[$code] + $currencyNames;
+ self::$cache[$code] += $currencyNames;
} else {
// No list exists, so create it
self::$cache[$code] = $currencyNames;
diff --git a/MLEB/cldr/includes/LanguageNames.php b/MLEB/cldr/includes/LanguageNames.php
index f9423062..d7a44e85 100644
--- a/MLEB/cldr/includes/LanguageNames.php
+++ b/MLEB/cldr/includes/LanguageNames.php
@@ -1,5 +1,7 @@
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* A class for querying translated language names from CLDR data.
*
@@ -12,11 +14,26 @@ class LanguageNames extends CldrNames {
private static $cache = [];
- public const FALLBACK_NATIVE = 0; // Missing entries fallback to native name
- public const FALLBACK_NORMAL = 1; // Missing entries fallback through the fallback chain
- public const LIST_MW_SUPPORTED = 0; // Only names that have localisation in MediaWiki
- public const LIST_MW = 1; // All names that are in Names.php
- public const LIST_MW_AND_CLDR = 2; // Combination of Names.php and what is in cldr
+ /**
+ * Missing entries fallback to native name
+ */
+ public const FALLBACK_NATIVE = 0;
+ /**
+ * Missing entries fallback through the fallback chain
+ */
+ public const FALLBACK_NORMAL = 1;
+ /**
+ * Only names that have localisation in MediaWiki
+ */
+ public const LIST_MW_SUPPORTED = 0;
+ /**
+ * All names that are in Names.php
+ */
+ public const LIST_MW = 1;
+ /**
+ * Combination of Names.php and what is in cldr
+ */
+ public const LIST_MW_AND_CLDR = 2;
/**
* Get localized language names for a particular language, using fallback languages for missing
@@ -32,9 +49,11 @@ class LanguageNames extends CldrNames {
$list = self::LIST_MW
) {
$xx = self::loadLanguage( $code );
- $native = Language::fetchLanguageNames(
- null,
- $list === self::LIST_MW_SUPPORTED ? 'mwfile' : 'mw'
+
+ $native = MediaWikiServices::getInstance()->getLanguageNameUtils()
+ ->getLanguageNames(
+ null,
+ $list === self::LIST_MW_SUPPORTED ? 'mwfile' : 'mw'
);
if ( $fbMethod === self::FALLBACK_NATIVE ) {
@@ -87,7 +106,9 @@ class LanguageNames extends CldrNames {
self::$cache[$code] = [];
- if ( !Language::isValidBuiltInCode( $code ) ) {
+ if ( !MediaWikiServices::getInstance()->getLanguageNameUtils()
+ ->isValidBuiltInCode( $code )
+ ) {
return [];
}
@@ -108,7 +129,7 @@ class LanguageNames extends CldrNames {
require $filename;
// @phan-suppress-next-line PhanImpossibleCondition
if ( is_array( $languageNames ) ) {
- self::$cache[$code] = self::$cache[$code] + $languageNames;
+ self::$cache[$code] += $languageNames;
}
} else {
wfDebug( __METHOD__ . ": Unable to load language names for $filename\n" );
diff --git a/MLEB/cldr/includes/TimeUnits.php b/MLEB/cldr/includes/TimeUnits.php
index 731e0d46..dbebc209 100644
--- a/MLEB/cldr/includes/TimeUnits.php
+++ b/MLEB/cldr/includes/TimeUnits.php
@@ -1,5 +1,7 @@
<?php
+use MediaWiki\MediaWikiServices;
+
/**
* A class for querying translated time units from CLDR data.
*
@@ -51,9 +53,11 @@ class TimeUnits extends CldrNames {
if ( !isset( self::$cache[$code] ) ) {
self::$cache[$code] = [];
+ $langNameUtil = MediaWikiServices::getInstance()->getLanguageNameUtils();
+
/* Load override for wrong or missing entries in cldr */
$override = __DIR__ . '/../LocalNames/' . self::getOverrideFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $override ) ) {
+ if ( $langNameUtil->isValidBuiltInCode( $code ) && file_exists( $override ) ) {
$timeUnits = false;
require $override;
@@ -65,12 +69,12 @@ class TimeUnits extends CldrNames {
}
$filename = __DIR__ . '/../CldrNames/' . self::getFileName( $code );
- if ( Language::isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
+ if ( $langNameUtil->isValidBuiltInCode( $code ) && file_exists( $filename ) ) {
$timeUnits = false;
require $filename;
// @phan-suppress-next-line PhanImpossibleCondition
if ( is_array( $timeUnits ) ) {
- self::$cache[$code] = self::$cache[$code] + $timeUnits;
+ self::$cache[$code] += $timeUnits;
}
} else {
wfDebug( __METHOD__ . ": Unable to load time units for $filename\n" );
diff --git a/MLEB/cldr/package-lock.json b/MLEB/cldr/package-lock.json
index d5dd7387..60cd38b5 100644
--- a/MLEB/cldr/package-lock.json
+++ b/MLEB/cldr/package-lock.json
@@ -5,29 +5,79 @@
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
"@babel/highlight": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
- "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/helper-validator-identifier": "^7.12.11",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+ "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@mdn/browser-compat-data": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-2.0.7.tgz",
+ "integrity": "sha512-GeeM827DlzFFidn1eKkMBiqXFD2oLsnZbaiGhByPl0vcapsRzUL+t9hDoov1swc9rB2jw64R+ihtzC8qOE9wXw==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
}
},
"@types/color-name": {
@@ -36,12 +86,6 @@
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
"dev": true
},
- "JSV": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
- "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=",
- "dev": true
- },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -49,21 +93,21 @@
"dev": true
},
"acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -144,10 +188,16 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "ast-metadata-inferer": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
+ "integrity": "sha512-tKHdBe8N/Vq2nLAm4YPBVREVZjMux6KrqyPfNQgIbDl0t7HaNSmy8w4OyVHYg/cvyn5BW7o7pVwpjPte89Zhcg==",
+ "dev": true
+ },
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -262,6 +312,19 @@
}
}
},
+ "browserslist": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz",
+ "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001208",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.712",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ }
+ },
"cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@@ -285,15 +348,61 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
+ "caniuse-lite": {
+ "version": "1.0.30001208",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz",
+ "integrity": "sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA==",
+ "dev": true
+ },
"chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"class-utils": {
@@ -344,6 +453,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
@@ -351,9 +466,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
- "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.2.tgz",
+ "integrity": "sha512-AOdq0i8ghZudnYv8RUnHrhTgafUGs61Rdz9jemU5x2lnZwAWyOq7vySo626K59e1fVKH1xSRorJwPVRLSWOoAQ==",
"dev": true
},
"component-emitter": {
@@ -374,6 +489,12 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
+ "core-js": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
+ "integrity": "sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA==",
+ "dev": true
+ },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -479,10 +600,16 @@
"esutils": "^2.0.2"
}
},
+ "electron-to-chromium": {
+ "version": "1.3.717",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz",
+ "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==",
+ "dev": true
+ },
"emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"enquirer": {
@@ -494,6 +621,12 @@
"ansi-colors": "^4.1.1"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -501,28 +634,29 @@
"dev": true
},
"eslint": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz",
- "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"enquirer": "^2.3.5",
- "eslint-scope": "^5.1.0",
- "eslint-utils": "^2.0.0",
- "eslint-visitor-keys": "^1.2.0",
- "espree": "^7.1.0",
- "esquery": "^1.2.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -530,7 +664,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.14",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -539,98 +673,124 @@
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
+ "table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
"dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
},
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-wikimedia": {
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.20.0.tgz",
+ "integrity": "sha512-F2dm+S6aCDDb99Fr6KD9L7u1gOK819deG6xAG4EIVaLsHdQhjbcpNUuzUkUmGmpEHIYHqSpwkZ1EvBMc9Pxn+w==",
+ "dev": true,
+ "requires": {
+ "eslint": "^7.23.0",
+ "eslint-plugin-compat": "^3.9.0",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-plugin-jsdoc": "^32.3.0",
+ "eslint-plugin-json-es": "^1.5.3",
+ "eslint-plugin-mediawiki": "^0.2.7",
+ "eslint-plugin-mocha": "^8.1.0",
+ "eslint-plugin-no-jquery": "^2.6.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-qunit": "^6.0.0",
+ "eslint-plugin-vue": "^7.8.0",
+ "eslint-plugin-wdio": "^7.0.0"
+ },
+ "dependencies": {
+ "eslint": {
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.21",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
}
},
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
"dev": true
},
- "strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
}
}
},
- "eslint-config-wikimedia": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.16.2.tgz",
- "integrity": "sha512-tQikCZT2k3z9UzvRDFAUOpVSwE/MEmKIUQQraFh9tgyPOmRY6fVkMONcFqdEuz8eyg2syW9MNvT2d1SGSMLfBg==",
- "dev": true,
- "requires": {
- "eslint": "^7.2.0",
- "eslint-plugin-es": "^3.0.1",
- "eslint-plugin-jsdoc": "^27.1.2",
- "eslint-plugin-json": "^2.1.1",
- "eslint-plugin-mediawiki": "^0.2.5",
- "eslint-plugin-mocha": "^7.0.1",
- "eslint-plugin-no-jquery": "^2.4.1",
- "eslint-plugin-node": "^11.1.0",
- "eslint-plugin-qunit": "^4.2.0",
- "eslint-plugin-vue": "^6.2.2",
- "eslint-plugin-wdio": "^6.0.12"
+ "eslint-plugin-compat": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.9.0.tgz",
+ "integrity": "sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==",
+ "dev": true,
+ "requires": {
+ "@mdn/browser-compat-data": "^2.0.7",
+ "ast-metadata-inferer": "^0.4.0",
+ "browserslist": "^4.12.2",
+ "caniuse-lite": "^1.0.30001166",
+ "core-js": "^3.6.5",
+ "find-up": "^4.1.0",
+ "lodash.memoize": "4.1.2",
+ "semver": "7.3.2"
}
},
"eslint-plugin-es": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
- "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
"dev": true,
"requires": {
"eslint-utils": "^2.0.0",
@@ -638,72 +798,88 @@
}
},
"eslint-plugin-jsdoc": {
- "version": "27.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-27.1.2.tgz",
- "integrity": "sha512-iWrG2ZK4xrxamoMkoyzgkukdmfqWc5Ncd6K+CnwRgxrbwjQQpzmt5Kl8GB0l12R0oUK2AF+9tGFJKNGzuyz79Q==",
+ "version": "32.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.0.tgz",
+ "integrity": "sha512-zyx7kajDK+tqS1bHuY5sapkad8P8KT0vdd/lE55j47VPG2MeenSYuIY/M/Pvmzq5g0+3JB+P3BJGUXmHxtuKPQ==",
"dev": true,
"requires": {
- "comment-parser": "^0.7.5",
- "debug": "^4.1.1",
- "jsdoctypeparser": "^6.1.0",
- "lodash": "^4.17.15",
+ "comment-parser": "1.1.2",
+ "debug": "^4.3.1",
+ "jsdoctypeparser": "^9.0.0",
+ "lodash": "^4.17.20",
"regextras": "^0.7.1",
- "semver": "^6.3.0",
+ "semver": "^7.3.4",
"spdx-expression-parse": "^3.0.1"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
+ "lru-cache": "^6.0.0"
}
}
}
},
- "eslint-plugin-json": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-2.1.1.tgz",
- "integrity": "sha512-Ktsab8ij33V2KFLhh4alC1FYztdmbV32DeMZYYUCZm4kKLW1s4DrleKKgtbAHSJsmshCK5QGOZtfyc2r3jCRsg==",
+ "eslint-plugin-json-es": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-json-es/-/eslint-plugin-json-es-1.5.3.tgz",
+ "integrity": "sha512-9wWjwhoN+ipMel70ktkWy0H7jj9sm5OAbAy3N3F3AT0swpIofVsIjDXyjGZJwSzy9tZzDtI/aKIj2WsqMHw2QA==",
"dev": true,
"requires": {
- "lodash": "^4.17.15",
- "vscode-json-languageservice": "^3.5.1"
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ }
}
},
"eslint-plugin-mediawiki": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.5.tgz",
- "integrity": "sha512-Xs5G4f1EnS6+9gFWkk28nWA9xcOEPx7YZEGsMYGLelZRAF+2DmV/PigF5N5VqoOkNBpwcbXqLD8wLfkg29aF8w==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.2.7.tgz",
+ "integrity": "sha512-2ZvPvLEwCIqrJxV1349bdX5Q03c30WccuUMCfB1Gh2IVxbBSrY0gbzOk/gPZeYigVhODt9xoFWUCIz8jwTWfrA==",
"dev": true,
"requires": {
- "eslint-plugin-vue": "^6.2.2",
+ "eslint-plugin-vue": "^7.7.0",
"upath": "^1.2.0"
}
},
"eslint-plugin-mocha": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-7.0.1.tgz",
- "integrity": "sha512-zkQRW9UigRaayGm/pK9TD5RjccKXSgQksNtpsXbG9b6L5I+jNx7m98VUbZ4w1H1ArlNA+K7IOH+z8TscN6sOYg==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-8.1.0.tgz",
+ "integrity": "sha512-1EgHvXKRl7W3mq3sntZAi5T24agRMyiTPL4bSXe+B4GksYOjAPEWYx+J3eJg4It1l2NMNZJtk0gQyQ6mfiPhQg==",
"dev": true,
"requires": {
- "eslint-utils": "^2.0.0",
- "ramda": "^0.27.0"
+ "eslint-utils": "^2.1.0",
+ "ramda": "^0.27.1"
}
},
"eslint-plugin-no-jquery": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.5.0.tgz",
- "integrity": "sha512-RrQ380mUJJKdjgpQ/tZAJ3B3W1n3LbVmULooS2Pv5pUDcc5uVHVSJMTdUlsbvQyfo6hWP2LJ4FbOoDzENWcF7A==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.6.0.tgz",
+ "integrity": "sha512-xC7pbNHJMdyxqhzcNMRrmC5/tbt1T4KCKXjOqUpKm/CaRryGKS5iWztzWPrL0KwyI3R3ub6goHFmIQS19f+mZA==",
"dev": true
},
"eslint-plugin-node": {
@@ -720,6 +896,16 @@
"semver": "^6.1.0"
},
"dependencies": {
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
@@ -735,35 +921,40 @@
}
},
"eslint-plugin-qunit": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-4.2.0.tgz",
- "integrity": "sha512-UibPK0fSshPTJauyitsHjACixpf+I5BEKqXi6WJ/WGhW31WwP7flSdBW8+Y9B46v05KYH6MJg/uZVIaiaHO5Cg==",
- "dev": true
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-6.0.0.tgz",
+ "integrity": "sha512-+R8z2umSTIiWcxmTQ9nGoML8DL0VQJg4C+E9OpJ2KF9QL4WL/FoayROeTG5Z9zhlZ2qqa+9WkZ1YD6mx89io8w==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.1.0",
+ "requireindex": "^1.2.0"
+ }
},
"eslint-plugin-vue": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
- "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz",
+ "integrity": "sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw==",
"dev": true,
"requires": {
+ "eslint-utils": "^2.1.0",
"natural-compare": "^1.4.0",
- "semver": "^5.6.0",
- "vue-eslint-parser": "^7.0.0"
+ "semver": "^7.3.2",
+ "vue-eslint-parser": "^7.6.0"
}
},
"eslint-plugin-wdio": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-6.0.12.tgz",
- "integrity": "sha512-qZqcU1Z0bqrqhYM1MbwIvKQxcQEGIOEclOjcveavvLZAN4ezpXb1Ogw3xu+UK13iArregJOMI6uUt+JkFmER1A==",
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.4.2.tgz",
+ "integrity": "sha512-tkISFycJmRFMKsEjetRcAmWSHKJKnw5rKHDxfE7Ob3tF5lbmYlCLfNKH0UwanOpSdulpe52s3K+CBHSd6qUUNQ==",
"dev": true
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -783,14 +974,22 @@
"dev": true
},
"espree": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
- "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^7.2.0",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.2.0"
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -800,29 +999,37 @@
"dev": true
},
"esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
},
"dependencies": {
"estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -1019,12 +1226,12 @@
"dev": true
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"fill-range": {
@@ -1050,6 +1257,16 @@
}
}
},
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"findup-sync": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
@@ -1094,20 +1311,19 @@
"dev": true
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
"flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"for-in": {
@@ -1159,9 +1375,9 @@
"dev": true
},
"glob": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -1173,9 +1389,9 @@
}
},
"glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@@ -1206,18 +1422,26 @@
}
},
"globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "version": "13.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz",
+ "integrity": "sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.20.2"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"grunt": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.2.1.tgz",
- "integrity": "sha512-zgJjn9N56tScvRt/y0+1QA+zDBnKTrkpyeSBqQPLcZvbqTD/oyGMrdZQXmm6I3828s+FmPvxc3Xv+lgKFtudOw==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
+ "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
"dev": true,
"requires": {
"dateformat": "~3.0.3",
@@ -1227,8 +1451,8 @@
"glob": "~7.1.6",
"grunt-cli": "~1.3.2",
"grunt-known-options": "~1.1.0",
- "grunt-legacy-log": "~2.0.0",
- "grunt-legacy-util": "~1.1.1",
+ "grunt-legacy-log": "~3.0.0",
+ "grunt-legacy-util": "~2.0.0",
"iconv-lite": "~0.4.13",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
@@ -1317,6 +1541,34 @@
"requires": {
"chalk": "^4.0.0",
"eslint": "^7.0.0"
+ }
+ },
+ "grunt-known-options": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
+ "dev": true
+ },
+ "grunt-legacy-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz",
+ "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==",
+ "dev": true,
+ "requires": {
+ "colors": "~1.1.2",
+ "grunt-legacy-log-utils": "~2.1.0",
+ "hooker": "~0.2.3",
+ "lodash": "~4.17.19"
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz",
+ "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==",
+ "dev": true,
+ "requires": {
+ "chalk": "~4.1.0",
+ "lodash": "~4.17.19"
},
"dependencies": {
"ansi-styles": {
@@ -1361,9 +1613,9 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -1371,65 +1623,29 @@
}
}
},
- "grunt-jsonlint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-jsonlint/-/grunt-jsonlint-1.1.0.tgz",
- "integrity": "sha1-ox7pckCu4/NDyiY8Rb1TIGMSfbI=",
- "dev": true,
- "requires": {
- "jsonlint": "1.6.2",
- "strip-json-comments": "^2.0.0"
- }
- },
- "grunt-known-options": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
- "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
- "dev": true
- },
- "grunt-legacy-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
- "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
- "dev": true,
- "requires": {
- "colors": "~1.1.2",
- "grunt-legacy-log-utils": "~2.0.0",
- "hooker": "~0.2.3",
- "lodash": "~4.17.5"
- }
- },
- "grunt-legacy-log-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
- "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
- "dev": true,
- "requires": {
- "chalk": "~2.4.1",
- "lodash": "~4.17.10"
- }
- },
"grunt-legacy-util": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
- "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
+ "integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
"dev": true,
"requires": {
"async": "~1.5.2",
"exit": "~0.1.1",
"getobject": "~0.1.0",
"hooker": "~0.2.3",
- "lodash": "~4.17.10",
- "underscore.string": "~3.3.4",
+ "lodash": "~4.17.20",
+ "underscore.string": "~3.3.5",
"which": "~1.3.0"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ }
}
},
- "has-color": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
- "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
- "dev": true
- },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -1499,9 +1715,9 @@
"dev": true
},
"import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -1531,9 +1747,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"interpret": {
@@ -1630,9 +1846,9 @@
"dev": true
},
"is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-glob": {
@@ -1722,9 +1938,9 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
@@ -1732,9 +1948,9 @@
}
},
"jsdoctypeparser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
- "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
+ "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
"dev": true
},
"json-schema-traverse": {
@@ -1749,22 +1965,6 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
- "dev": true
- },
- "jsonlint": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz",
- "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=",
- "dev": true,
- "requires": {
- "JSV": ">= 4.0.x",
- "nomnom": ">= 1.5.x"
- }
- },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -1820,12 +2020,36 @@
}
}
},
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
"lodash": {
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
"dev": true
},
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
@@ -1880,12 +2104,6 @@
"brace-expansion": "^1.1.7"
}
},
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -1907,15 +2125,6 @@
}
}
},
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1947,40 +2156,11 @@
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
- "nomnom": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
- "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
- "dev": true,
- "requires": {
- "chalk": "~0.4.0",
- "underscore": "~1.6.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
- "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
- "dev": true
- },
- "chalk": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
- "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
- "dev": true,
- "requires": {
- "ansi-styles": "~1.0.0",
- "has-color": "~0.1.0",
- "strip-ansi": "~0.1.0"
- }
- },
- "strip-ansi": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
- "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
- "dev": true
- }
- }
+ "node-releases": {
+ "version": "1.1.71",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "dev": true
},
"nopt": {
"version": "3.0.6",
@@ -2107,6 +2287,30 @@
"os-tmpdir": "^1.0.0"
}
},
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -2139,6 +2343,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -2197,9 +2407,9 @@
"dev": true
},
"ramda": {
- "version": "0.27.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz",
- "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==",
+ "version": "0.27.1",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz",
+ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==",
"dev": true
},
"rechoir": {
@@ -2245,10 +2455,22 @@
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
"dev": true
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true
+ },
"resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
@@ -2283,9 +2505,9 @@
"dev": true
},
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
"glob": "^7.1.3"
@@ -2307,9 +2529,9 @@
"dev": true
},
"semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
"dev": true
},
"set-value": {
@@ -2351,14 +2573,40 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
}
},
"snapdragon": {
@@ -2509,15 +2757,25 @@
"dev": true
},
"spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
"dev": true
},
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
"spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+ "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
"dev": true
},
"split-string": {
@@ -2557,31 +2815,14 @@
}
},
"string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
}
},
"strip-ansi": {
@@ -2594,9 +2835,9 @@
}
},
"strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
"supports-color": {
@@ -2609,15 +2850,41 @@
}
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+ "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^7.0.2",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz",
+ "integrity": "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ }
}
},
"text-table": {
@@ -2689,12 +2956,6 @@
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
"dev": true
},
- "underscore": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
- "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
- "dev": true
- },
"underscore.string": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
@@ -2764,9 +3025,9 @@
"dev": true
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
@@ -2791,9 +3052,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
- "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -2805,54 +3066,17 @@
"homedir-polyfill": "^1.0.1"
}
},
- "vscode-json-languageservice": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz",
- "integrity": "sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ==",
- "dev": true,
- "requires": {
- "jsonc-parser": "^2.2.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-languageserver-types": "^3.15.1",
- "vscode-nls": "^4.1.2",
- "vscode-uri": "^2.1.2"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-nls": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-4.1.2.tgz",
- "integrity": "sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
"vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz",
+ "integrity": "sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
"eslint-scope": "^5.0.0",
"eslint-visitor-keys": "^1.1.0",
"espree": "^6.2.1",
- "esquery": "^1.0.1",
+ "esquery": "^1.4.0",
"lodash": "^4.17.15"
},
"dependencies": {
@@ -2890,14 +3114,11 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
}
diff --git a/MLEB/cldr/package.json b/MLEB/cldr/package.json
index 7fdc0119..51a4aaba 100644
--- a/MLEB/cldr/package.json
+++ b/MLEB/cldr/package.json
@@ -7,10 +7,9 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.16.2",
- "grunt": "1.2.1",
+ "eslint-config-wikimedia": "0.20.0",
+ "grunt": "1.3.0",
"grunt-banana-checker": "0.9.0",
- "grunt-eslint": "23.0.0",
- "grunt-jsonlint": "1.1.0"
+ "grunt-eslint": "23.0.0"
}
}
diff --git a/MLEB/cldr/rebuild.php b/MLEB/cldr/rebuild.php
index 745d7553..9aa439f4 100644
--- a/MLEB/cldr/rebuild.php
+++ b/MLEB/cldr/rebuild.php
@@ -11,6 +11,8 @@
* @license GPL-2.0-or-later
*/
+use MediaWiki\MediaWikiServices;
+
// Standard boilerplate to define $IP
if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
$IP = getenv( 'MW_INSTALL_PATH' );
@@ -49,8 +51,10 @@ class CLDRRebuild extends Maintenance {
$this->error( "CLDR data not found at $DATA\n", 1 );
}
+ $langNameUtils = MediaWikiServices::getInstance()->getLanguageNameUtils();
+
// Get an array of all MediaWiki languages ( $wgLanguageNames + $wgExtraLanguageNames )
- $languages = Language::fetchLanguageNames();
+ $languages = $langNameUtils->getLanguageNames();
# hack to get pt-pt too
$languages['pt-pt'] = 'Foo';
ksort( $languages );
@@ -80,7 +84,11 @@ class CLDRRebuild extends Maintenance {
// If the file exists, parse it, otherwise display an error
if ( file_exists( $input ) ) {
- $outputFileName = Language::getFileName( 'CldrNames', getRealCode( $code ), '.php' );
+ $outputFileName = $langNameUtils->getFileName(
+ 'CldrNames',
+ $this->getRealCode( $code ),
+ '.php'
+ );
$p = new CLDRParser();
$p->parse( $input, "$OUTPUT/CldrNames/$outputFileName" );
} else {
@@ -106,36 +114,36 @@ class CLDRRebuild extends Maintenance {
$p->parse_currency_symbols( $DATA, "$OUTPUT/CldrCurrency/Symbols.php" );
$this->output( "Done parsing currency symbols.\n" );
}
-}
-/**
- * Get the code for the MediaWiki localisation,
- * these are same as the fallback.
- *
- * @param string $code
- * @return string
- */
-function getRealCode( $code ) {
- $realCode = $code;
- if ( !strcmp( $code, 'kk' ) ) {
- $realCode = 'kk-cyrl';
- } elseif ( !strcmp( $code, 'ku' ) ) {
- $realCode = 'ku-latn';
- } elseif ( !strcmp( $code, 'sr' ) ) {
- $realCode = 'sr-ec';
- } elseif ( !strcmp( $code, 'tg' ) ) {
- $realCode = 'tg-cyrl';
- } elseif ( !strcmp( $code, 'zh' ) ) {
- $realCode = 'zh-hans';
- } elseif ( !strcmp( $code, 'pt' ) ) {
- $realCode = 'pt-br';
- } elseif ( !strcmp( $code, 'pt-pt' ) ) {
- $realCode = 'pt';
- } elseif ( !strcmp( $code, 'az-arab' ) ) {
- $realCode = 'azb';
- }
+ /**
+ * Get the code for the MediaWiki localisation,
+ * these are same as the fallback.
+ *
+ * @param string $code
+ * @return string
+ */
+ private function getRealCode( $code ) {
+ $realCode = $code;
+ if ( !strcmp( $code, 'kk' ) ) {
+ $realCode = 'kk-cyrl';
+ } elseif ( !strcmp( $code, 'ku' ) ) {
+ $realCode = 'ku-latn';
+ } elseif ( !strcmp( $code, 'sr' ) ) {
+ $realCode = 'sr-ec';
+ } elseif ( !strcmp( $code, 'tg' ) ) {
+ $realCode = 'tg-cyrl';
+ } elseif ( !strcmp( $code, 'zh' ) ) {
+ $realCode = 'zh-hans';
+ } elseif ( !strcmp( $code, 'pt' ) ) {
+ $realCode = 'pt-br';
+ } elseif ( !strcmp( $code, 'pt-pt' ) ) {
+ $realCode = 'pt';
+ } elseif ( !strcmp( $code, 'az-arab' ) ) {
+ $realCode = 'azb';
+ }
- return $realCode;
+ return $realCode;
+ }
}
$maintClass = CLDRRebuild::class;
diff --git a/MLEB/cldr/tests/phpunit/TimeUnitsTest.php b/MLEB/cldr/tests/phpunit/TimeUnitsTest.php
index 623a3ae2..8821f29e 100644
--- a/MLEB/cldr/tests/phpunit/TimeUnitsTest.php
+++ b/MLEB/cldr/tests/phpunit/TimeUnitsTest.php
@@ -9,14 +9,15 @@
*/
class TimeUnitsTest extends MediaWikiTestCase {
- /** @dataProvider providerTimeUnit */
- public function testTimeUnit(
- $language,
- $tsTime, // The timestamp to format
- $currentTime, // The time to consider "now"
- $expectedOutput, // The expected output
- $desc // Description
- ) {
+ /**
+ * @dataProvider providerTimeUnit
+ * @param string $language
+ * @param string $tsTime The timestamp to format
+ * @param string $currentTime The time to consider "now"
+ * @param string $expectedOutput The expected output
+ * @param string $desc Description
+ */
+ public function testTimeUnit( $language, $tsTime, $currentTime, $expectedOutput, $desc ) {
$tsTime = new MWTimestamp( $tsTime );
$currentTime = new MWTimestamp( $currentTime );
$this->assertEquals(