مستخدم:Najem Ajem/vector-2022.js
(بالتحويل من مستخدم:الناجم العاجم/vector-2022.js)
ملاحظة: بعد النشر، أنت قد تحتاج إلى إفراغ الكاش الخاص بمتصفحك لرؤية التغييرات.
- فايرفوكس / سافاري: أمسك Shift أثناء ضغط Reload، أو اضغط على إما Ctrl-F5 أو Ctrl-R (⌘-R على ماك)
- جوجل كروم: اضغط Ctrl-Shift-R (⌘-Shift-R على ماك)
- إنترنت إكسبلورر/إيدج: أمسك Ctrl أثناء ضغط Refresh، أو اضغط Ctrl-F5
- أوبرا: اضغط Ctrl-F5.
//مسودتي
$( document ).ready( function() {
mw.util.addPortletLink(
'p-personal',
'/w/index.php?title=مستخدم:الناجم العاجم/مسودة&action=edit',
'مسودة'
);
});
importScript('MediaWiki:Gadget-QQ.js');
importScript('MediaWiki:Gadget-QQ.css');
importScript('MediaWiki:Gadget-silent fail storage.js');
importScript('MediaWiki:Gadget-editor.js');
// install [[en:MediaWiki:Gadget-TranslationAdder.js]] in-browser text editor to experience it
mw.loader.load('//en.wiktionary.org/w/index.php?title=MediaWiki:Gadget-TranslationAdder.js&action=raw&ctype=text/javascript');
/**
* العمل على مساعد لإضافة الترجمات
*
* مأخوذ من النسخة السويدية من إضافة
* [[sv:MediaWiki:Gadget-translation editor.js]] (oldid=1687182) - الكاتب : [[sv:User:Skalman]]
*
* والتي هي مستوحاة من النسخة الإنجليزية
* [[en:User:Conrad.Irwin/editor.js]]
*
* [[تصنيف:سكريبتات ويكاموس|محرر الترجمات]]
*/
/* global jQuery, mediaWiki, editor, silentFailStorage, CrTr_ChangerLiensRouges, wgPageName */
( function( mw, $ ) { // Closure (مغلقة في نهاية السكريبت)
'use strict';
var
// جدول التوافقات: لغة <-> رمز اللغة
// والذي سيُحمل في استمارة
tab_langues,
// Id يُجمع في وظيفة add_heading_updater() لأجل
// ملخصات تعديل مكتوبة بطريقة صحيحة
heading_id_counter = 0;
if (editor.enabled) {
$('div.translations')
.each(function (i) {
add_translation_form(this, i);
add_heading_updater(this);
});
// إعادة تحميل وصلات الترجمات الأولية إذا كانت موجودة
$('.trad-stub').hide();
$('.trad-stub').parent('li').hide();
}
// ما نسميه 'جدولا' هو في الحقيقة 'div' على ويكاموس
// لكن ذو حمولة أقل (له مظهر جدول قيم)
function get_translation_table_index(table) {
return $.inArray(table, $('div.translations'));
}
function get_error_html(message) {
return '<img src="//upload.wikimedia.org/wikipedia/commons/6/67/MW-Icon-AlertMark.svg"> ' + message;
}
function get_info_html(message) {
return '<img src="//upload.wikimedia.org/wikipedia/commons/a/a8/OOjs UI icon info big progressive.svg"> ' + message;
}
function add_heading_updater(table) {
var id = heading_id_counter++;
var self = $(table).parent().parent('.NavContent').prev('.NavHead');
var edit_head = $('<a>', {
href: '#',
text: '±',
'class': 'ed-edit-head',
title: 'غيّر الوصف'
}).prependTo(self);
function remove_gloss_nodes() {
var nodes = [];
$.each(self[0].childNodes, function (i, node) {
if (node.className !== 'ed-edit-head' && node.className !== 'NavToggle') {
nodes.push(node);
}
});
$(nodes).detach();
return nodes;
}
var gloss_nodes;
edit_head.click(function (e) {
e.preventDefault();
if (self.find('form').length) {
self.find('form').remove();
self.append(gloss_nodes);
return;
}
edit_head.text('تحميل…');
editor.wikitext()
.then(function (wikitext) {
edit_head.text('±');
gloss_nodes = remove_gloss_nodes();
var prev_gloss_nodes = gloss_nodes;
var gloss = translation.get_gloss(wikitext, get_translation_table_index(table));
var gloss_to_handle = gloss.standard ? gloss.text : gloss.trans_top;
var form = $('<form>', { html:
'<label>تعريف: <input name="gloss"></label>' +
'<button type="submit">معاينة</button> ' +
'<span class="ed-loading">تحميل…</span>' +
'<span class="ed-errors"></span>'
});
function error(msg) {
form.find('.ed-errors')
.html(get_error_html(msg));
}
self.append(form);
form.find('input')
.val(gloss_to_handle)
.focus();
form.click(function (e) {
e.stopPropagation();
}).submit(function (e) {
e.preventDefault();
if (this.gloss.value === gloss_to_handle) {
error('الوصف لم يتغيّر');
return;
}
var gloss_wikitext = $.trim(this.gloss.value);
if (!translation.is_trans_top(gloss_wikitext) &&
translation.contains_wikitext(gloss_wikitext)) {
error('هيئة الوصف غير ملائمة، إنها' +
' تتضمن علامات ويكي ([]{}#|)' +
' (وبالتالي {{ترجمات}} غائب)');
return;
}
form.find('.ed-loading').show();
$.when(
parse_wikitext(translation.make_trans_top(gloss_wikitext)),
// get wikitext again in case it has changed since last time
editor.wikitext()
).done(function (gloss_html, wikitext) {
gloss_html = $(gloss_html);
var prev_class = self.parent('.NavFrame').attr('class');
var new_class = gloss_html.filter('.NavFrame').attr('class');
gloss_html = gloss_html.find('.NavHead').contents();
form.remove();
wikitext = translation.set_gloss(
wikitext,
get_translation_table_index(table),
gloss_wikitext
);
editor.edit({
wikitext: wikitext,
summary: 'عنوان : "' + gloss_wikitext + '"',
summary_type: 'gloss' + id,
redo: function () {
remove_gloss_nodes();
$('<span>', {
'class': 'ed-added',
html: gloss_html
}).appendTo(self) ;
if (prev_class !== new_class) {
self.parent('.NavFrame').attr('class', new_class);
}
},
undo: function () {
remove_gloss_nodes();
self.append(prev_gloss_nodes);
if (prev_class !== new_class) {
self.parent('.NavFrame').attr('class', prev_class);
}
}
});
});
});
});
});
}
function add_translation_form(table) {
var
self = $(table),
nav_content = self.parent().parent();
// إذا لم تكن أي ترجمة في الصندوق، يضاف ثانية 'ul'
// لربط النموذج
if ( self.children().length === 0 ||
self.children().first().prop('nodeName').toLowerCase() !== 'ul' ) {
self.append( $( '<ul></ul>' ) );
}
// خيارات اللغة
var lang_meta = {
'': '', // الحالة الإفتراضية لا تضيف النوع أو العدد
'ألمانية': 'مذ مؤ مح جم',
'aragonais': 'مذ مؤ جم',
'أرمينية': 'trans',
'أرمينية قديمة': 'trans',
'asturien': 'مذ مؤ مح جم',
'بنغالية': 'trans',
'بيلاروسية': 'مذ مؤ مح جم trans',
'birman': 'trans',
'بريتونية': 'مذ مؤ جم',
'بلغارية': 'مذ مؤ مح جم trans',
'كتالونية': 'مذ مؤ جم',
'صينية': 'trans tradi',
'copte': 'مذ مؤ trans',
'كورية': 'trans tradi',
'corse': 'مذ مؤ جم',
'دنماركية': 'مش مح جم',
'dzongkha': 'trans',
'erza': 'trans',
'إسبانية': 'مذ مؤ جم',
'féroïen': 'مذ مؤ مح',
'frioulan': 'مذ مؤ جم',
'جيورجية': 'trans',
'gaélique écossais': 'مذ مؤ مث',
'gaélique irlandais': 'مذ مؤ جم',
'galicien': 'مذ مؤ جم',
'gallois': 'مذ مؤ جم',
'gotique': 'مذ مؤ مح جم trans',
'goudjarati': 'trans',
'إغريقية': 'trans مذ مؤ مح جم',
'إغريقية قديمة': 'trans مذ مؤ مح مث جم',
'إغريقية بيزنطية': 'trans',
'عبرية': 'مذ مؤ trans',
'عبرية قديمة': 'مذ مؤ trans',
'هندية': 'مذ مؤ trans',
'inuktitut': 'trans',
'islandais': 'مذ مؤ مح جم',
'إيطالية': 'مذ مؤ مذ.مؤ جم',
'يابانية': 'trans',
'كازاخية': 'trans',
'khmer': 'trans',
'laotien': 'trans',
'لاتينية': 'مذ مؤ مح جم',
'letton': 'مذ مؤ جم',
'ligure': 'مذ مؤ جم',
'ليتوانية': 'مذ مؤ جم',
'لوكسمبورغية': 'مذ مؤ مح جم',
'macédonien': 'مذ مؤ مح جم trans',
'malayalam': 'trans',
'المندرين': 'trans tradi',
'marathe': 'trans',
'minnan': 'tradi',
'mirandais': 'مذ مؤ جم',
'mongol': 'trans',
'هولندية': 'مذ مؤ مح جم',
'نيبالية': 'trans',
'نرويجية (بوكمال)': 'مذ مؤ مح جم مذ.مؤ.جم',
'نرويجية (nynorsk)': 'مذ مؤ مح جم مذ.مؤ.جم',
'ossète': 'trans',
'فارسية': 'trans',
'piémontais': 'مذ مؤ جم',
'plodarisch': 'مذ مؤ مح جم',
'بولونية': 'مذ مؤ مح جم',
'برتغالية': 'مذ مؤ جم',
'romanche': 'مذ مؤ جم',
'رومانية': 'مذ مؤ مح جم',
'روسية': 'مذ مؤ مح trans',
'سنسكريتية': 'مذ مؤ مح مث جم trans',
'sarde': 'مذ مؤ جم',
'صربية': 'مذ مؤ مح جم trans',
'sherpa': 'trans',
'sicilien': 'مذ مؤ جم',
'سلوفاكية': 'مذ مؤ مح',
'سلوفينية': 'مذ مؤ مح',
'سويدية': 'مش مح',
'لغة التامول': 'trans',
'tadjik': 'trans',
'tatare': 'trans',
'thaï': 'trans',
'tibétain': 'trans',
'أوكرانية': 'مذ مؤ مح جم trans',
'vénitien': 'مذ مؤ جم',
'أيرلندية قديمة': 'مذ مؤ مح مث جم',
'vieux norrois': 'مذ مؤ مح جم',
'vieux slave': 'مذ مؤ مح مث جم',
'yiddish': 'مذ مؤ مح جم trans',
};
// الترجمات في هذه اللغات يمكن أن تتضمن حرفا كبيرا
// كي لا ينجم عن هذا خطأ في حال عدم احتواء عنوان الصفحة على حرف كبير: ميزة مضافة تجريبيا لا غير
var expected_case = [
'ألمانية',
'alémanique alsacien',
'vieux-francique',
'francique mosellan',
'francique rhénan',
'francique ripuaire',
'لوكسمبورغية'
];
var options = $.map({
النوع: {
مذ: 'مذكر',
مؤ: 'مؤنث',
مذ ومؤ: 'مذكر ومؤنث',
مث: 'مثنى',
مش: 'مشترَك',
مف: 'مفرد',
مز: 'مزدوَج',
جم: 'جمع',
جم مذ: 'جمع مذكر',
جم مؤ: 'جمع مؤنث',
جم مث: 'جمع مثنى',
جم مذ ومؤ: 'جمع مذكر ومؤنث'
}
}, function (items, name) {
items = $.map(items, function (text, value) {
return '<label class="ed-' + value + '">' +
'<input type="radio" name="' + name + '" value="' + value + '">' +
text +
'</label>';
});
return '<p class="ed-options ed-' + name + '">' + items.join(' ') + '</p>';
}).join('') +
'<p class="ed-options"><label class="ed-trans">عوربة: ' +
'<input name="trans" placeholder="مثال: ستيپل لأجل staple"></label></p>' +
'<p class="ed-options"><label class="ed-tradi">كتابة تقليدية: ' +
'<input name="tradi" placeholder="مثال: 軍團 لأجل 군단"></label></p>' +
'<p class="ed-options"><label class="ed-pagename">اسم الصفحة<span title="' +
'إذا كانت الترجمة لا تقابل اسم صفحة موجودة في ويكاموس، ' +
'فيمكن حينئذ تحديد اسم صفحة مكافئة مرغوب في استعمالها هنا' +
'(رابط الترجمة سيوجِه إذن إلى الصفحة المكافئة)">(؟)</span>: ' +
'<input name="pagename" placeholder="مثال: cestina لأجل čeština"></label></p>';
var form = $($.parseHTML('<form>' +
'<p><label><span class="txt-label">Ajouter une traduction en </span>' +
'<input class="ed-lang-name" name="lang_name" size="13" title="' +
'Nom de langue (anglais,…)" placeholder="langue à choisir"></label> : ' +
'<input class="ed-word" name="word" size="20" title="traduction" placeholder="traduction"> ' +
'<button type="submit">Ajouter</button> ' +
'<a href="#" class="ed-more">Plus</a></p>' +
options +
'<p><span class="ed-feedback">Signaler une anomalie – Suggérer une amélioration</span></p>' +
'<div class="ed-errors"></div>' +
'<div class="ed-info-msg"></div>' +
'</form>'));
// Make radio buttons deselectable
form.find(':radio').click(function last_click(e) {
if (last_click[this.name] === this) {
last_click[this.name] = null;
this.checked = false;
} else {
last_click[this.name] = this;
}
});
var show_all_opts = false;
form.find('.ed-lang-name')
// remplacement - si nécessaire - du code langue en nom de langue
.blur(remplace_code_langue)
.blur(update_options_visibility)
// If the item exists, the value will be used as the value,
// otherwise it's 'null', which empties (the already empty)
// text field.
.val(silentFailStorage.getItem('trans-lang'));
form.find('.ed-more').click(function (e) {
e.preventDefault();
show_all_opts = !show_all_opts;
$(this).text(show_all_opts ? 'Moins' : 'Plus');
update_options_visibility();
});
form.find('.ed-feedback').click(function(e) {
mw.loader.using('mediawiki.feedback', function() {
var
mwTitle = new mw.Title('Discussion_MediaWiki:Gadget-translation_editor.js'),
feedback = new mw.Feedback({
title: mwTitle
});
feedback.launch({subject: 'Traductions dans \"' + mw.config.get('wgPageName').replace(/_/g, ' ') + '\"'});
// Afficher un placeholder pour le message
var placeholder_feedback = 'Veuillez entrer votre message ici';
if ($('.mw-feedbackDialog-feedback-form textarea').length) {
$('.mw-feedbackDialog-feedback-form textarea').get(0).placeholder = placeholder_feedback;
}
// Cacher le bouton "Signaler un bogue technique"
$('.oo-ui-processDialog-actions-other').hide();
});
});
update_options_visibility();
function update_options_visibility() {
var elems = form.find('.ed-options label');
if (show_all_opts) {
elems.show();
form.find('.ed-feedback').show();
// On affiche le champ pour l'écriture traditionnelle
// uniquement en chinois et en coréen
var lang_name = form.find('.ed-lang-name').val();
if ($.inArray(lang_name, ['chinois', 'coréen']) === -1) {
form.find('.ed-tradi').hide();
}
} else {
var opts = lang_meta[form[0].lang_name.value] || lang_meta[''];
elems
.hide()
.filter('.ed-' + opts.replace(/ /g, ', .ed-')).show();
form.find('.ed-feedback').hide();
}
}
// fonction pour déterminer si une chaine
// correspond à un nom de langue dans le tableau
function is_lang_name(str) {
if (tab_langues === undefined) {
return undefined;
}
for (var code in tab_langues) {
if (tab_langues[code] === str) {
return true;
}
}
return false;
}
// fonction de remplacement code langue -> nom de langue
// lancée à la perte de focus du champ du code langue
function remplace_code_langue() {
var elem = form.find('.ed-lang-name');
var val = elem.val();
if (val === '') {
elem.attr('title', 'Nom de langue (ex : anglais)');
return;
}
// Si le nom de langue est donné avec une majuscule initiale, on l'enlève
if (val.charAt(0).toLowerCase() !== val.charAt(0)) {
val = val.charAt(0).toLowerCase() + val.substr(1);
elem.val(val);
}
// Parfois, le code hu est utilisé pour le hongrois
// (or c'est aussi un nom de langue et les noms de langue sont gardés comme tels)
// On le remplace donc par hongrois (aucune traduction en hu n'a jamais été ajoutée via le gadget),
// en prévenant l'utilisateur
if (val == 'hu') {
elem.val('hongrois');
var msg = 'Il a été supposé que vous voulez ajouter une traduction en hongrois.<br>' +
'Si vous vouliez en fait ajouter une traduction en hu, <span class="ed-info-case ed-click">cliquer ici</span>.';
form.find('.ed-info-msg').html(get_info_html(msg));
$('.ed-info-case').click( function() {
elem.val('hu');
form.find('.ed-info-msg').empty();
} );
return;
}
if (is_lang_name(val)) {
return;
}
if (tab_langues !== undefined && tab_langues.hasOwnProperty(val)) {
elem.val(tab_langues[val]);
return;
}
elem.attr('title', 'Nom de langue (ex : anglais)');
}
form.appendTo(nav_content);
nav_content.find('input').focus(function () {
editor.init();
// On charge le tableau de correspondance langues <-> codes langue
// si ce n'est pas déjà fait
if (tab_langues === undefined) {
var api = new mw.Api();
return api.get({
action: 'query',
format: 'json',
titles: 'MediaWiki:Gadget-translation editor.js/langues.json',
prop: 'revisions',
rvprop: 'content'
}).then(function (data) {
// Get the first (and only) page from data.query.pages
for (var pageid in data.query.pages) break;
tab_langues = JSON.parse(data.query.pages[pageid].revisions[0]['*']);
// On crée le tableau des noms de langues pour l'autocomplétion
var tab_lang_names = [];
for (var code in tab_langues) {
tab_lang_names.push(tab_langues[code]);
}
// Autocomplétion du nom de langue
mw.loader.using('jquery.ui', function() {
$('.ed-lang-name').autocomplete({
source: function( request, response ) {
var matcher = new RegExp( "^" +
$.ui.autocomplete.escapeRegex( request.term ),
"i" );
response( $.grep( tab_lang_names, function( item ){
return matcher.test( item );
}) );
},
minLength: 2
});
});
});
}
});
form.submit(function (e) {
e.preventDefault();
// On épure les valeurs afin d'enlever les éventuels espaces superflus
// autour de la chaine (copiée-collée depuis un texte…)
var lang_name = $.trim(this.lang_name.value);
var word = $.trim(this.word.value);
var gender = form.find('.ed-gender input:checked').prop('checked', false).val();
var trans = $.trim(this.trans.value) !== $.trim(this.trans.getAttribute('placeholder')) ?
$.trim(this.trans.value) : '';
var tradi = $.trim(this.tradi.value) !== $.trim(this.tradi.getAttribute('placeholder')) ?
$.trim(this.tradi.value) : '';
var pagename = $.trim(this.pagename.value) !== $.trim(this.pagename.getAttribute('placeholder')) ?
$.trim(this.pagename.value) : '';
silentFailStorage.setItem('trans-lang', lang_name);
var title = mw.config.get('wgTitle');
if (!lang_name) {
show_error(new NoInputError('lang-name'));
return;
} else if (!word) {
show_error(new NoInputError('word'));
return;
}
// Virgule ou point-virgule dans la traduction alors que le titre
// n'en contient pas
else if (word.indexOf(',') !== -1 &&
title.indexOf(',') === -1 &&
silentFailStorage.getItem('comma-knowledge') !== 'ok'
) {
show_error(new CommaWordError('une virgule'));
return;
} else if (word.indexOf('،') !== -1 &&
title.indexOf('،') === -1 &&
silentFailStorage.getItem('comma-knowledge') !== 'ok'
) {
show_error(new CommaWordError('une virgule'));
return;
} else if (word.indexOf(';') !== -1 &&
title.indexOf(';') === -1 &&
silentFailStorage.getItem('comma-knowledge') !== 'ok'
) {
show_error(new CommaWordError('un point-virgule'));
return;
} else if (word.indexOf('/') !== -1 &&
title.indexOf('/') === -1 &&
silentFailStorage.getItem('comma-knowledge') !== 'ok'
) {
show_error(new CommaWordError('une barre oblique'));
return;
} else if (word.charAt(0) !== word.charAt(0).toLowerCase() &&
title.charAt(0) === title.charAt(0).toLowerCase() &&
expected_case.indexOf(lang_name) === -1 &&
silentFailStorage.getItem('case-knowledge') !== 'ok'
) {
show_error(new CaseWordError());
return;
} else if (lang_name === 'français') {
show_error(new BadLangNameError());
return;
} else if (translation.re_wikitext.test(word)) {
show_error(new BadFormatError());
return;
}
var word_options = {
lang_name: lang_name,
lang_code: null,
word: word,
exists: null,
gender: gender,
trans: trans,
tradi: tradi,
pagename: pagename
};
function show_error(e) {
form.find('.ed-error').removeClass('ed-error');
if (!e) {
form.find('.ed-errors').empty();
return;
}
if (e instanceof NoLangTplError) {
form.find('.ed-lang-name').addClass('ed-error').focus();
e = 'La langue « ' + e.lang_name + ' » n\'est pas définie.';
} else if (e instanceof NoInputError) {
form.find('.ed-' + e.input).addClass('ed-error').focus();
if (e.input === 'lang-name') {
e = 'Entrez le nom de langue (anglais, suédois,…)';
} else if (e.input === 'word') {
e = 'Entrez la traduction';
}
} else if (e instanceof BadLangNameError) {
form.find('.ed-lang-name').addClass('ed-error').focus();
e = 'Il n\'est pas possible d\'ajouter une traduction en français. ' +
'À la place, veuillez utiliser la section « Synonymes » ou ' +
'« Variantes dialectales ».';
} else if (e instanceof CommaWordError) {
form.find('.ed-word').addClass('ed-error').focus();
e = 'Êtes-vous certain que la traduction contient ' + e.message + ' ? ' +
'Si tel n\'est pas le cas, <br />veuillez insérer les traductions une par une, ' +
'en cliquant sur le bouton « Ajouter » après chaque insertion de traduction.<br />' +
'Si vous êtes sûr de votre coup, veuillez <span class="ed-error-comma ed-click">cliquer ici</span>.';
} else if (e instanceof CaseWordError) {
form.find('.ed-word').addClass('ed-error').focus();
e = 'Êtes-vous certain que la majuscule fait partie de la traduction ?<br />' +
'Si tel n\'est pas le cas, merci de corriger cela.<br />' +
'Sinon, veuillez <span class="ed-error-case ed-click">cliquer ici</span>.';
} else if (e instanceof BadFormatError) {
form.find('.ed-word').addClass('ed-error').focus();
e = 'La traduction n\'est pas dans un format correct : ' +
'elle contient du wikitexte ([]{}|=)';
} else if (e instanceof HttpError) {
e = 'Vous ne pouvez pas charger la traduction. Êtes-vous en ligne ?';
}
form.find('.ed-errors').html(get_error_html(e));
// En cas de virgule détectée
$('.ed-error-comma')
.click(function() {
silentFailStorage.setItem('comma-knowledge', 'ok');
form.find(':submit').click();
});
// En cas de majuscule détectée
$('.ed-error-case')
.click(function() {
silentFailStorage.setItem('case-knowledge', 'ok');
form.find(':submit').click();
});
}
var lang_code;
// on convertit le nom de langue en code
if (tab_langues !== undefined) {
// Le tableau des langues contient-il le nom de langues donné ?
for (var code in tab_langues) {
if (tab_langues[code] === lang_name) {
lang_code = code;
break;
}
}
// Si le nom de langue donné n'est pas répertorié
// on regarde si ce n'est pas un code langue
if (lang_code === undefined) {
if (tab_langues[lang_name]) {
lang_code = lang_name;
lang_name = tab_langues[lang_code];
word_options.lang_name = lang_name;
} else {
show_error(new NoLangTplError(lang_name));
return;
}
}
} else {
throw new Error('Le tableau des langues n\'est pas défini.');
}
word_options.lang_code = lang_code;
$.when(
// word_html
page_exists(lang_code, pagename ? pagename : word)
.then(function (page_exists) {
word_options.exists = page_exists;
return parse_wikitext(translation.get_formatted_word(word_options))
.then(function (html) {
return html;
});
}),
// wikitext
editor.wikitext()
).fail(function (error) {
if (error === 'http') {
// jQuery HTTP error
show_error(new HttpError());
} else {
show_error(error);
}
}).done(function (word_html, wikitext) {
show_error(false);
form.find('.ed-info-msg').empty();
silentFailStorage.setItem('trans-lang', lang_name);
form[0].word.value = '';
form[0].trans.value = '';
form[0].tradi.value = '';
form[0].pagename.value = '';
var added_elem;
var index = get_translation_table_index(table);
wikitext = translation.add(wikitext, index, word_options);
editor.edit({
summary: '+' + lang_name + ' : [[' + (pagename ? pagename : word) + ']]',
summary_type: 'trad',
wikitext: wikitext,
redo: function () {
var translations = self.find('ul > li');
translation.add_to_list({
items: translations,
add_only_item: function () {
added_elem = $('<li>', { html: '<span class="trad-' + lang_code +
'">' + lang_name.charAt(0).toUpperCase() + lang_name.substr(1) +
'</span> : ' + word_html });
self.find('ul').prepend(added_elem);
},
equal_or_before: function (item) {
var match = /^\s*(.+)/.exec($(item).children().first().text());
if (match) {
// conventions internationales en premier
if (match[1] === 'Conventions internationales' &&
lang_name != 'conventions internationales') {
return 'before';
}
if (lang_name == 'conventions internationales' &&
match[1] != 'Conventions internationales') {
return false;
}
// on ignore les {{ébauche-trad}}
if (match[1] === 'Traductions manquantes.') return false;
if (sortkey(match[1].toLowerCase()) === sortkey(lang_name)) {
if ($(item).children('dl').length) { // si la langue
// a des dialectes à des niveaux différents
// (en wikicode, avec une ligne commençant par *:),
// l'ajout de langue n'est pas géré
mw.notify('Il n\'est pas possible d\'ajouter' +
' une traduction dans cette langue,' +
' car le format est inhabituel.');
throw new Error('Format incorrect : le wikicode' +
' des traductions dans cette langue ' +
'est inhabituel et la traduction ne peut' +
' donc pas être ajoutée par le gadget.');
}
return 'equal';
} else if (sortkey(match[1].toLowerCase()) < sortkey(lang_name)) {
return 'before';
}
}
return false;
},
add_to_item: function (item) {
added_elem = $('<span>', { html: ', ' + word_html})
.appendTo(item);
},
add_after: function (item) {
added_elem = $('<li>', { html: '<span class="trad-' +
lang_code + '">' + lang_name.charAt(0).toUpperCase() +
lang_name.substr(1) + '</span> : ' + word_html })
.insertAfter(item);
},
add_before: function (item) {
added_elem = $('<li>', { html: '<span class="trad-' +
lang_code + '">' + lang_name.charAt(0).toUpperCase() +
lang_name.substr(1) + '</span> : ' + word_html });
added_elem.insertBefore(item);
},
});
added_elem.addClass('ed-added');
// Si le gadget de création de traductions est activé,
// on colore directement en bleu les traductions à créer
// pour éviter d'avoir à recharger la page
if (window.CrTr_ChangerLiensRouges) window.CrTr_ChangerLiensRouges();
},
undo: function () {
added_elem.remove();
}
});
});
});
}
function parse_wikitext(wikitext) {
return new mw.Api().get({
action: 'parse',
text: '<div>' + wikitext + '</div>',
title: wgPageName
}).then(function (data) {
var html = data.parse.text['*'];
// Get only the parts between <div> and </div>
html = html.substring(
html.indexOf('<div>') + '<div>'.length,
html.lastIndexOf('</div>')
);
return $.trim(html);
});
}
function page_exists(lang_code, page) {
var
domain,
wm_liens = {
'cmn': 'zh',
'fra-nor': 'nrm',
'gsw': 'als',
'ko-Hani': 'ko',
'lzh': 'zh-classical',
'nan': 'zh-min-nan',
'nb': 'no',
'nn': 'no',
'rup': 'roa-rup',
'yue': 'zh-yue'
},
wiktios = [
'en', 'mg', 'fr', 'zh', 'lt', 'ru', 'es', 'el', 'pl', 'sv', 'ko',
'nl', 'de', 'tr', 'ku', 'ta', 'io', 'kn', 'fi', 'vi', 'hu', 'pt',
'chr', 'no', 'ml', 'my', 'id', 'it', 'li', 'ro', 'et', 'ja', 'te',
'jv', 'fa', 'cs', 'ca', 'ar', 'eu', 'gl', 'lo', 'uk', 'br', 'fj',
'eo', 'bg', 'hr', 'th', 'oc', 'is', 'vo', 'ps', 'zh-min-nan',
'simple', 'cy', 'uz', 'scn', 'sr', 'af', 'ast', 'az', 'da', 'sw',
'fy', 'tl', 'he', 'nn', 'wa', 'ur', 'la', 'sq', 'hy', 'sm', 'sl',
'ka', 'pnb', 'nah', 'hi', 'tt', 'bs', 'lb', 'lv', 'tk', 'sk', 'hsb',
'nds', 'kk', 'ky', 'be', 'km', 'mk', 'ga', 'wo', 'ms', 'ang', 'co',
'sa', 'gn', 'mr', 'csb', 'ug', 'st', 'ia', 'sd', 'sh', 'si', 'mn',
'tg', 'or', 'kl', 'vec', 'jbo', 'an', 'ln', 'fo', 'zu', 'gu', 'kw',
'gv', 'rw', 'qu', 'ss', 'ie', 'mt', 'om', 'bn', 'pa', 'roa-rup',
'iu', 'so', 'am', 'su', 'za', 'gd', 'mi', 'tpi', 'ne', 'yi', 'ti',
'sg', 'na', 'dv', 'tn', 'ts', 'ha', 'ks', 'ay'
];
if (wm_liens.hasOwnProperty(lang_code)) {
domain = wm_liens[lang_code] + '.wiktionary';
} else if (lang_code == 'conv') {
domain = 'species.wikimedia';
} else if ($.inArray(lang_code, wiktios) !== -1) {
domain = lang_code + '.wiktionary';
}
// Si le Wiktionnaire n'existe pas, inutile de faire une requête HTTP
if (!domain) {
return $.Deferred().resolve('trad--').promise();
}
// traiter l'apostrophe typographique comme une apostrophe dactylographique
// dans les liens interwikis, les autres wiktionnaires privilégiant la seconde
page = page.replace('’', '\'');
page = page.replace('ʼ', '\'');
var def = $.Deferred();
$.ajax({
url: '//' + domain + '.org/w/api.php?origin=' + location.protocol + '//' + location.host,
data: {
action: 'query',
titles: page,
format: 'json'
},
dataType: 'json'
}).fail(function () {
def.resolve('trad');
}).then(function (data) {
def.resolve(data.query.pages[-1] ? 'trad-' : 'trad+');
});
return def.promise();
}
// Ajout pour le Wiktionnaire francophone,
// adapté de [[MediaWiki:Gadget-CommonWikt.js]], fonction CleDeTri
function sortkey(word) {
var key = word.toLowerCase();
key = key.replace( /[àáâãäå]/g, "a" );
key = key.replace( /[æ]/g, "ae" );
key = key.replace( /[çćċč]/g, "c" );
key = key.replace( /[ĉ]/g, "cx" );
key = key.replace( /[èéêë]/g, "e" );
key = key.replace( /[ĝ]/g, "gx" );
key = key.replace( /[ĥ]/g, "hx" );
key = key.replace( /[ìíîï]/g, "i" );
key = key.replace( /[ĵ]/g, "jx" );
key = key.replace( /[ñ]/g, "n" );
key = key.replace( /[òóôõö]/g, "o" );
key = key.replace( /[œ]/g, "oe" );
key = key.replace( /[òóôõö]/g, "o" );
key = key.replace( /[ŝ]/g, "sx" );
key = key.replace( /[ùúûü]/g, "u" );
key = key.replace( /[ŭ]/g, "ux" );
key = key.replace( /[ýÿ]/g, "y" );
key = key.replace( /['’)(]/g, "" );
key = key.replace( /[-\/]/g, " " );
return key;
}
var translation = {
re_wikitext: /[[\]{}#|=]/,
contains_wikitext: function (str) {
return translation.re_wikitext.test(str);
},
re_gloss: /\{\{ترجمات(.*)\}\}/g,
re_section: /(\{\{ترجمات.*\}\})([\s\S]*?)(\{\{trad-fin\}\})/g,
is_trans_top: function (gloss) {
return gloss.replace(translation.re_gloss, '-') === '-';
},
make_trans_top: function (gloss) {
if (translation.is_trans_top(gloss)) {
return gloss;
} else {
return '{{ترجمات|' + gloss + '}}';
}
},
get_gloss: function (wikitext, index) {
// s'il y a un commentaire, l'analyse ne va pas être possible
if (/\{\{ترجمات\|.*?(?:<!--|-->)/.test(wikitext)) {
mw.notify('Le wikitexte contient un commentaire "<!--". ' +
'La page doit être modifiée manuellement.');
throw new Error('Le wikitexte contient un commentaire "<!--". ' +
'La page doit être modifiée manuellement.');
}
translation.re_gloss.lastIndex = 0;
for (var i = 0; i <= index; i++) {
var match = translation.re_gloss.exec(wikitext);
if (i === index && match) {
var standard = /^(|\|[^|=]*)$/.test(match[1]);
return {
trans_top: match[0],
text: standard ? match[1].substr(1) : void 0,
standard: standard
};
}
}
throw new Error('Le ' + (index+1) + '-ème {{ترجمات}} n\'a pas été trouvé dans le wikitexte.');
},
set_gloss: function (wikitext, index, gloss) {
index++;
var count = 0;
return wikitext.replace(translation.re_gloss, function (match, p1, p2) {
count++;
if (count !== index) {
return match;
}
return translation.make_trans_top(gloss);
});
},
get_formatted_word: function (opts) {
var tpl = [
opts.exists,
opts.lang_code,
opts.pagename ? opts.pagename : opts.word
];
opts.gender && tpl.push(opts.gender);
opts.trans && tpl.push('tr=' + opts.trans);
opts.tradi && tpl.push('tradi=' + opts.tradi);
opts.pagename && tpl.push('dif=' + opts.word);
var res = '{{' + tpl.join('|') + '}}';
opts.lang_code == 'conv' && (res = "''" + res + "''"); // Conventions internationales en italique
return res;
},
// Options:
// - items: Array of items
// - equal_or_before: Function that returns either 'equal', 'before' or false
// - add_to_item: Adds a word to an item
// - add_after: Adds the item after an item
// - add_before: Adds the item before an item
add_to_list: function (opts) {
var items = opts.items;
if (!items.length) {
items[0] = opts.add_only_item();
return items;
}
for (var i = items.length - 1; i >= 0; i--) {
var eq_or_bef = opts.equal_or_before(items[i]);
if (eq_or_bef === 'equal') {
items[i] = opts.add_to_item(items[i]);
return items;
} else if (eq_or_bef === 'before') {
items[i] = opts.add_after(items[i]);
return items;
}
}
items[0] = opts.add_before(items[0]);
return items;
},
add: function (wikitext, index, opts) {
var match = wikitext.match(translation.re_section);
if (match === null) {
mw.notify('Il manque probablement un modèle {{trad-fin}} dans le wikicode.');
throw new Error('Wikicode incorrect : la page doit être modifiée manuellement');
}
if (match[index].indexOf('<!--') !== -1) {
mw.notify('Le wikitexte contient un commentaire "<!--". La page doit être' +
' modifiée manuellement.');
throw new Error('Le wikitexte contient un commentaire "<!--". La page doit être' +
' modifiée manuellement.');
}
index++;
var count = 0;
return wikitext.replace(translation.re_section, function (match, p1, p2, p3) {
count++;
if (count !== index) {
return match;
}
p2 = $.trim(p2);
var formatted_word = translation.get_formatted_word(opts);
var lines = translation.add_to_list({
// split into lines
items: p2 ? p2.split('\n') : [],
add_only_item: function () {
return '* {{T|' + opts.lang_code + '}} : ' + formatted_word;
},
equal_or_before: function (line) {
// Le regex suivant contient [(:] car on peut avoir un dialecte
// précisé entre parenthèses après le nom de langue
var match_T = /^\*\s*\{\{T\|([^}|]+?)(?:\|trier)?\}\}\s*[(:]/.exec(line);
// Il importe aussi de prendre en compte les cas rares comme les traductions en chinois
// dans [[arrière-grand-mère]], qui sont indentées à la ligne via *: {{trad|...}}
var match_trad_indente = /^\*:\s*\{\{trad[+-]{0,2}\|([^}|]+?)\|/.exec(line);
if (match_T || match_trad_indente) {
var match = match_T || match_trad_indente;
var code_langue = match[1];
// conventions internationales en premier
if (code_langue === 'conv' && opts.lang_code != 'conv') {
return 'before';
}
if (opts.lang_code == 'conv' && code_langue != 'conv') {
return false;
}
// Le code langue contenu dans le modèle T est peut-être une redirection
// vers un autre code, auquel cas on le remplace par cet autre code
// On accède pour cela au champ "redirects" de la liste des langues
// qui contient toutes les redirections de code langue (à la fin de la liste)
if (tab_langues[code_langue] === undefined) {
if (tab_langues.redirects[code_langue]) {
code_langue = tab_langues.redirects[code_langue];
} else {
// sinon, c'est que le code est indéfini
return false;
}
}
if (sortkey(tab_langues[code_langue]) === sortkey(opts.lang_name)) {
// si une ligne de traduction finit brutalement par « : »
// (et ne comporte donc que le nom de langue sans traduction à la suite),
// c'est probablement qu'on a affaire à une langue
// avec des dialectes qui seront introduits sur une
// nouvelle ligne par « *: » → cas à gérer manuellement
if (/^\*\s*\{\{T\|[^}|]+?(?:\|trier)?\}\}\s*:\s*$/.exec(line)) {
mw.notify('Il n\'est pas possible d\'ajouter une traduction' +
' dans cette langue, car le format est inhabituel.');
throw new Error('Format incorrect : le wikicode des traductions' +
' dans cette langue est inhabituel et la traduction' +
' ne peut donc pas être ajoutée par le gadget.');
}
return 'equal';
} else if (sortkey(tab_langues[code_langue]) < sortkey(opts.lang_name)) {
return 'before';
}
}
return false;
},
add_to_item: function (line) {
return line + ', ' + formatted_word;
},
add_before: function (line) {
return this.add_only_item() + '\n' + line;
},
add_after: function (line) {
return line + '\n' + this.add_only_item();
}
});
return p1 + '\n' + lines.join('\n') + '\n' + p3;
});
}
};
function extend_error(name, p1_name) {
function E(p1) {
this.message = p1;
if (p1_name) this[p1_name] = p1;
}
E.prototype = new Error();
E.prototype.constructor = E;
E.prototype.name = name;
return E;
}
var NoLangTplError = extend_error('NoLangTplError', 'lang_name');
var NoInputError = extend_error('NoInputError', 'input');
var BadLangNameError = extend_error('BadLangNameError');
var CommaWordError = extend_error('CommaWordError');
var CaseWordError = extend_error('CaseWordError');
var BadFormatError = extend_error('BadFormatError');
var HttpError = extend_error('HttpError');
// Export some useful components
window.translation = translation;
window.parse_wikitext = parse_wikitext;
window.add_heading_updater = add_heading_updater;
window.add_translation_form = add_translation_form;
} ( mediaWiki, jQuery ) ); // Fin de la closure ouverte au tout début