Define $wgProfiler via LocalSettings.php instead.
* The mw.loader.addSource() is now considered a private method, and no longer
supports the `id, url` signature. Use the `Object` parameter instead.
+* The backwards-compatibility code in HTMLForm to add a drop-down control to an
+ option that is not set to be a drop-down if the "mw-chosen" class is present,
+ is now removed.
* Several collations were removed. They were workarounds for bugs in the ICU
library and they are no longer needed (as of ICU 57.1):
* 'uppercase-se' (NorthernSamiUppercaseCollation) - use 'uca-se' instead
* 'xx-uca-et' (CollationEt) - use 'uca-et' instead
* 'xx-uca-fa' (CollationFa) - use 'uca-fa' instead
+* The hooks 'SpecialRecentChangesFilters' & 'SpecialWatchlistFilters' deprecated
+ in 1.23 were removed. Instead, use 'ChangesListSpecialPageStructuredFilters'.
+ The ChangesListSpecialPage code for these legacy hooks, and their use in
+ SpecialRecentchanges.php and SpecialWatchlist, was also removed:
+ * ChangesListSpecialPage->getCustomFilters()
+ * ChangesListSpecialPage->getFilterGroupDefinitionFromLegacyCustomFilters()
+ * ChangesListSpecialPage::customFilters
=== Deprecations in 1.32 ===
* HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
&$title: If the hook returns false, a Title object to use instead of the
result from the normal query
-'SpecialRecentChangesFilters': DEPRECATED since 1.23! Use
-ChangesListSpecialPageStructuredFilters instead.
-Called after building form options at RecentChanges.
-$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML
- name/URL parameters. Each key maps to an associative array with a 'msg'
- (message key) and a 'default' value.
-
'SpecialRecentChangesPanel': Called when building form options in
SpecialRecentChanges.
&$extraOpts: array of added items, to which can be added
$wgVersion: Current $wgVersion for you to use
&$versionUrl: Raw url to link to (eg: release notes)
-'SpecialWatchlistFilters': DEPRECATED since 1.23! Use
-ChangesListSpecialPageStructuredFilters instead.
-Called after building form options at Watchlist.
-$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML
- name/URL parameters. Each key maps to an associative array with a 'msg'
- (message key) and a 'default' value.
-
'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
SpecialWatchlist. Allows extensions to register custom values they have
inserted to rc_type so they can be returned as part of the watchlist.
* @since 1.32
* @var int An appropriate combination of SCHEMA_COMPAT_XXX flags.
*/
-$wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD;
+$wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW;
/**
* Actor table schema migration stage.
"apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
"apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
"apihelp-compare-param-frompst": "قم بإجراء تحويل ما قبل الحفظ على <var>fromtext-{slot}</var>.",
- "apihelp-compare-param-fromtext": "استخدÙ\85 Ù\87ذا اÙ\84Ù\86ص بدÙ\84ا Ù\85Ù\86 Ù\85ØتÙ\88Ù\89 اÙ\84Ù\85راجعة اÙ\84Ù\85Øدد بÙ\88اسطة <var>fromtitle</var>Ø\8c <var>fromid</var> Ø£Ù\88 <var>fromrev</var>.",
- "apihelp-compare-param-fromcontentmodel": "نموذج محتوى <var>fromtext</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
- "apihelp-compare-param-fromcontentformat": "تÙ\86سÙ\8aÙ\82 Ù\85ØتÙ\88Ù\89 تسÙ\84سÙ\84 <var>fromtext</var>.",
+ "apihelp-compare-param-fromtext": "Øدد <kbd>fromslots=main</kbd> Ù\88استخدÙ\85 <var>fromtext-main</var> Ù\83بدÙ\8aÙ\84.",
+ "apihelp-compare-param-fromcontentmodel": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromcontentmodel-main</var> كبديل.",
+ "apihelp-compare-param-fromcontentformat": "Øدد <kbd>fromslots=main</kbd> Ù\88استخدÙ\85 <var>fromcontentformat-main</var> Ù\83بدÙ\8aÙ\84.",
"apihelp-compare-param-fromsection": "استخدم فقط القسم المحدد في المحتوى 'من' المحدد.",
"apihelp-compare-param-totitle": "العنوان الثاني للمقارنة.",
"apihelp-compare-param-toid": "رقم الصفحة الثاني للمقارنة.",
"apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.",
"apihelp-compare-param-torelative": "استخدم مراجعة متعلقة بالمراجعة المحددة من <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var>، سيتم تجاهل جميع خيارات 'إلى' الأخرى.",
"apihelp-compare-param-topst": "قم بإجراء تحويل ما قبل الحفظ على <var>totext</var>.",
- "apihelp-compare-param-totext": "استخدÙ\85 Ù\87ذا اÙ\84Ù\86ص بدÙ\84ا Ù\85Ù\86 Ù\85ØتÙ\88Ù\89 اÙ\84Ù\85راجعة اÙ\84Ù\85Øدد بÙ\88اسطة <var>totitle</var> Ø£Ù\88 <var>toid</var> Ø£Ù\88 <var>torev</var>.",
- "apihelp-compare-param-tocontentmodel": "نموذج محتوى <var>totext</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
- "apihelp-compare-param-tocontentformat": "تÙ\86سÙ\8aÙ\82 Ù\85ØتÙ\88Ù\89 تسÙ\84سÙ\84 <var>totext</var>.",
+ "apihelp-compare-param-totext": "Øدد <kbd>toslots=main</kbd> Ù\88استخدÙ\85 <var>totext-main</var> Ù\83بدÙ\8aÙ\84.",
+ "apihelp-compare-param-tocontentmodel": "حدد <kbd>toslots=main</kbd> واستخدم <var>tocontentmodel-main</var> كبديل.",
+ "apihelp-compare-param-tocontentformat": "Øدد <kbd>toslots=main</kbd> Ù\88استخدÙ\85 <var>tocontentformat-main</var> Ù\83بدÙ\8aÙ\84.",
"apihelp-compare-param-tosection": "استخدم فقط القسم المحدد في المحتوى 'إلى' المحدد.",
"apihelp-compare-param-prop": "أية قطعة من المعلومات للحصول عليها.",
"apihelp-compare-paramvalue-prop-diff": "HTML الفرق.",
* @since 1.29
*/
class ChangesListBooleanFilter extends ChangesListFilter {
- // This can sometimes be different on Special:RecentChanges
- // and Special:Watchlist, due to the double-legacy hooks
- // (SpecialRecentChangesFilters and SpecialWatchlistFilters)
-
- // but there will be separate sets of ChangesListFilterGroup and ChangesListFilter instances
- // for those pages (it should work even if they're both loaded
- // at once, but that can't happen).
/**
* Main unstructured UI i18n key
*
* @return string Message with arguments replaced
*/
public function msg( $key, $fallback /*[, params...] */ ) {
+ global $wgSitename;
$args = array_slice( func_get_args(), 2 );
+ $res = false;
if ( $this->useMessageCache() ) {
try {
- return wfMessage( $key, $args )->text();
+ $res = wfMessage( $key, $args )->text();
} catch ( Exception $e ) {
}
}
- return wfMsgReplaceArgs( $fallback, $args );
+ if ( $res === false ) {
+ $res = wfMsgReplaceArgs( $fallback, $args );
+ // If an exception happens inside message rendering,
+ // {{SITENAME}} sometimes won't be replaced.
+ $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
+ }
+ return $res;
}
/**
global $wgOut, $wgSitename;
if ( $this->useOutputPage() ) {
$wgOut->prepareErrorPage( $this->getPageTitle() );
+ // Manually set the html title, since sometimes
+ // {{SITENAME}} does not get replaced for exceptions
+ // happening inside message rendering.
+ $wgOut->setHTMLTitle(
+ $this->msg(
+ 'pagetitle',
+ "$1 - $wgSitename",
+ $this->getPageTitle()
+ )
+ );
$wgOut->addHTML( $this->getHTML() );
* @return string Message with arguments replaced
*/
private static function msg( $key, $fallback /*[, params...] */ ) {
+ global $wgSitename;
$args = array_slice( func_get_args(), 2 );
try {
- return wfMessage( $key, $args )->text();
+ $res = wfMessage( $key, $args )->text();
} catch ( Exception $e ) {
- return wfMsgReplaceArgs( $fallback, $args );
+ $res = wfMsgReplaceArgs( $fallback, $args );
+ // If an exception happens inside message rendering,
+ // {{SITENAME}} sometimes won't be replaced.
+ $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
}
+ return $res;
}
/**
$this->mParams['disabled-options'] = [];
}
- // For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
- if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
+ if ( isset( $params['dropdown'] ) ) {
$this->mClass .= ' mw-htmlform-dropdown';
}
'type',
'min',
'max',
- 'pattern',
- 'title',
'step',
- 'list',
+ 'title',
'maxlength',
'tabindex',
'disabled',
'required',
'autofocus',
- 'multiple',
'readonly',
'autocomplete',
+ // Only used in HTML mode:
+ 'pattern',
+ 'list',
+ 'multiple',
];
$attribs += $this->getAttributes( $allowedParams );
# @todo Enforce pattern, step, required, readonly on the server side as
# well
$allowedParams = [
+ 'type',
+ 'min',
+ 'max',
+ 'step',
+ 'title',
+ 'maxlength',
+ 'tabindex',
+ 'disabled',
+ 'required',
'autofocus',
+ 'readonly',
+ 'autocomplete',
+ // Only used in OOUI mode:
'autosize',
- 'disabled',
'flags',
'indicator',
- 'maxlength',
- 'readonly',
- 'required',
- 'tabindex',
- 'type',
- 'autocomplete',
];
$attribs += OOUI\Element::configFromHtmlAttributes(
"config-session-expired": "Срокът на валидност на данните от сесията са изтекли.\nПродължителността на сесиите е настроена на $1.\nТова може да бъде увеличено чрез настройване на <code>session.gc_maxlifetime</code> в php.ini.\nНеобходимо е рестартиране на инсталационния процес.",
"config-no-session": "Данните за сесията бяха загубени!\nПроверете вашия php.ini и се уверете, че на <code>session.save_path</code> е настроена подходящата директория.",
"config-your-language": "Вашият език:",
- "config-your-language-help": "Ð\98збиÑ\80ане на език за използване по време на инсталацията.",
+ "config-your-language-help": "Ð\98збоÑ\80 на език за използване по време на инсталацията.",
"config-wiki-language": "Език на уикито:",
- "config-wiki-language-help": "Ð\98збиÑ\80ане на език, на който ще е основното съдържание на уикито.",
+ "config-wiki-language-help": "Ð\98збоÑ\80 на език, на който ще е основното съдържание на уикито.",
"config-back": "← Връщане",
"config-continue": "Продължаване →",
"config-page-language": "Език",
"config-sidebar": "* [https://www.mediawiki.org Сайт на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Наръчник на потребителя]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Наръчник на администратора]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ]\n----\n* <doclink href=Readme>Документация</doclink>\n* <doclink href=ReleaseNotes>Бележки за версията</doclink>\n* <doclink href=Copying>Авторски права</doclink>\n* <doclink href=UpgradeDoc>Обновяване</doclink>",
"config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.",
"config-env-bad": "Средата беше проверена.\nНе е възможна инсталация на МедияУики.",
- "config-env-php": "Инсталирана е версия на PHP $1.",
+ "config-env-php": "PHP $1 е инсталирано.",
"config-env-hhvm": "HHVM $1 е инсталиран.",
"config-unicode-using-intl": "Използване на разширението [https://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
"config-unicode-pure-php-warning": "<strong>Внимание:</strong> [https://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е да се запознаете с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
"config-unicode-update-warning": "<strong>Предупреждение</strong>: Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова версия], в случай че сте загрижени за използването на Unicode.",
"config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysqli</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php-mysql</code>.",
"config-outdated-sqlite": "<strong>Внимание:</strong> имате инсталиран SQLite $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
- "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
+ "config-no-fts3": "<strong>Предупреждение:</strong> SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
"config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
- "config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
+ "config-pcre-no-utf8": "<strong>Фатално:</strong> Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
"config-memory-raised": "<code>memory_limit</code> на PHP е $1, увеличаване до $2.",
"config-memory-bad": "<strong>Внимание:</strong> <code>memory_limit</code> на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!",
"config-apc": "[https://secure.php.net/apc APC] е инсталиран",
"config-imagemagick": "Открит е ImageMagick: <code>$1</code>.\nПреоразмеряването на картинки ще бъде включено ако качването на файлове бъде разрешено.",
"config-gd": "Открита е вградена графичната библиотека GD.\nАко качването на файлове бъде включено, ще бъде включена възможността за преоразмеряване на картинки.",
"config-no-scaling": "Не са открити библиотеките GD или ImageMagick.\nПреоразмеряването на картинки ще бъде изключено.",
- "config-no-uri": "'''Грешка:''' Не може да се определи текущия адрес.\nИнсталация беше прекратена.",
+ "config-no-uri": "<strong>Грешка:</strong> Не може да се определи текущия адрес.\nИнсталация беше прекратена.",
"config-no-cli-uri": "<strong>Внимание:</strong> Не е зададен параметър <code>--scriptpath</code>, стойност по подразбиране: <code>$1</code>.",
- "config-using-server": "Използване на сървърното име \"<nowiki>$1</nowiki>\".",
- "config-using-uri": "Използване на сървърния адрес (URL) \"<nowiki>$1$2</nowiki>\".",
+ "config-using-server": "Използване на сървърното име „<nowiki>$1</nowiki>“.",
+ "config-using-uri": "Използване на сървърния адрес (URL) „<nowiki>$1$2</nowiki>“.",
"config-uploads-not-safe": "<strong>Внимание:</strong> Папката по подразбиране за качване <code>$1</code> е уязвима от изпълнение на зловредни скриптове.\nВъпреки че МедияУики извършва проверка за заплахи в сигурността на всички качени файлове, силно препоръчително е да се [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security затвори тази уязвимост в сигурността] преди разрешаване за качване на файлове.",
"config-no-cli-uploads-check": "<strong>Предупреждение:</strong> Директорията по подразбиране за качване на файлове (<code>$1</code>) не е проверена за уязвимости при изпълнение на произволен скрипт по време на инсталацията от командния ред.",
"config-brokenlibxml": "Вашата система използва комбинация от версии на PHP и libxml2, които са с много грешки и могат да причинят скрити повреди на данните в МедияУики или други уеб приложения.\nНеобходимо е обновяване до libxml2 2.7.3 или по-нова версия ([https://bugs.php.net/bug.php?id=45996 докладвана грешка при PHP]).\nИнсталацията беше прекратена.",
"config-suhosin-max-value-length": "Suhosin е инсталиран и ограничава дължината GET параметъра <code>length</code> на $1 байта. Компонентът на МедияУики ResourceLoader ще може да пренебрегне частично това ограничение, но това ще намали производителността. По възможност е препоръчително да се настрои <code>suhosin.get.max_value_length</code> на 1024 или по-голяма стойност в <code>php.ini</code> и в LocalSettings.php да се настрои <code>$wgResourceLoaderMaxQueryLength</code> със същата стойност.",
"config-using-32bit": "<strong>Внимание:</strong> изглежда, че системата Ви работи с 32-битови числа. Това [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не се препоръчва].",
"config-db-type": "Тип на базата от данни:",
- "config-db-host": "ХоÑ\81Ñ\82 на базата от данни:",
+ "config-db-host": "СÑ\8aÑ\80вÑ\8aÑ\80 на базата от данни:",
"config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
- "config-db-host-oracle": "TNS на базата данни:",
+ "config-db-host-oracle": "TNS на базаÑ\82а оÑ\82 данни:",
"config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файлът tnsnames.ora трябва да бъде видим за инсталацията.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
"config-db-wiki-settings": "Идентифициране на това уики",
"config-db-name": "Име на базата от данни:",
"config-db-port": "Порт на базата от данни:",
"config-db-schema": "Схема за МедияУики",
"config-db-schema-help": "Схемата по-горе обикновено е коректна.\nПромени се извършват ако наистина е необходимо.",
- "config-pg-test-error": "Невъзможно свързване с базата данни '''$1''': $2",
+ "config-pg-test-error": "Невъзможно свързване с базата данни <strong>$1</strong>: $2",
"config-sqlite-dir": "Директория за данни на SQLite:",
"config-sqlite-dir-help": "SQLite съхранява всички данни в един файл.\n\nПо време на инсталацията уеб сървърът трябва да има права за писане в посочената директория.\n\nТя <strong>не трябва</strong> да е достъпна през уеб, затова не е там, където са PHP файловете.\n\nИнсталаторът ще съхрани заедно с нея файл <code>.htaccess</code>, но ако този метод пропадне, някой може да придобие достъп до суровите данни от базата от данни.\nТова включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.\n\nБазата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
"config-oracle-def-ts": "Таблично пространство по подразбиране:",
"config-can-upgrade": "В базата от данни има таблици за МедияУики.\nЗа надграждането им за MediaWiki $1, натиска се <strong>Продължаване</strong>.",
"config-upgrade-done": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].\n\nАко е необходимо, възможно е файлът <code>LocalSettings.php</code> да бъде създаден отново чрез натискане на бутона по-долу.\nТова <strong>не е препоръчително действие</strong>, освен ако не срещате затруднения с уикито.",
"config-upgrade-done-no-regenerate": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].",
- "config-regenerate": "Създаване на LocalSettings.php →",
+ "config-regenerate": "Ð\9fовÑ\82оÑ\80но Ñ\81ъздаване на LocalSettings.php →",
"config-show-table-status": "Заявката <code>SHOW TABLE STATUS</code> не сполучи!",
- "config-unknown-collation": "'''Предупреждение:''' Базата от данни използва неразпозната колация.",
+ "config-unknown-collation": "<strong>Предупреждение:</strong> Базата от данни използва неразпозната колация.",
"config-db-web-account": "Сметка за уеб достъп до базата от данни",
"config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.",
"config-db-web-account-same": "Използване на същата сметка като при инсталацията.",
"config-admin-password-confirm": "Парола (повторно):",
"config-admin-help": "Въвежда се предпочитаното потребителско име, например „Иванчо Иванчев“.\nТова ще е потребителското име, което администраторът ще използва за влизане в уикито.",
"config-admin-name-blank": "Необходимо е да бъде въведено потребителско име на администратора.",
- "config-admin-name-invalid": "Посоченото потребителско име \"<nowiki>$1</nowiki>\" е невалидно.\nНеобходимо е да се посочи друго.",
+ "config-admin-name-invalid": "Посоченото потребителско име „<nowiki>$1</nowiki>“ е невалидно.\nНеобходимо е да се посочи друго.",
"config-admin-password-blank": "Въведете парола за администраторската сметка.",
"config-admin-password-mismatch": "Двете въведени пароли не съвпадат.",
"config-admin-email": "Адрес за електронна поща:",
"config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
"config-extension-link": "Знаете ли, че това уики поддържа [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [https://www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
"config-skins-screenshots": "$1 (снимки на екрана: $2)",
+ "config-extensions-requires": "$1 (изисква $2)",
"config-screenshot": "снимка на екран",
"mainpagetext": "<strong>МедияУики беше успешно инсталирано.</strong>",
"mainpagedocfooter": "Разгледайте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
/** @var FormOptions */
protected $rcOptions;
- /** @var array */
- protected $customFilters;
-
// Order of both groups and filters is significant; first is top-most priority,
// descending from there.
// 'showHideSuffix' is a shortcut to and avoid spelling out
*
* Groups are displayed to the user in the structured UI. However, if necessary,
* all of the filters in a group can be configured to only display on the
- * unstuctured UI, in which case you don't need a group title. This is done in
- * getFilterGroupDefinitionFromLegacyCustomFilters, for example.
+ * unstuctured UI, in which case you don't need a group title.
*
* @var array $filterGroupDefinitions
*/
Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] );
- $unstructuredGroupDefinition =
- $this->getFilterGroupDefinitionFromLegacyCustomFilters(
- $this->getCustomFilters()
- );
- $this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] );
+ $this->registerFiltersFromDefinitions( [] );
$userExperienceLevel = $this->getFilterGroup( 'userExpLevel' );
$registered = $userExperienceLevel->getFilter( 'registered' );
}
}
- /**
- * Get filter group definition from legacy custom filters
- *
- * @param array $customFilters Custom filters from legacy hooks
- * @return array Group definition
- */
- protected function getFilterGroupDefinitionFromLegacyCustomFilters( array $customFilters ) {
- // Special internal unstructured group
- $unstructuredGroupDefinition = [
- 'name' => 'unstructured',
- 'class' => ChangesListBooleanFilterGroup::class,
- 'priority' => -1, // Won't display in structured
- 'filters' => [],
- ];
-
- foreach ( $customFilters as $name => $params ) {
- $unstructuredGroupDefinition['filters'][] = [
- 'name' => $name,
- 'showHide' => $params['msg'],
- 'default' => $params['default'],
- ];
- }
-
- return $unstructuredGroupDefinition;
- }
-
/**
* @return array The legacy show/hide toggle filters
*/
return $output;
}
- /**
- * Get custom show/hide filters using deprecated ChangesListSpecialPageFilters
- * hook.
- *
- * @return array Map of filter URL param names to properties (msg/default)
- */
- protected function getCustomFilters() {
- if ( $this->customFilters === null ) {
- $this->customFilters = [];
- Hooks::run( 'ChangesListSpecialPageFilters', [ $this, &$this->customFilters ], '1.29' );
- }
-
- return $this->customFilters;
- }
-
/**
* Fetch values for a FormOptions object from the WebRequest associated with this instance.
*
}
}
- /**
- * Get all custom filters
- *
- * @return array Map of filter URL param names to properties (msg/default)
- */
- protected function getCustomFilters() {
- if ( $this->customFilters === null ) {
- $this->customFilters = parent::getCustomFilters();
- Hooks::run( 'SpecialRecentChangesFilters', [ $this, &$this->customFilters ], '1.23' );
- }
-
- return $this->customFilters;
- }
-
/**
* Process $par and put options found in $opts. Used when including the page.
*
}
}
- /**
- * Get all custom filters
- *
- * @return array Map of filter URL param names to properties (msg/default)
- */
- protected function getCustomFilters() {
- if ( $this->customFilters === null ) {
- $this->customFilters = parent::getCustomFilters();
- Hooks::run( 'SpecialWatchlistFilters', [ $this, &$this->customFilters ], '1.23' );
- }
-
- return $this->customFilters;
- }
-
/**
* Fetch values for a FormOptions object from the WebRequest associated with this instance.
*
* @ingroup Language
*/
class Language {
+ /**
+ * Return autonyms in fetchLanguageName(s).
+ * @since 1.32
+ */
+ const AS_AUTONYMS = null;
+
+ /**
+ * Return all known languages in fetchLanguageName(s).
+ * @since 1.32
+ */
+ const ALL = 'all';
+
+ /**
+ * Return in fetchLanguageName(s) only the languages for which we have at
+ * least some localisation.
+ * @since 1.32
+ */
+ const SUPPORTED = 'mwfile';
+
/**
* @var LanguageConverter
*/
/**
* Get an array of language names, indexed by code.
* @param null|string $inLanguage Code of language in which to return the names
- * Use null for autonyms (native names)
+ * Use self::AS_AUTONYMS for autonyms (native names)
* @param string $include One of:
- * 'all' all available languages
+ * self::ALL all available languages
* 'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
- * 'mwfile' only if the language is in 'mw' *and* has a message file
+ * self::SUPPORTED only if the language is in 'mw' *and* has a message file
* @return array Language code => language name (sorted by key)
* @since 1.20
*/
- public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
- $cacheKey = $inLanguage === null ? 'null' : $inLanguage;
+ public static function fetchLanguageNames( $inLanguage = self::AS_AUTONYMS, $include = 'mw' ) {
+ $cacheKey = $inLanguage === self::AS_AUTONYMS ? 'null' : $inLanguage;
$cacheKey .= ":$include";
if ( self::$languageNameCache === null ) {
self::$languageNameCache = new HashBagOStuff( [ 'maxKeys' => 20 ] );
/**
* Uncached helper for fetchLanguageNames
* @param null|string $inLanguage Code of language in which to return the names
- * Use null for autonyms (native names)
+ * Use self::AS_AUTONYMS for autonyms (native names)
* @param string $include One of:
- * 'all' all available languages
+ * self::ALL all available languages
* 'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
- * 'mwfile' only if the language is in 'mw' *and* has a message file
+ * self::SUPPORTED only if the language is in 'mw' *and* has a message file
* @return array Language code => language name (sorted by key)
*/
- private static function fetchLanguageNamesUncached( $inLanguage = null, $include = 'mw' ) {
+ private static function fetchLanguageNamesUncached(
+ $inLanguage = self::AS_AUTONYMS,
+ $include = 'mw'
+ ) {
global $wgExtraLanguageNames, $wgUsePigLatinVariant;
// If passed an invalid language code to use, fallback to en
- if ( $inLanguage !== null && !self::isValidCode( $inLanguage ) ) {
+ if ( $inLanguage !== self::AS_AUTONYMS && !self::isValidCode( $inLanguage ) ) {
$inLanguage = 'en';
}
}
}
- if ( $include === 'all' ) {
+ if ( $include === self::ALL ) {
ksort( $names );
return $names;
}
$returnMw[$coreCode] = $names[$coreCode];
}
- if ( $include === 'mwfile' ) {
+ if ( $include === self::SUPPORTED ) {
$namesMwFile = [];
# We do this using a foreach over the codes instead of a directory
# loop so that messages files in extensions will work correctly.
/**
* @param string $code The code of the language for which to get the name
- * @param null|string $inLanguage Code of language in which to return the name (null for autonyms)
- * @param string $include 'all', 'mw' or 'mwfile'; see fetchLanguageNames()
+ * @param null|string $inLanguage Code of language in which to return the name
+ * (SELF::AS_AUTONYMS for autonyms)
+ * @param string $include See fetchLanguageNames()
* @return string Language name or empty
* @since 1.20
*/
- public static function fetchLanguageName( $code, $inLanguage = null, $include = 'all' ) {
+ public static function fetchLanguageName(
+ $code,
+ $inLanguage = self::AS_AUTONYMS,
+ $include = self::ALL
+ ) {
$code = strtolower( $code );
$array = self::fetchLanguageNames( $inLanguage, $include );
return !array_key_exists( $code, $array ) ? '' : $array[$code];
"subject-preview": "Предварителен преглед на заглавието:",
"previewerrortext": "Възникна грешка при опита за преглед на промените.",
"blockedtitle": "Потребителят е блокиран",
- "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
+ "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
"autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:''$2''\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият ви IP-адрес е $3, а номерът на блокирането ви е $5. Включвайте ги във всяко питане, което правите.",
"systemblockedtext": "Вашето потребителско име или IP адрес беше автоматично блокирано от Медия Уики.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nВашият текущ IP адрес е $3.\nМоля, включете всичките детайли по-горе, ако правите каквито и да е запитвания.",
"blockednoreason": "не е указана причина",
"recentchangesdays": "Брой дни в последни промени:",
"recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
"recentchangescount": "Брой показвани редакции по подразбиране:",
- "prefs-help-recentchangescount": "Това вклÑ\8eÑ\87ва поÑ\81ледниÑ\82е пÑ\80омени, иÑ\81Ñ\82оÑ\80ииÑ\82е на Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е и дневниÑ\86иÑ\82е.",
+ "prefs-help-recentchangescount": "Ð\9cакÑ\81имален бÑ\80ой: 1000",
"prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
"prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
"savedprefs": "Настройките ви бяха съхранени.",
"prefs-files": "Файлове",
"prefs-custom-css": "Личен CSS",
"prefs-custom-js": "Личен JS",
- "prefs-common-config": "Общи настройки на CSS/JS за всички облици:",
+ "prefs-common-config": "Общи настройки на CSS/JSON/JavaScript за всички облици:",
"prefs-reset-intro": "Тази страница може да се използва за възстановяване на потребителските настройки към стандартните за сайта.\nТова действие е необратимо.",
"prefs-emailconfirm-label": "Потвърждаване на адрес за е-поща:",
"youremail": "Е-поща:",
"userrights-expiry-in-past": "کاتی بەسەرچوون بۆ گرووپی «$1» لە ڕابردوودایە.",
"group": "گرووپ:",
"group-user": "بەکارھێنەران",
- "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
+ "group-autoconfirmed": "بەکارھێنەرانی پەسەندکراوی خۆگەڕ",
"group-bot": "بۆتەکان",
"group-sysop": "بەڕێوەبەران",
"group-interface-admin": "بەڕێوەبەرانی ڕووکار",
"group-suppress": "چاودێرەکان",
"group-all": "(ھەموو)",
"group-user-member": "{{GENDER:$1|بەکارھێنەر}}",
- "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرە خۆبەخۆ پەسندکراوەکان}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرانی پەسەندکراوی خۆگەڕ}}",
"group-bot-member": "بۆت",
"group-sysop-member": "{{GENDER:$1|بەڕێوەبەر}}",
"group-interface-admin-member": "{{GENDER:$1|بەڕێوەبەری ڕووکار}}",
"group-bureaucrat-member": "{{GENDER:$1|بیوروکرات}}",
"group-suppress-member": "{{GENDER:$1|چاودێر}}",
"grouppage-user": "{{ns:project}}:بەکارھێنەران",
- "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
+ "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرانی پەسەندکراوی خۆگەڕ",
"grouppage-bot": "{{ns:project}}:بۆت",
"grouppage-sysop": "{{ns:project}}:بەڕێوەبەران",
"grouppage-interface-admin": "{{ns:project}}:بەڕێوەبەرانی ڕووکار",
"rcfilters-liveupdates-button": "نوێکردنەوەی زیندوو",
"rcfilters-watchlist-edit-watchlist-button": "دەستکاریکردنی پێڕستی پەڕە چاودێریکراوەکانت",
"rcfilters-watchlist-showupdated": "ئەو پەڕانەی دەستکاریکراون و لەکاتی دەستکاریکردنەکەوە سەردانت نەکردوونەتەوە بە <strong>تۆخ</strong> دەردەکەون، بە نیشانی پڕکراوەوە.",
+ "rcfilters-preference-label": "گەڕاندنەوەی وەشانی نوێی دوایین گۆڕانکارییەکان",
+ "rcfilters-watchlist-preference-label": "شاردنەوەی وەشانی نوێی پێڕستی چاودێری",
+ "rcfilters-watchlist-preference-help": "ئەم ھەڵبژاردەیە وەشانی نوێی ڕووکار و ھەموو ئامرازەکانی لەو کاتەوە زیاد کراون دەگەڕێنێتەوە.",
"rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە <strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
"rclistfromreset": "گەڕاندنەوەی ھەڵبژاردەی بەروار",
"rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
"specialpages-group-wiki": "دراوەکان و ئامرازەکان",
"specialpages-group-redirects": "پەڕە تایبەتەکانی ڕەوانەکردن",
"specialpages-group-spam": "ئامرازەکانی سپەم",
+ "specialpages-group-developer": "ئامرازەکانی بەرھەمھێنەر",
"blankpage": "پەڕەی واڵا",
"intentionallyblankpage": "ئەم پەڕەیە لەقەست واڵا ھێڵراوەتەوە.",
"external_image_whitelist": " #ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە<pre>\n#کەرتەکانی regular expression (تەنیا ئە بەشە کە لە نێوان // دا دێت) لە خوارەوە دابنێ\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#ئەو دێڕانە بە # دەست پێدەکەن وەک شرۆڤە (comments) مامەڵەیان لەگەڵ دەکرێ\n#بە گەورە و بچووکی پیتەکان ھەستیارە (case-insensitive)\n\n#گشت کەرتەکانی regex لە سەرەوەی ئەم دێرەدا دابنێ. ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە</pre>",
"rcfilters-activefilters": "Active filters",
"rcfilters-activefilters-hide": "Hide",
"rcfilters-activefilters-show": "Show",
- "rcfilters-activefilters-hide-tooltip": "Hide Active Filters area",
- "rcfilters-activefilters-show-tooltip": "Show Active Filters area",
+ "rcfilters-activefilters-hide-tooltip": "Hide Active filters area",
+ "rcfilters-activefilters-show-tooltip": "Show Active filters area",
"rcfilters-advancedfilters": "Advanced filters",
"rcfilters-limit-title": "Results to show",
"rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|change|changes}}, $2",
"rcfilters-highlighted-filters-list": "Highlighted: $1",
"rcfilters-quickfilters": "Saved filters",
"rcfilters-quickfilters-placeholder-title": "No filters saved yet",
- "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active Filter area, below.",
+ "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active filters area, below.",
"rcfilters-savedqueries-defaultlabel": "Saved filters",
"rcfilters-savedqueries-rename": "Rename",
"rcfilters-savedqueries-setdefault": "Set as default",
"postedit-confirmation-saved": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯇꯨꯡꯁꯤꯟꯈꯔꯦ ꯫",
"postedit-confirmation-published": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯐꯣꯡꯗꯣꯛꯈꯔꯦ ꯫",
"content-model-wikitext": "ꯋꯤꯀꯤ ꯋꯥꯍꯩ ꯋꯥꯇꯥ",
+ "content-model-javascript": "ꯖꯥꯕꯥ ꯃꯌꯦꯛ",
"content-json-empty-object": "ꯑꯍꯥꯡꯕꯥ ꯄꯣꯠꯁꯛ",
"viewpagelogs": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯅꯧꯅ ꯆꯪꯉꯨ",
"currentrev-asof": "$1 ꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ ꯃꯤꯠꯌꯦꯡ",
"nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
"currentrevisionlink": "ꯈꯋꯥꯏꯗꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛ ꯌꯦꯡꯕꯥ",
"cur": "ꯍꯧ",
+ "next": "ꯃꯊꯪ",
"last": "ꯃꯃꯥꯡꯒꯤ",
"page_first": "ꯑꯍꯥꯟꯕ",
"page_last": "ꯑꯔꯣꯏꯕ",
"history-feed-title": "ꯄꯨꯋꯥꯔꯤ ꯑꯃꯨꯛ ꯍꯟꯅ ꯌꯦꯡꯕ",
"history-feed-item-nocomment": "$2 ꯗ$1",
"rev-delundel": "ꯑꯍꯣꯡꯕꯥ ꯎꯍꯟꯂꯤꯕꯥ",
+ "rev-showdeleted": "ꯎꯨꯠꯂꯨ",
+ "revisiondelete": "ꯀꯛꯊꯠꯄ/ꯀꯛꯊꯠꯇꯕ ꯑꯃꯨꯛꯍꯟꯅ ꯌꯦꯡꯕ",
"revdelete-show-file-submit": "ꯍꯣꯏ",
+ "revdelete-radio-set": "ꯑꯔꯣꯠꯄ",
"revdelete-radio-unset": "ꯎꯍꯟꯕ",
+ "pagehist": "ꯂꯃꯥꯏꯒꯤ ꯄꯨꯋꯥꯔꯤ",
+ "deletedhist": "ꯀꯛꯊꯠꯈꯤꯕꯒꯤ ꯄꯨꯋꯥꯔꯤ",
"mergelog": "ꯂꯣꯒ ꯄꯨꯟꯁꯤꯟꯕ",
"history-title": "Revision history of \"$1\"",
"difference-title": "$1 ꯒꯤ ꯑꯃꯨꯛꯍꯟꯕꯥ ꯈꯦꯠꯅꯕꯥꯒꯤ ꯃꯔꯛ",
"editingsection": "$1 (အပိုင်း) ကို ပြင်ဆင်နေသည်။",
"editingcomment": "$1 (အပိုင်းသစ်) ကို ပြင်ဆင်နေသည်။",
"editconflict": "အငြင်းပွားမှုကို တည်းဖြတ်ရန် - $1",
+ "explainconflict": "သင် စတင်တည်းဖြတ်ကတည်းက တစ်စုံတစ်ယောက်မှ ဤစာမျက်နှာကို ပြောင်းလဲခဲ့သည်။ အပေါ်ပိုင်းဧရိယာတွင် လက်ရှိတည်ရှိနေသော စာမျက်နှာစာသား ပါဝင်သည်။ သင်၏ပြောင်းလဲချက်များကို အောက်ပိုင်းစာသားဧရိယာတွင် ပြသပေးထားသည်။ သင်၏ပြောင်းလဲချက်များကို ရှိနှင့်ပြီးသားစာသားတွင် ပေါင်းစပ်ရမည်ဖြစ်ပါသည်။ \"$1\" ကို သင်နှိပ်လိုက်ပါက အပေါ်ပိုင်းဧရိယာရှိ စာသား<strong>သာလျင်</strong> သိမ်းဆည်းသွားမည်ဖြစ်ပါသည်။",
"yourtext": "သင့်စာသား",
"storedversion": "သိမ်းဆည်းထားသောမူ",
"yourdiff": "ကွဲပြားချက်များ",
"post-expand-template-argument-warning": "'''သတိပေးချက် -''' ဤစာမျက်နှာတွင် ပမာဏအားဖြင့် ကြီးမားကျယ်ပြန့်သော template argument တစ်ခုပါဝင်သည်။\nယင်း arguments များကို ဖယ်ထုတ်လိုက်သည်။",
"post-expand-template-argument-category": "ဖယ်ထုတ်ထားသော template arguments များပါဝင်သည့် စာမျက်နှာများ",
"parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]",
+ "undo-success": "တည်းဖြတ်မှုကို နောက်ပြန်ဆုတ်နိုင်ပါသည်။ သင် လုပ်ဆောင်လိုသည့်အရာကို အတည်ပြုစစ်ဆေးနိုင်ရန် အောက်တွင်ပြထားသော နှိုင်းယှဉ်ချက်ကို စစ်ဆေးပါ၊ ပြီးလျင် နောက်သို့ပြန်ပြင်ရန် ပြောင်းလဲမှုများကို သိမ်းဆည်းပါ။",
"undo-failure": "ကြားဖြတ် တည်းဖြတ်မှုများကြောင့် တည်းဖြတ်မှုကို နောက်ပြန် မပြင်နိုင်တော့ပါ။",
"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
"cantcreateaccount-text": "ဤအိုင်ပီလိပ်စာ (<strong>$1</strong>) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ <em>$2</em>",
"rcfilters-watchlist-markseen-button": "ပြောင်းလဲမှုများအားလုံးကို ကြည့်ရှုပြီးကြောင်း မှတ်သားရန်",
"rcfilters-watchlist-edit-watchlist-button": "သင့်စောင့်ကြည့်စာရင်းရှိ စာမျက်နှာများစာရင်းအား တည်းဖြတ်ရန်",
"rcfilters-watchlist-showupdated": "သင်နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို <strong>စာလုံးမဲ</strong> ဖြင့် ပြသထားသည်။",
+ "rcfilters-preference-label": "လတ်တလောအပြောင်းအလဲများ၏ မွမ်းမံထားသောဗားရှင်းကို ဝှက်ရန်",
+ "rcfilters-watchlist-preference-label": "စောင့်ကြည့်စာရင်း၏ မွမ်းမံထားသောဗားရှင်းကို ဝှက်ရန်",
"rcfilters-target-page-placeholder": "စာမျက်နှာနာမည် (သို့မဟုတ် ကဏ္ဍ) ရိုက်ထည့်ပါ",
"rcnotefrom": "အောက်ပါတို့မှာ <strong>$3၊ $4</strong> မှစ၍ {{PLURAL:$5|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}} ဖြစ်သည် (<strong>$1</strong> အထိ ပြထား)။",
"rclistfromreset": "ရက်စွဲရွေးချယ်မှုအား ပြန်စရန်",
"nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။",
"uctop": "(လက်ရှိ)",
"month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :",
- "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :",
+ "year": "အဆိုပါ နှစ်မှစ၍ (အဆိုပါနှစ်ထက်လည်း စောသော):",
"date": "အဆိုပါရက်စွဲမှစ၍ (ယင်းထက်လည်း စောသော):",
"sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
"sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်",
"passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။",
"passwordpolicies-group": "အုပ်စု",
"passwordpolicies-policies": "မူဝါဒများ",
+ "passwordpolicies-policy-minimalpasswordlength": "စကားဝှက်တွင် အနည်းဆုံး {{PLURAL:$1|စကားလုံး|စကားလုံးများ}} $1 ခုရှိရမည်။",
"passwordpolicies-policy-passwordcannotmatchusername": "စကားဝှက်သည် အသုံးပြုသူအမည်နှင့် မတူညီရပါ"
}
"category-file-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу датотеку.|{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији, од укупно $2.}}",
"category-file-count-limited": "{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
"listingcontinuesabbrev": "наст.",
- "index-category": "Ð\9fопиÑ\81ане странице",
+ "index-category": "Ð\98ндекÑ\81иÑ\80ане странице",
"noindex-category": "Непописане странице",
"broken-file-category": "Странице са неисправним везама до датотека",
"categoryviewer-pagedlinks": "$1 ($2)",
"tagline": "Извор: {{SITENAME}}",
"help": "Помоћ",
"search": "Претрага",
- "search-ignored-headings": " #<!-- не меÑ\9aаÑ\98Ñ\82е ниÑ\88Ñ\82а Ñ\83 овом Ñ\80едÑ\83 --> <pre>\n# Ð\9dаÑ\81лови коÑ\98и Ñ\9bе биÑ\82и занемаÑ\80ени пÑ\80и пÑ\80еÑ\82Ñ\80ази.\n# Ð\9fÑ\80омене Ñ\81Ñ\83 видÑ\99иве одмаÑ\85 након Ñ\88Ñ\82о Ñ\81е Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81а наÑ\81ловом попиÑ\88е.\n# Ð\9cожеÑ\82е изнÑ\83диÑ\82и поновно попиÑ\81ивање „нултом” изменом.\n# Синтакса је следећа:\n# * Сваки ред који започиње знаком „#” је коментар.\n# * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
+ "search-ignored-headings": " #<!-- не меÑ\9aаÑ\98Ñ\82е ниÑ\88Ñ\82а Ñ\83 овом Ñ\80едÑ\83 --> <pre>\n# Ð\9dаÑ\81лови коÑ\98и Ñ\9bе биÑ\82и занемаÑ\80ени пÑ\80и пÑ\80еÑ\82Ñ\80ази.\n# Ð\9fÑ\80омене Ñ\81Ñ\83 видÑ\99иве одмаÑ\85 након Ñ\88Ñ\82о Ñ\81е Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81а наÑ\81ловом индекÑ\81иÑ\80а.\n# Ð\9cожеÑ\82е изнÑ\83диÑ\82и поновно индекÑ\81иÑ\80ање „нултом” изменом.\n# Синтакса је следећа:\n# * Сваки ред који започиње знаком „#” је коментар.\n# * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
"searchbutton": "Претражи",
"go": "Иди",
"searcharticle": "Иди",
"subject-preview": "Преглед теме:",
"previewerrortext": "Дошло је до грешке при покушају прегледа промена.",
"blockedtitle": "Корисник је блокиран",
- "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте навели валидну имејл адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша актуелна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
- "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите могућност „{{int:emailuser}}“ осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша актуелна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
+ "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте навели валидну имејл адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
+ "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите могућност „{{int:emailuser}}“ осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
"blockednoreason": "разлог није наведен",
"whitelistedittext": "$1 да бисте уређивали странице.",
"confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
"powersearch-togglenone": "Ништа",
"powersearch-remember": "Запамти избор за будуће претраге",
"search-external": "Спољашња претрага",
- "searchdisabled": "Ð\9fÑ\80еÑ\82Ñ\80ага Ñ\98е онемогÑ\83Ñ\9bена.\nУ меÑ\92Ñ\83вÑ\80еменÑ\83 можеÑ\82е Ñ\82Ñ\80ажиÑ\82и пÑ\80еко Ð\93Ñ\83гла.\nУпамÑ\82иÑ\82е да Ñ\9aегови пописи овог викија могу бити застарели.",
+ "searchdisabled": "Ð\9fÑ\80еÑ\82Ñ\80ага Ñ\98е онемогÑ\83Ñ\9bена.\nУ меÑ\92Ñ\83вÑ\80еменÑ\83 можеÑ\82е Ñ\82Ñ\80ажиÑ\82и пÑ\80еко Ð\93Ñ\83гла.\nУпамÑ\82иÑ\82е да Ñ\9aегови индекси овог викија могу бити застарели.",
"search-error": "Дошло је до грешке приликом претраге: $1",
"search-warning": "Упозорење приликом претраге: $1",
"preferences": "Подешавања",
"file-thumbnail-no": "Име датотеке почиње са <strong>$1</strong>.\nИзгледа да се ради о слици умањене величине <em>(сличица)</em>.\nАко имате ову слику у пуној резолуцији, отпремите је, у противном, промените име датотеке.",
"fileexists-forbidden": "Датотека с овим називом већ постоји и не може се заменити.\nАко и даље желите да пошаљете датотеку, вратите се и изаберите други назив.\n[[File:$1|thumb|center|$1]]",
"fileexists-shared-forbidden": "Датотека са овим именом већ постоји у заједничкој остави.\nАко још увек желите да отпремите датотеку, вратите се и користите ново име.\n[[File:$1|thumb|center|$1]]",
- "fileexists-no-change": "Датотека је дупликат актуелне верзије <strong>[[:$1]]</strong>.",
+ "fileexists-no-change": "Датотека је дупликат тренутне верзије <strong>[[:$1]]</strong>.",
"fileexists-duplicate-version": "Датотека је дупликат {{PLURAL:$2|старе верзије|старих верзија}} <strong>[[:$1]]</strong>.",
"file-exists-duplicate": "Ово је дупликат {{PLURAL:$1|следеће датотеке|следећих датотека}}:",
"file-deleted-duplicate": "Датотека која је идентична овој ([[:$1]]) је раније била избрисана.\nТребате да проверите историју брисања те датотеке пре него што наставите са њеним поновним оптремањем.",
"filehist-deleteall": "избриши све",
"filehist-deleteone": "избриши",
"filehist-revert": "врати",
- "filehist-current": "актуелна",
+ "filehist-current": "тренутна",
"filehist-datetime": "Датум/време",
"filehist-thumb": "Сличица",
"filehist-thumbtext": "Минијатура за верзију на дан $1",
"allpages-bad-ns": "{{SITENAME}} нема именски простор „$1“.",
"allpages-hide-redirects": "Сакриј преусмерења",
"cachedspecial-viewing-cached-ttl": "Гледате кеширану верзију ове странице, која може бити стара и до $1.",
- "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која можда није потпуно актуелна.",
+ "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која можда није потпуно тренутна.",
"cachedspecial-refresh-now": "Погледај најновију.",
"categories": "Категоријe",
"categories-submit": "Прикажи",
"blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nДневник сакривања је наведен испод као референца:",
"blocklogentry": "је блокирао [[$1]] са временом истицања од $2 $3",
"reblock-logentry": "је {{GENDER:|променио|променила}} подешавања блокирања за {{GENDER:$1|корисника|корисницу}} [[$1]] са временом истека од $2 ($3)",
- "blocklogtext": "Ово је дневник радњи блокирања и деблокирања корисника.\nАутоматски блокиране IP адресе нису наведене.\nПогледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.",
+ "blocklogtext": "Ово је дневник радњи блокирања и деблокирања корисника.\nАутоматски блокиране IP адресе нису наведене.\nПогледајте [[Special:BlockList|списак блокирања]] за списак тренутних операција забрана и блокирања.",
"unblocklogentry": "је деблокирао $1",
"block-log-flags-anononly": "само анонимни корисници",
"block-log-flags-nocreate": "онемогућено отварање налога",
"move-over-sharedrepo": "[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
"file-exists-sharedrepo": "Наведени назив датотеке се већ користи у дељеном складишту.\nИзаберите други назив.",
"export": "Извоз страница",
- "exporttext": "Можете да извезете текст и историју измена одређене странице или скупа страница уклљених у XML формату.\nОво онда може да буде увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите актуелну измену и све остале, или само актуелну измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везе, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].",
+ "exporttext": "Можете да извезете текст и историју измена одређене странице или скупа страница уклљених у XML формату.\nОво онда може да буде увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите тренутну измену и све остале, или само тренутну измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везе, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].",
"exportall": "Извези све странице",
- "exportcuronly": "Укључи само актуелну измену, не целу историју",
+ "exportcuronly": "Укључи само тренутну измену, не целу историју",
"exportnohistory": "----\n'''Напомена:''' извоз пуне историје страница преко овог обрасца је онемогућено из техничких разлога.",
"exportlistauthors": "Укључи целокупан списак доприносилаца за сваку страницу",
"export-submit": "Извези",
"exif-focalplaneyresolution": "Резолуција фокусне равни Y",
"exif-focalplaneresolutionunit": "Јединица за резолуцију фокусне равни",
"exif-subjectlocation": "Положај објекта",
- "exif-exposureindex": "Ð\9fопис експозиције",
+ "exif-exposureindex": "Ð\98ндекс експозиције",
"exif-sensingmethod": "Начин сензора",
"exif-filesource": "Изворна датотека",
"exif-scenetype": "Тип сцене",
"subject-preview": "Pregled teme:",
"previewerrortext": "Došlo je do greške pri pokušaju pregleda promena.",
"blockedtitle": "Korisnik je blokiran",
- "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Početak blokiranja: $8\n* Istek blokiranja: $6\n* Blokirani: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokiranju.\nNe možete da koristite mogućnost „{{int:emailuser}}” osim ako ste naveli validnu imejl adresu u svojim [[Special:Preferences|podešavanjima naloga]] i niste blokirani od korišćenja iste.\nVaša aktuelna IP adresa je $3, a ID blokade #$5.\nNavedite sve gornje detalje pri pravljenju bilo kakvih upita.",
- "autoblockedtext": "Vaša IP adresa je automatski blokirana jer ju je koristio drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Ime korisnika: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste raspravljali o blokadi.\n\nZapamtite da ne možete da koristite mogućnost „{{int:emailuser}}“ osim ako ste naveli valjanu imejl adresu u svojim [[Special:Preferences|podešavanjima]].\n\nVaša aktuelna IP adresa je $3, a ID blokade $5.\nUključite sve gornje detalje pri pravljenju bilo kakvih upita.",
+ "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Početak blokiranja: $8\n* Istek blokiranja: $6\n* Blokirani: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokiranju.\nNe možete da koristite mogućnost „{{int:emailuser}}” osim ako ste naveli validnu imejl adresu u svojim [[Special:Preferences|podešavanjima naloga]] i niste blokirani od korišćenja iste.\nVaša trenutna IP adresa je $3, a ID blokade #$5.\nNavedite sve gornje detalje pri pravljenju bilo kakvih upita.",
+ "autoblockedtext": "Vaša IP adresa je automatski blokirana jer ju je koristio drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Ime korisnika: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste raspravljali o blokadi.\n\nZapamtite da ne možete da koristite mogućnost „{{int:emailuser}}“ osim ako ste naveli valjanu imejl adresu u svojim [[Special:Preferences|podešavanjima]].\n\nVaša trenutna IP adresa je $3, a ID blokade $5.\nUključite sve gornje detalje pri pravljenju bilo kakvih upita.",
"blockednoreason": "nije naveden razlog",
"whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
"confirmedittext": "Morate da potvrdite svoju imejl adresu pre uređivanja stranica.\nPostavite i potvrdite imejl adresu preko [[Special:Preferences|podešavanja]].",
"file-thumbnail-no": "Ime datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o slici umanjene veličine <em>(sličica)</em>.\nAko imate ovu sliku u punoj rezoluciji, otpremite je, u protivnom, promenite ime datoteke.",
"fileexists-forbidden": "Datoteka s ovim nazivom već postoji i ne može se zameniti.\nAko i dalje želite da pošaljete datoteku, vratite se i izaberite drugi naziv.\n[[File:$1|thumb|center|$1]]",
"fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi.\nAko još uvek želite da otpremite datoteku, vratite se i koristite novo ime.\n[[File:$1|thumb|center|$1]]",
- "fileexists-no-change": "Datoteka je duplikat aktuelne verzije <strong>[[:$1]]</strong>.",
+ "fileexists-no-change": "Datoteka je duplikat trenutne verzije <strong>[[:$1]]</strong>.",
"fileexists-duplicate-version": "Datoteka je duplikat {{PLURAL:$2|stare verzije|starih verzija}} <strong>[[:$1]]</strong>.",
"file-exists-duplicate": "Ovo je duplikat {{PLURAL:$1|sledeće datoteke|sledećih datoteka}}:",
"file-deleted-duplicate": "Datoteka koja je identična ovoj ([[:$1]]) je ranije bila izbrisana.\nTrebate da proverite istoriju brisanja te datoteke pre nego što nastavite sa njenim ponovnim optremanjem.",
"filehist-deleteall": "izbriši sve",
"filehist-deleteone": "izbriši",
"filehist-revert": "vrati",
- "filehist-current": "aktuelna",
+ "filehist-current": "trenutna",
"filehist-datetime": "Datum/vreme",
"filehist-thumb": "Sličica",
"filehist-thumbtext": "Minijatura za verziju na dan $1",
"blocklog-showsuppresslog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena}}.\nIstorija sakrivanja se nalazi ispod:",
"blocklogentry": "je blokirao [[$1]] sa vremenom isticanja od $2 $3",
"reblock-logentry": "{{GENDER:|je promenio|je promenila}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice}} [[$1]] sa vremenom isteka od $2 ($3)",
- "blocklogtext": "Ovo je dnevnik radnji blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak aktuelnih operacija zabrana i blokiranja.",
+ "blocklogtext": "Ovo je dnevnik radnji blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih operacija zabrana i blokiranja.",
"unblocklogentry": "je deblokirao $1",
"block-log-flags-anononly": "samo anonimni korisnici",
"block-log-flags-nocreate": "onemogućeno otvaranje naloga",
"move-over-sharedrepo": "[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
"file-exists-sharedrepo": "Navedeni naziv datoteke se već koristi u deljenom skladištu.\nIzaberite drugi naziv.",
"export": "Izvoz stranica",
- "exporttext": "Možete da izvezete tekst i istoriju izmena određene stranice ili skupa stranica uklljenih u XML formatu.\nOvo onda može da bude uvezeno u drugi viki koji koristi Medijaviki softver preko [[Special:Import|stranice za uvoz]].\n\nDa biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite aktuelnu izmenu i sve ostale, ili samo aktuelnu izmenu s podacima o poslednjoj izmeni.\n\nU drugom slučaju, možete koristiti i link, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
+ "exporttext": "Možete da izvezete tekst i istoriju izmena određene stranice ili skupa stranica uklljenih u XML formatu.\nOvo onda može da bude uvezeno u drugi viki koji koristi Medijaviki softver preko [[Special:Import|stranice za uvoz]].\n\nDa biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite trenutnu izmenu i sve ostale, ili samo trenutnu izmenu s podacima o poslednjoj izmeni.\n\nU drugom slučaju, možete koristiti i link, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
"exportall": "Izvezi sve stranice",
- "exportcuronly": "Uključi samo aktuelnu izmenu, ne celu istoriju",
+ "exportcuronly": "Uključi samo trenutnu izmenu, ne celu istoriju",
"exportnohistory": "----\n'''Napomena:''' izvoz pune istorije stranica preko ovog obrasca je onemogućeno iz tehničkih razloga.",
"exportlistauthors": "Uključi celokupan spisak doprinosilaca za svaku stranicu",
"export-submit": "Izvezi",
true
);
$this->addOption( 'populate-only', 'Do not update change_tag_def table' );
+ $this->addOption( 'set-user-tags-only', 'Only update ctd_user_defined from valid_tag table' );
}
public function execute() {
__METHOD__
)
) {
+ if ( $this->hasOption( 'set-user-tags-only' ) ) {
+ $this->setUserDefinedTags();
+ return true;
+ }
if ( !$this->hasOption( 'populate-only' ) ) {
$this->updateCountTag();
}
$this->backpopulateChangeTagId();
+ $this->setUserDefinedTags();
} else {
$this->updateCountTagId();
}
return true;
}
+ private function setUserDefinedTags() {
+ $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+
+ $userTags = $dbr->selectFieldValues(
+ 'valid_tag',
+ 'vt_tag',
+ [],
+ __METHOD__
+ );
+
+ if ( empty( $userTags ) ) {
+ $this->output( "No user defined tags to set, moving on...\n" );
+ return;
+ }
+
+ if ( $this->hasOption( 'dry-run' ) ) {
+ $this->output(
+ 'These tags will have ctd_user_defined=1 : ' . implode( ', ', $userTags ) . "\n"
+ );
+ return;
+ }
+
+ $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
+
+ $dbw->update(
+ 'change_tag_def',
+ [ 'ctd_user_defined' => 1 ],
+ [ 'ctd_name' => $userTags ],
+ __METHOD__
+ );
+ $this->lbFactory->waitForReplication();
+ $this->output( "Finished setting user defined tags in change_tag_def table\n" );
+ }
+
private function updateCountTagId() {
$dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
### Format of this file
#
-# The top-level keys are module names (as registered in Resources.php).
+# The top-level keys are directory names (under resources/lib/).
+# They should match module names (as registered in Resources.php), but there are exceptions.
# Each top-level key holds a resource descriptor that must have one of
# the following `type` values:
#
#
### Type tar
#
-# The `src` and `integrity` keys are quired.
+# The `src` and `integrity` keys are required.
#
-# * `src`: Full URL to thes remote resource.
+# * `src`: Full URL to the remote resource.
# * `integrity`: Cryptographic hash (integrity metadata format per <https://www.w3.org/TR/SRI/>).
# * `dest`: An object mapping paths to files or directory from the remote resource to a destination
# in the module directory. The value of key in dest may be omitted, which will extract the key
#
### Type file
#
-# The `src` and `integrity` keys are quired.
+# The `src` and `integrity` keys are required.
#
-# * `src`: Full URL to thes remote resource.
+# * `src`: Full URL to the remote resource.
# * `integrity`: Cryptographic hash (integrity metadata format per <https://www.w3.org/TR/SRI/>).
# * `dest`: The name of the file in the module directory. Default: Basename of URL.
#
-### Type mult-file
+### Type multi-file
#
# The `files` key is required.
#
src: https://raw.githubusercontent.com/santhoshtr/CLDRPluralRuleParser/v1.1.3/src/CLDRPluralRuleParser.js
integrity: sha384-Y0qxTEDVQgh+N5In+vLbZLL2H7PEROnicj8vxof0mxR8kXcGysGE6OcF+cS+Ao0u
+easy-deflate:
+ type: multi-file
+ files:
+ deflate.js:
+ src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/deflate.js
+ integrity: sha384-sHnZLDSWMUhA2w9ygkzCK8YFvoh/fQKY6lXMbvmrYzjuNURiLB0DZFCDNMpGyZ77
+ easydeflate.js:
+ src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/easydeflate.js
+ integrity: sha384-EwPfP2RMkDPa1HkzQsXgzTsy1KEjcIzQPA1HDS/JPHjvEMvVUsCxWwm1oXql/jk2
+ inflate.js:
+ src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/inflate.js
+ integrity: sha384-hMg44Hw424mUYvmzKl0JT4J8UU/1YYhTiGRtR0YX/MXNLK9qWTK0d62FBCDGxmxw
+ README.md:
+ src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/README.md
+ integrity: sha384-6kwcfCLivvqXBZy2ATyya+mTVWLk3eaQyBdC6tbpBtkygnBrM2SNkq3jz/l7IkvP
+
html5shiv:
type: file
src: https://raw.githubusercontent.com/aFarkas/html5shiv/3.7.3/src/html5shiv.js
For sources that don't publish an integrity hash, omit "integrity" (or leave empty)
and run the "make-sri" action to compute the missing hashes.
-This script runs in dry mode by default. Use --update to actually change, remove,
-or add files to /resources/lib/.
+This script runs in dry-run mode by default. Use --update to actually change,
+remove, or add files to resources/lib/.
TEXT
);
$this->addArg( 'action', 'One of "update", "verify" or "make-sri"', true );
"devDependencies": {
"deepmerge": "1.3.2",
"eslint": "5.0.1",
- "eslint-config-wikimedia": "0.7.2",
+ "eslint-config-wikimedia": "0.8.1",
"eslint-plugin-qunit": "3.3.1",
"grunt": "1.0.3",
"grunt-banana-checker": "0.6.0",
function addMulti( $oldContainer, $container ) {
var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
- oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen|mw-htmlform-dropdown)/g, '' ),
+ oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-htmlform-dropdown)/g, '' ),
$select = $( '<select>' ),
dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
oldClass = oldClass.trim();
// Help icon for Tagged edits
this.helpIcon = new OO.ui.ButtonWidget( {
- icon: 'help',
+ icon: 'helpNotice',
framed: false,
title: mw.msg( 'rcfilters-view-tags-help-icon-tooltip' ),
classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-helpIcon' ],
classes.push( 'mw-rcfilters-ui-itemMenuOptionWidget-identifier-' + ident );
} );
- this.$element.addClass( classes.join( ' ' ) );
+ this.$element.addClass( classes );
}
this.updateUiBasedOnState();
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\IMaintainableDatabase;
use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\LBFactory;
use Wikimedia\TestingAccessWrapper;
/**
/**
* The local service locator, created during setUp().
+ * @var MediaWikiServices
*/
private $localServices;
return $testConfig;
}
- /**
- * @param ConfigFactory $oldConfigFactory
- * @param LBFactory $oldLoadBalancerFactory
- * @param MediaWikiServices $newServices
- *
- * @throws MWException
- */
- private static function installTestServices(
- ConfigFactory $oldConfigFactory,
- LBFactory $oldLoadBalancerFactory,
- MediaWikiServices $newServices
- ) {
- // Use bootstrap config for all configuration.
- // This allows config overrides via global variables to take effect.
- $bootstrapConfig = $newServices->getBootstrapConfig();
- $newServices->resetServiceForTesting( 'ConfigFactory' );
- $newServices->redefineService(
- 'ConfigFactory',
- self::makeTestConfigFactoryInstantiator(
- $oldConfigFactory,
- [ 'main' => $bootstrapConfig ]
- )
- );
- $newServices->resetServiceForTesting( 'DBLoadBalancerFactory' );
- $newServices->redefineService(
- 'DBLoadBalancerFactory',
- function ( MediaWikiServices $services ) use ( $oldLoadBalancerFactory ) {
- return $oldLoadBalancerFactory;
- }
- );
- }
-
/**
* @param ConfigFactory $oldFactory
* @param Config[] $configurations
* Resets some non-service singleton instances and other static caches. It's not necessary to
* reset services here.
*/
- private function resetNonServiceCaches() {
+ public static function resetNonServiceCaches() {
global $wgRequest, $wgJobClasses;
foreach ( $wgJobClasses as $type => $class ) {
$this->resetDB( $this->db, $this->tablesUsed );
}
- $this->localServices->destroy();
+ self::restoreMwServices();
$this->localServices = null;
- MediaWikiServices::forceGlobalInstance( self::$originalServices );
}
/**
}
// Reset all caches between tests.
- $this->resetNonServiceCaches();
+ self::resetNonServiceCaches();
// XXX: reset maintenance triggers
// Hook into period lag checks which often happen in long-running scripts
throw new Exception( __METHOD__ . ' must be called after MediaWikiTestCase::run()' );
}
+ if ( $this->localServices !== MediaWikiServices::getInstance() ) {
+ throw new Exception( __METHOD__ . ' will not work because the global MediaWikiServices '
+ . 'instance has been replaced by test code.' );
+ }
+
$this->localServices->disableService( $name );
$this->localServices->redefineService(
$name,
if ( !$this->localServices ) {
throw new Exception( __METHOD__ . ' must be called after MediaWikiTestCase::run()' );
}
+
+ if ( $this->localServices !== MediaWikiServices::getInstance() ) {
+ throw new Exception( __METHOD__ . ' will not work because the global MediaWikiServices '
+ . 'instance has been replaced by test code.' );
+ }
+
MWNamespace::clearCaches();
Language::clearCaches();
protected function overrideMwServices(
Config $configOverrides = null, array $services = []
) {
+ $newInstance = self::installMockMwServices( $configOverrides );
+
+ if ( $this->localServices ) {
+ $this->localServices->destroy();
+ }
+
+ $this->localServices = $newInstance;
+
+ foreach ( $services as $name => $callback ) {
+ $newInstance->redefineService( $name, $callback );
+ }
+
+ return $newInstance;
+ }
+
+ /**
+ * Creates a new "mock" MediaWikiServices instance, and installs it.
+ * This effectively resets all cached states in services, with the exception of
+ * the ConfigFactory and the DBLoadBalancerFactory service, which are inherited from
+ * the original MediaWikiServices.
+ *
+ * @note The new original MediaWikiServices instance can later be restored by calling
+ * restoreMwServices(). That original is determined by the first call to this method, or
+ * by setUpBeforeClass, whichever is called first. The caller is responsible for managing
+ * and, when appropriate, destroying any other MediaWikiServices instances that may get
+ * replaced when calling this method.
+ *
+ * @param Config|null $configOverrides Configuration overrides for the new MediaWikiServices
+ * instance.
+ *
+ * @return MediaWikiServices the new mock service locator.
+ */
+ public static function installMockMwServices( Config $configOverrides = null ) {
+ // Make sure we have the original service locator
+ if ( !self::$originalServices ) {
+ self::$originalServices = MediaWikiServices::getInstance();
+ }
+
if ( !$configOverrides ) {
$configOverrides = new HashConfig();
}
$oldLoadBalancerFactory = self::$originalServices->getDBLoadBalancerFactory();
$testConfig = self::makeTestConfig( null, $configOverrides );
- $newInstance = new MediaWikiServices( $testConfig );
+ $newServices = new MediaWikiServices( $testConfig );
// Load the default wiring from the specified files.
// NOTE: this logic mirrors the logic in MediaWikiServices::newInstance.
$wiringFiles = $testConfig->get( 'ServiceWiringFiles' );
- $newInstance->loadWiringFiles( $wiringFiles );
+ $newServices->loadWiringFiles( $wiringFiles );
// Provide a traditional hook point to allow extensions to configure services.
- Hooks::run( 'MediaWikiServices', [ $newInstance ] );
+ Hooks::run( 'MediaWikiServices', [ $newServices ] );
- foreach ( $services as $name => $callback ) {
- $newInstance->redefineService( $name, $callback );
+ // Use bootstrap config for all configuration.
+ // This allows config overrides via global variables to take effect.
+ $bootstrapConfig = $newServices->getBootstrapConfig();
+ $newServices->resetServiceForTesting( 'ConfigFactory' );
+ $newServices->redefineService(
+ 'ConfigFactory',
+ self::makeTestConfigFactoryInstantiator(
+ $oldConfigFactory,
+ [ 'main' => $bootstrapConfig ]
+ )
+ );
+ $newServices->resetServiceForTesting( 'DBLoadBalancerFactory' );
+ $newServices->redefineService(
+ 'DBLoadBalancerFactory',
+ function ( MediaWikiServices $services ) use ( $oldLoadBalancerFactory ) {
+ return $oldLoadBalancerFactory;
+ }
+ );
+
+ MediaWikiServices::forceGlobalInstance( $newServices );
+ return $newServices;
+ }
+
+ /**
+ * Restores the original, non-mock MediaWikiServices instance.
+ * The previously active MediaWikiServices instance is destroyed,
+ * if it is different from the original that is to be restored.
+ *
+ * @note this if for internal use by test framework code. It should never be
+ * called from inside a test case, a data provider, or a setUp or tearDown method.
+ *
+ * @return bool true if the original service locator was restored,
+ * false if there was nothing too do.
+ */
+ public static function restoreMwServices() {
+ if ( !self::$originalServices ) {
+ return false;
}
- self::installTestServices(
- $oldConfigFactory,
- $oldLoadBalancerFactory,
- $newInstance
- );
+ $currentServices = MediaWikiServices::getInstance();
- if ( $this->localServices ) {
- $this->localServices->destroy();
+ if ( self::$originalServices === $currentServices ) {
+ return false;
}
- MediaWikiServices::forceGlobalInstance( $newInstance );
- $this->localServices = $newInstance;
+ MediaWikiServices::forceGlobalInstance( self::$originalServices );
+ $currentServices->destroy();
- return $newInstance;
+ return true;
}
/**
self::$dbSetup = false;
}
- /**
- * Prepares the given database connection for usage in the context of usage tests.
- * This sets up clones database tables and changes the table prefix as appropriate.
- * If the database connection already has cloned tables, calling this method has no
- * effect. The tables are not re-cloned or reset in that case.
- *
- * @param IMaintainableDatabase $db
- */
- protected function prepareConnectionForTesting( IMaintainableDatabase $db ) {
- if ( !self::$dbSetup ) {
- throw new LogicException(
- 'Cannot use prepareConnectionForTesting()'
- . ' if the test case is not defined to use the database!'
- );
- }
-
- if ( isset( $db->_originalTablePrefix ) ) {
- // The DB connection was already prepared for testing.
- return;
- }
-
- $testPrefix = self::getTestPrefixFor( $db );
- $oldPrefix = $db->tablePrefix();
-
- $tablesCloned = self::listTables( $db );
-
- if ( $oldPrefix === $testPrefix ) {
- // The database connection already has the test prefix, but presumably not
- // the cloned tables. This is the typical case, since the LBFactory will
- // have the prefix set during testing, but LoadBalancers will still return
- // connections that don't have the cloned table structure.
- $oldPrefix = self::$oldTablePrefix;
- }
-
- $dbClone = new CloneDatabase( $db, $tablesCloned, $testPrefix, $oldPrefix );
- $dbClone->useTemporaryTables( self::$useTemporaryTables );
-
- $db->_originalTablePrefix = $oldPrefix;
-
- if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
- throw new LogicException( 'Cannot clone database tables' );
- } else {
- $dbClone->cloneTableStructure();
- }
- }
-
/**
* Setups a database with cloned tables using the given prefix.
*
return $now - $days * $secondsPerDay;
}
- public function testGetFilterGroupDefinitionFromLegacyCustomFilters() {
- $customFilters = [
- 'hidefoo' => [
- 'msg' => 'showhidefoo',
- 'default' => true,
- ],
-
- 'hidebar' => [
- 'msg' => 'showhidebar',
- 'default' => false,
- ],
- ];
-
- $this->assertEquals(
- [
- 'name' => 'unstructured',
- 'class' => ChangesListBooleanFilterGroup::class,
- 'priority' => -1,
- 'filters' => [
- [
- 'name' => 'hidefoo',
- 'showHide' => 'showhidefoo',
- 'default' => true,
- ],
- [
- 'name' => 'hidebar',
- 'showHide' => 'showhidebar',
- 'default' => false,
- ]
- ],
- ],
- $this->changesListSpecialPage->getFilterGroupDefinitionFromLegacyCustomFilters(
- $customFilters
- )
- );
- }
-
public function testGetStructuredFilterJsData() {
$this->changesListSpecialPage->filterGroups = [];
<?php
+
use Wikimedia\ScopedCallback;
/**
public function setUp() {
wfDebug( __METHOD__ );
+
$db = wfGetDB( DB_MASTER );
$type = $db->getType();
$prefix = $type === 'oracle' ?
$this->oldTablePrefix = $db->tablePrefix();
MediaWikiTestCase::setupTestDB( $db, $prefix );
CloneDatabase::changePrefix( $prefix );
- $teardown = $this->ptRunner->setDatabase( $db );
+
+ $this->ptRunner->setDatabase( $db );
+
+ MediaWikiTestCase::resetNonServiceCaches();
+
+ MediaWikiTestCase::installMockMwServices();
+ $teardown = new ScopedCallback( function () {
+ MediaWikiTestCase::restoreMwServices();
+ } );
+
$teardown = $this->ptRunner->setupUploads( $teardown );
$this->ptTeardownScope = $teardown;
}
"wikimedia/qunit",
"../../.eslintrc.json"
],
- "env": {
- "qunit": true
- },
"globals": {
"sinon": false
},