Page MenuHomePhabricator

No OneTemporary

File Metadata

Created
Wed, Feb 19, 4:19 AM
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/family.py b/family.py
index 2c20a969..df74ab43 100644
--- a/family.py
+++ b/family.py
@@ -1,3794 +1,3794 @@
# -*- coding: utf-8 -*-
#
# (C) Pywikipedia bot team, 2004-2010
#
# Distributed under the terms of the MIT license.
#
__version__='$Id$'
import config
import re
import urllib
from datetime import timedelta, datetime
# Parent class for all wiki families
class Family:
def __init__(self):
self.name = None
# Updated from http://meta.wikimedia.org/wiki/Interwiki_sorting_order
self.alphabetic = [
'ace', 'af', 'ak', 'als', 'am', 'ang', 'ab', 'ar', 'an', 'arc',
'roa-rup', 'frp', 'as', 'ast', 'gn', 'av', 'ay', 'az', 'bm', 'bn',
'zh-min-nan', 'nan', 'map-bms', 'ba', 'be', 'be-x-old', 'bh', 'bcl',
'bi', 'bar', 'bo', 'bs', 'br', 'bg', 'bxr', 'ca', 'cv', 'ceb', 'cs',
'ch', 'cbk-zam', 'ny', 'sn', 'tum', 'cho', 'co', 'cy', 'da', 'dk',
'pdc', 'de', 'dv', 'nv', 'dsb', 'dz', 'mh', 'et', 'el', 'eml', 'en',
'myv', 'es', 'eo', 'ext', 'eu', 'ee', 'fa', 'hif', 'fo', 'fr', 'fy',
'ff', 'fur', 'ga', 'gv', 'gd', 'gl', 'gan', 'ki', 'glk', 'gu',
'got', 'hak', 'xal', 'ko', 'ha', 'haw', 'hy', 'hi', 'ho', 'hsb',
'hr', 'io', 'ig', 'ilo', 'bpy', 'id', 'ia', 'ie', 'iu', 'ik', 'os',
'xh', 'zu', 'is', 'it', 'he', 'jv', 'kl', 'kn', 'kr', 'pam', 'krc',
'ka', 'ks', 'csb', 'kk', 'kw', 'rw', 'ky', 'rn', 'sw', 'kv', 'kg',
'ht', 'ku', 'kj', 'lad', 'lbe', 'lo', 'la', 'lv', 'lb', 'lt', 'lij',
'li', 'ln', 'jbo', 'lg', 'lmo', 'hu', 'mk', 'mg', 'ml', 'mt', 'mi',
'mr', 'arz', 'mzn', 'ms', 'cdo', 'mwl', 'mdf', 'mo', 'mn', 'mus',
'my', 'nah', 'na', 'fj', 'nl', 'nds-nl', 'cr', 'ne', 'new', 'ja',
'nap', 'ce', 'pih', 'no', 'nb', 'nn', 'nrm', 'nov', 'ii', 'oc',
'mhr', 'or', 'om', 'ng', 'hz', 'uz', 'pa', 'pi', 'pag', 'pnb',
'pap', 'ps', 'km', 'pcd', 'pms', 'tpi', 'nds', 'pl', 'tokipona',
'tp', 'pnt', 'pt', 'aa', 'kaa', 'crh', 'ty', 'ksh', 'ro', 'rmy',
'rm', 'qu', 'ru', 'sah', 'se', 'sm', 'sa', 'sg', 'sc', 'sco', 'stq',
'st', 'tn', 'sq', 'scn', 'si', 'simple', 'sd', 'ss', 'sk', 'cu',
'sl', 'szl', 'so', 'ckb', 'srn', 'sr', 'sh', 'su', 'fi', 'sv', 'tl',
'ta', 'kab', 'roa-tara', 'tt', 'te', 'tet', 'th', 'ti', 'tg', 'to',
'chr', 'chy', 've', 'tr', 'tk', 'tw', 'udm', 'bug', 'uk', 'ur',
'ug', 'za', 'vec', 'vi', 'vo', 'fiu-vro', 'wa', 'zh-classical',
'vls', 'war', 'wo', 'wuu', 'ts', 'yi', 'yo', 'zh-yue', 'diq', 'zea',
'bat-smg', 'zh', 'zh-tw', 'zh-cn',
]
self.langs = {}
# The timedelta to GMT of the server.
# Exemple for a server running CET :
# timedelta(hours=+1)
self.servergmtoffset = timedelta()
# Translation used on all wikis for the different namespaces.
# (Please sort languages alphabetically)
# You only need to enter translations that differ from _default.
self.namespaces = {
-2: {
'_default': u'Media',
'ab': u'Медиа',
'ace': u'Alat',
'am': u'ፋይል',
'ar': u'ميديا',
'arc': u'ܡܝܕܝܐ',
'arz': u'ميديا',
'as': u'মাধ্যম',
'av': u'Медиа',
'az': [u'Media', u'Mediya'],
'ba': u'Медиа',
'bat-smg': [u'Medėjė', u'Medeje', u'Medija'],
'bcl': u'Medio',
'be': u'Мультымедыя',
'be-x-old': u'Мэдыя',
'bg': u'Медия',
'bm': u'Média',
'bn': [u'মিডিয়া', u'Média'],
'bpy': u'মিডিয়া',
'bs': [u'Mediji', u'Medija'],
'ce': u'Медйа',
'ceb': u'Medya',
'ckb': u'میدیا',
'crh': [u'Media', u'Медиа'],
'cs': u'Média',
'cu': u'Срѣ́дьства',
'cv': u'Медиа',
'dsb': u'Medija',
'el': [u'Μέσο', u'Μέσον'],
'et': u'Meedia',
'fa': u'مدیا',
'ff': u'Média',
'fiu-vro': u'Meediä',
'fo': u'Miðil',
'fr': u'Média',
'frp': u'Mèdia',
'ga': u'Meán',
'gan': u'Media',
'glk': u'مدیا',
'gu': u'દ્રશ્ય-શ્રાવ્ય (મિડિયા)',
'gv': u'Meanyn',
'haw': u'Pāpaho',
'he': u'מדיה',
'hi': u'मीडिया',
'hr': u'Mediji',
'ht': u'Medya',
'hu': u'Média',
'hy': u'Մեդիա',
'ia': u'Multimedia',
'is': u'Miðill',
'ja': u'メディア',
'ka': u'მედია',
'kaa': u'Media',
'kk': u'Таспа',
'km': u'មេឌា',
'kn': u'ಮೀಡಿಯ',
'ko': u'미디어',
'krc': u'Медиа',
'ksh': [u'Medie', u'Meedije'],
'ku': u'Medya',
'kv': u'Медиа',
'lbe': u'Медиа',
'ln': u'Média',
'lo': [u'ສື່', u'ສື່ອ'],
'lt': u'Medija',
'mdf': u'Медиа',
'mg': u'Rakitra',
'mhr': u'Медиа',
'mk': u'Медија',
'ml': u'മീഡിയ',
'mn': u'Медиа',
'mr': u'मिडिया',
'mt': u'Medja',
'myv': u'Медия',
'mzn': [u'مه‌دیا', u'مدیا'],
'nah': u'Mēdiatl',
'new': u'माध्यम',
'nn': u'Filpeikar',
'no': u'Medium',
'oc': u'Mèdia',
'pa': u'ਮੀਡੀਆ',
'pcd': u'Média',
'pnt': u'Μέσον',
'ps': u'رسنۍ',
'pt': u'Multimédia',
'qu': u'Midya',
'rmy': u'Mediya',
'ru': u'Медиа',
'sa': u'माध्यम',
'sah': u'Медиа',
'scn': u'Mèdia',
'sd': u'ذريعات',
'sg': u'Média',
'si': u'මාධ්‍යය',
'sk': u'Médiá',
'sl': u'Datoteka',
'sr': u'Медија',
'su': u'Média',
'sw': u'Faili',
'ta': u'ஊடகம்',
'te': u'మీడియా',
'tg': u'Медиа',
'th': u'สื่อ',
'tl': u'Midya',
'tlh': u'Doch',
'tr': u'Medya',
'tt': u'Медиа',
'ty': u'Média',
'udm': u'Медиа',
'uk': u'Медіа',
'ur': u'زریعہ',
'vi': u'Phương tiện',
'vo': u'Nünamakanäd',
'wo': u'Xibaarukaay',
'wuu': u'媒体',
'xal': u'Аһар',
'yi': u'מעדיע',
'yo': u'Amóhùnmáwòrán',
'za': u'媒体',
'zh': [u'Media', u'媒体', u'媒體'],
},
-1: {
'_default': u'Special',
'ab': u'Служебная',
'ace': u'Kusuih',
'af': u'Spesiaal',
'als': u'Spezial',
'am': u'ልዩ',
'an': u'Espezial',
'ang': u'Syndrig',
'ar': u'خاص',
'arc': u'ܕܝܠܢܝܐ',
'arz': u'خاص',
'as': [u'বিশেষ', u'विशेष'],
'ast': u'Especial',
'av': u'Служебная',
'ay': u'Especial',
'az': u'Xüsusi',
'ba': u'Ярҙамсы',
'bar': u'Spezial',
'bat-smg': u'Specēlos',
'bcl': u'Espesyal',
'be': u'Адмысловае',
'be-x-old': u'Спэцыяльныя',
'bg': u'Специални',
'bm': u'Spécial',
'bn': u'বিশেষ',
'bpy': u'বিশেষ',
'br': u'Dibar',
'bs': u'Posebno',
'bug': u'Istimewa',
'ca': u'Especial',
'cbk-zam': u'Especial',
'ce': u'Башхо',
'ceb': u'Espesyal',
'ch': u'Espesiat',
'ckb': u'تایبەت',
'crh': [u'Mahsus', u'Махсус'],
'cs': u'Speciální',
'csb': u'Specjalnô',
'cu': [u'Наро́чьна', u'Нарочьна'],
'cv': u'Ятарлă',
'cy': u'Arbennig',
'da': u'Speciel',
'de': u'Spezial',
'dsb': u'Specialne',
'dv': u'ހާއްޞަ',
'el': u'Ειδικό',
'eml': u'Speciale',
'eo': u'Speciala',
'es': u'Especial',
'et': u'Eri',
'eu': [u'Berezi', u'Aparteko'],
'fa': u'ویژه',
'ff': u'Spécial',
'fi': u'Toiminnot',
'fiu-vro': u'Tallituslehekülg',
'fo': [u'Serstakt', u'Serstakur'],
'fr': u'Spécial',
'frp': u'Spèciâl',
'fur': u'Speciâl',
'fy': u'Wiki',
'ga': u'Speisialta',
'gan': u'Special',
'gl': u'Especial',
'glk': u'ویژه',
'gn': u"Mba'echĩchĩ",
'gu': u'વિશેષ',
'gv': u'Er lheh',
'haw': u'Papa nui',
'he': u'מיוחד',
'hi': u'विशेष',
'hr': u'Posebno',
'hsb': u'Specialnje',
'ht': u'Espesyal',
'hu': u'Speciális',
'hy': u'Սպասարկող',
'id': u'Istimewa',
'io': u'Specala',
'is': u'Kerfissíða',
'it': u'Speciale',
'ja': u'特別',
'jv': u'Astamiwa',
'ka': u'სპეციალური',
'kaa': u'Arnawlı',
'kab': u'Uslig',
'kk': u'Арнайы',
'kl': [u'Immikkut', u'Speciel'],
'km': u'ពិសេស',
'kn': u'ವಿಶೇಷ',
'ko': u'특수기능',
'krc': u'Къуллукъ',
'ksh': [u'Spezial', u'Shpezjal'],
'ku': u'Taybet',
'kv': u'Служебная',
'kw': [u'Arbennek', u'Arbednek'],
'la': u'Specialis',
'lad': u'Especial',
'lb': u'Spezial',
'lbe': u'Къуллугъирал лажин',
'li': u'Speciaal',
'lij': [u'Speçiale', u'Speciale'],
'lmo': [u'Special', u'Speciale'],
'ln': u'Spécial',
'lo': u'ພິເສດ',
'lt': u'Specialus',
'map-bms': u'Astamiwa',
'mdf': u'Башка',
'mg': u'Manokana',
'mhr': [u'Лӱмын ыштыме', u'Служебная'],
'mk': u'Специјални',
'ml': u'പ്രത്യേകം',
'mn': u'Тусгай',
'mr': u'विशेष',
'ms': u'Khas',
'mt': [u'Speċjali', u'Specjali'],
'myv': u'Башка тевень',
'mzn': [u'شا', u'ویژه'],
'nah': [u'Nōncuahquīzqui', u'Especial'],
'nap': [u'Speciàle', u'Speciale'],
'nds': u'Spezial',
'nds-nl': u'Speciaal',
'new': u'विशेष',
'nl': u'Speciaal',
'nn': u'Spesial',
'no': u'Spesial',
'oc': u'Especial',
'os': u'Сæрмагонд',
'pa': u'ਖਾਸ',
'pcd': u'Spécial',
'pdc': u'Spezial',
'pl': u'Specjalna',
'pnt': u'Ειδικόν',
'ps': u'ځانګړی',
'pt': u'Especial',
'qu': u'Sapaq',
'rmy': u'Uzalutno',
'ru': u'Служебная',
'sa': u'विशेष',
'sah': u'Аналлаах',
'sc': u'Ispetziale',
'scn': u'Spiciali',
'sd': u'خاص',
'sg': u'Spécial',
'si': u'විශේෂ',
'sk': u'Špeciálne',
'sl': u'Posebno',
'sq': u'Speciale',
'sr': u'Посебно',
'srn': [u'Spesyal', u'Speciaal'],
'stq': u'Spezial',
'su': u'Husus',
'sw': u'Maalum',
'szl': u'Specjalna',
'ta': u'சிறப்பு',
'te': u'ప్రత్యేక',
'tet': u'Espesiál',
'tg': u'Вижа',
'th': u'พิเศษ',
'tk': u'Ýörite',
'tl': u'Natatangi',
'tlh': u"le'",
'tr': u'Özel',
'tt': [u'Махсус', u'Maxsus'],
'ty': u'Spécial',
'udm': u'Панель',
'uk': u'Спеціальна',
'ur': u'خاص',
'uz': u'Maxsus',
'vec': u'Speciale',
'vi': u'Đặc biệt',
'vls': u'Specioal',
'vo': u'Patikos',
'wa': u'Sipeciås',
'wo': u'Jagleel',
'wuu': u'特殊',
'xal': u'Көдлхнә',
'yi': u'באַזונדער',
'yo': u'Pàtàkì',
'za': u'特殊',
'zea': u'Speciaol',
'zh': [u'Special', u'特殊'],
},
0: {
'_default': None,
},
1: {
'_default': u'Talk',
'ab': u'Обсуждение',
'ace': u'Marit',
'af': u'Bespreking',
'als': u'Diskussion',
'am': u'ውይይት',
'an': u'Descusión',
'ang': u'Gesprec',
'ar': u'نقاش',
'arc': u'ܡܡܠܠܐ',
'arz': u'نقاش',
'as': [u'বার্তা', u'वार्ता'],
'ast': u'Alderique',
'av': u'Обсуждение',
'ay': u'Discusión',
'az': u'Müzakirə',
'ba': u'Фекер алышыу',
'bar': u'Diskussion',
'bat-smg': u'Aptarėms',
'bcl': u'Olay',
'be': u'Размовы',
'be-x-old': u'Абмеркаваньне',
'bg': u'Беседа',
'bm': u'Discussion',
'bn': u'আলাপ',
'bpy': u'য়্যারী',
'br': u'Kaozeal',
'bs': u'Razgovor',
'bug': u'Pembicaraan',
'ca': u'Discussió',
'cbk-zam': u'Discusión',
'ce': u'Дийца',
'ceb': u'Hisgot',
'ch': u'Kombetsasion',
'ckb': u'لێدوان',
'crh': [u'Muzakere', u'Музакере'],
'cs': u'Diskuse',
'csb': u'Diskùsëjô',
'cu': u'Бєсѣ́да',
'cv': u'Сӳтсе явасси',
'cy': u'Sgwrs',
'da': u'Diskussion',
'de': u'Diskussion',
'dsb': u'Diskusija',
'dv': u'ޚިޔާލު',
'el': u'Συζήτηση',
'eml': u'Discussione',
'eo': u'Diskuto',
'es': u'Discusión',
'et': u'Arutelu',
'eu': u'Eztabaida',
'fa': u'بحث',
'ff': u'Discussion',
'fi': u'Keskustelu',
'fiu-vro': u'Arotus',
'fo': u'Kjak',
'fr': u'Discussion',
'frp': u'Discussion',
'fur': u'Discussion',
'fy': u'Oerlis',
'ga': u'Plé',
'gan': u'Talk',
'gl': u'Conversa',
'glk': u'بحث',
'gn': u'Myangekõi',
'gu': u'ચર્ચા',
'gv': u'Resooney',
'haw': u'Kūkākūkā',
'he': u'שיחה',
'hi': u'वार्ता',
'hr': u'Razgovor',
'hsb': u'Diskusija',
'ht': u'Diskite',
'hu': u'Vita',
'hy': u'Քննարկում',
'ia': u'Discussion',
'id': [u'Pembicaraan', u'Bicara'],
'io': u'Debato',
'is': u'Spjall',
'it': u'Discussione',
'ja': u'ノート',
'jv': u'Dhiskusi',
'ka': u'განხილვა',
'kaa': u"Sa'wbet",
'kab': u'Mmeslay',
'kk': u'Талқылау',
'kl': [u'Oqallinneq', u'Diskussion'],
'km': u'ការពិភាក្សា',
'kn': u'ಚರ್ಚೆಪುಟ',
'ko': u'토론',
'krc': u'Сюзюу',
'ksh': u'Klaaf',
'ku': u'Nîqaş',
'kv': u'Обсуждение',
'kw': [u'Keskows', u'Kescows', u'Cows'],
'la': u'Disputatio',
'lad': u'Discusión',
'lb': u'Diskussioun',
'lbe': u'Ихтилат',
'li': u'Euverlèk',
'lij': [u'Discûscion', u'Discussione'],
'lmo': [u'Ciciarada', u'Discussione'],
'ln': u'Discussion',
'lo': u'ສົນທະນາ',
'lt': u'Aptarimas',
'lv': u'Diskusija',
'map-bms': u'Dhiskusi',
'mdf': u'Корхнема',
'mg': [u'Dinika', u'Discuter'],
'mhr': [u'Каҥашымаш', u'Обсуждение'],
'mk': u'Разговор',
'ml': u'സംവാദം',
'mn': u'Хэлэлцүүлэг',
'mr': u'चर्चा',
'ms': u'Perbincangan',
'mt': u'Diskussjoni',
'mwl': u'Cumbersa',
'myv': u'Кортамо',
'mzn': [u'گپ', u'بحث'],
'nah': [u'Tēixnāmiquiliztli', u'Discusión'],
'nap': [u'Chiàcchiera', u'Discussione'],
'nds': u'Diskuschoon',
'nds-nl': u'Overleg',
'new': u'खँलाबँला',
'nl': u'Overleg',
'nn': u'Diskusjon',
'no': u'Diskusjon',
'nv': u'Naaltsoos baa yáshtiʼ',
'oc': u'Discutir',
'os': u'Дискусси',
'pa': u'ਚਰਚਾ',
'pcd': u'Discussion',
'pdc': u'Diskussion',
'pl': u'Dyskusja',
'pms': u'Discussion',
'pnt': u'Καλάτσεμαν',
'ps': u'خبرې اترې',
'pt': u'Discussão',
'qu': u'Rimanakuy',
'rmy': [u'Vakyarimata', u'Discuţie'],
'ro': u'Discuţie',
'ru': u'Обсуждение',
'sa': u'संभाषणं',
'sah': u'Ырытыы',
'sc': u'Cuntierra',
'scn': u'Discussioni',
'sd': u'بحث',
'sg': u'Discussion',
'si': u'සාකච්ඡාව',
'sk': u'Diskusia',
'sl': u'Pogovor',
'sq': u'Diskutim',
'sr': u'Разговор',
'srn': [u'Taki', u'Overleg'],
'stq': u'Diskussion',
'su': u'Obrolan',
'sv': u'Diskussion',
'sw': u'Majadiliano',
'szl': u'Dyskusja',
'ta': u'பேச்சு',
'te': u'చర్చ',
'tet': u'Diskusaun',
'tg': u'Баҳс',
'th': u'พูดคุย',
'tk': u'Çekişme',
'tl': u'Usapan',
'tlh': u"ja'chuq",
'tr': u'Tartışma',
'tt': [u'Бәхәс', u'Фикер алышу', u'Bäxäs'],
'ty': u'Discussion',
'udm': u'Вераськон',
'uk': u'Обговорення',
'ur': u'تبادلۂ خیال',
'uz': u'Munozara',
'vec': u'Discussion',
'vi': u'Thảo luận',
'vls': u'Discuusje',
'vo': u'Bespik',
'wa': u'Copene',
'wo': [u'Waxtaan', u'Discuter'],
'wuu': u'讨论',
'xal': u'Меткән',
'yi': u'רעדן',
'yo': u'Ọ̀rọ̀',
'za': u'讨论',
'zea': u'Overleg',
'zh': [u'Talk', u'讨论', u'討論', u'对话', u'對話'],
},
2: {
'_default': u'User',
'ab': u'Участник',
'ace': u'Ureuëng Nguy',
'af': u'Gebruiker',
'als': u'Benutzer',
'am': u'አባል',
'an': u'Usuario',
'ar': u'مستخدم',
'arc': u'ܡܬܚܫܚܢܐ',
'arz': u'مستخدم',
'as': [u'সদস্য', u'सदस्य'],
'ast': u'Usuariu',
'av': u'Участник',
'ay': u'Usuario',
'az': u'İstifadəçi',
'ba': u'Ҡатнашыусы',
'bar': u'Benutzer',
'bat-smg': [u'Nauduotuos', u'Naudotojas'],
'bcl': u'Paragamit',
'be': u'Удзельнік',
'be-x-old': u'Удзельнік',
'bg': u'Потребител',
'bm': u'Utilisateur',
'bn': u'ব\u09cdযবহারকারী',
'bpy': u'আতাকুরা',
'br': u'Implijer',
'bs': u'Korisnik',
'bug': u'Pengguna',
'ca': u'Usuari',
'cbk-zam': u'Usuario',
'ce': u'Юзер',
'ceb': u'Gumagamit',
'ch': u'Muna\'sesetbi',
'ckb': u'بەکارھێنەر',
'crh': [u'Qullanıcı', u'Къулланыджы'],
'cs': u'Uživatel',
'csb': u'Brëkòwnik',
'cu': u'По́льꙃєватєл҄ь',
'cv': u'Хутшăнакан',
'cy': u'Defnyddiwr',
'da': u'Bruger',
'de': u'Benutzer',
'dsb': u'Wužywaŕ',
'dv': u'މެމްބަރު',
'el': u'Χρήστης',
'eml': u'Utente',
'eo': u'Vikipediisto',
'es': u'Usuario',
'et': u'Kasutaja',
'eu': u'Lankide',
'fa': u'کاربر',
'ff': u'Utilisateur',
'fi': u'Käyttäjä',
'fiu-vro': u'Pruukja',
'fo': u'Brúkari',
'fr': u'Utilisateur',
'frp': u'Utilisator',
'fur': u'Utent',
'fy': u'Meidogger',
'ga': u'Úsáideoir',
'gan': u'User',
'gl': u'Usuario',
'glk': u'کاربر',
'gn': u'Puruhára',
'gu': u'સભ્ય',
'gv': u'Ymmydeyr',
'haw': u'Mea hoʻohana',
'he': u'משתמש',
'hi': u'सदस्य',
'hr': u'Suradnik',
'hsb': u'Wužiwar',
'ht': u'Itilizatè',
'hu': u'Szerkesztő',
'hy': u'Մասնակից',
'ia': u'Usator',
'id': u'Pengguna',
'io': u'Uzanto',
'is': u'Notandi',
'it': u'Utente',
'ja': u'利用者',
'jv': u'Panganggo',
'ka': u'მომხმარებელი',
'kaa': u'Paydalanıwshı',
'kab': u'Amseqdac',
'kk': u'Қатысушы',
'kl': [u'Atuisoq', u'Bruger'],
'km': u'អ្នកប្រើប្រាស់',
'kn': u'ಸದಸ್ಯ',
'ko': u'사용자',
'krc': u'Къошулуучу',
'ksh': [u'Metmaacher', u'Medmaacher'],
'ku': u'Bikarhêner',
'kv': u'Участник',
'kw': u'Devnydhyer',
'la': u'Usor',
'lad': u'Usuario',
'lb': u'Benotzer',
'lbe': u'Гьуртту хьума',
'li': u'Gebroeker',
'lij': u'Utente',
'lmo': [u'Druvadur', u'Druvat', u'Utente'],
'ln': u'Utilisateur',
'lo': u'ຜູ້ໃຊ້',
'lt': u'Naudotojas',
'lv': u'Lietotājs',
'map-bms': u'Panganggo',
'mdf': u'Тиись',
'mg': [u'Mpikambana', u'Utilisateur'],
'mhr': [u'Пайдаланыше', u'Участник'],
'mk': u'Корисник',
'ml': u'ഉപയോക്താവ്',
'mn': u'Хэрэглэгч',
'mr': u'सदस्य',
'ms': u'Pengguna',
'mt': u'Utent',
'mwl': u'Outelizador',
'myv': u'Теиця',
'mzn': [u'کارور', u'کاربر'],
'nah': [u'Tlatequitiltilīlli', u'Usuario'],
'nap': u'Utente',
'nds': u'Bruker',
'nds-nl': u'Gebruker',
'new': u'छ्येलेमि',
'nl': u'Gebruiker',
'nn': u'Brukar',
'no': u'Bruker',
'nv': u'Choyoołʼįįhí',
'oc': u'Utilizaire',
'os': u'Архайæг',
'pa': u'ਮੈਂਬਰ',
'pcd': u'Utilisateur',
'pdc': u'Benutzer',
'pl': u'Użytkownik',
'pms': u'Utent',
'pnt': u'Χρήστες',
'ps': [u'کارن', u'کارونکی'],
'pt': u'Usuário',
'qu': u'Ruraq',
'rmy': [u'Jeno', u'Utilizator'],
'ro': u'Utilizator',
'ru': u'Участник',
'sa': u'योजकः',
'sah': u'Кыттааччы',
'sc': u'Usuàriu',
'scn': u'Utenti',
'sd': u'يوزر',
'sg': u'Utilisateur',
'sh': u'Korisnik',
'si': u'පරිශීලක',
'sk': u'Redaktor',
'sl': u'Uporabnik',
'sq': u'Përdoruesi',
'sr': u'Корисник',
'srn': [u'Masyin', u'Gebruiker'],
'stq': u'Benutser',
'su': u'Pamaké',
'sv': u'Användare',
'sw': u'Mtumiaji',
'szl': u'Użytkownik',
'ta': u'பயனர்',
'te': [u'వాడుకరి', u'సభ్యులు', u'సభ్యుడు'],
'tet': u'Uza-na\'in',
'tg': u'Корбар',
'th': u'ผู้ใช' + u'\u0e49',
'tk': u'Ulanyjy',
'tl': u'Tagagamit',
'tlh': u"lo'wI'",
'tr': u'Kullanıcı',
'tt': [u'Кулланучы', u'Äğzä'],
'ty': u'Utilisateur',
'udm': u'Викиавтор',
'uk': u'Користувач',
'ur': u'صارف',
'uz': u'Foydalanuvchi',
'vec': u'Utente',
'vi': u'Thành viên',
'vls': u'Gebruker',
'vo': u'Geban',
'wa': u'Uzeu',
'wo': [u'Jëfandikukat', u'Utilisateur'],
'wuu': u'用户',
'xal': u'Демнч',
'yi': u'באַניצער',
'yo': u'Oníṣe',
'za': u'用户',
'zea': u'Gebruker',
'zh': [u'User', u'用户', u'用戶'],
},
3: {
'_default': u'User talk',
'ab': u'Обсуждение участника',
'ace': u'Marit Ureuëng Nguy',
'af': u'Gebruikerbespreking',
'als': u'Benutzer Diskussion',
'am': u'አባል ውይይት',
'an': u'Descusión usuario',
'ar': u'نقاش المستخدم',
'arc': u'ܡܡܠܠܐ ܕܡܬܚܫܚܢܐ',
'arz': u'نقاش المستخدم',
'as': [u'সদস্য বার্তা', u'सदस्य वार्ता'],
'ast': u'Usuariu alderique',
'av': u'Обсуждение участника',
'ay': u'Usuario Discusión',
'az': u'İstifadəçi müzakirəsi',
'ba': u'Ҡатнашыусы м-н фекер алышыу',
'bar': u'Benutzer Diskussion',
'bat-smg': u'Nauduotuojė aptarėms',
'bcl': u'Olay kan paragamit',
'be': u'Размовы з удзельнікам',
'be-x-old': u'Гутаркі ўдзельніка',
'bg': u'Потребител беседа',
'bm': u'Discussion utilisateur',
'bn': u'ব্যবহারকারী আলাপ',
'bpy': u'আতাকুরার য়্যারী',
'br': u'Kaozeadenn Implijer',
'bs': u'Razgovor sa korisnikom',
'bug': u'Pembicaraan Pengguna',
'ca': u'Usuari Discussió',
'cbk-zam': u'Usuario Discusión',
'ce': u'Юзери дийца',
'ceb': u'Hisgot sa Gumagamit',
'ch': u'Kombetsasion ni muna\'sesetbi',
'ckb': u'لێدوانی بەکارھێنەر',
'crh': [u'Qullanıcı muzakeresi', u'Къулланыджы музакереси'],
'cs': u'Uživatel diskuse',
'csb': u'Diskùsëjô brëkòwnika',
'cu': u'По́льꙃєватєлꙗ бєсѣ́да',
'cv': u'Хутшăнаканăн канашлу страници',
'cy': u'Sgwrs Defnyddiwr',
'da': u'Brugerdiskussion',
'de': u'Benutzer Diskussion',
'dsb': u'Diskusija wužywarja',
'el': u'Συζήτηση χρήστη',
'eml': u'Discussioni utente',
'eo': u'Vikipediista diskuto',
'es': u'Usuario Discusión',
'et': u'Kasutaja arutelu',
'eu': u'Lankide eztabaida',
'fa': u'بحث کاربر',
'ff': u'Discussion utilisateur',
'fi': u'Keskustelu käyttäjästä',
'fiu-vro': u'Pruukja arotus',
'fo': [u'Brúkarakjak', u'Brúkari kjak'],
'fr': u'Discussion utilisateur',
'frp': u'Discussion utilisator',
'fur': u'Discussion utent',
'fy': u'Meidogger oerlis',
'ga': u'Plé úsáideora',
'gan': u'User talk',
'gl': [u'Conversa usuario', u'Conversa Usuario'],
'glk': u'بحث کاربر',
'gn': u'Puruhára myangekõi',
'gu': u'સભ્યની ચર્ચા',
'gv': u'Resooney ymmydeyr',
'haw': u'Kūkākūkā o mea hoʻohana',
'he': u'שיחת משתמש',
'hi': u'सदस्य वार्ता',
'hr': u'Razgovor sa suradnikom',
'hsb': u'Diskusija z wužiwarjom',
'ht': u'Diskisyon Itilizatè',
'hu': u'Szerkesztővita',
'hy': u'Մասնակցի քննարկում',
'ia': u'Discussion Usator',
'id': u'Pembicaraan Pengguna',
'io': u'Uzanto Debato',
'is': u'Notandaspjall',
'it': u'Discussioni utente',
'ja': u'利用者‐会話',
'jv': u'Dhiskusi Panganggo',
'ka': [u'მომხმარებლის განხილვა', u'მომხმარებელი განხილვა'],
'kaa': u"Paydalanıwshı sa'wbeti",
'kab': u'Amyannan umsqedac',
'kk': u'Қатысушы талқылауы',
'kl': [u'Atuisup oqalliffia', u'Brugerdiskussion'],
'km': u'ការពិភាក្សារបស់អ្នកប្រើប្រាស់',
'kn': u'ಸದಸ್ಯರ ಚರ್ಚೆಪುಟ',
'ko': u'사용자토론',
'krc': u'Къошулуучуну сюзюу',
'ksh': [u'Metmaacher Klaaf', u'Medmaacher Klaaf'],
'ku': u'Bikarhêner nîqaş',
'kv': u'Обсуждение участника',
'kw': [u'Keskows Devnydhyer', u'Kescows Devnydhyer', u'Cows Devnydhyer'],
'la': u'Disputatio Usoris',
'lad': u'Usuario Discusión',
'lb': u'Benotzer Diskussioun',
'lbe': u'Гьуртту хьуминнал ихтилат',
'li': u'Euverlèk gebroeker',
'lij': [u'Discûscioîn ûtente', u'Discussioni utente'],
'lmo': [u'Ciciarada Druvadur', u'Ciciarada Druvat', u'Discussioni utente'],
'ln': u'Discussion utilisateur',
'lo': u'ສົນທະນາຂອງຜູ້ໃຊ້',
'lt': u'Naudotojo aptarimas',
'lv': u'Lietotāja diskusija',
'map-bms': u'Dhiskusi Panganggo',
'mdf': u'Тиись корхнема',
'mg': [u'Dinika amin\'ny mpikambana', u'Discussion Utilisateur'],
'mhr': [u'Пайдаланышын каҥашымаш', u'Обсуждение участника'],
'mk': u'Разговор со корисник',
'ml': u'ഉപയോക്താവിന്റെ സംവാദം',
'mn': u'Хэрэглэгчийн яриа',
'mr': u'सदस्य चर्चा',
'ms': u'Perbincangan Pengguna',
'mt': u'Diskussjoni utent',
'mwl': u'Cumbersa outelizador',
'myv': u'Теицянь кортамось',
'mzn': [u'کارور گپ', u'بحث کاربر'],
'nah': [u'Tlatequitiltilīlli tēixnāmiquiliztli', u'Usuario Discusión'],
'nap': [u'Utente chiàcchiera', u'Discussioni utente'],
'nds': u'Bruker Diskuschoon',
'nds-nl': u'Overleg gebruker',
'new': u'छ्येलेमि खँलाबँला',
'nl': u'Overleg gebruiker',
'nn': u'Brukardiskusjon',
'no': u'Brukerdiskusjon',
'nv': u'Choyoołʼįįhí bichʼįʼ yáshtiʼ',
'oc': u'Discussion Utilizaire',
'os': u'Архайæджы дискусси',
'pa': u'ਮੈਂਬਰ ਚਰਚਾ',
'pcd': u'Discussion utilisateur',
'pdc': u'Benutzer Diskussion',
'pl': u'Dyskusja użytkownika',
'pms': u'Ciaciarade',
'pnt': u'Καλάτσεμαν χρήστε',
'ps': [u'د کارن خبرې اترې', u'د کارونکي خبرې اترې'],
'pt': u'Usuário Discussão',
'qu': u'Ruraq rimanakuy',
'rmy': [u'Jeno vakyarimata', u'Discuţie Utilizator'],
'ro': u'Discuţie Utilizator',
'ru': u'Обсуждение участника',
'sa': u'योजकसंभाषणं',
'sah': u'Кыттааччы ырытыыта',
'sc': u'Cuntierra usuàriu',
'scn': u'Discussioni utenti',
'sd': u'يوزر بحث',
'sg': u'Discussion utilisateur',
'sh': u'Razgovor sa korisnikom',
'si': u'පරිශීලක සාකච්ඡාව',
'sk': u'Diskusia s redaktorom',
'sl': u'Uporabniški pogovor',
'sq': u'Përdoruesi diskutim',
'sr': u'Разговор са корисником',
'srn': [u'Taki fu masyin', u'Overleg gebruiker'],
'stq': u'Benutser Diskussion',
'su': u'Obrolan pamaké',
'sv': u'Användardiskussion',
'sw': u'Majadiliano ya mtumiaji',
'szl': u'Dyskusja użytkownika',
'ta': u'பயனர் பேச்சு',
'te': [u'వాడుకరి చర్చ', u'సభ్యులపై చర్చ'],
'tet': u'Diskusaun Uza-na\'in',
'tg': u'Баҳси корбар',
'th': u'คุยกับผู้ใช้',
'tk': u'Ulanyjy çekişme',
'tl': u'Usapang tagagamit',
'tlh': u"lo'wI' ja'chuq",
'tr': u'Kullanıcı mesaj',
'tt': [u'Кулланучы бәхәсе', u'Äğzä bäxäse'],
'ty': u'Discussion utilisateur',
'udm': u'Викиавтор сярысь вераськон',
'uk': u'Обговорення користувача',
'ur': u'تبادلۂ خیال صارف',
'uz': u'Foydalanuvchi munozarasi',
'vec': u'Discussion utente',
'vi': u'Thảo luận Thành viên',
'vls': u'Discuusje gebruker',
'vo': u'Gebanibespik',
'wa': u'Uzeu copene',
'wo': [u'Waxtaani jëfandikukat', u'Discussion Utilisateur'],
'wuu': u'用户讨论',
'xal': u'Демнчна туск меткән',
'yi': u'באַניצער רעדן',
'yo': u'Ọ̀rọ̀ oníṣe',
'za': u'用户讨论',
'zea': u'Overleg gebruker',
'zh': [u'User talk', u'用户讨论', u'用户对话', u'用戶討論', u'用戶對話'],
},
4: {
'_default': u'Project',
'arc': u'ܘܝܩܝܦܕܝܐ',
'bn': u'উইকিপিডিয়া',
'mwl': u'Biquipédia',
'nah': u'Huiquipedia',
'tk': u'Wikipediýa',
'tt': u'Википедия',
},
5: {
'_default': u'Project talk',
'ace': u'Marit Wikipedia',
'arc': [u'ܡܡܠܠܐ ܕ ܘܝܩܝܦܕܝܐ', u'ܘܝܩܝܦܕܝܐ talk'],
'bn': u'উইকিপিডিয়া আলোচনা',
'ckb': u'لێدوانی Wikipedia',
'kl': u'Wikipedia-p oqalliffia',
'krc': u'Википедия сюзюу',
'kw': [u'Kescows Wikipedia', u'Cows Wikipedia'],
'lmo': u'Wikipedia Ciciarada',
'mhr': u'Wikipediaын каҥашымаш',
'mwl': u'Biquipédia cumbersa',
'mzn': u'Wikipedia گپ',
'nah': u'Huiquipedia tēixnāmiquiliztli',
'nv': u'Wikiibíídiiya baa yáshtiʼ',
'sw': u'Majadiliano ya Wikipedia',
'tk': u'Wikipediýa çekişme',
'tt': u'Википедия бәхәсе',
'xal': u'Wikipedia туск меткән',
},
6: {
'_default': [u'File', u'Image'],
'ab': [u'Файл', u'Изображение'],
'ace': u'Beureukaih',
'af': [u'Lêer', u'Beeld'],
'als': [u'Datei', u'Bild'],
'am': u'ስዕል',
'an': u'Imachen',
'ang': u'Biliþ',
'ar': [u'ملف', u'صورة'],
'arc': u'ܠܦܦܐ',
'arz': [u'ملف', u'صورة'],
'as': [u'চিত্র', u'चित्र'],
'ast': [u'Archivu', u'Imaxe'],
'av': [u'Файл', u'Изображение'],
'ay': [u'Archivo', u'Imagen'],
'az': u'Şəkil',
'ba': u'Рәсем',
'bar': [u'Datei', u'Bild'],
'bat-smg': u'Abruozdielis',
'bcl': u'Ladawan',
'be': u'Выява',
'be-x-old': [u'Файл', u'Выява'],
'bg': [u'Файл', u'Картинка'],
'bm': u'Fichier',
'bn': u'চিত্র',
'bpy': u'ছবি',
'br': u'Skeudenn',
'bs': [u'Datoteka', u'Slika'],
'bug': u'Berkas',
'ca': [u'Fitxer', u'Imatge'],
'cbk-zam': [u'Archivo', u'Imagen'],
'cbs': u'Òbrôzk',
'ce': u'Сурт',
'ceb': [u'Payl', u'Imahen'],
'ch': u'Litratu',
'ckb': u'پەڕگە',
'crh': [u'Fayl', u'Resim', u'Ресим'],
'cs': u'Soubor',
'csb': u'Òbrôzk',
'cu': [u'Дѣ́ло', u'Ви́дъ'],
'cv': u'Ӳкерчĕк',
'cy': u'Delwedd',
'da': [u'Fil', u'Billede'],
'de': [u'Datei', u'Bild'],
'dsb': [u'Dataja', u'Wobraz'],
'dv': u'ފައިލް',
'el': [u'Αρχείο', u'Εικόνα'],
'eml': [u'File', u'Immagine'],
'eo': u'Dosiero',
'es': [u'Archivo', u'Imagen'],
'et': u'Pilt',
'eu': [u'Fitxategi', u'Irudi'],
'fa': [u'پرونده', u'تصویر'],
'ff': u'Fichier',
'fi': [u'Tiedosto', u'Kuva'],
'fiu-vro': u'Pilt',
'fo': u'Mynd',
'fr': u'Fichier',
'frp': u'Fichiér',
'fur': u'Figure',
'fy': u'Ofbyld',
'ga': u'Íomhá',
'gan': u'File',
'gl': [u'Ficheiro', u'Imaxe'],
'glk': [u'پرونده', u'تصویر'],
'gn': u"Ta'ãnga",
'gu': u'ચિત્ર',
'gv': u'Coadan',
'haw': [u'Waihona', u'Kiʻi'],
'he': [u'קובץ', u'תמונה'],
'hi': u'चित्र',
'hr': [u'Datoteka', u'Slika'],
'hsb': [u'Dataja', u'Wobraz'],
'ht': u'Imaj',
'hu': [u'Fájl', u'Kép'],
'hy': u'Պատկեր',
'ia': [u'File', u'Imagine'],
'id': [u'Berkas', u'Gambar'],
'io': u'Arkivo',
'is': u'Mynd',
'it': [u'File', u'Immagine'],
'ja': [u'ファイル', u'画像'],
'jv': u'Gambar',
'ka': [u'ფაილი', u'სურათი'],
'kaa': u"Su'wret",
'kab': u'Tugna',
'kk': u'Сурет',
'kl': [u'Fiileq', u'Fil'],
'km': [u'ឯកសារ', u'រូបភាព'],
'kn': u'ಚಿತ್ರ',
'ko': [u'파일', u'그림'],
'krc': u'Файл',
'ksh': [u'Datei', u'Beld', u'Belld'],
'ku': u'Wêne',
'kv': [u'Файл', u'Изображение'],
'kw': u'Restren',
'la': [u'Fasciculus', u'Imago'],
'lad': [u'Archivo', u'Imagen'],
'lb': [u'Fichier', u'Bild'],
'lbe': u'Сурат',
'li': u'Plaetje',
'lij': [u'Immaggine', u'Immagine'],
'lmo': [u'Archivi', u'Immagine'],
'ln': u'Fichier',
'lo': u'ຮູບ',
'lt': u'Vaizdas',
'lv': u'Attēls',
'map-bms': u'Gambar',
'mdf': u'Няйф',
'mg': u'Sary',
'mhr': u'Файл',
'mk': [u'Податотека', u'Слика'],
'ml': u'പ്രമാണം',
'mn': u'Зураг',
'mr': u'चित्र',
'ms': [u'Fail', u'Imej'],
'mt': u'Stampa',
'mwl': u'Fexeiro',
'myv': u'Артовкс',
'mzn': [u'پرونده', u'تصویر'],
'nah': [u'Īxiptli', u'Imagen'],
'nap': [u'Fiùra', u'Immagine'],
'nds': u'Bild',
'nds-nl': u'Ofbeelding',
'new': u'किपा',
'nl': [u'Bestand', u'Afbeelding'],
'nn': u'Fil',
'no': [u'Fil', u'Bilde'],
'nv': u'Eʼelyaaígíí',
'oc': u'Fichièr',
'os': u'Ныв',
'pa': u'ਤਸਵੀਰ',
'pcd': u'Fichier',
'pdc': [u'Datei', u'Bild'],
'pl': [u'Plik', u'Grafika'],
'pms': u'Figura',
'pnt': u'Αρχείον',
'ps': u'دوتنه',
'pt': [u'Ficheiro', u'Imagem'],
'qu': u'Rikcha',
'rmy': [u'Chitro', u'Imagine'],
'ro': [u'Fişier', u'Imagine'],
'ru': [u'Файл', u'Изображение'],
'sa': u'चित्रं',
'sah': [u'Билэ', u'Ойуу'],
'sc': u'File',
'scn': [u'File', u'Mmàggini'],
'sd': u'عڪس',
'sg': u'Fichier',
'sh': u'Datoteka',
'si': [u'ගොනුව', u'රූපය'],
'sk': [u'Súbor', u'Obrázok'],
'sl': u'Slika',
'sq': [u'Skeda', u'Figura'],
'sr': u'Слика',
'srn': [u'Gefre', u'Afbeelding'],
'stq': u'Bielde',
'su': u'Gambar',
'sv': [u'Fil', u'Bild'],
'sw': u'Picha',
'szl': [u'Plik', u'Grafika'],
'ta': u'படிமம்',
'te': [u'దస్త్రం', u'ఫైలు', u'బొమ్మ'],
'tet': u'Imajen',
'tg': u'Акс',
'th': [u'ไฟล์', u'ภาพ'],
'tk': u'Faýl',
'tl': u'Talaksan',
'tlh': u'nagh beQ',
'tr': [u'Dosya', u'Resim'],
'tt': [u'Файл', u'Рәсем', u'Räsem'],
'ty': u'Fichier',
'udm': u'Суред',
'uk': [u'Файл', u'Зображення'],
'ur': u'تصویر',
'uz': u'Tasvir',
'vec': [u'File', u'Imagine'],
'vi': [u'Tập tin', u'Hình'],
'vls': u'Ofbeeldienge',
'vo': [u'Ragiv', u'Magod'],
'wa': u'Imådje',
'wo': [u'Dencukaay'],
'wuu': u'文件',
'xal': u'Боомг',
'yi': [u'טעקע', u'בילד'],
'yo': u'Fáìlì',
'za': u'文件',
'zea': [u'Plaetje', u'File', u'Image', u'文件', u'图像', u'圖像'],
},
7: {
'_default': [u'File talk', u'Image talk'],
'ab': [u'Обсуждение файла', u'Обсуждение изображения'],
'ace': u'Marit Beureukaih',
'af': [u'Lêerbespreking', u'Beeldbespreking'],
'als': [u'Datei Diskussion', u'Bild Diskussion'],
'am': u'ስዕል ውይይት',
'an': u'Descusión imachen',
'ang': u'Biliþgesprec',
'ar': [u'نقاش الملف', u'نقاش الصورة'],
'arc': u'ܡܡܠܠܐ ܕܠܦܦܐ',
'arz': [u'نقاش الملف', u'نقاش الصورة'],
'as': [u'চিত্র বার্তা', u'चित्र वार्ता'],
'ast': [u'Archivu alderique', u'Imaxe alderique'],
'av': [u'Обсуждение файла', u'Обсуждение изображения'],
'ay': [u'Archivo Discusión', u'Imagen Discusión'],
'az': u'Şəkil müzakirəsi',
'ba': u'Рәсем б-са фекер алышыу',
'bar': [u'Datei Diskussion', u'Bild Diskussion'],
'bat-smg': u'Abruozdielė aptarėms',
'bcl': u'Olay sa ladawan',
'be': u'Размовы пра выяву',
'be-x-old': [u'Абмеркаваньне файла', u'Абмеркаваньне выявы'],
'bg': [u'Файл беседа', u'Картинка беседа'],
'bm': [u'Discussion fichier', u'Discussion Image'],
'bn': [u'চিত্র আলোচনা', u'চিত্র আলাপ'],
'bpy': u'ছবি য়্যারী',
'br': u'Kaozeadenn Skeudenn',
'bs': [u'Razgovor o datoteci', u'Razgovor o slici'],
'bug': u'Pembicaraan Berkas',
'ca': [u'Fitxer Discussió', u'Imatge Discussió'],
'cbk-zam': [u'Archivo Discusión', u'Imagen Discusión'],
'ce': u'Сурти дийца',
'ceb': [u'Hisgot sa Payl', u'Hisgot sa Imahen'],
'ch': u'Kombetsasion ni litratu',
'ckb': u'لێدوانی پەڕگە',
'crh': [u'Fayl muzakeresi', u'Resim muzakeresi', u'Ресим музакереси'],
'cs': u'Soubor diskuse',
'csb': u'Diskùsëjô òbrôzków',
'cu': [u'Дѣ́ла бєсѣ́да', u'Ви́да бєсѣ́да'],
'cv': u'Ӳкерчĕке сӳтсе явмалли',
'cy': u'Sgwrs Delwedd',
'da': [u'Fildiskussion', u'Billeddiskussion'],
'de': [u'Datei Diskussion', u'Bild Diskussion'],
'dsb': [u'Diskusija wó dataji', u'Diskusija wó wobrazu'],
'dv': u'ފައިލް ޚިޔާލު',
'el': [u'Συζήτηση αρχείου', u'Συζήτηση εικόνας'],
'eml': [u'Discussioni file', u'Discussioni immagine'],
'eo': u'Dosiera diskuto',
'es': [u'Archivo Discusión', u'Imagen Discusión'],
'et': u'Pildi arutelu',
'eu': [u'Fitxategi eztabaida', u'Irudi eztabaida'],
'fa': [u'بحث پرونده', u'بحث تصویر'],
'ff': [u'Discussion fichier', u'Discussion Image'],
'fi': [u'Keskustelu tiedostosta', u'Keskustelu kuvasta'],
'fiu-vro': u'Pildi arotus',
'fo': [u'Myndakjak', u'Mynd kjak'],
'fr': [u'Discussion fichier', u'Discussion Image'],
'frp': u'Discussion fichiér',
'fur': u'Discussion figure',
'fy': u'Ofbyld oerlis',
'ga': u'Plé íomhá',
'gan': u'File talk',
'gl': [u'Conversa ficheiro', u'Conversa imaxe', u'Conversa Imaxe'],
'glk': [u'بحث پرونده', u'بحث تصویر'],
'gn': u"Ta'ãnga myangekõi",
'gu': u'ચિત્રની ચર્ચા',
'gv': u'Resooney coadan',
'haw': u'Kūkākūkā o waihona',
'he': [u'שיחת קובץ', u'שיחת תמונה'],
'hi': u'चित्र वार्ता',
'hr': [u'Razgovor o datoteci', u'Razgovor o slici'],
'hsb': [u'Diskusija k dataji', u'Diskusija k wobrazej'],
'ht': u'Diskisyon Imaj',
'hu': [u'Fájlvita', u'Képvita'],
'hy': u'Պատկերի քննարկում',
'ia': [u'Discussion File', u'Discussion Imagine'],
'id': [u'Pembicaraan Berkas', u'Pembicaraan Gambar'],
'io': u'Arkivo Debato',
'is': u'Myndaspjall',
'it': [u'Discussioni file', u'Discussioni immagine'],
'ja': [u'ファイル‐ノート', u'画像‐ノート'],
'jv': u'Dhiskusi Gambar',
'ka': [u'ფაილის განხილვა', u'სურათი განხილვა'],
'kaa': u"Su'wret sa'wbeti",
'kab': u'Amyannan n tugna',
'kk': u'Сурет талқылауы',
'kl': [u'Fiilip oqalliffia', u'Fildiskussion'],
'km': [u'ការពិភាក្សាអំពីឯកសារ', u'ការពិភាក្សាអំពីរូបភាព'],
'kn': u'ಚಿತ್ರ ಚರ್ಚೆಪುಟ',
'ko': [u'파일토론', u'그림토론'],
'krc': u'Файлны сюзюу',
'ksh': [u'Dateie Klaaf', u'Belder Klaaf', u'Bellder Klaaf'],
'ku': u'Wêne nîqaş',
'kv': [u'Обсуждение файла', u'Обсуждение изображения'],
'kw': [u'Keskows Restren', u'Kescows Restren', u'Cows Restren'],
'la': [u'Disputatio Fasciculi', u'Disputatio Imaginis'],
'lad': [u'Archivo Discusión', u'Imagen Discusión'],
'lb': [u'Fichier Diskussioun', u'Bild Diskussioun'],
'lbe': u'Суратраясса ихтилат',
'li': u'Euverlèk plaetje',
'lij': [u'Discûscioîn immaggine', u'Discussioni immagine'],
'lmo': [u'Ciciarada Archivi', u'Discussioni immagine'],
'ln': [u'Discussion fichier', u'Discussion Image'],
'lo': u'ສົນທະນາກ່ຽວກັບຮູບ',
'lt': u'Vaizdo aptarimas',
'lv': u'Attēla diskusija',
'map-bms': u'Dhiskusi Gambar',
'mdf': u'Няйф корхнема',
'mg': [u'Dinika amin\'ny sary', u'Discussion Image'],
'mhr': [u'Файлын каҥашымаш', u'Обсуждение файла'],
'mk': [u'Разговор за податотека', u'Разговор за слика'],
'ml': u'പ്രമാണത്തിന്റെ സംവാദം',
'mn': u'Зургийн хэлэлцүүлэг',
'mr': u'चित्र चर्चा',
'ms': [u'Perbincangan Fail', u'Perbincangan Imej'],
'mt': u'Diskussjoni stampa',
'mwl': u'Cumbersa fexeiro',
'myv': u'Артовксто кортамось',
'mzn': [u'پرونده گپ', u'بحث تصویر'],
'nah': [u'Īxiptli tēixnāmiquiliztli', u'Imagen Discusión'],
'nap': [u'Fiùra chiàcchiera', u'Discussioni immagine'],
'nds': u'Bild Diskuschoon',
'nds-nl': u'Overleg ofbeelding',
'new': u'किपा खँलाबँला',
'nl': [u'Overleg bestand', u'Overleg afbeelding'],
'nn': u'Fildiskusjon',
'no': [u'Fildiskusjon', u'Bildediskusjon'],
'nv': u'Eʼelyaaígíí baa yáshtiʼ',
'oc': u'Discussion Fichièr',
'os': u'Нывы тыххæй дискусси',
'pa': u'ਤਸਵੀਰ ਚਰਚਾ',
'pcd': u'Discussion fichier',
'pdc': [u'Datei Diskussion', u'Bild Diskussion'],
'pl': [u'Dyskusja pliku', u'Dyskusja grafiki'],
'pms': u'Discussion dla figura',
'pnt': u'Καλάτσεμαν αρχείονος',
'ps': u'د دوتنې خبرې اترې',
'pt': [u'Ficheiro Discussão', u'Imagem Discussão'],
'qu': u'Rikcha rimanakuy',
'rmy': [u'Chitro vakyarimata', u'Discuţie Imagine'],
'ro': [u'Discuţie Fişier', u'Discutie Fisier', u'Discuţie Fisier', u'Discuţie Imagine'],
'ru': [u'Обсуждение файла', u'Обсуждение изображения'],
'sa': u'चित्रसंभाषणं',
'sah': [u'Билэ ырытыыта', u'Ойуу ырытыыта'],
'sc': u'Cuntierra file',
'scn': [u'Discussioni file', u'Discussioni mmàggini'],
'sd': u'عڪس بحث',
'sg': u'Discussion fichier',
'sh': u'Razgovor o datoteci',
'si': [u'ගොනුව සාකච්ඡාව', u'රූපය සාකච්ඡාව'],
'sk': [u'Diskusia k súboru', u'Diskusia k obrázku'],
'sl': u'Pogovor o sliki',
'sq': [u'Skeda diskutim', u'Figura diskutim'],
'sr': u'Разговор о слици',
'srn': [u'Taki fu gefre', u'Overleg afbeelding'],
'stq': u'Bielde Diskussion',
'su': u'Obrolan gambar',
'sv': [u'Fildiskussion', u'Bilddiskussion'],
'sw': u'Majadiliano ya faili',
'szl': [u'Dyskusja pliku', u'Dyskusja grafiki'],
'ta': [u'படிமப் பேச்சு', u'உருவப் பேச்சு'],
'te': [u'దస్త్రంపై చర్చ', u'ఫైలుపై చర్చ', u'బొమ్మపై చర్చ'],
'tet': u'Diskusaun Imajen',
'tg': u'Баҳси акс',
'th': [u'คุยเรื่องไฟล์', u'คุยเรื่องภาพ'],
'tk': u'Faýl çekişme',
'tl': u'Usapang talaksan',
'tlh': u"nagh beQ ja'chuq",
'tr': [u'Dosya tartışma', u'Resim tartışma'],
'tt': [u'Файл бәхәсе', u'Рәсем бәхәсе', u'Räsem bäxäse'],
'ty': [u'Discussion fichier', u'Discussion Image'],
'udm': u'Суред сярысь вераськон',
'uk': [u'Обговорення файлу', u'Обговорення зображення'],
'ur': u'تبادلۂ خیال تصویر',
'uz': u'Tasvir munozarasi',
'vec': [u'Discussion file', u'Discussion imagine'],
'vi': [u'Thảo luận Tập tin', u'Thảo luận Hình'],
'vls': u'Discuusje ofbeeldienge',
'vo': [u'Ragivibespik', u'Magodibespik'],
'wa': u'Imådje copene',
'wo': [u'Waxtaani dencukaay'],
'wuu': u'文件讨论',
'xal': u'Боомгин туск меткән',
'yi': [u'טעקע רעדן', u'בילד רעדן'],
'yo': u'Ọ̀rọ̀ fáìlì',
'za': u'文件讨论',
'zea': u'Overleg plaetje',
'zh': [u'File talk', u'Image talk', u'文件讨论', u'图像讨论', u'文件对话', u'图像对话', u'文件討論', u'圖像討論', u'文件對話', u'圖像對話'],
},
8: {
'_default': u'MediaWiki',
'ace': u'AlatWiki',
'am': u'መልዕክት',
'ar': u'ميدياويكي',
'arc': u'ܡܝܕܝܐܘܝܩܝ',
'arz': [u'ميدياويكى', u'ميدياويكي'],
'az': u'MediyaViki',
'bcl': u'MediaWiki',
'bg': u'МедияУики',
'bn': u'মিডিয়াউইকি',
'bpy': u'মিডিয়াউইকি',
'bs': [u'MediaWiki', u'MedijaViki'],
'ce': u'МедйаВики',
'crh': [u'MediaViki', u'МедиаВики'],
'cy': u'MediaWici',
'dv': u'މީޑިއާވިކީ',
'fa': u'مدیاویکی',
'fi': u'Järjestelmäviesti',
'fo': [u'MediaWiki', u'MidiaWiki'],
'glk': u'مدیاویکی',
'gu': u'મીડિયાવિકિ',
'he': u'מדיה ויקי',
'hi': u'मीडियाविकि',
'ht': u'MedyaWiki',
'is': u'Melding',
'ka': u'მედიავიკი',
'kk': u'МедиаУики',
'km': u'មេឌាវិគី',
'kn': u'ಮೀಡಿಯವಿಕಿ',
'ko': u'미디어위키',
'ksh': [u'MediaWiki', u'MedijaWikki'],
'lo': u'ມີເດຍວິກິ',
'mdf': u'МедиаВики',
'mk': u'МедијаВики',
'ml': u'മീഡിയവിക്കി',
'mn': u'МедиаВики',
'mr': u'मिडियाविकी',
'mwl': u'Biqui',
'mzn': [u'مه‌دیاویکی', u'مه‌دیا ویکی', u'مدیاویکی'],
'nah': u'Huiquimedia',
'new': u'मिडियाविकि',
'pa': u'ਮੀਡੀਆਵਿਕਿ',
'ps': u'ميډياويکي',
'rmy': u'MediyaViki',
'sa': u'मिडीयाविकी',
'sd': u'ذريعات وڪي',
'si': [u'මාධ්‍යවිකි', u'විකිමාධ්‍ය'],
'sr': u'МедијаВики',
'su': [u'MédiaWiki'],
'ta': u'மீடியாவிக்கி',
'te': u'మీడియావికీ',
'tg': u'Медиавики',
'th': u'มีเดียวิกิ',
'tr': u'MediaWiki',
'tt': u'МедиаВики',
'ur': u'میڈیاوکی',
'vo': u'Sitanuns',
'yi': u'מעדיעװיקי',
},
9: {
'_default': u'MediaWiki talk',
'ab': u'Обсуждение MediaWiki',
'ace': u'Marit AlatWiki',
'af': u'MediaWikibespreking',
'als': u'MediaWiki Diskussion',
'am': u'መልዕክት ውይይት',
'an': u'Descusión MediaWiki',
'ar': u'نقاش ميدياويكي',
'arc': u'ܡܡܠܠܐ ܕܡܝܕܝܐܘܝܩܝ',
'arz': [u'نقاش ميدياويكى', u'نقاش ميدياويكي'],
'as': u'MediaWiki বার্তা',
'ast': u'MediaWiki alderique',
'av': u'Обсуждение MediaWiki',
'ay': u'MediaWiki Discusión',
'az': u'MediyaViki müzakirəsi',
'ba': u'MediaWiki б-са фекер алышыу',
'bar': u'MediaWiki Diskussion',
'bat-smg': u'MediaWiki aptarėms',
'bcl': u'Olay sa MediaWiki',
'be': u'Размовы пра MediaWiki',
'be-x-old': u'Абмеркаваньне MediaWiki',
'bg': u'МедияУики беседа',
'bm': u'Discussion MediaWiki',
'bn': [u'মিডিয়াউইকি আলোচনা', u'MediaWiki আলাপ'],
'bpy': u'মিডিয়াউইকির য়্যারী',
'br': u'Kaozeadenn MediaWiki',
'bs': [u'MediaWiki razgovor', u'Razgovor o MedijaVikiju'],
'bug': u'Pembicaraan MediaWiki',
'ca': u'MediaWiki Discussió',
'cbk-zam': u'MediaWiki Discusión',
'ce': u'МедйаВики дийца',
'ceb': u'Hisgot sa MediaWiki',
'ckb': u'لێدوانی میدیاویکی',
'crh': [u'MediaViki muzakeresi', u'МедиаВики музакереси'],
'cs': u'MediaWiki diskuse',
'csb': u'Diskùsëjô MediaWiki',
'cu': u'MediaWiki бєсѣ́да',
'cv': u'MediaWiki сӳтсе явмалли',
'cy': u'Sgwrs MediaWici',
'da': u'MediaWiki-diskussion',
'de': u'MediaWiki Diskussion',
'dsb': u'MediaWiki diskusija',
'dv': u'މީޑިޔާވިކި ޚިޔާލު',
'el': u'Συζήτηση MediaWiki',
'eml': u'Discussioni MediaWiki',
'eo': u'MediaWiki diskuto',
'es': u'MediaWiki Discusión',
'et': u'MediaWiki arutelu',
'eu': u'MediaWiki eztabaida',
'fa': u'بحث مدیاویکی',
'ff': u'Discussion MediaWiki',
'fi': u'Keskustelu järjestelmäviestistä',
'fiu-vro': u'MediaWiki arotus',
'fo': [u'MediaWiki-kjak', u'MidiaWiki-kjak', u'MidiaWiki kjak'],
'fr': u'Discussion MediaWiki',
'frp': u'Discussion MediaWiki',
'fur': u'Discussion MediaWiki',
'fy': u'MediaWiki oerlis',
'ga': u'Plé MediaWiki',
'gan': u'MediaWiki talk',
'gl': u'Conversa MediaWiki',
'glk': u'بحث مدیاویکی',
'gn': u'MediaWiki myangekõi',
'gu': u'મીડિયાવિકિ ચર્ચા',
'gv': 'Resooney MediaWiki',
'haw': u'Kūkākūkā o MediaWiki',
'he': u'שיחת מדיה ויקי',
'hi': u'मीडियाविकि वार्ता',
'hr': u'MediaWiki razgovor',
'hsb': u'MediaWiki diskusija',
'ht': u'Diskisyon MedyaWiki',
'hu': u'MediaWiki-vita',
'hy': u'MediaWiki քննարկում',
'ia': u'Discussion MediaWiki',
'id': u'Pembicaraan MediaWiki',
'io': u'MediaWiki Debato',
'is': u'Meldingarspjall',
'it': u'Discussioni MediaWiki',
'ja': u'MediaWiki‐ノート',
'jv': u'Dhiskusi MediaWiki',
'ka': [u'მედიავიკის განხილვა', u'მედიავიკი განხილვა'],
'kaa': u"MediaWiki sa'wbeti",
'kab': u'Amyannan n MediaWiki',
'kk': u'МедиаУики талқылауы',
'kl': [u'Mediawikip oqalliffia', u'MediaWiki-diskussion'],
'km': u'ការពិភាក្សាអំពីមេឌាវិគី',
'kn': u'ಮೀಡೀಯವಿಕಿ ಚರ್ಚೆ',
'ko': u'미디어위키토론',
'krc': u'MediaWiki-ни сюзюу',
'ksh': [u'MediaWiki Klaaf', u'MedijaWikki Klaaf'],
'ku': u'MediaWiki nîqaş',
'kv': u'Обсуждение MediaWiki',
'kw': [u'Keskows MediaWiki', u'Kescows MediaWiki', u'Cows MediaWiki'],
'la': u'Disputatio MediaWiki',
'lad': u'MediaWiki Discusión',
'lb': u'MediaWiki Diskussioun',
'lbe': u'MediaWikiлиясса ихтилат',
'li': u'Euverlèk MediaWiki',
'lij': [u'Discûscioîn MediaWiki', u'Discussioni MediaWiki'],
'lmo': [u'Ciciarada MediaWiki', u'Discussioni MediaWiki'],
'ln': u'Discussion MediaWiki',
'lo': u'ສົນທະນາກ່ຽວກັບມີເດຍວິກິ',
'lt': u'MediaWiki aptarimas',
'lv': u'MediaWiki diskusija',
'map-bms': u'Dhiskusi MediaWiki',
'mdf': u'МедиаВики корхнема',
'mg': [u'Dinika amin\'ny MediaWiki', u'Discussion MediaWiki'],
'mhr': u'Обсуждение MediaWiki',
'mk': u'Разговор за МедијаВики',
'ml': u'മീഡിയവിക്കി സംവാദം',
'mn': u'МедиаВикигийн хэлэлцүүлэг',
'mr': u'मिडियाविकी चर्चा',
'ms': u'Perbincangan MediaWiki',
'mt': u'Diskussjoni MediaWiki',
'mwl': u'Cumbersa Biqui',
'myv': u'MediaWiki-нь кортамось',
'mzn': [u'مه‌دیاویکی گپ', u'مه‌دیا ویکی گپ', u'بحث مدیاویکی'],
'nah': [u'Huiquimedia tēixnāmiquiliztli', u'MediaWiki Discusión'],
'nap': [u'MediaWiki chiàcchiera', u'Discussioni MediaWiki'],
'nds': u'MediaWiki Diskuschoon',
'nds-nl': u'Overleg MediaWiki',
'new': u'मिडियाविकि खँलाबँला',
'nl': u'Overleg MediaWiki',
'nn': u'MediaWiki-diskusjon',
'no': u'MediaWiki-diskusjon',
'nv': u'MediaWiki baa yáshtiʼ',
'oc': u'Discussion MediaWiki',
'os': u'Дискусси MediaWiki',
'pa': u'ਮੀਡੀਆਵਿਕਿ ਚਰਚਾ',
'pcd': u'Discussion MediaWiki',
'pdc': u'MediaWiki Diskussion',
'pl': u'Dyskusja MediaWiki',
'pms': u'Discussion dla MediaWiki',
'ps': u'د ميډياويکي خبرې اترې',
'pt': u'MediaWiki Discussão',
'qu': u'MediaWiki rimanakuy',
'rmy': [u'MediyaViki vakyarimata', u'Discuţie MediaWiki'],
'ro': u'Discuţie MediaWiki',
'ru': u'Обсуждение MediaWiki',
'sa': u'मिडियाविकीसंभाषणं',
'sah': u'Обсуждение MediaWiki',
'sc': u'Cuntierra MediaWiki',
'scn': u'Discussioni MediaWiki',
'sd': u'ذريعات وڪي بحث',
'sg': u'Discussion MediaWiki',
'si': [u'මාධ්‍යවිකි සාකච්ඡාව', u'විකිමාධ්‍ය සාකච්ඡාව'],
'sk': u'Diskusia k MediaWiki',
'sl': u'Pogovor o MediaWiki',
'sq': u'MediaWiki diskutim',
'sr': u'Разговор о МедијаВикију',
'srn': [u'Taki fu MediaWiki', u'Overleg MediaWiki'],
'stq': u'MediaWiki Diskussion',
'su': [u'Obrolan MédiaWiki', u'Obrolan MediaWiki'],
'sv': u'MediaWiki-diskussion',
'sw': u'Majadiliano ya MediaWiki',
'szl': u'Dyskusja MediaWiki',
'ta': u'மீடியாவிக்கி பேச்சு',
'te': u'మీడియావికీ చర్చ',
'tet': u'Diskusaun MediaWiki',
'tg': u'Баҳси медиавики',
'th': u'คุยเรื่องมีเดียวิกิ',
'tk': u'MediaWiki çekişme',
'tl': u'Usapang MediaWiki',
'tlh': u"MediaWiki ja'chuq",
'tr': u'MediaWiki tartışma',
'tt': [u'МедиаВики бәхәсе', u'Медиа Вики бәхәсе', u'MediaWiki bäxäse'],
'ty': u'Discussion MediaWiki',
'udm': u'MediaWiki сярысь вераськон',
'uk': u'Обговорення MediaWiki',
'ur': u'تبادلۂ خیال میڈیاوکی',
'uz': u'MediaWiki munozarasi',
'vec': u'Discussion MediaWiki',
'vi': u'Thảo luận MediaWiki',
'vls': u'Discuusje MediaWiki',
'vo': u'Bespik dö sitanuns',
'wa': u'MediaWiki copene',
'wo': [u'Waxtaani MediaWiki', u'Discussion MediaWiki'],
'wuu': u'MediaWiki讨论',
'xal': u'MediaWiki туск меткән',
'yi': u'מעדיעװיקי רעדן',
'yo': u'Ọ̀rọ̀ mediaWiki',
'za': u'MediaWiki讨论',
'zea': u'Overleg MediaWiki',
'zh': [u'MediaWiki talk', u'MediaWiki讨论', u'MediaWiki对话', u'MediaWiki討論', u'MediaWiki對話'],
},
10: {
'_default': u'Template',
'ab': u'Шаблон',
'ace': u'Pola',
'af': u'Sjabloon',
'als': u'Vorlage',
'am': [u'መለጠፊያ', u'መልጠፊያ'],
'an': u'Plantilla',
'ang': u'Bysen',
'ar': u'قالب',
'arc': u'ܩܠܒܐ',
'arz': u'قالب',
'as': [u'সাঁচ', u'साँचा'],
'ast': u'Plantía',
'av': u'Шаблон',
'ay': u'Plantilla',
'az': u'Şablon',
'ba': u'Ҡалып',
'bar': u'Vorlage',
'bat-smg': u'Šabluons',
'bcl': u'Plantilya',
'be': u'Шаблон',
'be-x-old': u'Шаблён',
'bg': u'Шаблон',
'bm': u'Modèle',
'bn': u'টেমপ্লেট',
'bpy': u'মডেল',
'br': u'Patrom',
'bs': u'Šablon',
'bug': u'Templat',
'ca': u'Plantilla',
'cbk-zam': u'Plantilla',
'cbs': u'Szablóna',
'ce': u'Дакъа',
'ceb': u'Plantilya',
'ckb': u'داڕێژە',
'crh': [u'Şablon', u'Шаблон'],
'cs': u'Šablona',
'csb': u'Szablóna',
'cu': u'Обраꙁь́ць',
'cv': u'Шаблон',
'cy': u'Nodyn',
'da': u'Skabelon',
'de': u'Vorlage',
'dsb': u'Pśedłoga',
'dv': u'ފަންވަތް',
'el': u'Πρότυπο',
'eo': u'Ŝablono',
'es': u'Plantilla',
'et': u'Mall',
'eu': u'Txantiloi',
'fa': u'الگو',
'ff': u'Modèle',
'fi': u'Malline',
'fiu-vro': u'Näüdüs',
'fo': u'Fyrimynd',
'fr': u'Modèle',
'frp': u'Modèlo',
'fur': u'Model',
'fy': u'Berjocht',
'ga': u'Teimpléad',
'gan': u'Template',
'gl': u'Modelo',
'glk': u'الگو',
'gn': u'Tembiecharã',
'gu': u'ઢાંચો',
'gv': u'Clowan',
'haw': u'Anakuhi',
'he': u'תבנית',
'hi': u'साँचा',
'hr': u'Predložak',
'hsb': u'Předłoha',
'ht': u'Modèl',
'hu': u'Sablon',
'hy': u'Կաղապար',
'ia': u'Patrono',
'id': u'Templat',
'io': [u'Shablono', u'Modelo'],
'is': u'Snið',
'jv': u'Cithakan',
'ka': u'თარგი',
'kaa': u'Shablon',
'kab': u'Talɣa',
'kk': u'Үлгі',
'kl': [u'Ilisserut', u'Skabelon'],
'km': u'ទំព័រគំរូ',
'kn': u'ಟೆಂಪ್ಲೇಟು',
'ko': u'틀',
'krc': u'Шаблон',
'ksh': u'Schablon',
'ku': u'Şablon',
'kv': u'Шаблон',
'kw': u'Skantlyn',
'la': u'Formula',
'lad': u'Plantilla',
'lb': u'Schabloun',
'lbe': u'Шаблон',
'li': u'Sjabloon',
'lmo': u'Mudel',
'ln': u'Modèle',
'lo': u'ແມ່ແບບ',
'lt': u'Šablonas',
'lv': u'Veidne',
'map-bms': u'Cithakan',
'mdf': u'Шаблон',
'mg': [u'Endrika', u'Modèle'],
'mhr': [u'Ямдылык', u'Шаблон'],
'mk': u'Шаблон',
'ml': u'ഫലകം',
'mn': u'Загвар',
'mr': u'साचा',
'ms': u'Templat',
'mt': u'Mudell',
'mwl': u'Modelo',
'myv': u'ЛопаПарцун',
'mzn': [u'شابلون', u'الگو'],
'nah': [u'Nemachiyōtīlli', u'Plantilla'],
'nap': u'Modello',
'nds': u'Vörlaag',
'nds-nl': u'Mal',
'nl': u'Sjabloon',
'nn': u'Mal',
'no': u'Mal',
'nv': u'Bee álnééhí',
'oc': u'Modèl',
'os': u'Шаблон',
'pa': u'ਨਮੂਨਾ',
'pcd': u'Modèle',
'pdc': u'Vorlage',
'pl': u'Szablon',
'pms': u'Stamp',
'pnt': u'Πρότυπον',
'ps': u'کينډۍ',
'pt': u'Predefinição',
'qu': u'Plantilla',
'rmy': [u'Sikavno', u'Format'],
'ro': u'Format',
'ru': u'Шаблон',
'sa': u'बिंबधर',
'sah': u'Халыып',
'sd': u'سانچو',
'sg': u'Modèle',
'sh': u'Šablon',
'si': u'සැකිල්ල',
'sk': u'Šablóna',
'sl': u'Predloga',
'sq': u'Stampa',
'sr': u'Шаблон',
'srn': [u'Ankra', u'Sjabloon'],
'stq': u'Foarloage',
'su': u'Citakan',
'sv': u'Mall',
'sw': u'Kigezo',
'szl': u'Szablon',
'ta': u'வார்ப்புரு',
'te': u'మూస',
'tg': u'Шаблон',
'th': u'แม่แบบ',
'tk': u'Şablon',
'tl': u'Suleras',
'tlh': u"chen'ay'",
'tr': u'Şablon',
'tt': [u'Үрнәк', u'Ürnäk'],
'ty': u'Modèle',
'udm': u'Шаблон',
'uk': u'Шаблон',
'ur': u'سانچہ',
'uz': u'Andoza',
'vec': u'Modèl',
'vi': [u'Bản mẫu', u'Tiêu bản'],
'vls': u'Patrôon',
'vo': u'Samafomot',
'wa': u'Modele',
'wo': [u'Royuwaay', u'Modèle'],
'wuu': u'模板',
'xal': u'Зура',
'yi': u'מוסטער',
'yo': u'Àdàkọ',
'za': u'模板',
'zea': u'Sjabloon',
'zh': [u'Template', u'模板'],
},
11: {
'_default': u'Template talk',
'ab': u'Обсуждение шаблона',
'ace': u'Marit Pola',
'af': u'Sjabloonbespreking',
'als': u'Vorlage Diskussion',
'am': [u'መለጠፊያ ውይይት', u'መልጠፊያ ውይይት'],
'an': u'Descusión plantilla',
'ang': u'Bysengesprec',
'ar': u'نقاش القالب',
'arc': u'ܡܡܠܠܐ ܕܩܠܒܐ',
'arz': u'نقاش القالب',
'as': [u'সাঁচ বার্তা', u'साँचा वार्ता'],
'ast': u'Plantía alderique',
'av': u'Обсуждение шаблона',
'ay': u'Plantilla Discusión',
'az': u'Şablon müzakirəsi',
'ba': u'Ҡалып б-са фекер алышыу',
'bar': u'Vorlage Diskussion',
'bat-smg': u'Šabluona aptarėms',
'bcl': u'Olay sa plantilya',
'be': u'Размовы пра шаблон',
'be-x-old': u'Абмеркаваньне шаблёну',
'bg': u'Шаблон беседа',
'bm': u'Discussion modèle',
'bn': u'টেমপ্লেট আলোচনা',
'bpy': u'মডেলর য়্যারী',
'br': u'Kaozeadenn Patrom',
'bs': u'Razgovor o šablonu',
'bug': u'Pembicaraan Templat',
'ca': u'Plantilla Discussió',
'cbk-zam': u'Plantilla Discusión',
'ce': u'Дакъан дийца',
'ceb': u'Hisgot sa Plantilya',
'ckb': u'لێدوانی داڕێژە',
'crh': [u'Şablon muzakeresi', u'Шаблон музакереси'],
'cs': u'Šablona diskuse',
'csb': u'Diskùsëjô Szablónë',
'cu': u'Обраꙁьца́ бєсѣ́да',
'cv': u'Шаблона сӳтсе явмалли',
'cy': u'Sgwrs Nodyn',
'da': u'Skabelondiskussion',
'de': u'Vorlage Diskussion',
'dsb': u'Diskusija wó pśedłoze',
'dv': u'ފަންވަތް ޚިޔާލު',
'el': u'Συζήτηση προτύπου',
'eml': u'Discussioni template',
'eo': u'Ŝablona diskuto',
'es': u'Plantilla Discusión',
'et': u'Malli arutelu',
'eu': u'Txantiloi eztabaida',
'fa': u'بحث الگو',
'ff': u'Discussion modèle',
'fi': u'Keskustelu mallineesta',
'fiu-vro': u'Näüdüse arotus',
'fo': [u'Fyrimyndakjak', u'Fyrimynd kjak'],
'fr': u'Discussion modèle',
'frp': u'Discussion modèlo',
'fur': u'Discussion model',
'fy': u'Berjocht oerlis',
'ga': u'Plé teimpléid',
'gan': u'Template talk',
'gl': [u'Conversa modelo', u'Conversa Modelo'],
'glk': u'بحث الگو',
'gn': u'Tembiecharã myangekõi',
'gu': u'ઢાંચાની ચર્ચા',
'gv': u'Resooney clowan',
'haw': u'Kūkākūkā o anakuhi',
'he': u'שיחת תבנית',
'hi': u'साँचा वार्ता',
'hr': u'Razgovor o predlošku',
'hsb': u'Diskusija k předłoze',
'ht': u'Diskisyon Modèl',
'hu': u'Sablonvita',
'hy': u'Կաղապարի քննարկում',
'ia': u'Discussion Patrono',
'id': u'Pembicaraan Templat',
'io': [u'Shablono Debato', u'Modelo Debato'],
'is': u'Sniðaspjall',
'it': u'Discussioni template',
'ja': u'Template‐ノート',
'jv': u'Dhiskusi Cithakan',
'ka': [u'თარგის განხილვა', u'თარგი განხილვა'],
'kaa': u"Shablon sa'wbeti",
'kab': u'Amyannan n talɣa',
'kk': u'Үлгі талқылауы',
'kl': [u'Ilisserummi oqallinneq', u'Skabelondiskussion'],
'km': u'ការពិភាក្សាអំពីទំព័រគំរូ',
'kn': u'ಟೆಂಪ್ಲೇಟು ಚರ್ಚೆ',
'ko': u'틀토론',
'krc': u'Шаблонну сюзюу',
'ksh': u'Schablone Klaaf',
'ku': u'Şablon nîqaş',
'kv': u'Обсуждение шаблона',
'kw': [u'Keskows Skantlyn', u'Kescows Scantlyn', u'Cows Scantlyn'],
'la': u'Disputatio Formulae',
'lad': u'Plantilla Discusión',
'lb': u'Schabloun Diskussioun',
'lbe': u'Шаблондалиясса ихтилат',
'li': u'Euverlèk sjabloon',
'lij': [u'Discûscioîn template', u'Discussioni template'],
'lmo': [u'Ciciarada Mudel', u'Discussioni template'],
'ln': u'Discussion modèle',
'lo': u'ສົນທະນາກ່ຽວກັບແມ່ແບບ',
'lt': u'Šablono aptarimas',
'lv': u'Veidnes diskusija',
'map-bms': u'Dhiskusi Cithakan',
'mdf': u'Шаблон корхнема',
'mg': [u'Dinika amin\'ny endrika', u'Discussion Modèle'],
'mhr': [u'Ямдылыкын каҥашымаш', u'Обсуждение шаблона'],
'mk': u'Разговор за шаблон',
'ml': u'ഫലകത്തിന്റെ സംവാദം',
'mn': u'Загварын хэлэлцүүлэг',
'mr': u'साचा चर्चा',
'ms': u'Perbincangan Templat',
'mt': u'Diskussjoni mudell',
'mwl': u'Cumbersa Modelo',
'myv': u'ЛопаПарцундо кортамось',
'mzn': [u'شابلون گپ', u'بحث الگو'],
'nah': [u'Nemachiyōtīlli tēixnāmiquiliztli', u'Plantilla Discusión'],
'nap': [u'Modello chiàcchiera', u'Discussioni template'],
'nds': u'Vörlaag Diskuschoon',
'nds-nl': u'Overleg mal',
'nl': u'Overleg sjabloon',
'nn': u'Maldiskusjon',
'no': u'Maldiskusjon',
'nv': u'Bee álnééhí baa yáshtiʼ',
'oc': u'Discussion Modèl',
'os': u'Шаблоны тыххæй дискусси',
'pa': u'ਨਮੂਨਾ ਚਰਚਾ',
'pcd': u'Discussion modèle',
'pdc': u'Vorlage Diskussion',
'pl': u'Dyskusja szablonu',
'pms': u'Discussion dlë stamp',
'pnt': u'Καλάτσεμαν πρότυπι',
'ps': u'د کينډۍ خبرې اترې',
'pt': u'Predefinição Discussão',
'qu': u'Plantilla rimanakuy',
'rmy': [u'Sikavno vakyarimata', u'Discuţie Format'],
'ro': u'Discuţie Format',
'ru': u'Обсуждение шаблона',
'sa': u'बिंबधर संभाषणं',
'sah': u'Халыып ырытыыта',
'sc': u'Cuntierra template',
'scn': u'Discussioni template',
'sd': u'سنچو بحث',
'sg': u'Discussion modèle',
'sh': u'Razgovor o šablonu',
'si': [u'සැකිලි සාකච්ඡාව', u'සැකිල සාකච්ඡාව'],
'sk': u'Diskusia k šablóne',
'sl': u'Pogovor o predlogi',
'sq': u'Stampa diskutim',
'sr': u'Разговор о шаблону',
'srn': [u'Taki fu ankra', u'Overleg sjabloon'],
'stq': u'Foarloage Diskussion',
'su': u'Obrolan citakan',
'sv': u'Malldiskussion',
'sw': u'Majadiliano ya kigezo',
'szl': u'Dyskusja szablonu',
'ta': u'வார்ப்புரு பேச்சு',
'te': u'మూస చర్చ',
'tet': u'Diskusaun Template',
'tg': u'Баҳси шаблон',
'th': u'คุยเรื่องแม่แบบ',
'tk': u'Şablon çekişme',
'tl': u'Usapang suleras',
'tlh': u"chen'ay' ja'chuq",
'tr': u'Şablon tartışma',
'tt': [u'Үрнәк бәхәсе', u'Шаблон бәхәсе', u'Ürnäk bäxäse'],
'ty': u'Discussion modèle',
'udm': u'Шаблон сярысь вераськон',
'uk': u'Обговорення шаблону',
'ur': u'تبادلۂ خیال سانچہ',
'uz': u'Andoza munozarasi',
'vec': u'Discussion modèl',
'vi': [u'Thảo luận Bản mẫu', u'Thảo luận Tiêu bản'],
'vls': u'Discuusje patrôon',
'vo': u'Samafomotibespik',
'wa': u'Modele copene',
'wo': [u'Waxtaani royuwaay', u'Discussion Modèle'],
'wuu': u'模板讨论',
'xal': u'Зуран туск меткән',
'yi': u'מוסטער רעדן',
'yo': u'Ọ̀rọ̀ àdàkọ',
'za': u'模板讨论',
'zea': u'Overleg sjabloon',
'zh': [u'Template talk', u'模板讨论', u'模板討論', u'模板对话', u'模板對話'],
},
12: {
'_default': u'Help',
'ab': u'Справка',
'ace': u'Beunantu',
'af': u'Hulp',
'als': u'Hilfe',
'am': u'እርዳታ',
'an': u'Aduya',
'ar': u'مساعدة',
'arc': u'ܥܘܕܪܢܐ',
'arz': u'مساعدة',
'as': u'সহায়',
'ast': u'Aida',
'av': u'Справка',
'ay': u'Ayuda',
'az': u'Kömək',
'ba': u'Белешмә',
'bar': u'Hilfe',
'bat-smg': u'Pagelba',
'bcl': u'Tabang',
'be': u'Даведка',
'be-x-old': u'Дапамога',
'bg': u'Помощ',
'bm': u'Aide',
'bn': u'সাহায্য',
'bpy': u'পাংলাক',
'br': u'Skoazell',
'bs': u'Pomoć',
'bug': u'Bantuan',
'ca': u'Ajuda',
'cbk-zam': u'Ayuda',
'cbs': u'Pòmòc',
'ce': u'ГІо',
'ceb': u'Tabang',
'ch': u'Ayudo',
'ckb': u'یارمەتی',
'crh': [u'Yardım', u'Ярдым'],
'cs': u'Nápověda',
'csb': u'Pòmòc',
'cu': u'По́мощь',
'cv': u'Пулăшу',
'cy': u'Cymorth',
'da': u'Hjælp',
'de': u'Hilfe',
'dsb': u'Pomoc',
'dv': u'އެހީ',
'el': u'Βοήθεια',
'eml': u'Aiuto',
'eo': u'Helpo',
'es': u'Ayuda',
'et': u'Juhend',
'eu': u'Laguntza',
'fa': u'راهنما',
'ff': u'Aide',
'fi': u'Ohje',
'fiu-vro': u'Oppus',
'fo': u'Hjálp',
'fr': u'Aide',
'frp': u'Éde',
'fur': u'Jutori',
'fy': u'Hulp',
'ga': u'Cabhair',
'gan': u'Help',
'gl': u'Axuda',
'glk': u'راهنما',
'gn': u'Pytyvõ',
'gu': u'મદદ',
'gv': u'Cooney',
'haw': u'Kōkua',
'he': u'עזרה',
'hi': u'सहायता',
'hr': u'Pomoć',
'hsb': u'Pomoc',
'ht': u'Èd',
'hu': u'Segítség',
'hy': u'Օգնություն',
'ia': u'Adjuta',
'id': u'Bantuan',
'io': u'Helpo',
'is': u'Hjálp',
'it': u'Aiuto',
'jv': u'Pitulung',
'ka': u'დახმარება',
'kaa': u'Anıqlama',
'kab': u'Tallat',
'kk': u'Анықтама',
'kl': [u'Ikiuutit', u'Hjælp'],
'km': u'ជំនួយ',
'kn': u'ಸಹಾಯ',
'ko': u'도움말',
'krc': u'Болушлукъ',
'ksh': [u'Hölp', u'Hülp'],
'ku': u'Alîkarî',
'kv': u'Справка',
'kw': u'Gweres',
'la': u'Auxilium',
'lad': u'Ayuda',
'lb': u'Hëllef',
'lbe': u'Кумаг',
'lij': [u'Agiûtto', u'Aiuto'],
'lmo': [u'Jüt', u'Aiuto'],
'ln': u'Aide',
'lo': u'ຊ່ວຍເຫຼືອ',
'lt': u'Pagalba',
'lv': u'Palīdzība',
'map-bms': u'Pitulung',
'mdf': u'Лезкс',
'mg': [u'Fanoroana', u'Aide'],
'mhr': [u'Полшык', u'Справка'],
'mk': u'Помош',
'ml': u'സഹായം',
'mn': u'Тусламж',
'mr': [u'सहाय्य', u'साहाय्य'],
'ms': u'Bantuan',
'mt': [u'Għajnuna', u'Ghajnuna'],
'mwl': u'Ajuda',
'myv': u'Лезкс',
'mzn': [u'رانه‌ما', u'راهنما'],
'nah': [u'Tēpalēhuiliztli', u'Ayuda'],
'nap': [u'Ajùto', u'Aiuto'],
'nds': u'Hülp',
'nds-nl': u'Hulpe',
'new': u'ग्वाहालि',
'nn': u'Hjelp',
'no': u'Hjelp',
'nv': u'Anáʼálwoʼ',
'oc': u'Ajuda',
'os': u'Æххуыс',
'pa': u'ਮਦਦ',
'pcd': u'Aide',
'pdc': u'Hilfe',
'pl': u'Pomoc',
'pms': u'Agiut',
'pnt': u'Βοήθειαν',
'ps': u'لارښود',
'pt': u'Ajuda',
'qu': u'Yanapa',
'rmy': [u'Zhutipen', u'Ajutor'],
'ro': u'Ajutor',
'ru': u'Справка',
'sa': u'सहाय्य',
'sah': u'Көмө',
'sc': u'Agiudu',
'scn': u'Aiutu',
'sd': u'مدد',
'sg': u'Aide',
'si': u'උදවු',
'sk': u'Pomoc',
'sl': u'Pomoč',
'sq': u'Ndihmë',
'sr': u'Помоћ',
'srn': u'Yepi',
'stq': u'Hälpe',
'su': u'Pitulung',
'sv': u'Hjälp',
'sw': u'Msaada',
'szl': u'Pomoc',
'ta': u'உதவி',
'te': [u'సహాయం', u'సహాయము'],
'tet': u'Ajuda',
'tg': u'Роҳнамо',
'th': u'วิธีใช้',
'tk': u'Ýardam',
'tl': u'Tulong',
'tlh': u'QaH',
'tr': u'Yardım',
'tt': [u'Ярдәм', u'Yärdäm'],
'ty': u'Aide',
'udm': u'Валэктон',
'uk': u'Довідка',
'ur': u'معاونت',
'uz': u'Yordam',
'vec': u'Ajuto',
'vi': u'Trợ giúp',
'vls': u'Ulpe',
'vo': u'Yuf',
'wa': u'Aidance',
'wo': [u'Ndimbal', u'Aide'],
'wuu': u'帮助',
'xal': u'Цәәлһлһн',
'yi': u'הילף',
'yo': u'Ìrànlọ́wọ́',
'za': u'帮助',
'zea': u'Ulpe',
'zh': [u'Help', u'帮助', u'幫助'],
},
13: {
'_default': u'Help talk',
'ab': u'Обсуждение справки',
'ace': u'Marit Beunantu',
'af': u'Hulpbespreking',
'als': u'Hilfe Diskussion',
'am': u'እርዳታ ውይይት',
'an': u'Descusión aduya',
'ang': u'Helpgesprec',
'ar': u'نقاش المساعدة',
'arc': u'ܡܡܠܠܐ ܕܥܘܕܪܢܐ',
'arz': u'نقاش المساعدة',
'as': u'সহায় বার্তা',
'ast': u'Aida alderique',
'av': u'Обсуждение справки',
'ay': u'Ayuda Discusión',
'az': u'Kömək müzakirəsi',
'ba': u'Белешмә б-са фекер алышыу',
'bar': u'Hilfe Diskussion',
'bat-smg': u'Pagelbas aptarėms',
'bcl': u'Olay sa tabang',
'be': u'Размовы пра даведку',
'be-x-old': u'Абмеркаваньне дапамогі',
'bg': u'Помощ беседа',
'bm': u'Discussion aide',
'bn': u'সাহায্য আলোচনা',
'bpy': u'পাংলাকর য়্যারী',
'br': u'Kaozeadenn Skoazell',
'bs': u'Razgovor o pomoći',
'bug': u'Pembicaraan Bantuan',
'ca': u'Ajuda Discussió',
'cbk-zam': u'Ayuda Discusión',
'ce': u'ГІодан дийца',
'ceb': u'Hisgot sa Tabang',
'ch': u'Kombetsasion ni ayudo',
'ckb': u'لێدوانی یارمەتی',
'crh': [u'Yardım muzakeresi', u'Разговор о помоћи'],
'cs': u'Nápověda diskuse',
'csb': u'Diskùsëjô Pòmòcë',
'cu': u'По́мощи бєсѣ́да',
'cv': u'Пулăшăва сӳтсе явмалли',
'cy': u'Sgwrs Cymorth',
'da': u'Hjælp-diskussion',
'de': u'Hilfe Diskussion',
'dsb': u'Diskusija wó pomocy',
'dv': u'އެހީ ޚިޔާލު',
'el': u'Συζήτηση βοήθειας',
'eml': u'Discussioni aiuto',
'eo': u'Helpa diskuto',
'es': u'Ayuda Discusión',
'et': u'Juhendi arutelu',
'eu': u'Laguntza eztabaida',
'fa': u'بحث راهنما',
'ff': u'Discussion aide',
'fi': u'Keskustelu ohjeesta',
'fiu-vro': u'Oppusõ arotus',
'fo': [u'Hjálparkjak', u'Hjálp kjak'],
'fr': u'Discussion aide',
'frp': u'Discussion éde',
'fur': u'Discussion jutori',
'fy': u'Hulp oerlis',
'ga': u'Plé cabhrach',
'gan': u'Help talk',
'gl': [u'Conversa axuda', u'Conversa Axuda'],
'glk': u'بحث راهنما',
'gn': u'Pytyvõ myangekõi',
'gu': u'મદદની ચર્ચા',
'gv': u'Resooney cooney',
'haw': u'Kūkākūkā o kōkua',
'he': u'שיחת עזרה',
'hi': u'सहायता वार्ता',
'hr': u'Razgovor o pomoći',
'hsb': u'Pomoc diskusija',
'ht': u'Diskisyon Èd',
'hu': u'Segítségvita',
'hy': u'Օգնության քննարկում',
'ia': u'Discussion Adjuta',
'id': u'Pembicaraan Bantuan',
'io': u'Helpo Debato',
'is': u'Hjálparspjall',
'it': u'Discussioni aiuto',
'ja': u'Help‐ノート',
'jv': u'Dhiskusi Pitulung',
'ka': [u'დახმარების განხილვა', u'დახმარება განხილვა'],
'kaa': u"Anıqlama sa'wbeti",
'kab': u'Amyannan n tallat',
'kk': u'Анықтама талқылауы',
'kl': [u'Ikiuutini oqallinneq', u'Hjælp-diskussion'],
'km': u'ការពិភាក្សាអំពីជំនួយ',
'kn': u'ಸಹಾಯ ಚರ್ಚೆ',
'ko': u'도움말토론',
'krc': u'Болушлукъну сюзюу',
'ksh': [u'Hölp Klaaf', u'Hülp Klaaf'],
'ku': u'Alîkarî nîqaş',
'kv': u'Обсуждение справки',
'kw': [u'Keskows Gweres', u'Kescows Gweres', u'Cows Gweres'],
'la': u'Disputatio Auxilii',
'lad': u'Ayuda Discusión',
'lb': u'Hëllef Diskussioun',
'lbe': u'Кумаграясса ихтилат',
'li': u'Euverlèk help',
'lij': [u'Discûscioîn agiûtto', u'Discussioni aiuto'],
'lmo': [u'Ciciarada Jüt', u'Discussioni aiuto'],
'ln': u'Discussion aide',
'lo': u'ສົນທະນາກ່ຽວກັບຊ່ວຍເຫຼືອ',
'lt': u'Pagalbos aptarimas',
'lv': u'Palīdzības diskusija',
'map-bms': u'Dhiskusi Pitulung',
'mdf': u'Лезкс корхнема',
'mg': [u'Dinika amin\'ny fanoroana', u'Discussion Aide'],
'mhr': [u'Полшыкын каҥашымаш', u'Обсуждение справки'],
'mk': u'Разговор за помош',
'ml': u'സഹായത്തിന്റെ സംവാദം',
'mn': u'Тусламжийн хэлэлцүүлэг',
'mr': [u'सहाय्य चर्चा', u'साहाय्य चर्चा'],
'ms': u'Perbincangan Bantuan',
'mt': [u'Diskussjoni għajnuna', u'Diskussjoni ghajnuna'],
'mwl': u'Cumbersa ajuda',
'myv': u'Лезкстэ кортамось',
'mzn': [u'رانه‌مائه گپ', u'رانه‌مای گپ', u'بحث راهنما'],
'nah': [u'Tēpalēhuiliztli tēixnāmiquiliztli', u'Ayuda Discusión'],
'nap': [u'Ajùto chiàcchiera', u'Discussioni aiuto'],
'nds': u'Hülp Diskuschoon',
'nds-nl': u'Overleg hulpe',
'new': u'ग्वाहालि खँलाबँला',
'nl': u'Overleg help',
'nn': u'Hjelpdiskusjon',
'no': u'Hjelpdiskusjon',
'nv': u'Anáʼálwoʼ baa yáshtiʼ',
'oc': u'Discussion Ajuda',
'os': u'Æххуысы тыххæй дискусси',
'pa': u'ਮਦਦ ਚਰਚਾ',
'pcd': u'Discussion aide',
'pdc': u'Hilfe Diskussion',
'pl': u'Dyskusja pomocy',
'pms': u"Discussion ant sl'agiut",
'pnt': u'Καλάτσεμαν βοήθειας',
'ps': u'د لارښود خبرې اترې',
'pt': u'Ajuda Discussão',
'qu': u'Yanapa rimanakuy',
'rmy': [u'Zhutipen vakyarimata', u'Discuţie Ajutor'],
'ro': u'Discuţie Ajutor',
'ru': u'Обсуждение справки',
'sa': u'सहाय्यसंभाषणं',
'sah': u'Көмө ырытыыта',
'sc': u'Cuntierra agiudu',
'scn': u'Discussioni aiutu',
'sd': u'مدد بحث',
'sg': u'Discussion aide',
'si': [u'උදවු සාකච්ඡාව', u'උදව සාකච්ඡාව'],
'sk': u'Diskusia k pomoci',
'sl': u'Pogovor o pomoči',
'sq': u'Ndihmë diskutim',
'sr': u'Разговор о помоћи',
'srn': [u'Taki fu yepi', u'Overleg help'],
'stq': u'Hälpe Diskussion',
'su': u'Obrolan pitulung',
'sv': u'Hjälpdiskussion',
'sw': u'Majadiliano ya msaada',
'szl': u'Dyskusja pomocy',
'ta': u'உதவி பேச்சு',
'te': [u'సహాయం చర్చ', u'సహాయము చర్చ'],
'tet': u'Diskusaun Ajuda',
'tg': u'Баҳси роҳнамо',
'th': u'คุยเรื่องวิธีใช้',
'tk': u'Ýardam çekişme',
'tl': u'Usapang tulong',
'tlh': u"QaH ja'chuq",
'tr': u'Yardım tartışma',
'tt': [u'Ярдәм бәхәсе', u'Yärdäm bäxäse'],
'ty': u'Discussion aide',
'udm': u'Валэктон сярысь вераськон',
'uk': u'Обговорення довідки',
'ur': u'تبادلۂ خیال معاونت',
'uz': u'Yordam munozarasi',
'vec': u'Discussion ajuto',
'vi': u'Thảo luận Trợ giúp',
'vls': u'Discuusje ulpe',
'vo': u'Yufibespik',
'wa': u'Aidance copene',
'wo': [u'Waxtaani ndimbal', u'Discussion Aide'],
'wuu': u'帮助讨论',
'xal': u'Цәәлһлһин туск меткән',
'yi': u'הילף רעדן',
'yo': u'Ọ̀rọ̀ ìrànlọ́wọ́',
'za': u'帮助讨论',
'zea': u'Overleg ulpe',
'zh': [u'Help talk', u'帮助讨论', u'幫助討論', u'幫助對話', u'帮助对话'],
},
14: {
'_default': u'Category',
'ab': u'Категория',
'ace': u'Kawan',
'af': u'Kategorie',
'als': u'Kategorie',
'am': u'መደብ',
'an': u'Categoría',
'ang': u'Flocc',
'ar': u'تصنيف',
'arc': u'ܣܕܪܐ',
'arz': u'تصنيف',
'as': [u'শ্রেণী', u'श्रेणी'],
'ast': u'Categoría',
'av': u'Категория',
'ay': u'Categoría',
'az': u'Kateqoriya',
'ba': u'Категория',
'bar': u'Kategorie',
'bat-smg': [u'Kateguorėjė', u'Kategorija'],
'bcl': u'Kategorya',
'be': u'Катэгорыя',
'be-x-old': u'Катэгорыя',
'bg': u'Категория',
'bm': u'Catégorie',
'bn': u'বিষয়শ্রেণী',
'bpy': u'থাক',
'br': u'Rummad',
'bs': u'Kategorija',
'bug': u'Kategori',
'ca': u'Categoria',
'cbk-zam': u'Categoría',
'ce': u'Тоба',
'ceb': u'Kategoriya',
'ch': u'Katigoria',
'ckb': u'پۆل',
'crh': [u'Kategoriya', u'Категория'],
'cs': u'Kategorie',
'csb': u'Kategòrëjô',
'cu': [u'Катигорі́ꙗ', u'Катигорї'],
'cv': u'Категори',
'cy': u'Categori',
'da': u'Kategori',
'de': u'Kategorie',
'dsb': u'Kategorija',
'dv': u'ޤިސްމު',
'el': u'Κατηγορία',
'eml': u'Categoria',
'eo': u'Kategorio',
'es': u'Categoría',
'et': u'Kategooria',
'eu': u'Kategoria',
'fa': u'رده',
'ff': u'Catégorie',
'fi': u'Luokka',
'fiu-vro': u'Katõgooria',
'fo': u'Bólkur',
'fr': u'Catégorie',
'frp': u'Catègorie',
'fur': u'Categorie',
'fy': u'Kategory',
'ga': [u'Catagóir', u'Rang'],
'gan': u'Category',
'gl': u'Categoría',
'glk': u'رده',
'gn': u'Ñemohenda',
'gu': u'શ્રેણી',
'gv': u'Ronney',
'haw': u'Māhele',
'he': u'קטגוריה',
'hi': u'श्रेणी',
'hr': u'Kategorija',
'hsb': u'Kategorija',
'ht': u'Kategori',
'hu': u'Kategória',
'hy': u'Կատեգորիա',
'ia': u'Categoria',
'id': u'Kategori',
'io': u'Kategorio',
'is': u'Flokkur',
'it': u'Categoria',
'jv': u'Kategori',
'ka': u'კატეგორია',
'kaa': u'Kategoriya',
'kab': u'Taggayt',
'kk': u'Санат',
'kl': [u'Sumut atassuseq', u'Kategori'],
'km': [u'ចំនាត់ថ្នាក់ក្រុម', u'ចំណាត់ថ្នាក់ក្រុម'],
'kn': u'ವರ್ಗ',
'ko': u'분류',
'krc': u'Категория',
'ksh': [u'Saachjrupp', u'Sachjrop', u'Saachjropp', u'Kattejori', u'Kategorie', u'Katejori'],
'ku': u'Kategorî',
'kv': u'Категория',
- 'kw': u'Klass',
+ 'kw': [u'Klass', u'Class'],
'la': u'Categoria',
'lad': u'Categoría',
'lb': u'Kategorie',
'lbe': u'Категория',
'li': [u'Categorie', u'Kategorie'],
'lij': [u'Categorîa', u'Categoria'],
'lmo': [u'Categuria', u'Categoria'],
'ln': u'Catégorie',
'lo': u'ໝວດ',
'lt': u'Kategorija',
'lv': u'Kategorija',
'map-bms': [u'Kategori', u'Kategorija'],
'mdf': u'Категорие',
'mg': [u'Sokajy', u'Catégorie'],
'mhr': [u'Категорий', u'Категория'],
'mk': u'Категорија',
'ml': u'വർഗ്ഗം',
'mn': u'Ангилал',
'mr': u'वर्ग',
'ms': u'Kategori',
'mt': u'Kategorija',
'mwl': u'Catadorie',
'myv': u'Категория',
'mzn': [u'رج', u'رده'],
'nah': [u'Neneuhcāyōtl', u'Categoría'],
'nap': [u'Categurìa', u'Categoria'],
'nds': u'Kategorie',
'nds-nl': [u'Kattegerie', u'Categorie'],
'new': u'पुचः',
'nl': u'Categorie',
'nn': u'Kategori',
'no': u'Kategori',
'nv': u'Tʼááłáhági átʼéego',
'oc': u'Categoria',
'os': u'Категори',
'pa': u'ਸ਼੍ਰੇਣੀ',
'pcd': u'Catégorie',
'pdc': u'Kategorie',
'pl': u'Kategoria',
'pms': u'Categorìa',
'pnt': u'Κατηγορίαν',
'ps': u'وېشنيزه',
'pt': u'Categoria',
'qu': u'Katiguriya',
'rmy': [u'Shopni', u'Categorie'],
'ro': u'Categorie',
'ru': u'Категория',
'sa': u'वर्गः',
'sah': u'Категория',
'sc': u'Categoria',
'scn': u'Catigurìa',
'sd': u'زمرو',
'sg': u'Catégorie',
'sh': u'Kategorija',
'si': u'ප්‍රවර්ගය',
'sk': u'Kategória',
'sl': u'Kategorija',
'sq': [u'Kategoria', u'Kategori'],
'sr': u'Категорија',
'srn': [u'Guru', u'Categorie'],
'stq': u'Kategorie',
'su': u'Kategori',
'sv': u'Kategori',
'sw': u'Jamii',
'szl': u'Kategoria',
'ta': u'பகுப்பு',
'te': u'వర్గం',
'tet': u'Kategoria',
'tg': u'Гурӯҳ',
'th': u'หมวดหมู่',
'tk': u'Kategoriýa',
'tl': [u'Kaurian', u'Kategorya'],
'tlh': u'Segh',
'tr': u'Kategori',
'tt': [u'Төркем', u'Törkem'],
'ty': u'Catégorie',
'udm': u'Категория',
'uk': u'Категорія',
'ur': u'زمرہ',
'uz': [u'Turkum', u'Kategoriya'],
'vec': u'Categoria',
'vi': u'Thể loại',
'vls': u'Categorie',
'vo': u'Klad',
'wa': u'Categoreye',
'wo': [u'Wàll', u'Catégorie'],
'wuu': u'分类',
'xal': u'Әәшл',
'yi': u'קאַטעגאָריע',
'yo': u'Ẹ̀ka',
'za': u'分类',
'zea': u'Categorie',
'zh': [u'Category', u'分类', u'分類'],
},
15: {
'_default': u'Category talk',
'ab': u'Обсуждение категории',
'ace': u'Marit Kawan',
'af': u'Kategoriebespreking',
'als': u'Kategorie Diskussion',
'am': u'መደብ ውይይት',
'an': u'Descusión categoría',
'ang': u'Floccgesprec',
'ar': u'نقاش التصنيف',
'arc': u'ܡܡܠܠܐ ܕܣܕܪܐ',
'arz': u'نقاش التصنيف',
'as': [u'শ্রেণী বার্তা', u'श्रेणी वार्ता'],
'ast': u'Categoría alderique',
'av': u'Обсуждение категории',
'ay': u'Categoría Discusión',
'az': u'Kateqoriya müzakirəsi',
'ba': u'Категория б-са фекер алышыу',
'bar': u'Kategorie Diskussion',
'bat-smg': u'Kateguorėjės aptarėms',
'bcl': u'Olay sa kategorya',
'be': u'Размовы пра катэгорыю',
'be-x-old': u'Абмеркаваньне катэгорыі',
'bg': u'Категория беседа',
'bm': u'Discussion catégorie',
'bn': u'বিষয়শ্রেণী আলোচনা',
'bpy': u'থাকর য়্যারী',
'br': u'Kaozeadenn Rummad',
'bs': u'Razgovor o kategoriji',
'bug': u'Pembicaraan Kategori',
'ca': u'Categoria Discussió',
'cbk-zam': u'Categoría Discusión',
'ce': u'Тобан дийца',
'ceb': u'Hisgot sa Kategoriya',
'ch': u'Kombetsasion ni katigoria',
'ckb': u'لێدوانی پۆل',
'crh': [u'Kategoriya muzakeresi', u'Категория музакереси'],
'cs': u'Kategorie diskuse',
'csb': u'Diskùsëjô Kategòrëji',
'cu': [u'Катигорі́ѩ бєсѣ́да', u'Катигорїѩ бесѣда' ],
'cv': u'Категорине сӳтсе явмалли',
'cy': u'Sgwrs Categori',
'da': u'Kategoridiskussion',
'de': u'Kategorie Diskussion',
'dsb': u'Diskusija wó kategoriji',
'dv': u'ޤިސްމު ޚިޔާލު',
'el': u'Συζήτηση κατηγορίας',
'eml': u'Discussioni categoria',
'eo': u'Kategoria diskuto',
'es': u'Categoría Discusión',
'et': u'Kategooria arutelu',
'eu': u'Kategoria eztabaida',
'fa': u'بحث رده',
'ff': u'Discussion catégorie',
'fi': u'Keskustelu luokasta',
'fiu-vro': u'Katõgooria arotus',
'fo': [u'Bólkakjak', u'Bólkur kjak'],
'fr': u'Discussion catégorie',
'frp': u'Discussion catègorie',
'fur': u'Discussion categorie',
'fy': u'Kategory oerlis',
'ga': u'Plé catagóire',
'gan': u'Category talk',
'gl': [u'Conversa categoría', u'Conversa Categoría'],
'glk': u'بحث رده',
'gn': u'Ñemohenda myangekõi',
'gu': u'શ્રેણીની ચર્ચા',
'gv': u'Resooney ronney',
'haw': u'Kūkākūkā o māhele',
'he': u'שיחת קטגוריה',
'hi': u'श्रेणी वार्ता',
'hr': u'Razgovor o kategoriji',
'hsb': u'Diskusija ke kategoriji',
'ht': u'Diskisyon Kategori',
'hu': u'Kategóriavita',
'hy': u'Կատեգորիայի քննարկում',
'ia': u'Discussion Categoria',
'id': u'Pembicaraan Kategori',
'io': u'Kategorio Debato',
'is': u'Flokkaspjall',
'it': u'Discussioni categoria',
'ja': u'Category‐ノート',
'jv': u'Dhiskusi Kategori',
'ka': [u'კატეგორიის განხილვა', u'კატეგორია განხილვა'],
'kaa': u"Kategoriya sa'wbeti",
'kab': u'Amyannan n taggayt',
'kk': u'Санат талқылауы',
'kl': [u'Sumut atassusermi oqallinneq', u'Kategoridiskussion'],
'km': [u'ការពិភាក្សាអំពីចំនាត់ថ្នាក់ក្រុម', u'ការពិភាក្សាអំពីចំណាត់ថ្នាក់ក្រុម'],
'kn': u'ವರ್ಗ ಚರ್ಚೆ',
'ko': u'분류토론',
'krc': u'Категорияны сюзюу',
'ksh': [u'Saachjruppe Klaaf', u'Saachjrupp Klaaf', u'Sachjrop Klaaf', u'Saachjroppe Klaaf', u'Kattejori Klaaf', u'Kategorie Klaaf', u'Katejorije Klaaf'],
'ku': u'Kategorî nîqaş',
'kv': u'Обсуждение категории',
'kw': [u'Keskows Klass', u'Kescows Class', u'Cows Class'],
'la': u'Disputatio Categoriae',
'lad': u'Categoría Discusión',
'lb': u'Kategorie Diskussioun',
'lbe': u'Категориялиясса ихтилат',
'li': [u'Euverlèk categorie', u'Euverlèk kategorie'],
'lij': [u'Discûscioîn categorîa', u'Discussioni categoria'],
'lmo': [u'Ciciarada Categuria', u'Discussioni categoria'],
'ln': u'Discussion catégorie',
'lo': u'ສົນທະນາກ່ຽວກັບໝວດ',
'lt': u'Kategorijos aptarimas',
'lv': u'Kategorijas diskusija',
'map-bms': u'Dhiskusi Kategori',
'mdf': u'Категорие корхнема',
'mg': [u'Dinika amin\'ny sokajy', u'Dinika amini\'ny sokajy', u'Discussion Catégorie'],
'mhr': [u'Категорийын каҥашымаш', u'Обсуждение категории'],
'mk': u'Разговор за категорија',
'ml': u'വർഗ്ഗത്തിന്റെ സംവാദം',
'mn': u'Ангиллын хэлэлцүүлэг',
'mr': u'वर्ग चर्चा',
'ms': u'Perbincangan Kategori',
'mt': u'Diskussjoni kategorija',
'mwl': u'Cumbersa catadorie',
'myv': u'Категориядо кортамось',
'mzn': [u'رج گپ', u'بحث رده'],
'nah': [u'Neneuhcāyōtl tēixnāmiquiliztli', u'Categoría Discusión'],
'nap': [u'Categurìa chiàcchiera', u'Discussioni categoria'],
'nds': u'Kategorie Diskuschoon',
'nds-nl': [u'Overleg kattegerie', 'Overleg categorie'],
'new': u'पुचः खँलाबँला',
'nl': u'Overleg categorie',
'nn': u'Kategoridiskusjon',
'no': u'Kategoridiskusjon',
'nv': u'Tʼááłáhági átʼéego baa yáshtiʼ',
'oc': u'Discussion Categoria',
'os': u'Категорийы тыххæй дискусси',
'pa': u'ਸ਼੍ਰੇਣੀ ਚਰਚਾ',
'pcd': u'Discussion catégorie',
'pdc': u'Kategorie Diskussion',
'pl': u'Dyskusja kategorii',
'pms': u'Discussion ant sla categorìa',
'pnt': u'Καλάτσεμαν κατηγορίας',
'ps': u'د وېشنيزې خبرې اترې',
'pt': u'Categoria Discussão',
'qu': u'Katiguriya rimanakuy',
'rmy': [u'Shopni vakyarimata', u'Discuţie Categorie'],
'ro': u'Discuţie Categorie',
'ru': u'Обсуждение категории',
'sa': u'वर्गसंभाषणं',
'sah': u'Категория ырытыыта',
'sc': u'Cuntierra categoria',
'scn': u'Discussioni catigurìa',
'sd': u'زمرو بحث',
'sg': u'Discussion catégorie',
'sh': u'Razgovor o kategoriji',
'si': u'ප්‍රවර්ග සාකච්ඡාව',
'sk': u'Diskusia ku kategórii',
'sl': u'Pogovor o kategoriji',
'sq': [u'Kategoria diskutim', u'Kategori Diskutim'],
'sr': u'Разговор о категорији',
'srn': [u'Taki fu guru', u'Overleg categorie'],
'stq': u'Kategorie Diskussion',
'su': u'Obrolan kategori',
'sv': u'Kategoridiskussion',
'sw': u'Majadiliano ya jamii',
'szl': u'Dyskusja kategorii',
'ta': u'பகுப்பு பேச்சு',
'te': u'వర్గం చర్చ',
'tet': u'Diskusaun Kategoria',
'tg': u'Баҳси гурӯҳ',
'th': u'คุยเรื่องหมวดหมู่',
'tk': u'Kategoriýa çekişme',
'tl': [u'Usapang kaurian', u'Usapang kategorya'],
'tlh': u"Segh ja'chuq",
'tr': u'Kategori tartışma',
'tt': [u'Төркем бәхәсе', u'Törkem bäxäse'],
'ty': u'Discussion catégorie',
'udm': u'Категория сярысь вераськон',
'uk': u'Обговорення категорії',
'ur': u'تبادلۂ خیال زمرہ',
'uz': u'Turkum munozarasi',
'vec': u'Discussion categoria',
'vi': u'Thảo luận Thể loại',
'vls': u'Discuusje categorie',
'vo': u'Kladibespik',
'wa': u'Categoreye copene',
'wo': [u'Waxtaani wàll', u'Discussion Catégorie'],
'wuu': u'分类讨论',
'xal': u'Әәшлин туск меткән',
'yi': u'קאַטעגאָריע רעדן',
'yo': u'Ọ̀rọ̀ ẹ̀ka',
'za': u'分类讨论',
'zea': u'Overleg categorie',
'zh': [u'Category talk', u'分类讨论', u'分類討論', u'分类对话', u'分類對話'],
},
}
# letters that can follow a wikilink and are regarded as part of
# this link
# This depends on the linktrail setting in LanguageXx.php and on
# [[MediaWiki:Linktrail]].
# Note: this is a regular expression.
self.linktrails = {
'_default': u'[a-z]*',
'de': u'[a-zäöüß]*',
'da': u'[a-zæøå]*',
'fi': u'[a-zåäö]*',
'fr': u'[a-zàâçéèêîôû]*',
'he': u'[a-zא-ת]*',
'hu': u'[a-záéíóúöüőűÁÉÍÓÚÖÜŐŰ]*',
'it': u'[a-zàèéìòù]*',
'kk': u'[a-zäçéğıïñöşüýа-яёәғіқңөұүһʺʹ]*',
'ksh': u'[äöüėëijßəğåůæœça-z]*',
'nl': u'[a-zäöüïëéèéàç]*',
'pt': u'[a-záâàãéêíóôõúüç]*',
'ru': u'[a-zа-я]*',
}
# Wikimedia wikis all use "bodyContent" as the id of the <div>
# element that contains the actual page content; change this for
# wikis that use something else (e.g., mozilla family)
self.content_id = "bodyContent"
# A dictionary where keys are family codes that can be used in
# inter-family interwiki links. Values are not used yet.
# Generated from http://toolserver.org/~daniel/interwiki-en.txt:
# remove interlanguage links from file, then run
# f = open('interwiki-en.txt')
# for line in f.readlines():
# s = line[:line.index('\t')]
# print ((" '%s':" % s).ljust(20) + ("'%s'," % s))
# TODO: replace this with API interwikimap call
self.known_families = {
'abbenormal': 'abbenormal',
'aboutccc': 'aboutccc',
'acadwiki': 'acadwiki',
'acronym': 'acronym',
'advogato': 'advogato',
'airwarfare': 'airwarfare',
'aiwiki': 'aiwiki',
'ajaxxab': 'ajaxxab',
'alife': 'alife',
'allwiki': 'allwiki',
'annotation': 'annotation',
'annotationwiki': 'annotationwiki',
'archivecompress': 'archivecompress',
'archivestream': 'archivestream',
'arxiv': 'arxiv',
'aspienetwiki': 'aspienetwiki',
'atmwiki': 'atmwiki',
'b': 'wikibooks',
'battlestarwiki': 'battlestarwiki',
'bemi': 'bemi',
'benefitswiki': 'benefitswiki',
'biblewiki': 'biblewiki',
'bluwiki': 'bluwiki',
'bmpcn': 'bmpcn',
'boxrec': 'boxrec',
'brasilwiki': 'brasilwiki',
'brazilwiki': 'brazilwiki',
'brickwiki': 'brickwiki',
'bridgeswiki': 'bridgeswiki',
'bryanskpedia': 'bryanskpedia',
'bswiki': 'bswiki',
'bugzilla': 'bugzilla',
'buzztard': 'buzztard',
'bytesmiths': 'bytesmiths',
'c2': 'c2',
'c2find': 'c2find',
'cache': 'cache',
'canyonwiki': 'canyonwiki',
'canwiki': 'canwiki',
'Ĉej': 'Ĉej',
'cellwiki': 'cellwiki',
'changemakers': 'changemakers',
'chapter': 'chapter',
'cheatswiki': 'cheatswiki',
'chej': 'chej',
'ciscavate': 'ciscavate',
'cityhall': 'cityhall',
'ckwiss': 'ckwiss',
'cliki': 'cliki',
'cmwiki': 'cmwiki',
'cndbname': 'cndbname',
'cndbtitle': 'cndbtitle',
'codersbase': 'codersbase',
'colab': 'colab',
'comixpedia': 'comixpedia',
'commons': 'commons',
'communityscheme': 'communityscheme',
'consciousness': 'consciousness',
'corpknowpedia': 'corpknowpedia',
'cpanelwiki': 'cpanelwiki',
'choralwiki': 'choralwiki',
'craftedbycarol': 'craftedbycarol',
'crazyhacks': 'crazyhacks',
'creationmatters': 'creationmatters',
'creatureswiki': 'creatureswiki',
'cxej': 'cxej',
'dawiki': 'dawiki',
'dcdatabase': 'dcdatabase',
'dcma': 'dcma',
'dejanews': 'dejanews',
'delicious': 'delicious',
'demokraatia': 'demokraatia',
'devmo': 'devmo',
'dictionary': 'dictionary',
'dict': 'dict',
'disinfopedia': 'disinfopedia',
'diveintoosx': 'diveintoosx',
'dndwiki': 'dndwiki',
'docbook': 'docbook',
'dolphinwiki': 'dolphinwiki',
'doom_wiki': 'doom_wiki',
'drae': 'drae',
'drumcorpswiki': 'drumcorpswiki',
'dwellerswiki': 'dwellerswiki',
'dwjwiki': 'dwjwiki',
'ebwiki': 'ebwiki',
'eĉei': 'eĉei',
'echei': 'echei',
'echolink': 'echolink',
'ecoreality': 'ecoreality',
'ecxei': 'ecxei',
'editcount': 'editcount',
'efnetceewiki': 'efnetceewiki',
'efnetcppwiki': 'efnetcppwiki',
'efnetpythonwiki': 'efnetpythonwiki',
'efnetxmlwiki': 'efnetxmlwiki',
'elibre': 'elibre',
'eljwiki': 'eljwiki',
'emacswiki': 'emacswiki',
'encyclopediadramatica':'encyclopediadramatica',
'energiewiki': 'energiewiki',
'eokulturcentro': 'eokulturcentro',
'evowiki': 'evowiki',
'fanimutationwiki': 'fanimutationwiki',
'finalempire': 'finalempire',
'finalfantasy': 'finalfantasy',
'finnix': 'finnix',
'firstwiki': 'firstwiki',
'flickruser': 'flickruser',
'floralwiki': 'floralwiki',
'foldoc': 'foldoc',
'forthfreak': 'forthfreak',
'foundation': 'foundation',
'foxwiki': 'foxwiki',
'freebio': 'freebio',
'freebsdman': 'freebsdman',
'freeculturewiki': 'freeculturewiki',
'freefeel': 'freefeel',
'freekiwiki': 'freekiwiki',
'gamewiki': 'gamewiki',
'ganfyd': 'ganfyd',
'gatorpedia': 'gatorpedia',
'gausswiki': 'gausswiki',
'gentoo-wiki': 'gentoo',
'genwiki': 'genwiki',
'glencookwiki': 'glencookwiki',
'globalvoices': 'globalvoices',
'glossarwiki': 'glossarwiki',
'glossarywiki': 'glossarywiki',
'golem': 'golem',
'google': 'google',
'googlegroups': 'googlegroups',
'gotamac': 'gotamac',
'greencheese': 'greencheese',
'guildwiki': 'guildwiki',
'h2wiki': 'h2wiki',
'hammondwiki': 'hammondwiki',
'haribeau': 'haribeau',
'herzkinderwiki': 'herzkinderwiki',
'hewikisource': 'hewikisource',
'hkmule': 'hkmule',
'holshamtraders': 'holshamtraders',
'hrwiki': 'hrwiki',
'hrfwiki': 'hrfwiki',
'humancell': 'humancell',
'hupwiki': 'hupwiki',
'iawiki': 'iawiki',
'imdbname': 'imdbname',
'imdbtitle': 'imdbtitle',
'infoanarchy': 'infoanarchy',
'infobase': 'infobase',
'infosecpedia': 'infosecpedia',
'iso639-3': 'iso639-3',
'iuridictum': 'iuridictum',
'jameshoward': 'jameshoward',
'jargonfile': 'jargonfile',
'javanet': 'javanet',
'javapedia': 'javapedia',
'jefo': 'jefo',
'jiniwiki': 'jiniwiki',
'jspwiki': 'jspwiki',
'jstor': 'jstor',
'kamelo': 'kamelo',
'karlsruhe': 'karlsruhe',
'kerimwiki': 'kerimwiki',
'kinowiki': 'kinowiki',
'kmwiki': 'kmwiki',
'knowhow': 'knowhow',
'kontuwiki': 'kontuwiki',
'koslarwiki': 'koslarwiki',
'lanifexwiki': 'lanifexwiki',
'linuxwiki': 'linuxwiki',
'linuxwikide': 'linuxwikide',
'liswiki': 'liswiki',
'lojban': 'lojban',
'lollerpedia': 'lollerpedia',
'lovebox': 'lovebox',
'lqwiki': 'lqwiki',
'lugkr': 'lugkr',
'lurkwiki': 'lurkwiki',
'lutherwiki': 'lutherwiki',
'lvwiki': 'lvwiki',
'm': 'meta',
'm-w': 'm-w',
'mail': 'mail',
'marveldatabase': 'marveldatabase',
'mathsongswiki': 'mathsongswiki',
'mbtest': 'mbtest',
'meatball': 'meatball',
'mediazilla': 'mediazilla',
'memoryalpha': 'memoryalpha',
'meta': 'meta',
'metareciclagem': 'metareciclagem',
'metaweb': 'metaweb',
'metawiki': 'metawiki',
'metawikipedia': 'metawikipedia',
'mineralienatlas': 'mineralienatlas',
'mjoo': 'mjoo',
'moinmoin': 'moinmoin',
'mozcom': 'mozcom',
'mozillawiki': 'mozillawiki',
'mozillazinekb': 'mozillazinekb',
'mozwiki': 'mozwiki',
'musicbrainz': 'musicbrainz',
'muweb': 'muweb',
'mw': 'mw',
'mwod': 'mwod',
'mwot': 'mwot',
'myspace': 'myspace',
'mytips': 'mytips',
'n': 'wikinews',
'netvillage': 'netvillage',
'nkcells': 'nkcells',
'nomad': 'nomad',
'nosmoke': 'nosmoke',
'nost': 'nost',
'nswiki': 'nswiki',
'oeis': 'oeis',
'oldwikisource': 'oldwikisource',
'onelook': 'onelook',
'ourpeachtreecorners':'ourpeachtreecorners',
'openfacts': 'openfacts',
'opensourcesportsdirectory':'opensourcesportsdirectory',
'openwetware': 'openwetware',
'openwiki': 'openwiki',
'opera7wiki': 'opera7wiki',
'organicdesign': 'organicdesign',
'orgpatterns': 'orgpatterns',
'orthodoxwiki': 'orthodoxwiki',
'osi reference model':'osi reference model',
'ourmedia': 'ourmedia',
'paganwiki': 'paganwiki',
'panawiki': 'panawiki',
'pangalacticorg': 'pangalacticorg',
'patwiki': 'patwiki',
'perlconfwiki': 'perlconfwiki',
'perlnet': 'perlnet',
'personaltelco': 'personaltelco',
'phwiki': 'phwiki',
'phpwiki': 'phpwiki',
'pikie': 'pikie',
'planetmath': 'planetmath',
'pmeg': 'pmeg',
'pmwiki': 'pmwiki',
'purlnet': 'purlnet',
'pythoninfo': 'pythoninfo',
'pythonwiki': 'pythonwiki',
'pywiki': 'pywiki',
'psycle': 'psycle',
'q': 'wikiquote',
'quakewiki': 'quakewiki',
'qwiki': 'qwiki',
'r3000': 'r3000',
'rakwiki': 'rakwiki',
'raec': 'raec',
'redwiki': 'redwiki',
'revo': 'revo',
'rfc': 'rfc',
'rheinneckar': 'rheinneckar',
'robowiki': 'robowiki',
'rowiki': 'rowiki',
'rtfm': 'rtfm',
's': 'wikisource',
's23wiki': 's23wiki',
'scoutpedia': 'scoutpedia',
'seapig': 'seapig',
'seattlewiki': 'seattlewiki',
'seattlewireless': 'seattlewireless',
'seeds': 'seeds',
'senseislibrary': 'senseislibrary',
'sep11': 'sep11',
'shakti': 'shakti',
'shownotes': 'shownotes',
'siliconvalley': 'siliconvalley',
'slashdot': 'slashdot',
'slskrex': 'slskrex',
'smikipedia': 'smikipedia',
'sockwiki': 'sockwiki',
'sourceforge': 'sourceforge',
'sourcextreme': 'sourcextreme',
'squeak': 'squeak',
'strategy': 'strategy',
'stockphotoss': 'stockphotoss',
'strikiwiki': 'strikiwiki',
'susning': 'susning',
'svgwiki': 'svgwiki',
'swinbrain': 'swinbrain',
'swingwiki': 'swingwiki',
'tabwiki': 'tabwiki',
'takipedia': 'takipedia',
'tamriel': 'tamriel',
'tavi': 'tavi',
'tclerswiki': 'tclerswiki',
'technorati': 'technorati',
'tejo': 'tejo',
'terrorwiki': 'terrorwiki',
'tesoltaiwan': 'tesoltaiwan',
'thelemapedia': 'thelemapedia',
'theo': 'theo',
'theopedia': 'theopedia',
'theowiki': 'theowiki',
'theppn': 'theppn',
'thinkwiki': 'thinkwiki',
'tibiawiki': 'tibiawiki',
'tmbw': 'tmbw',
'tmnet': 'tmnet',
'tmwiki': 'tmwiki',
'toyah': 'toyah',
'trash!italia': 'trash!italia',
'turismo': 'turismo',
'tviv': 'tviv',
'twiki': 'twiki',
'twistedwiki': 'twistedwiki',
'tyvawiki': 'tyvawiki',
'uncyclopedia': 'uncyclopedia',
'underverse': 'underverse',
'unreal': 'unreal',
'ursine': 'ursine',
'usej': 'usej',
'usemod': 'usemod',
'v': 'wikiversity',
'videoville': 'videoville',
'villagearts': 'villagearts',
'visualworks': 'visualworks',
'vkol': 'vkol',
'voipinfo': 'voipinfo',
'w': 'wikipedia',
'warpedview': 'warpedview',
'webdevwikinl': 'webdevwikinl',
'webisodes': 'webisodes',
'webseitzwiki': 'webseitzwiki',
'wiki': 'wiki',
'wikia': 'wikia',
'wikianso': 'wikianso',
'wikibooks': 'wikibooks',
'wikichristian': 'wikichristian',
'wikicities': 'wikicities',
'wikif1': 'wikif1',
'wikifur': 'wikifur',
'wikikto': 'wikikto',
'wikimac-de': 'wikimac-de',
'wikimac-fr': 'wikimac-fr',
'wikimedia': 'wikimedia',
'wikinews': 'wikinews',
'wikinfo': 'wikinfo',
'wikinurse': 'wikinurse',
'wikipaltz': 'wikipaltz',
'wikipedia': 'wikipedia',
'wikipediawikipedia':'wikipediawikipedia',
'wikiquote': 'wikiquote',
'wikireason': 'wikireason',
'wikisophia': 'wikisophia',
'wikisource': 'wikisource',
'wikiscripts': 'wikiscripts',
'wikispecies': 'wikispecies',
'wikiti': 'wikiti',
'wikitravel': 'wikitravel',
'wikitree': 'wikitree',
'wikiveg': 'wikiveg',
'wikiversity': 'wikiversity',
'wikiwikiweb': 'wikiwikiweb',
'wikiworld': 'wikiworld',
'wikt': 'wiktionary',
'wiktionary': 'wiktionary',
'wipipedia': 'wipipedia',
'wlug': 'wlug',
'wlwiki': 'wlwiki',
'wmania': 'wmania',
'wookieepedia': 'wookieepedia',
'world66': 'world66',
'wowwiki': 'wowwiki',
'wqy': 'wqy',
'wurmpedia': 'wurmpedia',
'wznan': 'wznan',
'xboxic': 'xboxic',
'ypsieyeball': 'ypsieyeball',
'zrhwiki': 'zrhwiki',
'zum': 'zum',
'zwiki': 'zwiki',
'zzz wiki': 'zzz wiki',
}
# A list of category redirect template names in different languages
# Note: It *is* necessary to list template redirects here
self.category_redirect_templates = {
'_default': []
}
# A list of disambiguation template names in different languages
self.disambiguationTemplates = {
'_default': []
}
# A list of projects that share cross-project sessions.
self.cross_projects = []
# A list with the name for cross-project cookies.
# default for wikimedia centralAuth extensions.
self.cross_projects_cookies = ['centralauth_Session',
'centralauth_Token',
'centralauth_User']
self.cross_projects_cookie_username = 'centralauth_User'
# A list with the name in the cross-language flag permissions
self.cross_allowed = []
# A list with the name of the category containing disambiguation
# pages for the various languages. Only one category per language,
# and without the namespace, so add things like:
# 'en': "Disambiguation"
self.disambcatname = {}
# On most wikis page names must start with a capital letter, but some
# languages don't use this.
self.nocapitalize = []
# attop is a list of languages that prefer to have the interwiki
# links at the top of the page.
self.interwiki_attop = []
# on_one_line is a list of languages that want the interwiki links
# one-after-another on a single line
self.interwiki_on_one_line = []
# String used as separator between interwiki links and the text
self.interwiki_text_separator = '\r\n\r\n'
# Similar for category
self.category_attop = []
# on_one_line is a list of languages that want the category links
# one-after-another on a single line
self.category_on_one_line = []
# String used as separator between category links and the text
self.category_text_separator = '\r\n\r\n'
# When both at the bottom should categories come after interwikilinks?
self.categories_last = []
# Which languages have a special order for putting interlanguage
# links, and what order is it? If a language is not in
# interwiki_putfirst, alphabetical order on language code is used.
# For languages that are in interwiki_putfirst, interwiki_putfirst
# is checked first, and languages are put in the order given there.
# All other languages are put after those, in code-alphabetical
# order.
self.interwiki_putfirst = {}
# Languages in interwiki_putfirst_doubled should have a number plus
# a list of languages. If there are at least the number of interwiki
# links, all languages in the list should be placed at the front as
# well as in the normal list.
self.interwiki_putfirst_doubled = {} # THIS APPEARS TO BE UNUSED!
# Some families, e. g. commons and meta, are not multilingual and
# forward interlanguage links to another family (wikipedia).
# These families can set this variable to the name of the target
# family.
self.interwiki_forward = None
# Which language codes no longer exist and by which language code
# should they be replaced. If for example the language with code xx:
# now should get code yy:, add {'xx':'yy'} to obsolete. If all
# links to language xx: should be removed, add {'xx': None}.
self.obsolete = {}
# Language codes of the largest wikis. They should be roughly sorted
# by size.
self.languages_by_size = []
# Some languages belong to a group where the possibility is high that
# equivalent articles have identical titles among the group.
self.language_groups = {
# languages using the arabic script (incomplete)
'arab' : [
'ar', 'arz', 'ps', 'sd', 'ur', 'ckb',
# languages using multiple scripts, including arabic
'kk', 'ku', 'tt', 'ug', 'pnb'
],
# languages that use chinese symbols
'chinese': [
'wuu', 'zh', 'zh-classical', 'zh-yue', 'gan', 'ii',
# languages using multiple/mixed scripts, including chinese
'ja', 'za'
],
# languages that use the cyrillic alphabet
'cyril': [
'ab', 'av', 'ba', 'be', 'be-x-old', 'bg', 'bxr', 'ce', 'cu', 'cv', 'kv',
'ky', 'mk', 'lbe', 'mdf', 'mn', 'mo', 'myv', 'os', 'ru', 'sah', 'tg',
'tk', 'udm', 'uk', 'xal', 'mhr',
# languages using multiple scripts, including cyrillic
'ha', 'kk', 'sh', 'sr', 'tt'
],
# languages that use a greek script
'grec': [
'el', 'grc', 'pnt'
# languages using multiple scripts, including greek
],
# languages that use the latin alphabet
'latin': [
'aa', 'ace', 'af', 'ak', 'als', 'an', 'ang', 'ast', 'ay', 'bar',
'bat-smg', 'bcl', 'bi', 'bm', 'br', 'bs', 'ca', 'cbk-zam', 'cdo', 'ceb',
'ch', 'cho', 'chy', 'co', 'crh', 'cs', 'csb', 'cy', 'da', 'de',
'diq', 'dsb', 'ee', 'eml', 'en', 'eo', 'es', 'et', 'eu', 'ext',
'ff', 'fi', 'fiu-vro', 'fj', 'fo', 'fr', 'frp', 'fur', 'fy', 'ga',
'gd', 'gl', 'gn', 'gv', 'hak', 'haw', 'hif', 'ho', 'hr', 'hsb',
'ht', 'hu', 'hz', 'ia', 'id', 'ie', 'ig', 'ik', 'ilo', 'io',
'is', 'it', 'jbo', 'jv', 'kaa', 'kab', 'kg', 'ki', 'kj', 'kl',
'kr', 'ksh', 'kw', 'la', 'lad', 'lb', 'lg', 'li', 'lij', 'lmo',
'ln', 'lt', 'lv', 'map-bms', 'mg', 'mh', 'mi', 'ms', 'mt', 'mus',
'mwl', 'na', 'nah', 'nap', 'nds', 'nds-nl', 'ng', 'nl', 'nn', 'no',
'nov', 'nrm', 'nv', 'ny', 'oc', 'om', 'pag', 'pam', 'pap', 'pcd',
'pdc', 'pih', 'pl', 'pms', 'pt', 'qu', 'rm', 'rn', 'ro', 'roa-rup',
'roa-tara', 'rw', 'sc', 'scn', 'sco', 'se', 'sg', 'simple', 'sk', 'sl',
'sm', 'sn', 'so', 'sq', 'srn', 'ss', 'st', 'stq', 'su', 'sv',
'sw', 'szl', 'tet', 'tl', 'tn', 'to', 'tpi', 'tr', 'ts', 'tum',
'tw', 'ty', 'uz', 've', 'vec', 'vi', 'vls', 'vo', 'wa', 'war',
'wo', 'xh', 'yo', 'zea', 'zh-min-nan', 'zu',
# languages using multiple scripts, including latin
'az', 'chr', 'ckb', 'ha', 'iu', 'kk', 'ku', 'rmy', 'sh', 'sr',
'tt', 'ug', 'za'
],
# Scandinavian languages
'scand': [
'da', 'fo', 'is', 'nb', 'nn', 'no', 'sv'
],
}
# LDAP domain if your wiki uses LDAP authentication,
# http://www.mediawiki.org/wiki/Extension:LDAP_Authentication
self.ldapDomain = ()
# Allows crossnamespace interwiki linking.
# Lists the possible crossnamespaces combinations
# keys are originating NS
# values are dicts where:
# keys are the originating langcode, or _default
# values are dicts where:
# keys are the languages that can be linked to from the lang+ns, or
# '_default'; values are a list of namespace numbers
self.crossnamespace = {}
##
## Examples :
## Allowing linking to pt' 102 NS from any other lang' 0 NS is
# self.crossnamespace[0] = {
# '_default': { 'pt': [102]}
# }
## While allowing linking from pt' 102 NS to any other lang' = NS is
# self.crossnamespace[102] = {
# 'pt': { '_default': [0]}
# }
def _addlang(self, code, location, namespaces = {}):
"""Add a new language to the langs and namespaces of the family.
This is supposed to be called in the constructor of the family."""
self.langs[code] = location
for num, val in namespaces.iteritems():
self.namespaces[num][code]=val
def get_known_families(self, site):
return self.known_families
def linktrail(self, code, fallback = '_default'):
if code in self.linktrails:
return self.linktrails[code]
elif fallback:
return self.linktrails[fallback]
else:
raise KeyError(
"ERROR: linktrail in language %s unknown"
% code)
def namespace(self, code, ns_number, fallback = '_default', all = False):
if not self.isDefinedNS(ns_number):
raise KeyError('ERROR: Unknown namespace %d for %s:%s' % (ns_number, code, self.name))
elif self.isNsI18N(ns_number, code):
v = self.namespaces[ns_number][code]
if type(v) is not list:
v = [v,]
if all and self.isNsI18N(ns_number, fallback):
v2 = self.namespaces[ns_number][fallback]
if type(v2) is list:
v.extend(v2)
else:
v.append(v2)
elif fallback and self.isNsI18N(ns_number, fallback):
v = self.namespaces[ns_number][fallback]
if type(v) is not list:
v = [v,]
else:
raise KeyError('ERROR: title for namespace %d in language %s unknown' % (ns_number, code))
if all:
namespaces = []
# Unique list
for ns in v:
if ns not in namespaces:
namespaces.append(ns)
# Lowercase versions of namespaces
if code not in self.nocapitalize:
namespaces.extend([ns[0].lower() + ns[1:] for ns in namespaces if ns and ns[0].lower() != ns[0].upper()])
# Underscore versions of namespaces
namespaces.extend([ns.replace(' ', '_') for ns in namespaces if ns and ' ' in ns])
return tuple(namespaces)
else:
return v[0]
def isDefinedNS(self, ns_number):
"""Return True if the namespace has been defined in this family.
"""
return ns_number in self.namespaces
def isNsI18N(self, ns_number, code):
"""Return True if the namespace has been internationalized.
(it has a custom entry for a given language)"""
return code in self.namespaces[ns_number]
def isDefinedNSLanguage(self, ns_number, code, fallback='_default'):
"""Return True if the namespace has been defined in this family
for this language or its fallback.
"""
if not self.isDefinedNS(ns_number):
return False
elif self.isNsI18N(ns_number, code):
return True
elif fallback and self.isNsI18N(ns_number, fallback):
return True
else:
return False
def normalizeNamespace(self, code, value):
"""Given a value, attempt to match it with all available namespaces,
with default and localized versions. Sites may have more than one
way to write the same namespace - choose the first one in the list.
If nothing can be normalized, return the original value.
"""
for ns, localized_ns in self.namespaces.iteritems():
if code in localized_ns:
valid = localized_ns[code]
if isinstance(valid, basestring):
valid = [valid]
else:
valid = valid[:]
else:
valid = []
if '_default' in localized_ns:
default = localized_ns['_default']
if isinstance(default, basestring):
default = [default]
if default:
valid.extend(default)
if not valid:
continue
if value in valid:
return self.namespace(code, ns)
return value
def getNamespaceIndex(self, lang, namespace):
"""Given a namespace, attempt to match it with all available
namespaces. Sites may have more than one way to write the same
namespace - choose the first one in the list. Returns namespace
index or None.
"""
namespace = namespace.lower()
for n in self.namespaces.keys():
try:
nslist = self.namespaces[n][lang]
if type(nslist) is not list:
nslist = [nslist]
for ns in nslist:
if ns.lower() == namespace:
return n
except (KeyError,AttributeError):
# The namespace has no localized name defined
pass
if lang != '_default':
# This is not a localized namespace. Try if it
# is a default (English) namespace.
return self.getNamespaceIndex('_default', namespace)
else:
# give up
return None
def category_redirects(self, code, fallback="_default"):
if code in self.category_redirect_templates:
return self.category_redirect_templates[code]
elif fallback:
return self.category_redirect_templates[fallback]
else:
raise KeyError(
"ERROR: title for category redirect template in language '%s' unknown"
% code)
def disambig(self, code, fallback = '_default'):
if code in self.disambiguationTemplates:
return self.disambiguationTemplates[code]
elif fallback:
return self.disambiguationTemplates[fallback]
else:
raise KeyError(
"ERROR: title for disambig template in language %s unknown"
% code)
# Returns the title of the special namespace in language 'code', taken from
# dictionary above.
# If the dictionary doesn't contain a translation, it will use language
# 'fallback' (or, if fallback isn't given, MediaWiki default).
# If you want the bot to crash in case of an unknown namespace name, use
# fallback = None.
def special_namespace(self, code, fallback = '_default'):
return self.namespace(code, -1, fallback)
def special_namespace_url(self, code, fallback = '_default'):
encoded_title = self.namespace(code, -1, fallback).encode(self.code2encoding(code))
return urllib.quote(encoded_title)
def image_namespace(self, code, fallback = '_default'):
return self.namespace(code, 6, fallback)
def image_namespace_url(self, code, fallback = '_default'):
encoded_title = self.namespace(code, 6, fallback).encode(self.code2encoding(code))
return urllib.quote(encoded_title)
def mediawiki_namespace(self, code, fallback = '_default'):
return self.namespace(code, 8, fallback)
def template_namespace(self, code, fallback = '_default'):
return self.namespace(code, 10, fallback)
def category_namespace(self, code, fallback = '_default'):
return self.namespace(code, 14, fallback)
def category_namespaces(self, code):
return self.namespace(code, 14, all = True)
# Methods
def protocol(self, code):
"""
Can be overridden to return 'https'.
Other protocols are not supported.
"""
return 'http'
def hostname(self, code):
"""The hostname to use for standard http connections."""
return self.langs[code]
def scriptpath(self, code):
"""The prefix used to locate scripts on this wiki.
This is the value displayed when you enter {{SCRIPTPATH}} on a
wiki page (often displayed at [[Help:Variables]] if the wiki has
copied the master help page correctly).
The default value is the one used on Wikimedia Foundation wikis,
but needs to be overridden in the family file for any wiki that
uses a different value.
"""
return '/w'
def path(self, code):
return '%s/index.php' % self.scriptpath(code)
def querypath(self, code):
return '%s/query.php' % self.scriptpath(code)
def apipath(self, code):
return '%s/api.php' % self.scriptpath(code)
def nicepath(self, code):
return '/wiki/'
def dbName(self, code):
# returns the name of the MySQL database
return '%s%s' % (code, self.name)
# Which version of MediaWiki is used?
def version(self, code):
"""Return MediaWiki version number as a string."""
# Don't use this, use versionnumber() instead. This only exists
# to not break family files.
return '1.13alpha'
def versionnumber(self, code):
"""Return an int identifying MediaWiki version.
Currently this is implemented as returning the minor version
number; i.e., 'X' in version '1.X.Y'
"""
R = re.compile(r"(\d+).(\d+)")
M = R.search(self.version(code))
if not M:
# Version string malformatted; assume it should have been 1.10
return 10
return 1000 * int(M.group(1)) + int(M.group(2)) - 1000
def page_action_address(self, code, name, action):
return '%s?title=%s&action=%s&useskin=monobook' % (self.path(code), name, action)
def put_address(self, code, name):
return '%s?title=%s&action=submit&useskin=monobook' % (self.path(code), name)
def get_address(self, code, name):
return '%s?title=%s&redirect=no&useskin=monobook' % (self.path(code), name)
# The URL to get a page, in the format indexed by Google.
def nice_get_address(self, code, name):
return '%s%s' % (self.nicepath(code), name)
def edit_address(self, code, name):
return '%s?title=%s&action=edit&useskin=monobook' % (self.path(code), name)
def purge_address(self, code, name):
return '%s?title=%s&redirect=no&action=purge&useskin=monobook' % (self.path(code), name)
def references_address(self, code, name):
return '%s?title=%s:Whatlinkshere&target=%s&limit=%d&useskin=monobook' % (self.path(code), self.special_namespace_url(code), name, config.special_page_limit)
def upload_address(self, code):
return '%s?title=%s:Upload&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def double_redirects_address(self, code, default_limit = True):
if default_limit:
return '%s?title=%s:DoubleRedirects&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
else:
return '%s?title=%s:DoubleRedirects&limit=%d&useskin=monobook' % (self.path(code), self.special_namespace_url(code), config.special_page_limit)
def broken_redirects_address(self, code, default_limit = True):
if default_limit:
return '%s?title=%s:BrokenRedirects&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
else:
return '%s?title=%s:BrokenRedirects&limit=%d&useskin=monobook' % (self.path(code), self.special_namespace_url(code), config.special_page_limit)
def random_address(self, code):
return "%s?title=%s:Random&useskin=monobook" % (self.path(code), self.special_namespace_url(code))
def randomredirect_address(self, code):
return "%s?title=%s:RandomRedirect&useskin=monobook" % (self.path(code), self.special_namespace_url(code))
def allmessages_address(self, code):
return "%s?title=%s:Allmessages&ot=html&useskin=monobook" % (self.path(code), self.special_namespace_url(code))
def login_address(self, code):
return '%s?title=%s:Userlogin&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def captcha_image_address(self, code, id):
return '%s?title=%s:Captcha/image&wpCaptchaId=%s&useskin=monobook' % (self.path(code), self.special_namespace_url(code), id)
def watchlist_address(self, code):
return '%s?title=%s:Watchlist/edit&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def contribs_address(self, code, target, limit=500, offset=''):
return '%s?title=%s:Contributions&target=%s&limit=%s&offset=%s&useskin=monobook' % (self.path(code), self.special_namespace_url(code), target, limit, offset)
def move_address(self, code):
return '%s?title=%s:Movepage&action=submit&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def delete_address(self, code, name):
return '%s?title=%s&action=delete&useskin=monobook' % (self.path(code), name)
def undelete_view_address(self, code, name, ts=''):
return '%s?title=%s:Undelete&target=%s&timestamp=%s&useskin=monobook' % (self.path(code), self.special_namespace_url(code), name, ts)
def undelete_address(self, code):
return '%s?title=%s:Undelete&action=submit&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def protect_address(self, code, name):
return '%s?title=%s&action=protect&useskin=monobook' % (self.path(code), name)
def unprotect_address(self, code, name):
return '%s?title=%s&action=unprotect&useskin=monobook' % (self.path(code), name)
def block_address(self, code):
return '%s?title=%s:Blockip&action=submit&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def unblock_address(self, code):
return '%s?title=%s:Ipblocklist&action=submit&useskin=monobook' % (self.path(code), self.special_namespace_url(code))
def blocksearch_address(self, code, name):
return '%s?title=%s:Ipblocklist&action=search&ip=%s&useskin=monobook' % (self.path(code), self.special_namespace_url(code), name)
def linksearch_address(self, code, link, limit=500, offset=0):
return '%s?title=%s:Linksearch&limit=%d&offset=%d&target=%s&useskin=monobook' % (self.path(code), self.special_namespace_url(code), limit, offset, link)
def version_history_address(self, code, name, limit = config.special_page_limit):
return '%s?title=%s&action=history&limit=%d&useskin=monobook' % (self.path(code), name, limit)
def export_address(self, code):
return '%s?title=%s:Export&useskin=monobook' % (self.path(code), self.special_namespace_url('_default'))
def query_address(self, code):
return '%s?' % self.querypath(code)
def api_address(self, code):
return '%s?' % self.apipath(code)
def search_address(self, code, query, limit=100, namespaces = None):
"""
Constructs a URL for searching using Special:Search
'namespaces' may be an int or a list; an empty list selects
all namespaces. Defaults to namespace 0
"""
namespace_params = ''
if namespaces is not None:
if isinstance(namespaces, int):
namespace_params = "&ns%d=1" % namespaces
elif isinstance (namespaces, list):
if len(namespaces) == 0:
# add all namespaces
namespaces = self.namespaces.keys()
for i in namespaces:
if i >= 0:
namespace_params = namespace_params + '&ns%d=1' % i
return "%s?title=%s:Search&search=%s&limit=%d%s&fulltext=1&useskin=monobook" % (self.path(code),
self.special_namespace_url(code),
query,
limit,
namespace_params)
def allpages_address(self, code, start, namespace = 0):
if self.version(code)=="1.2":
return '%s?title=%s:Allpages&printable=yes&from=%s&useskin=monobook' % (
self.path(code), self.special_namespace_url(code), start)
else:
return '%s?title=%s:Allpages&from=%s&namespace=%s&useskin=monobook' % (
self.path(code), self.special_namespace_url(code), start, namespace)
def log_address(self, code, limit=50, mode = '', user = ''):
return "%s?title=Special:Log&type=%s&user=%s&page=&limit=%d&useskin=monobook" % (self.path(code), mode, user, limit)
def newpages_address(self, code, limit=50, namespace=0):
return "%s?title=%s:Newpages&limit=%d&namespace=%s&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit, namespace)
def longpages_address(self, code, limit=500):
return "%s?title=%s:Longpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def shortpages_address(self, code, limit=500):
return "%s?title=%s:Shortpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def categories_address(self, code, limit=500):
return "%s?title=%s:Categories&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def unusedfiles_address(self, code, limit=500):
return "%s?title=%s:Unusedimages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def deadendpages_address(self, code, limit=500):
return "%s?title=%s:Deadendpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def ancientpages_address(self, code, limit=500):
return "%s?title=%s:Ancientpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def lonelypages_address(self, code, limit=500):
return "%s?title=%s:Lonelypages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def protectedpages_address(self, code, limit=500):
return "%s?title=%s:ProtectedPages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def unwatchedpages_address(self, code, limit=500):
return "%s?title=%s:Unwatchedpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def uncategorizedcategories_address(self, code, limit=500):
return "%s?title=%s:Uncategorizedcategories&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def uncategorizedimages_address(self, code, limit=500):
return "%s?title=%s:Uncategorizedimages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def uncategorizedpages_address(self, code, limit=500):
return "%s?title=%s:Uncategorizedpages&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def unusedcategories_address(self, code, limit=500):
return "%s?title=%s:Unusedcategories&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def withoutinterwiki_address(self, code, limit=500):
return "%s?title=%s:Withoutinterwiki&limit=%d&useskin=monobook" % (self.path(code), self.special_namespace_url(code), limit)
def code2encoding(self, code):
"""Return the encoding for a specific language wiki"""
return 'utf-8'
def code2encodings(self, code):
"""Return a list of historical encodings for a specific language
wiki"""
return self.code2encoding(code),
# aliases
def encoding(self, code):
"""Return the encoding for a specific language wiki"""
return self.code2encoding(code)
def encodings(self, code):
"""Return a list of historical encodings for a specific language
wiki"""
return self.code2encodings(code)
def __cmp__(self, otherfamily):
try:
return cmp(self.name, otherfamily.name)
except AttributeError:
return cmp(id(self), id(otherfamily))
def __hash__(self):
return hash(self.name)
def __repr__(self):
return 'Family("%s")' % self.name
def RversionTab(self, code):
"""Change this to some regular expression that shows the page we
found is an existing page, in case the normal regexp does not work."""
return None
def has_query_api(self, code):
"""Is query.php installed in the wiki?"""
return False
def shared_image_repository(self, code):
"""Return the shared image repository, if any."""
return (None, None)
def server_time(self):
"""Returns a datetime object representing server time"""
# TODO : If the local computer time is wrong, result wll be wrong
return datetime.utcnow() + self.servergmtoffset
def isPublic(self):
"""Does the wiki require logging in before viewing it?"""
return True
def post_get_convert(self, site, getText):
"""Does a conversion on the retrieved text from the wiki
i.e. Esperanto X-conversion """
return getText
def pre_put_convert(self, site, putText):
"""Does a conversion on the text to insert on the wiki
i.e. Esperanto X-conversion """
return putText
diff --git a/featured.py b/featured.py
index 5947514c..5a39e60b 100644
--- a/featured.py
+++ b/featured.py
@@ -1,636 +1,637 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
This script understands various command-line arguments:
-interactive: ask before changing each page
-nocache doesn't include /cache/featured /cache/lists or /cache/good
file to remember if the article already was verified.
-fromlang:xx,yy xx,yy,zz,.. are the languages to be verified.
-fromlang:ar--fi Another possible with range the languages
-fromall to verify all languages.
-after:zzzz process pages after and including page zzzz
-top use -top if you want to move all {{Link FA|lang}} to the top
of the interwiki links. Default is placing {{Link FA|lang}}
next to the corresponding interwiki link.
-count Only counts how many featured/good articles exist
on all wikis (given with the "-fromlang" argument) or
on several language(s) (when using the "-fromall" argument).
Example: featured.py -fromlang:en,he -count
counts how many featured articles exist in the en and he
wikipedias.
-lists use this script for featured lists.
-good use this script for good articles.
-quiet no corresponding pages are displayed.
-dry for debug purposes. No changes will be made.
usage: featured.py [-interactive] [-nocache] [-top] [-after:zzzz] [-fromlang:xx,yy--zz|-fromall]
"""
__version__ = '$Id$'
#
# (C) Maxim Razin, 2005
# (C) Leonardo Gregianin, 2005-2008
# (C) xqt, 2009-2010
# (C) Pywikipedia bot team, 2005-2010
#
# Distributed under the terms of the MIT license.
#
import sys, re, pickle, os.path
import wikipedia, catlib, config
def CAT(site,name):
name = site.namespace(14) + ':' + name
cat=catlib.Category(site, name)
return cat.articles()
def BACK(site,name):
name = site.namespace(10) + ':' + name
p=wikipedia.Page(site, name)
return [page for page in p.getReferences(follow_redirects = False, onlyTemplateInclusion=True)]
msg = {
'als':u'Bötli: [[%s:%s]] isch en bsunders glungener Artikel',
'ar': u'بوت: [[%s:%s]] هي مقالة مختارة',
'bat-smg': u'robots: Pavīzdėnė straipsnė nūruoda [[%s:%s]]',
'be-x-old': u'Робат: [[%s:%s]] — абраны артыкул',
'bs': u'Bot: Interwiki za izabrane članke za [[%s:%s]]',
'cs': u'Robot přidal nejlepší článek: [[%s:%s]]',
'cy': u'Robot: Mae [[%s:%s]] yn erthygl ddethol',
'de': u'Bot: [[%s:%s]] ist ein ausgezeichneter Artikel',
'dsb':u'Bot: [[%s:%s]] jo wuběrny nastawk',
'en': u'Bot: [[%s:%s]] is a featured article',
'eo': u'roboto: [[%s:%s]] estas artikolo elstara',
'es': u'Bot: Enlace a artículo destacado para: [[%s:%s]]',
'fa': u' ربات: [[%s:%s]] یک مقاله برگزیده‌است',
'fi': u'Botti: [[%s:%s]] on suositeltu artikkeli',
'fr': u'Bot: Lien AdQ pour [[%s:%s]]',
'he': u'בוט: קישור לערך מומלץ עבור [[%s:%s]]',
'hr': u'Bot: Interwiki za izabrane članke za [[%s:%s]]',
'hsb':u'Bot: [[%s:%s]] je wuběrny nastawk',
'hu': u'Bot: a(z) [[%s:%s]] kiemelt szócikk',
'ia': u'Robot: Ligamine verso articulo eminente [[%s:%s]]',
'it': u'Bot: collegamento articolo in vetrina [[%s:%s]]',
'ja': u'ロボットによる: 秀逸な項目へのリンク [[%s:%s]]',
'ka': u'ბოტი: რჩეული სტატიის ბმული გვერდისათვის [[%s:%s]]',
'ko': u'로봇: 알찬 글 [[%s:%s]] 를 가리키는 링크',#로봇이:?
'ksh':u'bot: [[%s:%s]] ess_enen ußjezëijshneten Atikkel',
'lb': u'Bot: Exzellenten Arikel Link op [[%s:%s]]',
'lt': u'Bot: Pavyzdinis straipsnis [[%s:%s]]',
'nl': u'Bot: verwijzing naar etalage-artikel voor [[%s:%s]]',
'no': u'bot: [[%s:%s]] er en utmerka artikkel',
'nn': u'bot: [[%s:%s]] er ein god artikkel',
'mk': u'Бот: Интервики за избрани статии за [[%s:%s]]',
'pl': u'Bot: Link do artykułu wyróżnionego [[%s:%s]]',
'pt': u'Bot: Ligando artigos destacados para [[%s:%s]]',
'ru': u'Робот: избранная статья [[%s:%s]]',
'sk': u'Bot: [[%s:%s]] je najlepší článok',
'sr': u'Bot: Међувики за изабране чланке за [[%s:%s]]',
'sv': u'Bot: [[%s:%s]] är en utmärkt artikel',
'th': u'บอต: ลิงก์บทความคัดสรร [[%s:%s]]',
'tr': u'Bot değişikliği: [[%s:%s]] madde bağlantısı eklendi',
'vo': u'Bot: Yüm yegeda gudik tefü [[%s:%s]]',
'zh': u'機器人: 連結特色條目 [[%s:%s]]',
}
msg_good = {
'als': u'Bötli: [[%s:%s]] isch en glungener Artikel',
'ar': u'بوت: [[%s:%s]] هي مقالة جيدة',
'cy': u'Robot: Mae [[%s:%s]] yn erthygl dda',
'de': u'Bot: [[%s:%s]] ist ein lesenswerter Artikel',
'en': u'Bot: [[%s:%s]] is a good article',
'eo': u'roboto: [[%s:%s]] estas artikolo leginda',
'es': u'Bot: Enlace a artículo bueno para: [[%s:%s]]',
'fr': u'Bot: Lien BA pour [[%s:%s]]',
'ksh':u'bot: [[%s:%s]] ess_enen jooden Atikkel',
'no': u'bot: [[%s:%s]] er en anbefalt artikkel',
'nn': u'bot: [[%s:%s]] er ein god artikkel',
'pl': u'Bot: Link do dobrego artykułu: [[%s:%s]]',
'ru': u'Робот: хорошая статья [[%s:%s]]',
'sv': u'Bot: [[%s:%s]] är en läsvärd artikel',
}
msg_lists = {
'als':u'Bötli: [[%s:%s]] isch e bsunders glungene Lischte',
'ar': u'بوت: [[%s:%s]] هي قائمة مختارة',
'de': u'Bot: [[%s:%s]] ist eine informative Liste',
'en': u'Bot: [[%s:%s]] is a featured list',
'es': u'Bot: Enlace a lista destacado para: [[%s:%s]]',
'fi': u'Botti: [[%s:%s]] on suositeltu luetteloon',
'ksh':u'bot: [[%s:%s]] ess_en joode Leß',
'sv': u'Bot: [[%s:%s]] är en utmärkt list',
}
# ALL wikis use 'Link FA', and sometimes other localized templates.
# We use _default AND the localized ones
template = {
'_default': ['Link FA'],
'als': ['LinkFA'],
'an': ['Destacato', 'Destacau'],
'ar': [u'وصلة مقالة مختارة'],
'ast':['Enllaz AD'],
'az': ['Link FM'],
'br': ['Liamm PuB', 'Lien AdQ'],
'ca': [u'Enllaç AD', 'Destacat'],
'cy': ['Cyswllt erthygl ddethol', 'Dolen ED'],
'eo': ['LigoElstara'],
'es': ['Destacado'],
'eu': ['NA lotura'],
'fr': ['Lien AdQ'],
'fur':['Leam VdC'],
'ga': ['Nasc AR'],
'hi': ['Link FA', 'Lien AdQ'],
'is': [u'Tengill ÚG'],
'it': ['Link AdQ'],
'no': ['Link UA'],
'oc': ['Ligam AdQ', 'Lien AdQ'],
'ro': [u'Legătură AC', u'Legătură AF'],
'sv': ['UA', 'Link UA'],
'tr': ['Link SM'],
'vi': [u'Liên kết chọn lọc'],
'vo': [u'Yüm YG'],
'yi': [u'רא'],
}
template_good = {
'_default': ['Link GA'],
'ar': [u'وصلة مقالة جيدة'],
'da': ['Link GA', 'Link AA'],
'eo': ['LigoLeginda'],
'es': ['Bueno'],
'fr': ['Lien BA'],
'is': ['Tengill GG'],
'nn': ['Link AA'],
'no': ['Link AA'],
#'tr': ['Link GA', 'Link KM'],
'vi': [u'Liên kết bài chất lượng tốt'],
'wo': ['Lien BA'],
}
template_lists = {
'_default': ['Link FL'],
}
featured_name = {
'af': (BACK,u"Voorbladster"),
'als':(CAT, u"Wikipedia:Bsunders glungener Artikel"),
'am': (CAT, u"Wikipedia:Featured article"),
'an': (CAT, u"Articlos destacatos"),
'ar': (CAT, u"مقالات مختارة"),
'ast':(CAT, u"Uiquipedia:Artículos destacaos"),
'az': (BACK,u"Seçilmiş məqalə"),
'bar':(CAT, u"Berig"),
'bat-smg': (CAT, u"Vikipedėjės pavīzdėnē straipsnē"),
'be-x-old':(CAT, u"Вікіпэдыя:Выбраныя артыкулы"),
'bg': (CAT, u"Избрани статии"),
'bn': (BACK,u"নির্বাচিত নিবন্ধ"),
'br': (CAT, u"Pennadoù eus an dibab"),
'bs': (CAT, u"Odabrani članci"),
'ca': (CAT, u"Llista d'articles de qualitat"),
'ceb':(CAT, u"Mga napiling artikulo"),
'cs': (CAT, u"Nejlepší články"),
'cy': (CAT, u"Erthyglau dethol"),
'da': (CAT, u"Fremragende artikler"),
'de': (CAT, u"Wikipedia:Exzellent"),
#'dsb':(CAT, u"Ekscelentny"),
'dv': (BACK, u"Featured article"),
#'dv': (CAT, u"Featured Articles"),
'el': (BACK,u"Αξιόλογο άρθρο"),
'eo': (CAT, u"Elstaraj artikoloj"),
'en': (CAT, u"Featured articles"),
'es': (BACK, u"Artículo destacado"),
'et': (CAT, u"Eeskujulikud artiklid"),
'eu': (CAT, u"Nabarmendutako artikuluak"),
'ext':(BACK,u"Destacau"),
'fa': (BACK,u"نوشتار برگزیده"),
'fi': (CAT, u"Suositellut sivut"),
'fo': (CAT, u"Mánaðargrein"),
'fr': (CAT, u"Article de qualité"),
'gv': (CAT, u"Artyn reiht"),
'he': (CAT, u"ערכים מומלצים"),
'hi': (BACK,u"निर्वाचित लेख"),
'hr': (CAT, u"Izabrani članci"),
'hsb':(CAT, u"Ekscelentny"),
'hu': (CAT, u"Kiemelt cikkek"),
'hy': (BACK,u"Ընտրված հոդված"),
'ia': (CAT, u"Wikipedia:Articulos eminente"),
'id': (BACK, u"Featured article"),
#'id': (CAT, u"Artikel bagus utama"),
'is': (CAT, u"Wikipedia:Úrvalsgreinar"),
'it': (CAT, u"Voci in vetrina"),
'ja': (BACK,u"Featured article"),
'ka': (CAT, u"რჩეული სტატიები"),
'km': (BACK,u"អត្ថបទពិសេស"),
'kn': (BACK,u"ವಿಶೇಷ ಲೇಖನ"),
'ko': (CAT, u"알찬 글"),
'ksh':(CAT, u"Exzälenter Aatikkel"),
'kv': (CAT, u"Википедия:Бур гижӧдъяс"),
'la': (CAT, u"Paginae mensis"),
'li': (CAT, u"Wikipedia:Sjterartikele"),
'lmo':(CAT, u"Articol ben faa"),
'lo': (CAT, u"ບົດຄວາມດີເດັ່ນ"),
'lt': (CAT, u"Vikipedijos pavyzdiniai straipsniai"),
'lv': (CAT, u"Vērtīgi raksti"),
#'lv': (CAT, u"Nedēļas raksti"),
'mk': (BACK, u"Избрана"),
'ml': (BACK,u"Featured"),
'mr': (CAT, u"मुखपृष्ठ सदर लेख"),
'ms': (BACK,u"Rencana pilihan"),
'nah':(BACK,u"Featured article"),
'nds-nl': (BACK, u"Etelazie"),
'nl': (CAT, u"Wikipedia:Etalage-artikelen"),
'nn': (BACK,u"God artikkel"),
'no': (CAT, u"Utmerkede artikler"),
+ 'nv': (CAT, u"Naaltsoos nizhónígo ályaaígíí"),
'oc': (CAT, u"Article de qualitat"),
'pl': (CAT, u"Artykuły na medal"),
'pt': (CAT, u"!Artigos destacados"),
'ro': (CAT, u"Articole de calitate"),
'ru': (BACK, u"Избранная статья"),
'sco':(CAT, u"Featurt"),
'sh': (CAT, u"Izabrani članci"),
'simple': (CAT, u"Very good articles"),
'sk': (BACK,u"Perfektný článok"),
'sl': (CAT, u"Vsi izbrani članki"),
'sq': (BACK,u"Artikulli perfekt"),
'sr': (CAT, u"Изабрани"),
'sv': (CAT, u"Wikipedia:Utmärkta artiklar"),
'sw': (BACK,u"Makala_nzuri_sana"),
'szl':(CAT, u"Wyrůżńůne artikle"),
'ta': (CAT, u"சிறப்புக் கட்டுரைகள்"),
'te': (CAT, u"విశేషవ్యాసాలు"),
'th': (BACK,u"บทความคัดสรร"),
'tl': (BACK,u"Napiling artikulo"),
'tr': (BACK,u"Seçkin madde"),
'tt': (CAT, u"Сайланган мәкаләләр"),
'uk': (CAT, u"Вибрані статті"),
'ur': (CAT, u"منتخب مقالے"),
'uz': (CAT, u"Vikipediya:Tanlangan maqolalar"),
'vec':(BACK,u"Vetrina"),
'vi': (CAT, u"Bài viết chọn lọc"),
'vo': (CAT, u"Yegeds gudik"),
'wa': (CAT, u"Raspepyî årtike"),
'yi': (CAT, u"רעקאמענדירטע ארטיקלען"),
'yo': (BACK,u"Àyọkà pàtàkì"),
'zh': (CAT, u"特色条目"),
'zh-classical': (CAT, u"卓著"),
'zh-yue': (BACK, u"正文"),
}
good_name = {
'ar': (CAT, u"مقالات جيدة"),
'ca': (CAT, u"Llista d'articles bons"),
'cs': (CAT, u"Wikipedie:Dobré články"),
'da': (CAT, u"Gode artikler"),
'de': (CAT, u"Wikipedia:Lesenswert"),
#'dsb':(CAT, u"Naraźenje za pógódnośenje"),
'en': (CAT, u"Wikipedia good articles"),
'eo': (CAT, u"Legindaj artikoloj"),
'es': (CAT, u"Wikipedia:Artículos buenos"),
'et': (CAT, u"Head artiklid"),
'fi': (CAT, u"Hyvät artikkelit"),
'fr': (CAT, u"Bon article"),
'hsb':(CAT, u"Namjet za pohódnoćenje"),
'id': (BACK,u"Artikel bagus"),
#'id': (CAT, u"Artikel bagus"),
'is': (CAT, u"Wikipedia:Gæðagreinar"),
'ja': (CAT, u"おすすめ記事"),
'ksh':(CAT, u"Joode Aatikkel"),
'lt': (CAT, u"Vertingi straipsniai"),
'lv': (CAT, u"Labi raksti"),
'no': (CAT, u"Anbefalte artikler"),
'oc': (CAT, u"Bon article"),
'pl': (CAT, u"Dobre artykuły"),
'ro': (BACK, u"Articol bun"),
'ru': (CAT, u"Википедия:Хорошие статьи"),
'simple': (CAT, u"Good articles"),
'sr': (BACK,u"Иконица добар"),
'sv': (CAT, u"Wikipedia:Läsvärda artiklar"),
'tr': (BACK,u"Kaliteli madde"),
'uk': (CAT, u"Вікіпедія:Добрі статті"),
'uz': (CAT, u"Vikipediya:Yaxshi maqolalar"),
'yi': (CAT, u"וויקיפעדיע גוטע ארטיקלען"),
'zh': (CAT, u"優良條目"),
'zh-classical': (CAT, u"正典"),
}
lists_name = {
'ar': (BACK, u'قائمة مختارة'),
'da': (BACK, u'FremragendeListe'),
'de': (BACK, u'Informativ'),
'en': (BACK, u'Featured list'),
'id': (BACK, u'Featured list'),
'ja': (BACK, u'Featured List'),
'ksh':(CAT, u"Joode Leß"),
'no': (BACK, u'God liste'),
'pl': (BACK, u'Medalista'),
'pt': (BACK, u'Anexo destacado'),
'ro': (BACK, u'Listă de calitate'),
'ru': (BACK, u'Избранный список или портал'),
'tr': (BACK, u'Seçkin liste'),
'uk': (BACK, u'Вибраний список'),
'vi': (BACK, u'Sao danh sách chọn lọc'),
'zh': (BACK, u'Featured list'),
'da': (BACK, u'FremragendeListe'),
}
# globals
interactive=0
nocache=0
afterpage=u"!"
cache={}
def featuredArticles(site, pType):
arts=[]
try:
if pType == 'good':
method=good_name[site.lang][0]
elif pType == 'list':
method=lists_name[site.lang][0]
else:
method=featured_name[site.lang][0]
except KeyError:
wikipedia.output(u'Error: language %s doesn\'t has %s category source.' % (site.lang, feature))
return arts
if pType == 'good':
name=good_name[site.lang][1]
elif pType == 'list':
name=lists_name[site.lang][1]
else:
name=featured_name[site.lang][1]
raw=method(site, name)
for p in raw:
if p.namespace()==0: # Article
arts.append(p)
elif p.namespace()==1 and site.lang <> 'el': # Article talk (like in English)
arts.append(wikipedia.Page(p.site(), p.titleWithoutNamespace()))
wikipedia.output('\03{lightred}** wikipedia:%s has %i %s articles\03{default}' % (site.lang, len(arts), pType))
return arts
def findTranslated(page, oursite=None, quiet=False):
if not oursite:
oursite=wikipedia.getSite()
if page.isRedirectPage():
page = page.getRedirectTarget()
try:
iw=page.interwiki()
except:
wikipedia.output(u"%s -> no interwiki, giving up" % page.title())
return None
ourpage=None
for p in iw:
if p.site()==oursite:
ourpage=p
break
if not ourpage:
if not quiet:
wikipedia.output(u"%s -> no corresponding page in %s" % (page.title(), oursite))
return None
if not ourpage.exists():
wikipedia.output(u"%s -> our page doesn't exist: %s" % (page.title(), ourpage.title()))
return None
if ourpage.isRedirectPage():
ourpage = ourpage.getRedirectTarget()
wikipedia.output(u"%s -> corresponding page is %s" % (page.title(), ourpage.title()))
if ourpage.namespace() != 0:
wikipedia.output(u"%s -> not in the main namespace, skipping" % page.title())
return None
if ourpage.isRedirectPage():
wikipedia.output(u"%s -> double redirect, skipping" % page.title())
return None
if not ourpage.exists():
wikipedia.output(u"%s -> page doesn't exist, skipping" % ourpage.title())
return None
try:
iw=ourpage.interwiki()
except:
return None
backpage=None
for p in iw:
if p.site()==page.site():
backpage=p
break
if not backpage:
wikipedia.output(u"%s -> no back interwiki ref" % page.title())
return None
if backpage==page:
# everything is ok
return ourpage
if backpage.isRedirectPage():
backpage = backpage.getRedirectTarget()
if backpage==page:
# everything is ok
return ourpage
wikipedia.output(u"%s -> back interwiki ref target is %s" % (page.title(), backpage.title()))
return None
def getTemplateList (lang, pType):
if pType == 'good':
try:
templates = template_good[lang]
templates+= template_good['_default']
except KeyError:
templates = template_good['_default']
elif pType == 'list':
try:
templates = template_lists[lang]
templatest+= template_lists['_default']
except KeyError:
templates = template_lists['_default']
else:
try:
templates = template[lang]
templates+= template['_default']
except KeyError:
templates = template['_default']
return templates
def featuredWithInterwiki(fromsite, tosite, template_on_top, pType, quiet, dry = False):
if not fromsite.lang in cache:
cache[fromsite.lang]={}
if not tosite.lang in cache[fromsite.lang]:
cache[fromsite.lang][tosite.lang]={}
cc=cache[fromsite.lang][tosite.lang]
if nocache:
cc={}
templatelist = getTemplateList(tosite.lang, pType)
findtemplate = '(' + '|'.join(templatelist) + ')'
re_Link_FA=re.compile(ur"\{\{%s\|%s\}\}" % (findtemplate.replace(u' ', u'[ _]'), fromsite.lang), re.IGNORECASE)
re_this_iw=re.compile(ur"\[\[%s:[^]]+\]\]" % fromsite.lang)
arts=featuredArticles(fromsite, pType)
pairs=[]
for a in arts:
if a.title()<afterpage:
continue
if u"/" in a.title() and a.namespace() != 0:
wikipedia.output(u"%s is a subpage" % a.title())
continue
if a.title() in cc:
wikipedia.output(u"(cached) %s -> %s"%(a.title(), cc[a.title()]))
continue
if a.isRedirectPage():
a=a.getRedirectTarget()
try:
if not a.exists():
wikipedia.output(u"source page doesn't exist: %s" % a.title())
continue
atrans = findTranslated(a, tosite, quiet)
if atrans:
text=atrans.get()
m=re_Link_FA.search(text)
if m:
wikipedia.output(u"(already done)")
else:
# insert just before interwiki
if (not interactive or
wikipedia.input(u'Connecting %s -> %s. Proceed? [Y/N]'%(a.title(), atrans.title())) in ['Y','y']
):
m=re_this_iw.search(text)
if not m:
wikipedia.output(u"no interwiki record, very strange")
continue
site = wikipedia.getSite()
if pType == 'good':
comment = wikipedia.setAction(wikipedia.translate(site, msg_good) % (fromsite.lang, a.title()))
elif pType == 'list':
comment = wikipedia.setAction(wikipedia.translate(site, msg_lists) % (fromsite.lang, a.title()))
else:
comment = wikipedia.setAction(wikipedia.translate(site, msg) % (fromsite.lang, a.title()))
### Moving {{Link FA|xx}} to top of interwikis ###
if template_on_top == True:
# Getting the interwiki
iw = wikipedia.getLanguageLinks(text, site)
# Removing the interwiki
text = wikipedia.removeLanguageLinks(text, site)
text += u"\r\n{{%s|%s}}\r\n"%(templatelist[0], fromsite.lang)
# Adding the interwiki
text = wikipedia.replaceLanguageLinks(text, iw, site)
### Placing {{Link FA|xx}} right next to corresponding interwiki ###
else:
text=(text[:m.end()]
+ (u" {{%s|%s}}" % (templatelist[0], fromsite.lang))
+ text[m.end():])
if not dry:
try:
atrans.put(text, comment)
except wikipedia.LockedPage:
wikipedia.output(u'Page %s is locked!' % atrans.title())
cc[a.title()]=atrans.title()
except wikipedia.PageNotSaved, e:
wikipedia.output(u"Page not saved")
if __name__=="__main__":
template_on_top = False
featuredcount = False
fromlang=[]
processType = 'featured'
doAll = False
part = False
quiet = False
dry = False
for arg in wikipedia.handleArgs():
if arg == '-interactive':
interactive=1
elif arg == '-nocache':
nocache=1
elif arg.startswith('-fromlang:'):
fromlang=arg[10:].split(",")
part = True
elif arg == '-fromall':
doAll = True
elif arg.startswith('-after:'):
afterpage=arg[7:]
elif arg == '-top':
template_on_top = True
elif arg == '-count':
featuredcount = True
elif arg == '-good':
processType = 'good'
elif arg == '-lists':
processType = 'list'
elif arg == '-quiet':
quiet = True
elif arg == '-dry':
dry = True
if part:
try:
# BUG: range with zh-min-nan (3 "-")
if len(fromlang)==1 and fromlang[0].index("-")>=0:
ll1,ll2=fromlang[0].split("--",1)
if not ll1: ll1=""
if not ll2: ll2="zzzzzzz"
if processType == 'good':
fromlang=[ll for ll in good_name.keys() if ll>=ll1 and ll<=ll2]
elif processType == 'list':
fromlang=[ll for ll in good_lists.keys() if ll>=ll1 and ll<=ll2]
else:
fromlang=[ll for ll in featured_name.keys() if ll>=ll1 and ll<=ll2]
except:
pass
if doAll:
if processType == 'good':
fromlang=good_name.keys()
elif processType == 'list':
fromlang=lists_name.keys()
else:
fromlang=featured_name.keys()
filename="cache/" + processType
try:
cache=pickle.load(file(filename,"rb"))
except:
cache={}
if not fromlang:
wikipedia.showHelp('featured')
sys.exit(1)
fromlang.sort()
#test whether this site has template enabled
hasTemplate = False
if not featuredcount:
for tl in getTemplateList(wikipedia.getSite().lang, processType):
t = wikipedia.Page(wikipedia.getSite(), u'Template:'+tl)
if t.exists():
hasTemplate = True
break
try:
for ll in fromlang:
fromsite = wikipedia.getSite(ll)
if featuredcount:
featuredArticles(fromsite, processType)
elif not hasTemplate:
wikipedia.output(u'\nNOTE: %s arcticles are not implemented at %s-wiki.' % (processType, wikipedia.getSite().lang))
wikipedia.output('Quitting program...')
break
elif fromsite != wikipedia.getSite():
featuredWithInterwiki(fromsite, wikipedia.getSite(),
template_on_top, processType, quiet, dry)
except KeyboardInterrupt:
wikipedia.output('\nQuitting program...')
finally:
wikipedia.stopme()
if not nocache:
pickle.dump(cache,file(filename,"wb"))
diff --git a/interwiki.py b/interwiki.py
index 976ff97e..8cf43a4b 100644
--- a/interwiki.py
+++ b/interwiki.py
@@ -1,2403 +1,2404 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Script to check language links for general pages. This works by downloading the
page, and using existing translations plus hints from the command line to
download the equivalent pages from other languages. All of such pages are
downloaded as well and checked for interwiki links recursively until there are
no more links that are encountered. A rationalization process then selects the
right interwiki links, and if this is unambiguous, the interwiki links in the
original page will be automatically updated and the modified page uploaded.
These command-line arguments can be used to specify which pages to work on:
&pagegenerators_help;
-days: Like -years, but runs through all date pages. Stops at
Dec 31. If the argument is given in the form -days:X,
it will start at month no. X through Dec 31. If the
argument is simply given as -days, it will run from
Jan 1 through Dec 31. E.g. for -days:9 it will run
from Sep 1 through Dec 31.
-years: run on all year pages in numerical order. Stop at year 2050.
If the argument is given in the form -years:XYZ, it
will run from [[XYZ]] through [[2050]]. If XYZ is a
negative value, it is interpreted as a year BC. If the
argument is simply given as -years, it will run from 1
through 2050.
This implies -noredirect.
-new: Work on the 100 newest pages. If given as -new:x, will work
on the x newest pages.
When multiple -namespace parameters are given, x pages are
inspected, and only the ones in the selected name spaces are
processed. Use -namespace:all for all namespaces. Without
-namespace, only article pages are processed.
This implies -noredirect.
-restore: restore a set of "dumped" pages the robot was working on
when it terminated. The dump file will be subsequently
removed.
-restore:all restore a set of "dumped" pages of all dumpfiles to a given
family remaining in the "interwiki-dumps" directory. All
these dump files will be subsequently removed. If restoring
process interrupts again, it saves all unprocessed pages in
one new dump file of the given site.
-continue: like restore, but after having gone through the dumped pages,
continue alphabetically starting at the last of the dumped
pages. The dump file will be subsequently removed.
-warnfile: used as -warnfile:filename, reads all warnings from the
given file that apply to the home wiki language,
and read the rest of the warning as a hint. Then
treats all the mentioned pages. A quicker way to
implement warnfile suggestions without verifying them
against the live wiki is using the warnfile.py
script.
-quiet: Use this option to get less output
Additionaly, these arguments can be used to restrict the bot to certain pages:
-namespace:n Number or name of namespace to process. The parameter can be
used multiple times. It works in combination with all other
parameters, except for the -start parameter. If you e.g.
want to iterate over all categories starting at M, use
-start:Category:M.
-number: used as -number:#, specifies that the robot should process
that amount of pages and then stop. This is only useful in
combination with -start. The default is not to stop.
-until: used as -until:title, specifies that the robot should
process pages in wiki default sort order up to, and
including, "title" and then stop. This is only useful in
combination with -start. The default is not to stop.
Note: do not specify a namespace, even if -start has one.
-bracket only work on pages that have (in the home language)
parenthesis in their title. All other pages are skipped.
(note: without ending colon)
-skipfile: used as -skipfile:filename, skip all links mentioned in
the given file. This does not work with -number!
-skipauto use to skip all pages that can be translated automatically,
like dates, centuries, months, etc.
(note: without ending colon)
-lack: used as -lack:xx with xx a language code: only work on pages
without links to language xx. You can also add a number nn
lick -lack:xx:nn, so that the bot only works on pages with
at least n interwiki links (the default value for n is 1).
These arguments are useful to provide hints to the bot:
-hint: used as -hint:de:Anweisung to give the robot a hint
where to start looking for translations. This is only
useful if you specify a single page to work on. If no
text is given after the second ':', the name of the page
itself is used as the title for the hint, unless the
-hintnobracket command line option (see there) is also
selected.
There are some special hints, trying a number of languages
at once:
* all: All languages with at least ca. 100 articles.
* 10: The 10 largest languages (sites with most
articles). Analogous for any other natural
number.
* arab: All languages useing the Arabic alphabet.
* cyril: All languages that use the Cyrillic alphabet.
* chinese: All Chinese dialects.
* latin: All languages using the Latin script.
* scand: All Scandinavian languages.
-hintfile: similar to -hint, except that hints are taken from the given
file, enclosed in [[]] each, instead of the command line.
-askhints: for each page one or more hints are asked. See hint: above
for the format, one can for example give "en:something" or
"20:" as hint.
-same looks over all 'serious' languages for the same title.
-same is equivalent to -hint:all:
(note: without ending colon)
-wiktionary: similar to -same, but will ONLY accept names that are
identical to the original. Also, if the title is not
capitalized, it will only go through other wikis without
automatic capitalization.
-untranslated: works normally on pages with at least one interlanguage
link; asks for hints for pages that have none.
-untranslatedonly: same as -untranslated, but pages which already have a
translation are skipped. Hint: do NOT use this in
combination with -start without a -number limit, because
you will go through the whole alphabet before any queries
are performed!
-showpage when asking for hints, show the first bit of the text
of the page always, rather than doing so only when being
asked for (by typing '?'). Only useful in combination
with a hint-asking option like -untranslated, -askhints
or -untranslatedonly.
(note: without ending colon)
-noauto Do not use the automatic translation feature for years and
dates, only use found links and hints.
(note: without ending colon)
-hintnobracket used to make the robot strip everything in brackets,
and surrounding spaces from the page name, before it is
used in a -hint:xy: where the page name has been left out,
or -hint:all:, -hint:10:, etc. without a name, or
an -askhint reply, where only a language is given.
These arguments define how much user confirmation is required:
-autonomous run automatically, do not ask any questions. If a question
-auto to an operator is needed, write the name of the page
to autonomous_problems.dat and continue on the next page.
(note: without ending colon)
-confirm ask for confirmation before any page is changed on the
live wiki. Without this argument, additions and
unambiguous modifications are made without confirmation.
(note: without ending colon)
-force do not ask permission to make "controversial" changes,
like removing a language because none of the found
alternatives actually exists.
(note: without ending colon)
-select ask for each link whether it should be included before
changing any page. This is useful if you want to remove
invalid interwiki links and if you do multiple hints of
which some might be correct and others incorrect. Combining
-select and -confirm is possible, but seems like overkill.
(note: without ending colon)
These arguments specify in which way the bot should follow interwiki links:
-noredirect do not follow redirects nor category redirects.
(note: without ending colon)
-initialredirect work on its target if a redirect or category redirect is
entered on the command line or by a generator (note: without
ending colon). It is recommended to use this option with
-movelog pagegenerator.
-neverlink: used as -neverlink:xx where xx is a language code:
Disregard any links found to language xx. You can also
specify a list of languages to disregard, separated by
commas.
-ignore: used as -ignore:xx:aaa where xx is a language code, and
aaa is a page title to be ignored.
-ignorefile: similar to -ignore, except that the pages are taken from
the given file instead of the command line.
-localright do not follow interwiki from other pages than the starting
page. (Warning! Should be used very sparingly, only when
you are sure you have first gotten the interwiki on the
starting page exactly right).
(note: without ending colon)
-hintsareright do not follow interwiki links to sites for which hints
on existing pages are given. Note that, hints given
interactively, via the -askhint command line option,
are only effective once they have been entered, thus
interwiki links on the starting page are followed
regardess of hints given when prompted.
(Warning! Should be used with caution!)
(note: without ending colon)
-back only work on pages that have no backlink from any other
language; if a backlink is found, all work on the page
will be halted. (note: without ending colon)
The following arguments are only important for users who have accounts for
multiple languages, and specify on which sites the bot should modify pages:
-localonly only work on the local wiki, not on other wikis in the
family I have a login at. (note: without ending colon)
-limittwo only update two pages - one in the local wiki (if logged-in)
and one in the top available one.
For example, if the local page has links to de and fr,
this option will make sure that only local and de: (larger)
site is updated. This option is useful to quickly set two
way links without updating all of wiki's sites.
(note: without ending colon)
-whenneeded works like limittwo, but other languages are changed in the
following cases:
* If there are no interwiki at all on the page
* If an interwiki must be removed
* If an interwiki must be changed and there has been a
conflict for this page
Optionally, -whenneeded can be given an additional number
(for example -whenneeded:3), in which case other languages
will be changed if there are that number or more links to
change or add. (note: without ending colon)
The following arguments influence how many pages the bot works on at once:
-array: The number of pages the bot tries to be working on at once.
If the number of pages loaded is lower than this number,
a new set of pages is loaded from the starting wiki. The
default is 100, but can be changed in the config variable
interwiki_min_subjects
-query: The maximum number of pages that the bot will load at once.
Default value is 60.
Some configuration option can be used to change the working of this robot:
interwiki_min_subjects: the minimum amount of subjects that should be processed
at the same time.
interwiki_backlink: if set to True, all problems in foreign wikis will
be reported
interwiki_shownew: should interwiki.py display every new link it discovers?
interwiki_graph: output a graph PNG file on conflicts? You need pydot for
this: http://dkbza.org/pydot.html
interwiki_graph_format: the file format for interwiki graphs
without_interwiki: save file with local articles without interwikis
All these options can be changed through the user-config.py configuration file.
If interwiki.py is terminated before it is finished, it will write a dump file
to the interwiki-dumps subdirectory. The program will read it if invoked with
the "-restore" or "-continue" option, and finish all the subjects in that list.
After finishing the dump file will be deleted. To run the interwiki-bot on all
pages on a language, run it with option "-start:!", and if it takes so long you
have to break it off, use "-continue" next time.
"""
#
# (C) Rob W.W. Hooft, 2003
# (C) Daniel Herding, 2004
# (C) Yuri Astrakhan, 2005-2006
# (C) Pywikipedia bot team, 2007-2010
#
# Distributed under the terms of the MIT license.
#
__version__ = '$Id$'
#
import sys, copy, re, os
import time
import codecs
import socket
try:
set # introduced in Python 2.4: faster and future
except NameError:
from sets import Set as set
try: sorted ## Introduced in 2.4
except NameError:
def sorted(seq, cmp=None, key=None, reverse=False):
"""Copy seq and sort and return it.
>>> sorted([3, 1, 2])
[1, 2, 3]
"""
seq2 = copy.copy(seq)
if key:
if cmp is None:
cmp = __builtins__.cmp
seq2.sort(lambda x,y: cmp(key(x), key(y)))
else:
if cmp is None:
seq2.sort()
else:
seq2.sort(cmp)
if reverse:
seq2.reverse()
return seq2
import wikipedia as pywikibot
import config, pagegenerators, catlib
import titletranslate, interwiki_graph
import webbrowser
docuReplacements = {
'&pagegenerators_help;': pagegenerators.parameterHelp
}
class SaveError(pywikibot.Error):
"""
An attempt to save a page with changed interwiki has failed.
"""
class LinkMustBeRemoved(SaveError):
"""
An interwiki link has to be removed, but this can't be done because of user
preferences or because the user chose not to change the page.
"""
class GiveUpOnPage(pywikibot.Error):
"""
The user chose not to work on this page and its linked pages any more.
"""
msg = {
'af': (u'robot ', u'Bygevoeg', u'Verwyder', u'Verander'),
'als': (u'Bötli: ', u'Ygfüegt', u'Ussergnoh', u'Gändret'),
'am': (u'ሎሌ ', u'መጨመር', u'ማስወገድ', u'ማስተካከል'),
'ang': (u'Robot ', u'ēcung', u'fornimung', u'onhweorfung'),
'ar': (u'روبوت ', u'إضافة', u'إزالة', u'تعديل'),
'arc': (u'ܪܘܒܘܛ ', u'ܬܘܣܦܬܐ', u'ܠܚܝܐ', u'ܚܘܠܦܐ'),
'az': (u'Bot redaktəsi ', u'əlavə edilir', u'çıxardılır', u'dəyişdirilir'),
'ba': (u'робот ', u'өҫтәне', u'юйҙы', u'үҙгәртте'),
'bar': (u'Boterl: ', u'Aini', u'Aussi', u'Obàsst'),
'bat-smg': (u'robots ', u'Pridedama', u'Trėnama', u'Keitama'),
'bcl': (u'robot ', u'minadugang', u'minahali', u'minamodifikar'),
'be': (u'робат ', u'Дадаем', u'Выдаляем', u'Мяняем'),
'be-x-old': (u'робат ', u'дадаў', u'выдаліў', u'зьмяніў'),
'bg': (u'Робот ', u'Добавяне', u'Изтриване', u'Промяна'),
'bn': (u'রোবট ', u'যোগ করছে', u'মুছে ফেলছে', u'পরিবর্তন সাধন করছে'),
'bo': (u'འཕྲུལ་ཆས་ཀྱི་མི། ', u'ཁ་སྣོན་རྒྱག་པ།', u'བསུབ་པ།', u'བསྐྱར་བཅོས་བྱེད་པ།'),
'bpy': (u'রোবট ', u'তিলকরের', u'থেইকরের', u'বদালার'),
'br': (u'Robot ', u'ouzhpennet', u'tennet', u'kemmet'),
'ca': (u'Robot ', u'afegeix', u'esborra', u'modifica'),
'ce': (u'робот ', u'тIетоьхна', u'дIаяьккхина', u'хийцина'),
'ceb': (u'robot ', u'Gidugang', u'Gitangtang', u'Gimodipikar'),
'crh': (u'robot ', u'ekley', u'çetleştire', u'deñiştire'),
'cs': (u'robot ', u'přidal', u'odebral', u'změnil'),
'cv': (u'робот ', u'хушрĕ', u'кăларса пăрахрĕ', u'улăштарчĕ'),
'cy': (u'robot ', u'yn ychwanegu', u'yn tynnu', u'yn newid'),
'csb':(u'robot ', u'dodôwô', u'rëmô', u'pòprôwiô'),
'da': (u'robot ', u'Tilføjer', u'Fjerner', u'Ændrer'),
'de': (u'Bot: ', u'Ergänze', u'Entferne', u'Ändere'),
'dv': (u'ރޮބޮޓ ', u'އިތުރު ކުރުނ', u'ފޮހެލުނ', u'ބަދަލު ގެނައުނ'),
'el': (u'Ρομπότ: ', u'Προσθήκη', u'Αφαίρεση', u'Τροποποίηση'),
'en': (u'robot ', u'Adding', u'Removing', u'Modifying'),
'eo': (u'roboto ', u'aldono de', u'forigo de', u'modifo de'),
'es': (u'robot ', u'Añadido', u'Eliminado', u'Modificado'),
'et': (u'robot ', u'lisas', u'kustutas', u'muutis'),
'eu': (u'robota ', u'Erantsia', u'Ezabatua', u'Aldatua'),
'fa': (u'ربات ', u'افزودن', u'حذف', u'اصلاح'),
'fi': (u'Botti ', u'lisäsi', u'poisti', u'muokkasi'),
'fiu-vro': (u'robot ', u'manopandminõ', u'ärqvõtminõ', u'tävvendämine'),
'fo': (u'bottur ', u'leggur aftrat', u'strikar', u'broytur'),
'fr': (u'robot ', u'Ajoute', u'Retire', u'Modifie'),
'frp': (u'robot ', u'Apond', u'Retire', u'Modifie'),
'fur': (u'Robot: ', u'o zonti', u'o cambii', u'o gjavi'),
'fy': (u'Bot ', u'- derby', u'- fuort', u'- oars'),
'ga': (u'róbat ', u'ag suimiú', u'ag baint', u'ag mionathrú'),
'gl': (u'bot ', u'Engadido', u'Eliminado', u'Modificado'),
'gn': (u'bot ', u'ojoapy', u'oñembogue', u'oñemoambue'),
'gu': (u'રોબોટ ', u'ઉમેરણ', u'હટાવ્યું', u'ફેરફાર'),
'gv': (u'bot ', u'currit stiagh ec', u'scryssit magh ec', u'caghlaait ec'),
'he': (u'בוט ', u'מוסיף', u'מסיר', u'משנה'),
'hr': (u'robot ', u'Dodaje', u'Uklanja', u'Mijenja'),
'hsb': (u'bot ', u'přidał', u'wotstronił', u'změnił'),
'ht': (u'wobo ', u'Ajoute', u'Anlve', u'Modifye'),
'hu': (u'Bot: ', u'következő hozzáadása', u'következő eltávolítása', u'következő módosítása'),
'hy': (u'Ռոբոտը ', u'ավելացնում է․', u'հեռացնում է․', u'փոփոխում է․'),
'ia': (u'Robot: ', u'Addition de', u'Elimination de', u'Modification de'),
'id': (u'bot ', u'Menambah', u'Membuang', u'Mengubah'),
'ie': (u'Bot: ', u'Adjuntet', u'Removet', u'Modificat'),
'io': (u'roboto ', u'adjuntas', u'efacas', u'modifikas'),
'is': (u'robot ', u'Bæti við', u'Fjarlægi', u'Breyti'),
'it': (u'Bot: ', u'Aggiungo', u'Tolgo', u'Modifico'),
'ja': (u'ロボットによる ', u'追加', u'除去', u'変更'),
'ka': (u'ბოტის ', u'დამატება', u'წაშლა', u'შეცვლა'),
'kab': (u'a rubut ', u'ti merniwt', u'a ḍegger', u'a senfel'),
'ko': (u'로봇이 ', u'더함', u'지움', u'바꿈'),
'kk': (u'Боттың ', u'үстегені', u'аластағаны', u'түзеткені'),
'kl': (u'Robot ', u'Ilassut', u'Peersineq', u'Inisseeqqinneq'),
'km': (u'រ៉ូបូ ', u'បន្ថែម', u'ដកចេញ', u'កែសំរួល'),
'ksh': (u'Bot: ', u'dobëijedonn', u'erußjenumme', u'ußjewääßelt'),
'ku': (u'robot ', u'serzêde kirin', u'jêbirin', u'guhêrandin'),
'kw': (u'robot ', u'ow keworra', u'ow dilea', u'ow chanjya'),
'la': (u'bot ', u'addit', u'abdit', u'mutat'),
'lb': (u'Bot ', u'Derbäi setzen', u'Ewech huelen', u'Änneren'),
'lmo': (u'Robot ', u'jontant', u'trant via', u'modifiant'),
'ln': (u'bot ', u'ebakisí', u'elongólí', u'ebongolí'),
'lo': (u'ໂຣບົດ ', u'ພວມເພີ່ມ', u'ພວມລຶບ', u'ພວມແປງ'),
'lt': (u'robotas ', u'Pridedama', u'Šalinama', u'Keičiama'),
'mi': (u'he karetao ', u'e tāpiri ana', u'e tango ana', u'e whakarerekē ana'),
'lv': (u'robots ', u'pievieno', u'izņem', u'izmaina'),
'mdf': (u'бот ', u'поладозе', u'нардазе', u'полафтозе'),
'mg': (u'Rôbô ', u'Nanampy', u'Nanala', u'Nanova'),
'mk': (u'Бот ', u'Додава', u'Брише', u'Менува'),
'ml': (u'യന്ത്രം ', u'ചേര്‍ക്കുന്നു', u'നീക്കുന്നു', u'പുതുക്കുന്നു'),
'mn': (u'робот ', u'Нэмж байна', u'Арилгаж байна', u'Өөрчилж байна'),
'mr': (u'सांगकाम्याने ', u'वाढविले', u'काढले', u'बदलले'),
'ms': (u'bot ', u'menambah', u'membuang', u'mengubah'),
'myv': (u'роботось ', u'путызеть', u'нардызеть', u'полавтызеть'),
'mzn': (u'Rebot ', u'Biyeshten', u'Bayten', u'Hekărden'),
'nah': (u'Tepozcuayollotl', u'Tlamahxiltilli', u'Tlaquixtilli', u'Tlapatlalli'),
'nds': (u'IW-Bot: ', u'dorto', u'rut', u'ännert'),
'nds-nl': (u'bot ', u'derbie', u'derof', u'aanders'),
'nl': (u'robot ', u'Erbij', u'Eraf', u'Anders'),
'nn': (u'robot ', u'la til', u'fjerna', u'endra'),
'no': (u'robot ', u'legger til', u'fjerner', u'endrer'),
'nov': (u'robote ', u'Adid', u'Ekartad', u'Modifikad'),
'nrm': (u'robot ', u'ajouôte', u'hale', u'amende'),
+ 'nv': (u'botígíí díí naaltsoos tʼáá bíniʼ łahgo áyiilaa ', u'(+)', u'(-)', u'(+/-)'),
'os': (u'Робот ', u'баххæст кодта', u'Баивта', u'Аиуварс'),
'pdc': (u'Bot: ', u'dezu geduh', u'raus gnumme', u'gennert'),
'pl': (u'robot ', u'dodaje', u'usuwa', u'poprawia'),
'pms': (u'ël trigomiro ', u'a gionta', u'a gava', u'a modìfica'),
'pt': (u'Bot: ', u'Adicionando', u'Removendo',u'Modificando'),
'qu': (u'Rurana antacha ', u'Yapasqa', u'Qullusqa', u'Hukchasqa'),
'ro': (u'Robot interwiki: ', u'Adăugat', u'Înlăturat',u'Modificat'),
'ru': (u'робот ', u'добавил', u'удалил', u'изменил'),
'sah': (u'робот ', u'эптэ', u'сотто', u'уларытта'),
'sk': (u'robot ', u'Pridal', u'Odobral',u'Zmenil' ),
'sl': (u'robot ', u'Dodajanje', u'Odstranjevanje', u'Spreminjanje'),
'sq': (u'roboti ', u'shtoj', u'largoj', u'ndryshoj'),
'sr': (u'Бот ', u'Додаје', u'Брише', u'Мења'),
'su': (u'bot ', u'Nambih', u'Miceun', u'Ngarobih'),
'sv': (u'robot ', u'Lägger till', u'Tar bort', u'Ändrar'),
'sw': (u'roboti ', u'Nyongeza', u'Ondoa', u'Badiliko'),
'szl': (u'Bot ', u'dodowo', u'wyćepuje', u'zmjyńo'),
'ta': (u'தானியங்கி',u'இணைப்பு',u'அழிப்பு',u'மாற்றல்'),
'te': (u'యంత్రము ', u'కలుపుతున్నది', u'తొలగిస్తున్నది', u'మార్పులు చేస్తున్నది'),
'tet': (u'bot ', u'tau tan', u'hasai', u'filak'),
'tg': (u'робот ', u'илова карда истодааст', u'дигаргуни карда истодааст', u'ҳaвз карда истодааст'),
'tk': (u'robot ', u'goşdy', u'aýyrdy', u'üýtgetdi'),
'tl': (u'robot ', u'dinagdag', u'tinanggal', u'binago'),
'to': (u'mīsini', u'ʻoku tānaki', u'ʻoku toʻo', u'ʻoku liliu'),
'tr': (u'Bot değişikliği ', u'Ekleniyor', u'Kaldırılıyor', u'Değiştiriliyor'),
'tt': (u'робот ', u'кушты', u'бетерде', u'үзгәртте'),
'th': (u'โรบอต ', u'เพิ่ม', u'ลบ', u'แก้ไข'),
'udm': (u'робот ', u'ватсаз', u'ӵушиз', u'воштӥз'),
'uk': (u'робот ', u'додав', u'видалив', u'змінив'),
'ur': (u'روبالہ ', u'جمع', u'محو', u'ترمیم'),
'uz': (u'Bot ', u'Qoʻshdi', u'Tuzatdi', u'Oʻchirdi'),
'vec': (u'Bot: ', u'Zonto', u'Cavo', u'Canbio'),
'vi': (u'robot ', u'Thêm', u'Dời', u'Thay'),
'vo': (u'bot ', u'läükon', u'moükon', u'votükon'),
'war':(u'robot ', u'Gindugngan', u'Gintanggal', u'Ginliwat'),
'xal': (u'көдлвр ', u'немв', u'һарһв', u'сольв'),
'yi': (u'באט ', u'צוגעלייגט', u'אראפגענומען', u'געענדערט'),
'yo': (u'Bot ', u'Fífikún', u'Yíyọkúrò', u'Títúnṣe'),
'yue': (u'機械人 ', u'加', u'減', u'改'),
'zh': (u'機器人 ', u'新增', u'移除', u'修改'),
'zh-classical': (u'僕 ', u'增', u'削', u'修'),
'zh-min-nan': (u'bot ', u'ka-thiam', u'thiah-tû', u'siu-kái'),
'zh-yue': (u'機械人 ', u'加', u'減', u'改'),
}
# Subpage templates. Must be in lower case,
# whereas subpage itself must be case sensitive
moved_links = {
'bn' : (u'documentation', u'/doc'),
'ca' : (u'ús de la plantilla', u'/ús'),
'cs' : (u'dokumentace', u'/doc'),
'de' : (u'dokumentation', u'/Meta'),
'en' : ([u'documentation',
u'template documentation',
u'template doc',
u'doc',
u'documentation, template'], u'/doc'),
'es' : ([u'documentación', u'documentación de plantilla'], u'/doc'),
'eu' : (u'txantiloi dokumentazioa', u'/dok'),
# fi: no idea how to handle this type of subpage at :Metasivu:
'fi' : (u'mallineohje', None),
'fr' : ([u'/documentation', u'documentation', u'doc_modèle',
u'documentation modèle', u'documentation modèle compliqué',
u'documentation modèle en sous-page',
u'documentation modèle compliqué en sous-page',
u'documentation modèle utilisant les parserfunctions en sous-page',
],
u'/Documentation'),
'hu' : (u'sablondokumentáció', u'/doc'),
'id' : (u'template doc', u'/doc'),
'ja' : (u'documentation', u'/doc'),
'ka' : (u'თარგის ინფო', u'/ინფო'),
'ko' : (u'documentation', u'/설명문서'),
'ms' : (u'documentation', u'/doc'),
'pl' : (u'dokumentacja', u'/opis'),
'pt' : ([u'documentação', u'/doc'], u'/doc'),
'ro' : (u'documentaţie', u'/doc'),
'ru' : (u'doc', u'/doc'),
'sv' : (u'dokumentation', u'/dok'),
'vi' : (u'documentation', u'/doc'),
'zh' : ([u'documentation', u'doc'], u'/doc'),
}
# A list of template names in different languages.
# Pages which contains these shouldn't be changed.
ignoreTemplates = {
'_default': [u'delete'],
'cs' : [u'Pracuje_se'],
'de' : [u'inuse', u'löschen', u'sla', u'löschantrag', u'löschantragstext'],
'en' : [u'inuse', u'softredirect'],
'pdc': [u'lösche'],
}
class Global(object):
"""
Container class for global settings.
Use of globals outside of this is to be avoided.
"""
autonomous = False
confirm = False
always = False
select = False
followredirect = True
initialredirect = False
force = False
maxquerysize = 60
same = False
skip = set()
skipauto = False
untranslated = False
untranslatedonly = False
auto = True
neverlink = []
showtextlink = 0
showtextlinkadd = 300
localonly = False
limittwo = False
strictlimittwo = False
needlimit = 0
ignore = []
parenthesesonly = False
rememberno = False
followinterwiki = True
minsubjects = config.interwiki_min_subjects
nobackonly = False
askhints = False
hintnobracket = False
hints = []
hintsareright = False
contentsondisk = config.interwiki_contents_on_disk
lacklanguage = None
minlinks = 0
quiet = False
restoreAll = False
def readOptions(self, arg):
""" Read all commandline parameters for the global container """
if arg == '-noauto':
self.auto = False
elif arg.startswith('-hint:'):
self.hints.append(arg[6:])
elif arg.startswith('-hintfile'):
hintfilename = arg[10:]
if (hintfilename is None) or (hintfilename == ''):
hintfilename = pywikibot.input(u'Please enter the hint filename:')
f = codecs.open(hintfilename, 'r', config.textfile_encoding)
R = re.compile(ur'\[\[(.+?)(?:\]\]|\|)') # hint or title ends either before | or before ]]
for pageTitle in R.findall(f.read()):
self.hints.append(pageTitle)
f.close()
elif arg == '-force':
self.force = True
elif arg == '-same':
self.same = True
elif arg == '-wiktionary':
self.same = 'wiktionary'
elif arg == '-untranslated':
self.untranslated = True
elif arg == '-untranslatedonly':
self.untranslated = True
self.untranslatedonly = True
elif arg == '-askhints':
self.untranslated = True
self.untranslatedonly = False
self.askhints = True
elif arg == '-hintnobracket':
self.hintnobracket = True
elif arg == '-confirm':
self.confirm = True
elif arg == '-select':
self.select = True
elif arg == '-autonomous' or arg == '-auto':
self.autonomous = True
elif arg == '-noredirect':
self.followredirect = False
elif arg == '-initialredirect':
self.initialredirect = True
elif arg == '-localonly':
self.localonly = True
elif arg == '-limittwo':
self.limittwo = True
self.strictlimittwo = True
elif arg.startswith('-whenneeded'):
self.limittwo = True
self.strictlimittwo = False
try:
self.needlimit = int(arg[12:])
except KeyError:
pass
except ValueError:
pass
elif arg.startswith('-skipfile:'):
skipfile = arg[10:]
skipPageGen = pagegenerators.TextfilePageGenerator(skipfile)
for page in skipPageGen:
self.skip.add(page)
del skipPageGen
elif arg == '-skipauto':
self.skipauto = True
elif arg.startswith('-neverlink:'):
self.neverlink += arg[11:].split(",")
elif arg.startswith('-ignore:'):
self.ignore += [pywikibot.Page(None,p) for p in arg[8:].split(",")]
elif arg.startswith('-ignorefile:'):
ignorefile = arg[12:]
ignorePageGen = pagegenerators.TextfilePageGenerator(ignorefile)
for page in ignorePageGen:
self.ignore.append(page)
del ignorePageGen
elif arg == '-showpage':
self.showtextlink += self.showtextlinkadd
elif arg == '-graph':
# override configuration
config.interwiki_graph = True
elif arg == '-bracket':
self.parenthesesonly = True
elif arg == '-localright':
self.followinterwiki = False
elif arg == '-hintsareright':
self.hintsareright = True
elif arg.startswith('-array:'):
self.minsubjects = int(arg[7:])
elif arg.startswith('-query:'):
self.maxquerysize = int(arg[7:])
elif arg == '-back':
self.nobackonly = True
elif arg == '-quiet':
self.quiet = True
elif arg.startswith('-lack:'):
remainder = arg[6:].split(':')
self.lacklanguage = remainder[0]
if len(remainder) > 1:
self.minlinks = int(remainder[1])
else:
self.minlinks = 1
else:
return False
return True
class StoredPage(pywikibot.Page):
"""
Store the Page contents on disk to avoid sucking too much
memory when a big number of Page objects will be loaded
at the same time.
"""
# Please prefix the class members names by SP
# to avoid possible name clashes with pywikibot.Page
# path to the shelve
SPpath = None
# shelve
SPstore = None
# attributes created by pywikibot.Page.__init__
SPcopy = [ '_editrestriction',
'_site',
'_namespace',
'_section',
'_title',
'editRestriction',
'moveRestriction',
'_permalink',
'_userName',
'_ipedit',
'_editTime',
'_startTime',
'_revisionId',
'_deletedRevs' ]
def SPdeleteStore():
if StoredPage.SPpath:
del StoredPage.SPstore
os.unlink(StoredPage.SPpath)
SPdeleteStore = staticmethod(SPdeleteStore)
def __init__(self, page):
for attr in StoredPage.SPcopy:
setattr(self, attr, getattr(page, attr))
if not StoredPage.SPpath:
import shelve
index = 1
while True:
path = config.datafilepath('cache', 'pagestore' + str(index))
if not os.path.exists(path): break
index += 1
StoredPage.SPpath = path
StoredPage.SPstore = shelve.open(path)
self.SPkey = self.aslink().encode('utf-8')
self.SPcontentSet = False
def SPgetContents(self):
return StoredPage.SPstore[self.SPkey]
def SPsetContents(self, contents):
self.SPcontentSet = True
StoredPage.SPstore[self.SPkey] = contents
def SPdelContents(self):
if self.SPcontentSet:
del StoredPage.SPstore[self.SPkey]
_contents = property(SPgetContents, SPsetContents, SPdelContents)
class PageTree(object):
"""
Structure to manipulate a set of pages.
Allows filtering efficiently by Site.
"""
def __init__(self):
# self.tree :
# Dictionary:
# keys: Site
# values: list of pages
# All pages found within Site are kept in
# self.tree[site]
# While using dict values would be faster for
# the remove() operation,
# keeping list values is important, because
# the order in which the pages were found matters:
# the earlier a page is found, the closer it is to the
# Subject.originPage. Chances are that pages found within
# 2 interwiki distance from the originPage are more related
# to the original topic than pages found later on, after
# 3, 4, 5 or more interwiki hops.
# Keeping this order is hence important to display ordered
# list of pages to the user when he'll be asked to resolve
# conflicts.
self.tree = {}
self.size = 0
def filter(self, site):
"""
Iterates over pages that are in Site site
"""
try:
for page in self.tree[site]:
yield page
except KeyError:
pass
def __len__(self):
return self.size
def add(self, page):
site = page.site()
if not site in self.tree:
self.tree[site] = []
self.tree[site].append(page)
self.size += 1
def remove(self, page):
try:
self.tree[page.site()].remove(page)
self.size -= 1
except ValueError:
pass
def removeSite(self, site):
"""
Removes all pages from Site site
"""
try:
self.size -= len(self.tree[site])
del self.tree[site]
except KeyError:
pass
def siteCounts(self):
"""
Yields (Site, number of pages in site) pairs
"""
for site, d in self.tree.iteritems():
yield site, len(d)
def __iter__(self):
for site, plist in self.tree.iteritems():
for page in plist:
yield page
class Subject(object):
"""
Class to follow the progress of a single 'subject' (i.e. a page with
all its translations)
Subject is a transitive closure of the binary relation on Page:
"has_a_langlink_pointing_to".
A formal way to compute that closure would be:
With P a set of pages, NL ('NextLevel') a function on sets defined as:
NL(P) = { target | ∃ source ∈ P, target ∈ source.langlinks() }
pseudocode:
todo <- [originPage]
done <- []
while todo != []:
pending <- todo
todo <-NL(pending) / done
done <- NL(pending) U done
return done
There is, however, one limitation that is induced by implementation:
to compute efficiently NL(P), one has to load the page contents of
pages in P.
(Not only the langlinks have to be parsed from each Page, but we also want
to know if the Page is a redirect, a disambiguation, etc...)
Because of this, the pages in pending have to be preloaded.
However, because the pages in pending are likely to be in several sites
we cannot "just" preload them as a batch.
Instead of doing "pending <- todo" at each iteration, we have to elect a
Site, and we put in pending all the pages from todo that belong to that
Site:
Code becomes:
todo <- {originPage.site():[originPage]}
done <- []
while todo != {}:
site <- electSite()
pending <- todo[site]
preloadpages(site, pending)
todo[site] <- NL(pending) / done
done <- NL(pending) U done
return done
Subject objects only operate on pages that should have been preloaded before.
In fact, at any time:
* todo contains new Pages that have not been loaded yet
* done contains Pages that have been loaded, and that have been treated.
* If batch preloadings are successful, Page._get() is never called from
this Object.
"""
def __init__(self, originPage, hints = None):
"""Constructor. Takes as arguments the Page on the home wiki
plus optionally a list of hints for translation"""
if globalvar.contentsondisk:
originPage = StoredPage(originPage)
# Remember the "origin page"
self.originPage = originPage
# todo is a list of all pages that still need to be analyzed.
# Mark the origin page as todo.
self.todo = PageTree()
self.todo.add(originPage)
# done is a list of all pages that have been analyzed and that
# are known to belong to this subject.
self.done = PageTree()
# foundIn is a dictionary where pages are keys and lists of
# pages are values. It stores where we found each page.
# As we haven't yet found a page that links to the origin page, we
# start with an empty list for it.
self.foundIn = {self.originPage:[]}
# This is a list of all pages that are currently scheduled for
# download.
self.pending = PageTree()
if globalvar.hintsareright:
# This is a set of sites that we got hits to
self.hintedsites = set()
self.translate(hints, globalvar.hintsareright)
self.confirm = globalvar.confirm
self.problemfound = False
self.untranslated = None
self.hintsAsked = False
self.forcedStop = False
self.workonme = True
def getFoundDisambig(self, site):
"""
If we found a disambiguation on the given site while working on the
subject, this method returns it. If several ones have been found, the
first one will be returned.
Otherwise, None will be returned.
"""
for tree in [self.done, self.pending]:
for page in tree.filter(site):
if page.exists() and page.isDisambig():
return page
return None
def getFoundNonDisambig(self, site):
"""
If we found a non-disambiguation on the given site while working on the
subject, this method returns it. If several ones have been found, the
first one will be returned.
Otherwise, None will be returned.
"""
for tree in [self.done, self.pending]:
for page in tree.filter(site):
if page.exists() and not page.isDisambig() \
and not page.isRedirectPage() and not page.isCategoryRedirect():
return page
return None
def getFoundInCorrectNamespace(self, site):
"""
If we found a page that has the expected namespace on the given site
while working on the subject, this method returns it. If several ones
have been found, the first one will be returned.
Otherwise, None will be returned.
"""
for tree in [self.done, self.pending, self.todo]:
for page in tree.filter(site):
if page.namespace() == self.originPage.namespace():
if page.exists() and not page.isRedirectPage() and not page.isCategoryRedirect():
return page
return None
def translate(self, hints = None, keephintedsites = False):
"""Add the given translation hints to the todo list"""
if globalvar.same:
if hints:
pages = titletranslate.translate(self.originPage, hints = hints + ['all:'], auto = globalvar.auto, removebrackets
= globalvar.hintnobracket)
else:
pages = titletranslate.translate(self.originPage, hints = ['all:'], auto = globalvar.auto, removebrackets
= globalvar.hintnobracket)
else:
pages = titletranslate.translate(self.originPage, hints = hints, auto = globalvar.auto, removebrackets
= globalvar.hintnobracket)
for page in pages:
if globalvar.contentsondisk:
page = StoredPage(page)
self.todo.add(page)
self.foundIn[page] = [None]
if keephintedsites:
self.hintedsites.add(page.site)
def openSites(self):
"""
Iterator. Yields (site, count) pairs:
* site is a site where we still have work to do on
* count is the number of items in that Site that need work on
"""
return self.todo.siteCounts()
def whatsNextPageBatch(self, site):
"""
By calling this method, you 'promise' this instance that you will
preload all the 'site' Pages that are in the todo list.
This routine will return a list of pages that can be treated.
"""
# Bug-check: Isn't there any work still in progress? We can't work on
# different sites at a time!
if len(self.pending) > 0:
raise 'BUG: Can\'t start to work on %s; still working on %s' % (site, self.pending)
# Prepare a list of suitable pages
result = []
for page in self.todo.filter(site):
self.pending.add(page)
result.append(page)
self.todo.removeSite(site)
# If there are any, return them. Otherwise, nothing is in progress.
return result
def makeForcedStop(self,counter):
"""
Ends work on the page before the normal end.
"""
for site, count in self.todo.siteCounts():
counter.minus(site, count)
self.todo = PageTree()
self.forcedStop = True
def addIfNew(self, page, counter, linkingPage):
"""
Adds the pagelink given to the todo list, but only if we didn't know
it before. If it is added, update the counter accordingly.
Also remembers where we found the page, regardless of whether it had
already been found before or not.
Returns True if the page is new.
"""
if self.forcedStop:
return False
if globalvar.nobackonly:
if page == self.originPage:
try:
pywikibot.output(u"%s has a backlink from %s."%(page,linkingPage))
except UnicodeDecodeError:
pywikibot.output(u"Found a backlink for a page.")
self.makeForcedStop(counter)
return False
if page in self.foundIn:
# not new
self.foundIn[page].append(linkingPage)
return False
else:
if globalvar.contentsondisk:
page = StoredPage(page)
self.foundIn[page] = [linkingPage]
self.todo.add(page)
counter.plus(page.site())
return True
def skipPage(self, page, target, counter):
return self.isIgnored(target) or \
self.namespaceMismatch(page, target, counter) or \
self.wiktionaryMismatch(target)
def namespaceMismatch(self, linkingPage, linkedPage, counter):
"""
Checks whether or not the given page has another namespace
than the origin page.
Returns True if the namespaces are different and the user
has selected not to follow the linked page.
"""
if linkedPage in self.foundIn:
# We have seen this page before, don't ask again.
return False
elif self.originPage.namespace() != linkedPage.namespace():
# Allow for a mapping between different namespaces
crossFrom = self.originPage.site().family.crossnamespace.get(self.originPage.namespace(), {})
crossTo = crossFrom.get(self.originPage.site().language(), crossFrom.get('_default', {}))
nsmatch = crossTo.get(linkedPage.site().language(), crossTo.get('_default', []))
if linkedPage.namespace() in nsmatch:
return False
if globalvar.autonomous:
pywikibot.output(u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i." % (self.originPage.aslink(True), self.originPage.namespace(), linkedPage.aslink(True), linkedPage.namespace()))
# Fill up foundIn, so that we will not write this notice
self.foundIn[linkedPage] = [linkingPage]
return True
else:
preferredPage = self.getFoundInCorrectNamespace(linkedPage.site())
if preferredPage:
pywikibot.output(u"NOTE: Ignoring link from page %s in namespace %i to page %s in namespace %i because page %s in the correct namespace has already been found." % (self.originPage.aslink(True), self.originPage.namespace(), linkedPage.aslink(True), linkedPage.namespace(), preferredPage.aslink(True)))
return True
else:
choice = pywikibot.inputChoice('WARNING: %s is in namespace %i, but %s is in namespace %i. Follow it anyway?' % (self.originPage.aslink(True), self.originPage.namespace(), linkedPage.aslink(True), linkedPage.namespace()), ['Yes', 'No', 'Add an alternative', 'give up'], ['y', 'n', 'a', 'g'])
if choice != 'y':
# Fill up foundIn, so that we will not ask again
self.foundIn[linkedPage] = [linkingPage]
if choice == 'g':
self.makeForcedStop(counter)
elif choice == 'a':
newHint = pywikibot.input(u'Give the alternative for language %s, not using a language code:' % linkedPage.site().language())
if newHint:
alternativePage = pywikibot.Page(linkedPage.site(), newHint)
if alternativePage:
# add the page that was entered by the user
self.addIfNew(alternativePage, counter, None)
else:
pywikibot.output(u"NOTE: ignoring %s and its interwiki links" % linkedPage.aslink(True))
return True
else:
# same namespaces, no problem
return False
def wiktionaryMismatch(self, page):
if globalvar.same=='wiktionary':
if page.title().lower() != self.originPage.title().lower():
pywikibot.output(u"NOTE: Ignoring %s for %s in wiktionary mode" % (page.aslink(), self.originPage.aslink()))
return True
elif page.title() != self.originPage.title() and self.originPage.site().nocapitalize and page.site().nocapitalize:
pywikibot.output(u"NOTE: Ignoring %s for %s in wiktionary mode because both languages are uncapitalized." % (page.aslink(), self.originPage.aslink()))
return True
return False
def disambigMismatch(self, page, counter):
"""
Checks whether or not the given page has the another disambiguation
status than the origin page.
Returns a tuple (skip, alternativePage).
skip is True if the pages have mismatching statuses and the bot
is either in autonomous mode, or the user chose not to use the
given page.
alternativePage is either None, or a page that the user has
chosen to use instead of the given page.
"""
if globalvar.autonomous:
if self.originPage.isDisambig() and not page.isDisambig():
pywikibot.output(u"NOTE: Ignoring link from disambiguation page %s to non-disambiguation %s" % (self.originPage.aslink(True), page.aslink(True)))
return (True, None)
elif not self.originPage.isDisambig() and page.isDisambig():
pywikibot.output(u"NOTE: Ignoring link from non-disambiguation page %s to disambiguation %s" % (self.originPage.aslink(True), page.aslink(True)))
return (True, None)
else:
choice = 'y'
if self.originPage.isDisambig() and not page.isDisambig():
disambig = self.getFoundDisambig(page.site())
if disambig:
pywikibot.output(u"NOTE: Ignoring non-disambiguation page %s for %s because disambiguation page %s has already been found." % (page.aslink(True), self.originPage.aslink(True), disambig.aslink(True)))
return (True, None)
else:
choice = pywikibot.inputChoice('WARNING: %s is a disambiguation page, but %s doesn\'t seem to be one. Follow it anyway?' % (self.originPage.aslink(True), page.aslink(True)), ['Yes', 'No', 'Add an alternative', 'Give up'], ['y', 'n', 'a', 'g'])
elif not self.originPage.isDisambig() and page.isDisambig():
nondisambig = self.getFoundNonDisambig(page.site())
if nondisambig:
pywikibot.output(u"NOTE: Ignoring disambiguation page %s for %s because non-disambiguation page %s has already been found." % (page.aslink(True), self.originPage.aslink(True), nondisambig.aslink(True)))
return (True, None)
else:
choice = pywikibot.inputChoice('WARNING: %s doesn\'t seem to be a disambiguation page, but %s is one. Follow it anyway?' % (self.originPage.aslink(True), page.aslink(True)), ['Yes', 'No', 'Add an alternative', 'Give up'], ['y', 'n', 'a', 'g'])
if choice == 'n':
return (True, None)
elif choice == 'a':
newHint = pywikibot.input(u'Give the alternative for language %s, not using a language code:' % page.site().language())
alternativePage = pywikibot.Page(page.site(), newHint)
return (True, alternativePage)
elif choice == 'g':
self.makeForcedStop(counter)
return (True, None)
# We can follow the page.
return (False, None)
def isIgnored(self, page):
if page.site().language() in globalvar.neverlink:
pywikibot.output(u"Skipping link %s to an ignored language" % page.aslink())
return True
if page in globalvar.ignore:
pywikibot.output(u"Skipping link %s to an ignored page" % page.aslink())
return True
return False
def reportInterwikilessPage(self, page):
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s does not have any interwiki links" % self.originPage.aslink(True))
if config.without_interwiki:
f = codecs.open(
pywikibot.config.datafilepath('without_interwiki.txt'), 'a', 'utf-8')
f.write("# %s \n" % page.aslink(forceInterwiki=True))
f.close()
def askForHints(self, counter):
if not self.workonme:
# Do not ask hints for pages that we don't work on anyway
return
if (self.untranslated or globalvar.askhints) and not self.hintsAsked \
and not self.originPage.isRedirectPage() and not self.originPage.isCategoryRedirect():
# Only once!
self.hintsAsked = True
if globalvar.untranslated:
newhint = None
t = globalvar.showtextlink
if t:
pywikibot.output(self.originPage.get()[:t])
# loop
while True:
newhint = pywikibot.input(u'Give a hint (? to see pagetext):')
if newhint == '?':
t += globalvar.showtextlinkadd
pywikibot.output(self.originPage.get()[:t])
elif newhint and not ':' in newhint:
pywikibot.output(u'Please enter a hint in the format language:pagename or type nothing if you do not have a hint.')
elif not newhint:
break
else:
pages = titletranslate.translate(self.originPage, hints = [newhint], auto = globalvar.auto, removebrackets
= globalvar.hintnobracket)
for page in pages:
self.addIfNew(page, counter, None)
if globalvar.hintsareright:
self.hintedsites.add(page.site)
def batchLoaded(self, counter):
"""
This is called by a worker to tell us that the promised batch of
pages was loaded.
In other words, all the pages in self.pending have already
been preloaded.
The only argument is an instance
of a counter class, that has methods minus() and plus() to keep
counts of the total work todo.
"""
# Loop over all the pages that should have been taken care of
for page in self.pending:
# Mark the page as done
self.done.add(page)
# make sure that none of the linked items is an auto item
if globalvar.skipauto:
dictName, year = page.autoFormat()
if dictName is not None:
pywikibot.output(u'WARNING: %s:%s relates to %s:%s, which is an auto entry %s(%s)' % (self.originPage.site().language(), self.originPage.title(), page.site().language(),page.title(),dictName,year))
# Abort processing if the bot is running in autonomous mode.
if globalvar.autonomous:
self.makeForcedStop(counter)
# Register this fact at the todo-counter.
counter.minus(page.site())
# Now check whether any interwiki links should be added to the
# todo list.
if not page.exists():
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s does not exist. Skipping." % page.aslink(True))
if page == self.originPage:
# The page we are working on is the page that does not exist.
# No use in doing any work on it in that case.
for site, count in self.todo.siteCounts():
counter.minus(site, count)
self.todo = PageTree()
# In some rare cases it might be we already did check some 'automatic' links
self.done = PageTree()
continue
elif page.isRedirectPage() or page.isCategoryRedirect():
if page.isRedirectPage():
redir = u''
else:
redir = u'category '
try:
if page.isRedirectPage():
redirectTargetPage = page.getRedirectTarget()
else:
redirectTargetPage = page.getCategoryRedirectTarget()
except pywikibot.InvalidTitle:
# MW considers #redirect [[en:#foo]] as a redirect page,
# but we can't do anything useful with such pages
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s redirects to an invalid title"
% page.aslink(True))
continue
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s is %sredirect to %s"
% (page.aslink(True), redir, redirectTargetPage.aslink(True)))
if page == self.originPage:
if globalvar.initialredirect:
if globalvar.contentsondisk:
redirectTargetPage = StoredPage(redirectTargetPage)
#don't follow double redirects; it might be a self loop
if not redirectTargetPage.isRedirectPage() \
and not redirectTargetPage.isCategoryRedirect():
self.originPage = redirectTargetPage
self.todo.add(redirectTargetPage)
counter.plus(redirectTargetPage.site())
else:
# This is a redirect page to the origin. We don't need to
# follow the redirection.
# In this case we can also stop all hints!
for site, count in self.todo.siteCounts():
counter.minus(site, count)
self.todo = PageTree()
elif not globalvar.followredirect:
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: not following %sredirects." % redir)
elif page.site().family == redirectTargetPage.site().family \
and not self.skipPage(page, redirectTargetPage, counter):
if self.addIfNew(redirectTargetPage, counter, page):
if config.interwiki_shownew or pywikibot.verbose:
pywikibot.output(u"%s: %s gives new %sredirect %s"
% (self.originPage.aslink(), page.aslink(True), redir, redirectTargetPage.aslink(True)))
continue
# must be behind the page.isRedirectPage() part
# otherwise a redirect error would be raised
if page.isEmpty() and not page.isCategory():
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s is empty. Skipping." % page.aslink(True))
if page == self.originPage:
for site, count in self.todo.siteCounts():
counter.minus(site, count)
self.todo = PageTree()
self.done = PageTree()
continue
elif page.section():
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s is a page section. Skipping." % page.aslink(True))
continue
# Page exists, isnt a redirect, and is a plain link (no section)
try:
iw = page.interwiki()
except pywikibot.NoSuchSite:
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: site %s does not exist" % page.site())
continue
(skip, alternativePage) = self.disambigMismatch(page, counter)
if skip:
pywikibot.output(u"NOTE: ignoring %s and its interwiki links" % page.aslink(True))
self.done.remove(page)
iw = ()
if alternativePage:
# add the page that was entered by the user
self.addIfNew(alternativePage, counter, None)
duplicate = None
for p in self.done.filter(page.site()):
if p != page and p.exists() and not p.isRedirectPage() and not p.isCategoryRedirect():
duplicate = p
break
if self.originPage == page:
self.untranslated = (len(iw) == 0)
if globalvar.untranslatedonly:
# Ignore the interwiki links.
iw = ()
if globalvar.lacklanguage:
if globalvar.lacklanguage in [link.site().language() for link in iw]:
iw = ()
self.workonme = False
if len(iw) < globalvar.minlinks:
iw = ()
self.workonme = False
elif globalvar.autonomous and duplicate and not skip:
pywikibot.output(u"Stopping work on %s because duplicate pages"\
" %s and %s are found" % (self.originPage.aslink(True),
duplicate.aslink(True),
page.aslink(True)))
self.makeForcedStop(counter)
try:
f = codecs.open(
pywikibot.config.datafilepath('autonomous_problems.dat'),
'a', 'utf-8')
f.write("* %s {Found more than one link for %s}" % (self.originPage.aslink(True), page.site()))
if config.interwiki_graph and config.interwiki_graph_url:
filename = interwiki_graph.getFilename(self.originPage, extension = config.interwiki_graph_formats[0])
f.write(" [%s%s graph]" % (config.interwiki_graph_url, filename))
f.write("\n")
f.close()
# FIXME: What errors are we catching here?
# except: should be avoided!!
except:
#raise
pywikibot.output(u'File autonomous_problems.dat open or corrupted! Try again with -restore.')
sys.exit()
iw = ()
elif page.isEmpty() and not page.isCategory():
if not globalvar.quiet or pywikibot.verbose:
pywikibot.output(u"NOTE: %s is empty; ignoring it and its interwiki links" % page.aslink(True))
# Ignore the interwiki links
self.done.remove(page)
iw = ()
for linkedPage in iw:
if globalvar.hintsareright:
if linkedPage.site in self.hintedsites:
pywikibot.output(u"NOTE: %s: %s extra interwiki on hinted site ignored %s" % (self.originPage.aslink(), page.aslink(True), linkedPage.aslink(True)))
break
if not self.skipPage(page, linkedPage, counter):
if globalvar.followinterwiki or page == self.originPage:
if self.addIfNew(linkedPage, counter, page):
# It is new. Also verify whether it is the second on the
# same site
lpsite=linkedPage.site()
for prevPage in self.foundIn:
if prevPage != linkedPage and prevPage.site() == lpsite:
# Still, this could be "no problem" as either may be a
# redirect to the other. No way to find out quickly!
pywikibot.output(u"NOTE: %s: %s gives duplicate interwiki on same site %s" % (self.originPage.aslink(True), page.aslink(True), linkedPage.aslink(True)))
break
else:
if config.interwiki_shownew or pywikibot.verbose:
pywikibot.output(u"%s: %s gives new interwiki %s"% (self.originPage.aslink(), page.aslink(True), linkedPage.aslink(True)))
# These pages are no longer 'in progress'
self.pending = PageTree()
# Check whether we need hints and the user offered to give them
if self.untranslated and not self.hintsAsked:
self.reportInterwikilessPage(page)
self.askForHints(counter)
def isDone(self):
"""Return True if all the work for this subject has completed."""
return len(self.todo) == 0
def problem(self, txt, createneed = True):
"""Report a problem with the resolution of this subject."""
pywikibot.output(u"ERROR: %s" % txt)
self.confirm = True
if createneed:
self.problemfound = True
def whereReport(self, page, indent=4):
for page2 in sorted(self.foundIn[page]):
if page2 is None:
pywikibot.output(u" "*indent + "Given as a hint.")
else:
pywikibot.output(u" "*indent + page2.aslink(True))
def assemble(self):
# No errors have been seen so far, except....
errorCount = self.problemfound
mysite = pywikibot.getSite()
# Build up a dictionary of all pages found, with the site as key.
# Each value will be a list of pages.
new = {}
for page in self.done:
if page.exists() and not page.isRedirectPage() and not page.isCategoryRedirect():
site = page.site()
if site == self.originPage.site():
if page != self.originPage:
self.problem("Found link to %s" % page.aslink(True) )
self.whereReport(page)
errorCount += 1
else:
if site in new:
new[site].append(page)
else:
new[site] = [page]
# See if new{} contains any problematic values
result = {}
for site, pages in new.iteritems():
if len(pages) > 1:
errorCount += 1
self.problem("Found more than one link for %s" % site)
if not errorCount and not globalvar.select:
# no errors, so all lists have only one item
for site, pages in new.iteritems():
result[site] = pages[0]
return result
# There are any errors.
if config.interwiki_graph:
graphDrawer = interwiki_graph.GraphDrawer(self)
graphDrawer.createGraph()
# We don't need to continue with the rest if we're in autonomous
# mode.
if globalvar.autonomous:
return None
# First loop over the ones that have more solutions
for site, pages in new.iteritems():
if len(pages) > 1:
pywikibot.output(u"=" * 30)
pywikibot.output(u"Links to %s" % site)
i = 0
for page2 in pages:
i += 1
pywikibot.output(u" (%d) Found link to %s in:" % (i, page2.aslink(True)))
self.whereReport(page2, indent = 8)
while True:
answer = pywikibot.input(u"Which variant should be used? (<number>, [n]one, [g]ive up) ").lower()
if answer:
if answer == 'g':
return None