Uzantı:JsonConfig
JsonConfig uzantısı, diğer uzantıların yapılandırma verilerini bir viki sayfasında JSON blobu olarak depolamasına izin verir.
Mevcut özellikler ve kullanım modelleri

- Verileri birkaç şekilde depolamak için JsonConfig'i kullanabilirsiniz:
- tek bir yapılandırma sayfasında, ör. Config içinde uzantınız için bir dizi ayar: MyExtSettings (
Config, JsonConfig uzantısıyla ilişkili varsayılan ad alanıdır); - kendi ad alanlarında bulunan benzer yapıya sahip bir dizi sayfada, ör. bilinen proxy'lerin IP adresleri veya "Proxy:Opera" adlı olay günlüğü şemaları veya Schema:AccountCreation adlı şemalar
- yalnızca başlıkları bir normal ifade kalıbıyla eşleşen sayfalar için kullanma, ör. Config:Proxy:Opera veya Config:Opera.proxy. Bu, her içerik modeli için bir tane olmak üzere çok sayıda ad alanı içeren bir vikiyi doldurmaktan kaçınır.
- tek bir yapılandırma sayfasında, ör. Config içinde uzantınız için bir dizi ayar: MyExtSettings (
- Veri doğrulama (geçerli JSON dışında) ve normalleştirme yapmak için bir içerik sınıfı sağlayabilirsiniz.
- HTML görünümünü özelleştirmek için bir görünüm sınıfı sağlayabilirsiniz.
- Verileri saklayabilirsiniz:
- "one-per-wiki", "one-per-cluster", hatta her "family" için bir tane (paylaşılan memcached için önbellek anahtarının farklı yapısı);
- genel veya özel bir vikide ve kimlik bilgileriyle erişilir;
- ayrı bir kümede ve değiştirildiğinde uzaktan bildirim yapın.
Viki üzerinde kullanım
Şuan ki
- Commons tablo veri kümeleri
- Commons harita veri kümeleri
- Dashiki gösterge tablosu yapılandırmaları
- Diğerleri?
Geçmiş
- Wikipedia Zero işletme yapılandırmaları (Extension:ZeroBanner sayfasına bakın)
Kurulum
- Dosyaları indirin ve
extensions/klasörünüzdekiJsonConfigadlı dizine yerleştirin.
Developers and code contributors should install the extension from Git instead, using:cd extensions/ git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/JsonConfig
- LocalSettings.php dosyanızın altına aşağıdaki kodu ekleyin:
wfLoadExtension( 'JsonConfig' );
- Gerektiği gibi yapılandırın.
Yapıldı – Uzantının başarıyla yüklendiğini doğrulamak için vikinizde Special:Version seçeneğine gidin.
Yapılandırma
$wgJsonConfigs
Bu değişken, her tür yapılandırma sayfası için profilleri tanımlar.
$wgJsonConfigs, her bir alt dizinin aşağıdaki parametrelere sıfır veya daha fazlasına sahip olduğu ilişkilendirilebilir bir dizi dizisidir.
Varsayılan olarak, JsonConfig dize anahtarını bu profilin temsil ettiği model kimliği olarak kullanır, ancak aynı model kimliğini birden fazla profilde yeniden kullanmak istemeniz durumunda bunu model parametresiyle geçersiz kılabilirsiniz.
| parametre | tür | varsayılan | açıklama |
|---|---|---|---|
| model | string | ($wgJsonConfigs anahtarında)
|
Yeni bir sayfa oluştururken kullanılacak model kimliği. Hiçbiri belirtilmezse, bu profilin dizi anahtarı model kimliği olur. Bu değer null olarak ayarlanırsa, yerleşik modül kimliği JsonConfig kullanılacaktır. Model kimliği, null veya 'JsonConfig' dışında $wgJsonConfigModels içinde de listelenmelidir.
|
| namespace | int | NS_CONFIG (482) | Bu yapılandırmaların yer alacağı ad alanı veya varsayılan olarak 'Config:'
|
| nsName | string/false | Varsayılan olmayan (NS_CONFIG 482 değil) ad alanı için, buna kurallı (İngilizce) bir ad atar. Birden fazla $wgJsonConfigs dizisi aynı ad alanını kullanıyorsa, adı yalnızca bir kez ayarlayın. Bulunmazsa, bir uyarı verilir ve ad alanı otomatik olarak "ConfigNNN" adını alır. Bu yapılandırmanın yerel olarak depolanmaması durumunda, nsName yerel bildirim olmadan uzak ad alanı olarak kullanılacaktır.Ad alanını diğer, JsonConfig içerikli olmayan sayfalar ile paylaşmak istiyorsanız, bu değeri | |
| nsTalk | string | nsName+_talk
|
Varsayılan olmayan ad alanları için, tartışma sayfalarına kanonik (İngilizce) bir ad atar |
| pattern | string | (all) | Verilen ad alanındaki sayfa başlığıyla eşleşen düzenli ifade. Boşsa, yapılandırma ad alanındaki tüm sayfalara uygulanır. Eski "alt boşluk" davranışını eşleştirmek için isSubspace=true için ^/^ad:./ kalıbını ve isSubspace=false için /^ad$/ kalıbını kullanın.
|
| isLocal | bool | true | true ise, bu yapılandırma küme içinde paylaşılmayacak, bunun yerine her vikinin yerel bir yapılandırmasını olacaktır. false ise, bu yapılandırmanın birden fazla viki arasında paylaşılması amaçlanmıştır ve bu özel vikinin onu yerel olarak depolaması için "store" alanını ayarlayın.Bu işaret, önbelleğe alma anahtarını etkiler, bu nedenle, bu ayar false ise memcached'de aynı ada sahip bir yapılandırma sayfası paylaşılır, ancak true ise viki başına benzersiz olacaktır.
|
| cacheExp | int | 24*60*60 | Değer ne kadar süreyle (saniye cinsinden) memcached'de önbelleğe alınmalıdır |
| cacheKey | string | Değer ayarlanmışsa, bu dizeyi önbelleğe alma anahtarına ekleyin. Önceki önbelleğe alınmış değerleri geçersiz kılmak için cacheKey kullanın, ör. önbelleğe alınan değerleri değiştirecek uyumsuz bir değişiklik yaparken ve geri dönmeniz gerekebileceğinden endişelenirsiniz. Bu anahtar, aynı ailedeki tüm dil vikilerinin aynı önbelleğe alınmış değeri paylaşırken aynı sayfada ancak farklı vikilerde saklanmasına izin vermek için de kullanılabilir. Örneğin, Vikipedi "wp" kullanabilir ve Vikisöz "wq" kullanabilir.
| |
| flaggedRevs | bool | false | true ise, Flagged Revisions uzantısı ile doğrulanan en son revizyonu almaya çalışacak, null ise, işaretli revizyon kontrol edilecek ve varsa kullanılacaktır. false ise, her zaman en son revizyonu kullanır.
|
| remote | array | Yapılandırmaya başka bir vikiden nasıl erişileceğini açıklayan parametrelere sahip bir nesne. 'store' ayarlanmamışsa ve isLocal, Template:Phpifalse ise mevcut olmalıdır.
| |
| ‑ url | string | Yalnızca bu yapılandırma profili için uzak vikiden yapılandırma almak için varsayılan olmayan API uç noktası. Belirtilmezse, $wgJsonConfigApiUri değerini kullanır.
| |
| ‑ username | string | Verilirse, uzak yapılandırma depolamasının kimliğini doğrulamak için kullanılacaktır. | |
| ‑ password | string | username sayfasına bakın.
| |
| store | array | Geçerli vikinin bu yapılandırma verilerini gerçekten barındırmasını sağlamak için bu değeri true veya bir dizi olarak ayarlayın. Bu değer, eksikse ve isLocal, true ise otomatik olarak doldurulur.
| |
| ‑ cacheNewValue | bool | true | Yapılandırma değiştiğinde, önbellek nasıl değişmelidir. false ise, önbelleğe alınan değeri siler ve diğer vikileri yeniden istemeye zorlar. true, yeni değeri önbelleğe ayarlar. Bu yapılandırmayı kullanan viki ve depolayan vikiler aynı önbelleği paylaşıyorsa, bu çoğunlukla yararlıdır. false olması durumunda, eğer tüketici viki yeni değeri çok hızlı talep ederse, onu muhtemelen eski bir köle DB'den alabilir.
|
| ‑ notifyUrl | string | İsteğe bağlı olarak, yapılandırma değiştiğinde çağrılacak uzak API URL'sini belirtin. | |
| ‑ notifyUsername | string | notifyUrl ile kullanmak için isteğe bağlı kullanıcı adı
| |
| ‑ notifyPassword | string | notifyUrl ile kullanmak için isteğe bağlı parola
|
$wgJsonConfigModels
Bu değişken, hangi özel içerik sınıfının hangi Model kimliğini işleyeceğini tanımlar.
Aynı içerik sınıfı tarafından birden fazla Model Kimliği işlenebilir.
Tüm içerik sınıfları JCContent sınıfından türetilmelidir; model kimliği null ile eşleşirse, varsayılan JCContent sınıfı model kimliğini işler.
Örnek:
$wgJsonConfigModels['Config.MyExtSettings'] = 'MyExt\MyContentClass';
HTML oluşturma için ayrı bir sınıf uygularsanız, yapılandırma modelinizi fazladan view sınıfı olan bir dizi olarak belirtebilirsiniz:
$wgJsonConfigModels['Config.MyExtSettings'] = [
'class' => 'MyExt\MyContentClass',
'view' => 'MyExt\MyContentViewClass', // snadnější prodloužit o JCDefaultObjContentView nebo JCDefaultContentView
];
Örnekler
name ve isSubspace değerlerini kullanıyordu. Her ikisi de 1.0.0 sürümünde kaldırıldı ve normal ifadeyi kabul eden pattern parametresiyle değiştirildi. Desenlerinizi ^ ve $ sembolleriyle çevrelediğinizden ve eğik çizgiler (PHP stili) eklediğinizden emin olunHello World
En basit durum, her vikide yerel olarak depolanan, herhangi bir doğrulama olmaksızın tek bir yapılandırma sayfasıdır. Bu ayarları LocalSettings.php ile eklemeniz yeterli
// Model obsahu je JsonConfig.MySettings
// Třída modelu je nastavena na NULL, aby povolila neověřená data.
$wgJsonConfigModels['JsonConfig.MySettings'] = null;
$wgJsonConfigs['JsonConfig.MySettings'] = array(
'pattern' => '/^MySettings$/', // Název stránky v jmenném prostoru Config
);
Yukarıdakiler yerel vikide "Config" ad alanını etkinleştirir, ancak yalnızca "Config:MySettings" sayfasının oluşturulmasına izin verir, bu ad alanındaki başka herhangi bir sayfanın oluşturulmasına izin verilmez. Sayfada iyi biçimlendirilmiş JSON verilerini saklayabilirsiniz.
PHP'de MySettings verilerini okumak için, sayfaya erişmek için bir TitleValue nesnesi kullanın, ardından içeriğini isteyin:
use JsonConfig\JCSingleton;
$tv = new TitleValue( NS_CONFIG, 'MySettings' ); // Klíč databáze
$content = JCSingleton::GetContent( $tv );
if ( $content->isValid() ) {
$data = $content->getData();
...
}
Supporting Wikimedia templates
Some templates (e.g. Template:TNT) from Wikimedia projects require JsonConfig to support the Data namespace on commons for mw.ext.data.get.
You can use the following config to support that usecase.
wfLoadExtension( 'JsonConfig' );
$wgJsonConfigEnableLuaSupport = true; // required to use JsonConfig in Lua
$wgJsonConfigModels['Tabular.JsonConfig'] = 'JsonConfig\JCTabularContent';
$wgJsonConfigs['Tabular.JsonConfig'] = [
'namespace' => 486,
'nsName' => 'Data',
// page name must end in .tab, and contain at least one symbol
'pattern' => '/.\.tab$/',
'license' => 'CC0-1.0',
'isLocal' => false,
];
$wgJsonConfigModels['Map.JsonConfig'] = 'JsonConfig\JCMapDataContent';
$wgJsonConfigs['Map.JsonConfig'] = [
'namespace' => 486,
'nsName' => 'Data',
// page name must end in .map, and contain at least one symbol
'pattern' => '/.\.map$/',
'license' => 'CC0-1.0',
'isLocal' => false,
];
$wgJsonConfigInterwikiPrefix = "commons";
$wgJsonConfigs['Tabular.JsonConfig']['remote'] = [
'url' => 'https://commons.wikimedia.org/w/api.php'
];
$wgJsonConfigs['Map.JsonConfig']['remote'] = [
'url' => 'https://commons.wikimedia.org/w/api.php'
];
Bir kümede paylaşılan birden fazla yapılandırma
Diyelim ki güvenilir proxy'lerin IP'lerini Meta Viki'de Config:Proxy: sayfaları olarak saklamaya ve bu veriyi kümeyle paylaşmaya karar verdik.
// All wikis must have this configuration:
$wgJsonConfigs['JsonConfig.Proxy'] = [
'pattern' => '/^Proxy\:./', // require at least one letter after the ':'
'isLocal' => false,
];
// The LocalSettings.php for all wikis except Meta-Wiki will set this URL to Meta-Wiki's API endpoint:
$wgJsonConfigs['JsonConfig.Proxy']['remote'] = 'http://meta.wikimedia.org/w/api.php';
// LocalSettings.php for Meta-Wiki will indicate that the data should be stored there
$wgJsonConfigs['JsonConfig.Proxy']['store'] = true;
Bunun yerine, proxy'lere ayrı bir ad alanı tahsis etmek isterseniz, parametreler şu şekilde değişir:
$wgJsonConfigs['JsonConfig.Proxy'] = [
'namespace' => NNN, // NNN is the number you would reserve for Proxy namespace
'nsName' => 'Proxy', // Canonical namespace name
];
Doğrulama
Çoğu zaman, kendi doğrulamasına sahip özel bir içerik sınıfı da istenir.
JSON sayfaları, JCContent üzerinden türetilen içerik sınıfları tarafından yönetilir.
İçerik sınıfı, ham metnin ayrıştırılması ve doğrulanmasından sorumludur.
JCContent, JSON ayrıştırmasının ötesinde herhangi bir doğrulama yapmaz, ancak ondan türetmeyi ve JCContent::validate() ile geçersiz kılmayı seçebilirsiniz.
Daha da iyisi, bir dizi doğrulama ilkeli sağlayan ve yalnızca JCObjContent::validateContent() ile geçersiz kılan JCObjContent sınıfından türetebilirsiniz.
// This should be done on all wikis, including Meta-Wiki
$wgJsonConfigModels['JsonConfig.Proxy'] = 'ProxyExt\ProxyContent';
Bu belgenin iyiliği için, Opera Mini sunucularını açıklayan proxy yapılandırma sayfasının şu biçime sahip olduğunu varsayalım:
{
"enabled": true,
"comment": "See http://... for updates",
"ips": [
'37.228.104.0/21',
...
]
}
İşte bu verileri doğrulamak için içerik sınıfı.
use JsonConfig\JCObjContent;
use JsonConfig\JCValidators;
class ProxyContent extends JCObjContent {
/**
* Derived classes must implement this method to perform custom validation using the check(...) calls
*/
public function validateContent() {
// 'enabled' - must be a boolean, true by default.
// JCValidators::* already handle localized error messages
$this->testOptional( 'enabled', true, JCValidators::isBool() );
// an optional field 'comment' of type string
$this->testOptional( 'comment', '', JCValidators::isString() );
// 'ips' - must be a list of valid CIDR ranges
// field is not optional when default value would not pass validation
$this->test( 'ips', self::getIpValidator() );
}
private static function getIpValidator() {
// JCValue $value - a value of the field being checked wrapped with the status information.
// $v->getValue() actual value being examined
// $v->isMissing() if the value is not present in the data
// $v->defaultUsed() if the value did not exist and a default was supplied
// array $path - the location of this field in the hierarchy - each value is either string or an int
// JCObjContent $self - this object, useful to get access to other fields via $self->getField()
// You may modify the value stored inside, set additional flags, or report an error
// using the $v->error( $key, $path, ... ) function
return function ( JCValue $value, array $path, JCObjContent $self ) {
$isErr = false;
$v = $value->getValue();
if ( is_string( $v ) ) {
// user supplied a single string, treat as an non-assoc array
$v = array( $v );
} else {
// ensure that $v is an non-assoc array, and all of its values are strings
$isErr = !JCUtils::isList( $v ) || !JCUtils::allValuesAreStrings( $v );
}
if ( !$isErr ) {
// @todo: do the rest of the IP validation and set $isErr to true on failure
}
// Error message might be in this form:
// "Parameter \"$1\" must be an array of valid non-restricted (no private networks) CIDR IP blocks"
if ( $isErr ) {
$value->error( 'my-proxyconfig-err-ips', $path );
} else {
$value->setValue( $v );
}
};
}
}
Depolama vikisindeki özelleştirme davranışı
Ayrıca, depolama vikisinde görüntülemeyi ve sayfa oluşturmayı özelleştirmek isteyebilirsiniz (yukarıdaki örnekte Meta-Wiki).
Bunu yapmanın iki yolu vardır: JCContent-türetilmiş sınıfınızın içinde veya JCContentView üzerinden türetilen ayrı bir "view" sınıfı aracılığıyla.
İkinci yaklaşım, mimariyi temiz bir şekilde ayırdığı için tercih edilir ve görünüm sınıfının, verileri kullanan tüm vikilerde değil, yalnızca depolama vikisinde (örneğin, Meta-Wiki) bulunması gerekir.
JCContent-türetilmiş sınıftaki varsayılan değeri geçersiz kılmak için, yapıcıyı geçersiz kılın ve $text değerini üst kurucuya iletmeden önce NULL olarak gelirse yeni varsayılana ayarlayın.
HTML oluşturmayı geçersiz kılmak için JCContent::getHtml() geçersiz kılın.
Önerilen şekilde, JCContentView veya daha zengin özelliklere sahip JCDefaultContentView üzerinden türetilen bir görünüm sınıfı oluşturun.
JCContentView için, valueToHtml() ve getDefault() uygulamanız gerekecek.
Varsayılan olarak, görünüm JCDefaultContentView sınıfı tarafından uygulanır ve bu, görünümünde küçük ayarlamalara ihtiyacınız varsa özelleştirilebilir bir temel olarak da kullanılabilir.
// Yukarıdakinden model tanımını değiştirmek - META dahil tüm vikilerde yapılmalıdır
$wgJsonConfigModels['JsonConfig.Proxy'] = [ 'class' => 'ProxyExt\ProxyContent' ];
// view sınıfını ekleyin - yalnızca depolama vikisinde yapılmalıdır (ör. META)
$wgJsonConfigModels['JsonConfig.Proxy']['view'] = 'ProxyExt\ProxyView';
class ProxyView extends JsonConfig\JCDefaultObjContentView {
public function getDefault( $modelId ) {
return <<<JSON
{
"comment": "See http://... for updates",
"ips": [
"N.N.N.N/NN",...
]
}
JSON;
}
}
En iyi uygulamalar
- JsonConfig kullanan uzantılar, yapılandırmalarını ana uzantı dosyasındaki
$wgJsonConfigsve$wgJsonConfigModelsdeğerlerine eklemelidir. - Yapılandırma verilerini birden fazla viki arasında paylaşırsanız,
$wgJsonConfigs[]içinde kullanılan anahtar adını belgeleyin veLocalSettings.phpiçinde 'store' / 'remote' bölümünü başlatın. Bu, yapılandırma işlevini çoğaltan bir dizi genel değişken sunmaktan daha iyidir. Örneğin Wikimedia'nın Graph uzantısı yapılandırmasına bakın (bu, basit yapılandırma değişkenleri yerine karmaşık çoklu viki kurulumunu kullanmasına rağmen).
Durum
Uygulanan özellikler
- JSON ayrıştırma JSON metnini bir diziye veya bir nesneye dönüştürür
- Görselleştirme JSON'u koddan ziyade görüntülemesi kolay bir tablo olarak gösterir ve bazı ekstra vurgulamalar içerir. Örneğin, değer sağlanmadıysa ve varsayılan kullanılıyorsa, gri renkte gösterilir veya değer varsayılanla aynı olduğunda mor olarak gösterilir. Örneğin, bunu ve bunu bakın.
- Kod Düzenleyici JSON düzenlemeyi basitleştirir
- Özel Doğrulama, değerin doğru biçimde olup olmadığını veya bir kullanıcı kimliğinin var olup olmadığını kontrol etmek gibi karmaşık kontroller gerçekleştirir.
- MemCached önbelleğe alma json blob'larını memcached'de özel anahtarlar ve süre sonu politikaları altında depolar ve kaydetme sırasında sıfırlar.
- Flagged Revision desteği, yapılandırmaların üretime geçmeden önce "incelendi" olarak işaretlenmesine izin verir
- Çoğu temel arayüz öğesinin yerelleştirilmesi birçok dilde yapılmıştır ve en yaygın mesajların tek bir yerde yalnızca bir kez verilmesi çeviri işini azaltacaktır.
Uygulanmamış hoş şeyler
Bu özellikler, birden fazla yapılandırma türü için arzu edilir:
- Şema doğrulayıcı - Çoğu uzantı karmaşık doğrulama kurallarına ihtiyaç duymayabileceğinden veya şema artı ekstra doğrulamayı birleştirmek isteyebileceğinden, JSON Şeması'na göre doğrulayın.
- Özel düzenleyici - Zero team, muhtemelen JSON Schema'ya dayalı daha karmaşık bir düzenleyici uygulamayı düşünüyor.
- API sorgu desteği - Yapılandırma sayfalarının, metin blobları yerine tüm biçimlerde - json/xml/... - normal API sonuçları olarak döndürülmesine izin verin:
api.php ? action=query & titles=Config:Proxy:Opera & prop=jsonconfig
- Yerelleştirme - her yapılandırma anahtarı için yerelleştirilmiş açıklamalar gösterebilmek iyi olur
Dış erişim
Depolanan yapılandırma verilerine sıklıkla JavaScript, bot veya diğer programlar gibi bazı harici aracılar tarafından ihtiyaç duyulabilir.
JavaScript, standart action=query&rvprop=content API'yi çağırarak gerekli verilere erişmek için JSONP'yi kullanabilir veya CORS kullanılamıyorsa bir yönlendirme hizmeti geliştirebiliriz.
Uzantı yazarları, alana özgü bilgiler sağlamak için kendi API modüllerini eklemeyi seçebilirler.
Son olarak, rvprop=jcddata Sorgu API parametresi, rvprop=content döndüreceği bir metin blobu olarak değil, API sonucunun bir parçası olarak JSON verilerini döndürecektir.
// UYGULANMADI! Nasıl doğru yapılacağına karar verene kadar normal action=query API'sini kullanın
var req = {
format: 'json', action: 'query',
titles: 'Proxy:Opera',
prop: 'revisions', rvprop: 'jcdcontent', indexpageids: '',
};
$.ajax({
url: '//meta.wikipedia.org/w/api.php',
data: req, cache: true, dataType: 'jsonp',
success: function(result) { /* hataları ve uyarıları işleme, içeriği işleme */ }
});
Ayrıca bakınız
| Bu uzantı bir veya daha fazla Wikimedia projelerinde kullanılıyor. Bu, muhtemelen uzantının kararlı olduğu ve bu tür yüksek trafikli web siteleri tarafından kullanılacak kadar iyi çalıştığı anlamına gelir. Nerede kurulduğunu görmek için bu uzantının adını Wikimedia'nın CommonSettings.php ve InitialiseSettings.php yapılandırma dosyalarında arayın. Belirli bir vikide yüklü olan uzantılar listesinin tamamı vikinin Special:Version sayfasında görülebilir. |
| This extension is included in the following wiki farms/hosts and/or packages: This is not an authoritative list. Some wiki farms/hosts and/or packages may contain this extension even if they are not listed here. Always check with your wiki farms/hosts or bundle to confirm. |
- Stable extensions/tr
- ContentHandler extensions/tr
- Personalization extensions/tr
- GPL licensed extensions/tr
- Extensions in Wikimedia version control/tr
- AlternateEdit extensions/tr
- ApiMain::moduleManager extensions/tr
- ArticleDeleteComplete extensions/tr
- ArticleUndelete extensions/tr
- ArticleViewFooter extensions/tr
- BeforePageDisplay extensions/tr
- CanonicalNamespaces extensions/tr
- CodeEditorGetPageLanguage extensions/tr
- CodeMirrorGetMode extensions/tr
- ContentHandlerDefaultModelFor extensions/tr
- ContentHandlerForModelID extensions/tr
- EditFilterMergedContent extensions/tr
- EditPage::showEditForm:initial extensions/tr
- EditPageCopyrightWarning extensions/tr
- GetContentModels extensions/tr
- LinksUpdateComplete extensions/tr
- LoadExtensionSchemaUpdates extensions/tr
- MovePageIsValidMove extensions/tr
- PageMoveComplete extensions/tr
- PageSaveComplete extensions/tr
- ScribuntoExternalLibraries extensions/tr
- SkinCopyrightFooterMessage extensions/tr
- TitleGetEditNotices extensions/tr
- GetUserPermissionsErrors extensions/tr
- All extensions/tr
- Extensions used on Wikimedia/tr
- Extensions included in Miraheze/tr
