User:Fomafix/MediaWiki:Gadget-Move.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Adds a move tool to the sitelink edit toolbar to move a sitelink to another item.
 */

( function ( mw, wb, $ ) {

	if ( mw.config.get( 'wgNamespaceNumber' ) !== 0 ||
		!mw.config.exists( 'wbEntityId' ) ||
		!mw.config.get( 'wbIsEditView' ) ||
		!mw.config.get( 'wgIsProbablyEditable' )
	) {
		return;
	}

	switch ( mw.config.get( 'wgUserLanguage' ) ) {
	default:
	case 'en':
		mw.messages.set( {
			'move': 'Move',
			'move-toolbar': 'move',
			'close': 'Close',
			'newitem': 'The id of the new item',
			'intro': 'You can move a sitelink to another item. Please give a valid item id and check if the link for the new item is already set. Also remember to move label and descriptions.',
			'success': 'The sitelink $2 was successfully moved to $1.',
			'success-multi': 'The sitelinks were sucessfully moved to $1.',
			'error-sameid': 'The new item\'s id has to be different to the current one\'s.',
			'error-invalidid': 'The given id is not a valid item identifier.',
			'error-notexisting': 'The item with the id $1 does not exist.',
			'error-overwrite': 'The link for the given site in $1 is already set. Please check the item\'s id or remove the link from the item.',
			'error-api': 'There was an error editing the item: $1'
		} );
		break;
	case 'bn':
		mw.messages.set( {
			'move': 'স্থানান্তর',
			'move-toolbar': 'স্থানান্তর',
			'close': 'বন্ধ',
			'newitem': 'নতুন আইটেমটির আইডি',
			'intro': 'আপনি একটি সাইট লিঙ্ক অন্য আইটেমে স্থানান্তর করতে পারেন। দয়া করে আইটেমের বৈধ আইডি দিন এবং পরীক্ষা করুন যদি ইতিমধ্যে নতুন আইটেমটির জন্য লিঙ্ক সেট করা হয়। এছাড়াও লেবেল ও বিবরণ সরাতে মনে রাখবেন।',
			'success': 'সাইটলিঙ্ক সফলভাবে $1-এ স্থানান্তর হয়েছে।',
			'error-sameid': 'আইটেমের নতুন আইডি বর্তমান আইডি থেকে ভিন্ন হতে হবে।',
			'error-invalidid': 'প্রদত্ত আইডি কোনো বৈধ আইটেম শনাক্তকারী নয়।',
			'error-notexisting': 'আইডি $1-এর আইটেমটি বিদ্যমান নেই।',
			'error-overwrite': 'প্রদত্ত সাইটের জন্য লিঙ্ক $1-এ ইতিমধ্যেই সেট করা আছে। দয়া করে আইটেম আইডি পরীক্ষা করুন অথবা আইটেম থেকে লিঙ্ক মুছে ফেলুন।',
			'error-api': 'আইটেম সম্পাদনায় ত্রুটি ছিল: $1'
		} );
		break;
	case 'ca':
		mw.messages.set( {
			'move': 'Trasllada',
			'move-toolbar': 'trasllada',
			'close': 'Tanca',
			'newitem': 'ID del nou element',
			'intro': 'Podeu traslladar un enllaç de llengua a un altre element. Proporcioneu un ID d\'element vàlid i comproveu si ja existeix un enllaç en el nou element. Recordeu també de traslladar l\'etiqueta i les descripcions.',
			'success': 'L\'enllaç ha estat traslladat amb éxit a $1.',
			'error-sameid': 'L\'ID del nou element ha de ser diferent de l\'actual.',
			'error-invalidid': 'L\'ID proporcionat no és un identificador vàlid d\'element.',
			'error-notexisting': 'No existeix cap element amb l\'ID $1.',
			'error-overwrite': 'Ja existeix un enllaç per aquest lloc a $1. Comproveu l\'ID del nou element o suprimiu l\'enllaç en l\'element.',
			'error-api': 'S\'ha produït un error editant l\'element: $1'
		} );
		break;
	case 'cs':
		mw.messages.set( {
			'move': 'Přesunout',
			'move-toolbar': 'přesunout',
			'close': 'Zavřít',
			'newitem': 'ID cílové položky',
			'intro': 'Můžete přesunout odkaz do jiné položky. Vložte, prosím, platné ID položky a zkontrolujte, zda již neobsahuje odkaz na tento jazyk. Také přesuňte štítky a popisy.',
			'success': 'Odkaz na $2 byl úspěšně přesunut do $1.',
			'success-multi': 'Odkazy byly úspěšně přesunuty do $1.',
			'error-sameid': 'ID cílové položky musí být různé od této!',
			'error-invalidid': 'Zadané ID není platné.',
			'error-notexisting': 'Položka s ID $1 neexistuje.',
			'error-overwrite': 'Položka $1 již obsahuje odkaz na tento jazyk. Zkontrolujte ID nebo z ní odkaz odstraňte.',
			'error-api': 'Chyba při editaci: $1'
		} );
		break;
	case 'de':
	case 'de-at':
	case 'de-ch':
	case 'de-formal':
		mw.messages.set( {
			'move': 'Verschieben',
			'move-toolbar': 'verschieben',
			'close': 'Schließen',
			'newitem': 'Die ID des neuen Datenelements',
			'intro': 'Du kannst einen Websitelink in ein anderes Datenelement verschieben. Gib eine valide ID und prüfe, ob der Link für das neue Datenelement schon festgelegt ist. Beachte auch, Bezeichnung und Beschreibung zu verschieben.',
			'success': 'Der Websitelink $2 wurde erfolgreich nach $1 verschoben.',
			'success-multi': 'Die Websitelinks wurden erfolgreich nach $1 verschoben.',
			'error-sameid': 'Die ID des neuen Datenelements muss sich von der aktuellen unterscheiden.',
			'error-invalidid': 'Die ID ist nicht valide.',
			'error-notexisting': 'Das Datenelement mit der ID $1 existiert nicht.',
			'error-overwrite': 'Der Link für die Seite in $1 ist schon festgelegt. Bitte überprüfe die ID oder entferne den Link von dem Datenelement.',
			'error-api': 'Es ist ein Fehler beim Bearbeiten aufgetreten: $1'
		} );
		break;
	case 'es':
		mw.messages.set( {
			'move': 'Mover',
			'move-toolbar': 'mover',
			'close': 'Cerrar',
			'newitem': 'ID del nuevo elemento',
			'intro': 'Puedes mover el enlace de un sitio a un nuevo elemento. Por favor, proporciona un elemento válido y comprueba si el enlace para el nuevo elemento ya está establecido. También recuerda mover las etiquetas y descripciones.',
			'success': 'El enlace del sitio fue movido satisfactoriamente a $1.',
			'error-sameid': 'El id del nuevo elemento tiene que ser diferente al id del elemento actual.',
			'error-invalidid': 'El id proporcionado no es un identificador de elemento válido.',
			'error-notexisting': 'El elemento con el id $1 no existe.',
			'error-overwrite': 'El enlace para el sitio proporcionado en $1 ya está establecido. Por favor, comprueba el id del elemento o elimina el enlace del elemento.',
			'error-api': 'Hubo un erro al editar el elemento: $1'
		} );
		break;
	case 'fa':
		mw.messages.set( {
			'move': 'انتقال',
			'move-toolbar': 'انتقال',
			'close': 'بستن',
			'newitem': 'شمارهٔ آیتم مورد نظر',
			'intro': 'شما می توانید شمارهٔ آیتم جدید را وارد کنید توجه داشته باشید در صورتی که میان‌ویکی مقصد موجود نباشد انتقال انجام می‌شود',
			'success': 'میان‌ویکی با موفقیت به آیتم $1 منتقل شد.',
			'error-sameid': 'شمارهٔ آیتم مقصد باید با آیتمی که در آن هستید متفاوت باشد!',
			'error-invalidid': 'شمارهٔ آیتم مورد نظر درست نیست.',
			'error-notexisting': 'آیتمی با کد $1 وجود ندارد.',
			'error-overwrite': 'میان‌ویکی سایت مورد نظر $1 موجود است. لطفاً شمارهٔ آیتم وارد شده را چک کنید یا پیوند را از آیتم مثصد حذف نمائید..',
			'error-api': 'خطای ویرایش آیتم: $1'
		} );
		break;
	case 'fi':
		mw.messages.set( {
			'move': 'Siirrä',
			'move-toolbar': 'siirrä',
			'close': 'Sulje',
			'newitem': 'Uuden kohteen tunniste',
			'intro': 'Voit siirtää sivustolinkin toiseen kohteeseen. Anna kelvollinen kohteen tunniste ja tarkista onko linkki uudelle kohteelle jo asetettu. Muista siirtää myös nimi ja kuvaukset.',
			'success': 'Sivustolinkki on onnistuneesti siirretty kohteeseen $1.',
			'error-sameid': 'Uuden kohteen tunniste täytyy olla eri kuin nykyisen kohteen.',
			'error-invalidid': 'Annettu tunniste ei kelpaa kohteen tunnisteeksi.',
			'error-notexisting': 'Kohdetta tunnisteella $1 ei löydy.',
			'error-overwrite': 'Sivulle $1 on jo lisätty linkki. Tarkista kohteen tunniste tai poista linkki kohteesta.',
			'error-api': 'Virhe muokatessa kohdetta: $1'
		} );
		break;
	case 'fr':
		mw.messages.set( {
			'move': 'Déplacer',
			'move-toolbar': 'déplacer',
			'close': 'Fermer',
			'newitem': 'L\'identifiant du nouvel élément',
			'intro': 'Vous pouvez déplacer un lien interlangue vers un nouvel élément. Merci pour cela de donner un identifiant d\'élément valide (QXXX) et de vérifier si l\'élément vers lequel vous voulez déplacer ce lien est adapté. Pensez aussi à déplacer labels et descriptions.',
			'success': 'Le lien interlangue a été déplacé avec succès vers l\'élément $1.',
			'error-sameid': 'L\'identifiant du nouvel élément doit être différent de celui de l\'élément que vous êtes en train de modifier.',
			'error-invalidid': 'L\'identifiant que vous avez entré n\'est pas valide.',
			'error-notexisting': 'Il n\'existe pas d\'élément dont l\'identifiant est $1.',
			'error-overwrite': 'Il existe déjà un lien interlangue pour cette Wikipédia dans l\'élément $1. Merci de vérifier l\'identifiant du nouvel élément ou de supprimer simplement le lien interlangue de cette page.',
			'error-api': 'Une erreur s\'est produite lors de l\'édition de l\'élément $1'
		} );
		break;
	case 'gl':
		mw.messages.set( {
			'move': 'Mover',
			'move-toolbar': 'mover',
			'close': 'Pechar',
			'newitem': 'ID do novo elemento',
			'intro': 'Podes mover a ligazón dun sitio a un novo elemento. Por favor, proporciona un elemento válido e comproba se a ligazón para o novo elemento xa está establecido. Tamén lembra mover as etiquetas e descricións.',
			'success': 'A ligazón do sitio foi movida satisfactoriamente a $1.',
			'error-sameid': 'O id do novo elemento ten que ser diferente ó id do elemento actual.',
			'error-invalidid': 'O id proporcionado non é un identificador de elemento válido.',
			'error-notexisting': 'O elemento co id $1 non existe.',
			'error-overwrite': 'A ligazón para o sitio en $1 xa está establecido. Por favor, comproba o id do elemento ou elimina a ligazón do elemento elemento.',
			'error-api': 'Houbo un erro ó editar o elemento: $1'
		} );
		break;
	case 'id':
		mw.messages.set( {
			'move': 'Pindah',
			'move-toolbar': 'pindah',
			'close': 'Tutup',
			'newitem': 'ID (Qxxx) item baru',
			'intro': 'Anda dapat memindahkan interwiki ke item baru. Harap masukkan id (Qxxx) yang valid dan cek sebelumnya apakah id tersebut sudah ada. Jangan lupa memindahkan label dan properti.',
			'success': 'Interwiki berhasil dipindahkan ke $1.',
			'error-sameid': 'Item baru haruslah berbeda dari item sekarang.',
			'error-invalidid': 'ID yang dimasukkan tidak valid.',
			'error-notexisting': 'Item dengan id $1 belum ada.',
			'error-overwrite': 'Interwiki item pada wiki $1 sudah ada. Silakan di cek atau hapus interwiki dari item tersebut.',
			'error-api': 'Ada kesalahan penyuntingan item: $1'
		} );
		break;
	case 'it':
		mw.messages.set( {
			'move': 'Sposta',
			'move-toolbar': 'sposta',
			'close': 'Chiudi',
			'newitem': 'Id del nuovo elemento',
			'intro': 'Puoi spostare un sitelink in un altro elemento. Fornisci un Id (codice identificativo) di elemento valido e verifica che il collegamento nel nuovo elemento non sia già esistente. Ricorda inoltre di spostare anche l\'etichetta e la descrizione.',
			'success': 'Il sitelink $2 è stato spostato con successo in $1.',
			'success-multi': 'I sitelink sono stati spostati con successo in $1.',
			'error-sameid': 'L\'Id del nuovo elemento deve essere diverso da quello corrente.',
			'error-invalidid': 'L\'Id fornito non è un codice identificativo di elemento valido.',
			'error-notexisting': 'L\'elemento con Id $1 non esiste.',
			'error-overwrite': 'Collegamento per il sito selezionato già esistente in $1. Verifica l\'Id dell\'elemento o rimuovi il collegamento dall\'elemento.',
			'error-api': 'Errore nella modifica dell\'elemento: $1'
		} );
		break;
	case 'ja':
		mw.messages.set( {
			'move': '移動',
			'move-toolbar': '移動',
			'close': '中止',
			'newitem': '新しい項目のID',
			'intro': 'サイトリンクを新しい新しい項目に移すことができます。指定した項目のIDが間違っていないか、新しい項目に既にリンクが設定されていないか確認してください。ラベルと説明を直すのも忘れないでください。',
			'success': 'サイトリンクを $1 へ移動しました。',
			'error-sameid': '新しい項目のIDはこの項目のものとは別でなければなりません。',
			'error-invalidid': '指定されたIDは項目の識別子として無効です。',
			'error-notexisting': 'ID $1 の項目は存在しません。',
			'error-overwrite': '指定されたサイトに対するリンクが $1 に既に設定されています。新しい項目のIDを確認するか、既存のリンクを除去してください。',
			'error-api': '項目の編集中にエラーが発生しました: $1'
		} );
		break;
	case 'ko':
		mw.messages.set( {
			'move': '이동',
			'move-toolbar': '이동',
			'close': '닫기',
			'newitem': '새 항목의 ID',
			'intro': '사이트링크를 새 항목으로 이동합니다. 유효한 ID를 입력해 주세요. 새 항목에 이미 링크가 있는지 확인해 주세요. 레이블과 설명을 고치는 것도 잊지 마세요.',
			'success': '사이트링크를 $1로 이동했습니다.',
			'error-sameid': '새 항목의 ID는 현재 항목과 달라야 합니다.',
			'error-invalidid': '입력한 ID가 유효한 항목 식별자가 이닙니다.',
			'error-notexisting': '항목 $1이 없습니다.',
			'error-overwrite': '$1에 이미 지정한 사이트의 링크가 이미 있습니다. 항목 ID를 다시 확인하시거나, 기존의 링크를 삭제해주세요.',
			'error-api': '항목 $1의 편집 중에 오류가 발생했습니다.'
		} );
		break;
	case 'lb':
		mw.messages.set( {
			'move': 'Réckelen',
			'move-toolbar': 'réckelen',
			'close': 'Zoumaachen',
			'newitem': 'D\'Nummer (id) vum neien Element',
			'intro': 'Dir kënnt ee Link vun engem Site op een anert Element réckelen. Gitt w.e.g. eng valabel Nummer vun engem Element (id) un a kuckt no ob de Link fir dat neit Element scho gesat ass. Denkt dru fir d\'Etiketten a Beschreiwungen och ze réckelen.',
			'success': 'De Link op de Site gouf op $1 geréckelt.',
			'error-sameid': 'D\'Nummer (id) vum neien Element muss verschidde si vum Aktuellen.',
			'error-invalidid': 'D\'Nummer (id) déi ugi gouf ass keng valabel Nummer vun engem Element.',
			'error-notexisting': 'D\'Element mat der Nummer (id) $1 gëtt et net.',
			'error-overwrite': 'De Link fir dee Site vu(n) $1 ass scho gesat. Kuckt w.e.g. dem Element seng Nummer (id) nach eng Kéier no oder huelt de Link vum Element ewech.',
			'error-api': 'Et gouf e Feeler beim Ännere vum Element: $1'
		} );
		break;
	case 'min':
		mw.messages.set( {
			'move': 'Pindah',
			'move-toolbar': 'pindah',
			'close': 'Tutuik',
			'newitem': 'ID (Qxxx) item baru',
			'intro': 'Sanak dapek mamindahan interwiki ka item baru. Harap masuakan id (Qxxx) nan valid dan cek sabalumnyo apo id tasabuik lah ado. Jan lupo mamindahan label jo properti.',
			'success': 'Interwiki barasil dipindahan ka $1.',
			'error-sameid': 'Item baru haruslah babedo dari item kini ko.',
			'error-invalidid': 'ID nan dimasuakan indak valid.',
			'error-notexisting': 'Item jo id $1 alun ado.',
			'error-overwrite': 'Interwiki item pado wiki $1 alah ado. Silakan di cek atau hapuih interwiki dari item tasabuik.',
			'error-api': 'Ada kasalahan panyuntiangan item: $1'
		} );
		break;
	case 'mk':
		mw.messages.set( {
			'move': 'Премести',
			'move-toolbar': 'премести',
			'close': 'Затвори',
			'newitem': 'Назнака на новиот предмет',
			'intro': 'Можете да преместите викиврска во друг предмет. Внесете важечка предметна назнака и проверете врската за новиот предмет да не е веќе зададена. Исто така, не заборавајте да ги преместите етикетата и описите.',
			'success': 'Викиврската е успешно преместена во $1.',
			'error-sameid': 'Назнаката на новиот предмет мора да се разликува од назнаката на стариот.',
			'error-invalidid': 'Укажаната назнака е неважечка.',
			'error-notexisting': 'Не постои предмет со назнака $1.',
			'error-overwrite': 'Врската за даденото вики на $1 е веќе зададена. Проверете ја предметната назнака или отстранете ја врската од предметот.',
			'error-api': 'Се појави грешка при уредувањето на предметот: $1'
		} );
		break;
	case 'nl':
		mw.messages.set( {
			'move': 'Verplaatsen',
			'move-toolbar': 'verplaatsen',
			'close': 'Sluiten',
			'newitem': 'Het ID van het nieuwe item',
			'intro': 'Je kan een siteverwijzing verplaatsen naar een ander item. Geef een geldig item ID en controleer of de siteverwijzing al bij het goede item staan. Vergeet niet om ook het label en de beschrijvingen te verplaatsen.',
			'success': 'De siteverwijzing $2 was met succes verplaatst naar $1.',
			'error-sameid': 'Het ID van het item moet een ander zijn dan de huidige.',
			'error-invalidid': 'Het gegeven ID-nummer was ongeldig.',
			'error-notexisting': 'Het item met ID $1 bestaat niet.',
			'error-overwrite': 'De link voor de gegeven site in $1 was al ingesteld. Controleer alsjeblieft het ID van het item of verwijder de link van het item',
			'error-api': 'Er was een fout tijdens het bewerken van het item: $1'
		} );
		break;
	case 'pl':
		mw.messages.set( {
			'move': 'Przenieś',
			'move-toolbar': 'przenieś',
			'close': 'Zamknij',
			'newitem': 'ID nowego elementu',
			'intro': 'Możesz przenieść link do innego elementu. Podaj prawidłowe ID elementu i sprawdź czy dany link w nowym elemencie jest już wstawiony. Pamiętaj także o przeniesieniu etykiet i opisów.',
			'success': 'Link został przeniesiony do $1.',
			'error-sameid': 'Nowe ID musi być inne niż obecne.',
			'error-invalidid': 'Podane ID nie jest prawidłowe.',
			'error-notexisting': 'Element $1 nie istnieje.',
			'error-overwrite': 'Link w elemencie $1 jest już wstawiony. Sprawdź ID elementu lub usuń link z obecnego elementu.',
			'error-api': 'Wystąpił błąd podczas edycji elementu $1'
		} );
		break;
	case 'ru':
		mw.messages.set( {
			'move': 'Переместить',
			'move-toolbar': 'переместить',
			'close': 'Закрыть',
			'newitem': 'Идентификатор нового элемента',
			'intro': 'Вы можете переместить интервики-ссылку в другой элемент. Укажите верный идентификатор элемента и проверьте, может, ссылка для нового элемента уже указана. Также не забудьте переместить название и описание.',
			'success': 'Интервики-ссылка была перемещена в объект $1.',
			'error-sameid': 'Идентификатор нового элемента должен отличаться от идентификатора старого элемента.',
			'error-invalidid': 'Указано некорректное значение.',
			'error-notexisting': 'Элемента с идентификатором $1 не существует.',
			'error-overwrite': 'Интервики-ссылка на этот языковой раздел уже существует в элементе $1. Проверьте идентификатор элемента или удалите ссылку из элемента.',
			'error-api': 'При редактировании элемента произошла ошибка: $1'
		} );
		break;
	case 'sv':
		mw.messages.set( {
			'move': 'Flytta',
			'move-toolbar': 'flytta',
			'close': 'Stäng',
			'newitem': 'Det nya objekts ID',
			'intro': 'Du kan flytta en webbplatslänk till ett annat objekt. Ange ett giltigt objekts-ID och kolla om länken till det nya objektet redan angetts. Glöm inte att också flytta etikett och beskrivning.',
			'success': 'Webbplatslänken $2 flyttades till $1.',
			'success-multi': 'Webbplatslänkarna flyttades till $1.',
			'error-sameid': 'Det nya objektets ID måste skilja sig från det aktuella.',
			'error-invalidid': 'Det angivna ID:t är inte en giltig identifierare.',
			'error-notexisting': 'Det finns inget objekt med ID:t $1.',
			'error-overwrite': 'Den angivna webbplatsens länk på $1 har redan angetts. Kontrollera objektets ID eller ta bort länken från objektet.',
			'error-api': 'Det uppstod ett fel när objektet skulle redigeras: $1'
		} );
		break;
	case 'uk':
		mw.messages.set( {
			'move': 'Перемістити',
			'move-toolbar': 'перемістити',
			'close': 'Закрити',
			'newitem': 'Ідентифікатор нового елемента',
			'intro': 'Ви можете перемістити посилання на сайт до іншого елемента. Будь ласка, вкажіть валідний ідентифікатор елемента і перевірте, чи в новому елементі ще немає посилання на відповідний сайт. Також не забудьте перемістити назву та описи.',
			'success': 'Посилання $2 було успішно переміщено до $1.',
			'success-multi': 'Посилання були успішно переміщені до $1.',
			'error-sameid': 'Ідентифікатор нового елемента повинен відрізнятися від поточного.',
			'error-invalidid': 'Вказаний ідентифікатор не є валідним ідентифікатором елемента.',
			'error-notexisting': 'Елемента з ідентифікатором $1 не існує.',
			'error-overwrite': 'Посилання для вказаного сайту в $1 вже встановлене. Будь ласка, перевірте введений ідентифікатор елемента або вилучіть посилання з елемента.',
			'error-api': 'Сталася помилка під час редагування елемента: $1'
		} );
		break;
	case 'zh':
	case 'zh-hans':
	case 'zh-cn':
	case 'zh-sg':
		mw.messages.set( {
			'move': '移动',
			'move-toolbar': '移动',
			'close': '关闭',
			'newitem': '新项目的ID',
			'intro': '你可以将连结移动到另一个项目里。请输入一个有效项目的ID并确认新项目中没有相同语言的连结。请记得移动标签和描述。',
			'success': '连结已移动至$1。',
			'error-sameid': '请不要输入与此页相同的ID。',
			'error-invalidid': '这个ID不是一个有效的项目。',
			'error-notexisting': '项目$1并不存在。',
			'error-overwrite': '项目$1中已有相同语言的连结。请确认输入的ID或移除$1中的连结。',
			'error-api': '在编辑项目$1时似乎发生了一些问题。'
		} );
		break;
	case 'zh-hant':
	case 'zh-tw':
	case 'zh-hk':
	case 'zh-mo':
		mw.messages.set( {
			'move': '移動',
			'move-toolbar': '移動',
			'close': '關閉',
			'newitem': '新項目的ID',
			'intro': '你可以將連結移動到另一個項目裡。請輸入一個有效項目的ID並確認新項目中沒有相同語言的連結。請記得移動標籤和描述。',
			'success': '連結已移動至$1。',
			'error-sameid': '請不要輸入與此頁相同的ID。',
			'error-invalidid': '這個ID不是一個有效的項目。',
			'error-notexisting': '項目$1並不存在。',
			'error-overwrite': '項目$1中已有相同語言的連結。請確認輸入的ID或移除$1中的連結。',
			'error-api': '在編輯項目$1時似乎發生了一些問題。'
		} );
		break;
	}

	var api = new mw.Api(),
		repoApi = new wb.api.RepoApi( api ),
		olditem = mw.config.get( 'wbEntityId' ), // current item
		sitelinks, // current sitelinks
		sites, // ids of the sites to move
		newitem, // target item
		baseRevId = mw.config.get( 'wgCurRevisionId' ), // current revision id
		baseRevIdTarget, // current revision id of the target item
		$dialog, // jQuery object for the dialog
		$result; // jQuery object for the result

	function createSpinner() {
		$result.empty().append(
			$.createSpinner( {
				size: 'large',
				type: 'block'
			} )
		);
	}

	function showError( error ) {
		var parameters = Array.prototype.slice.call( arguments, 1 );
		$result.empty().append(
			$( '<p>' )
			.attr( 'class', 'error' )
			.append( mw.message( 'error-' + error ).params( parameters ).parseDom() )
		);
	}

	function onError( error, result ) {
		showError( 'api', result && result.error && result.error.info || error );
	}

	function success() {
		var message = mw.message(
			sites.length > 1 ? 'success-multi' : 'success',
			$( '<a>' ).attr( 'href', mw.util.getUrl( newitem ) ).text( newitem ),
			sites.length > 1 ? '' : sites[0]
		);

		$dialog.dialog( 'close' );

		// Hide moved sitelinks
		$( $.map( sites, function ( site ) {
			return $( '.wikibase-sitelinkview-' + site ).get( 0 );
		} ) ).hide( 400 );

		// Todo: Remove site from wikibase store to allow readding this sitelink.
		mw.notify( message, {
			autoHide: false,
			title: mw.msg( 'move' )
		} );
	}

	function move() {
		var newData, oldData, i, sitelink;

		if ( sites.length > 1 ) {
			newData = { sitelinks: {} };
			oldData = { sitelinks: {} };
	
			for ( i in sites ) {
				newData.sitelinks[sites[i]] = sitelinks[sites[i]];
				oldData.sitelinks[sites[i]] = { site: sites[i], remove: true };
			}

			api.postWithEditToken( {
				formatversion: 2,
				action: 'wbeditentity',
				id: olditem,
				baserevid: baseRevId,
				data: JSON.stringify( oldData ),
				summary: 'Moving sitelinks to [[' + newitem + ']]'
			} )
			.fail( onError )
			.done( function () {
				var deferred = $.Deferred();
				deferred.then( function () {
					api.postWithEditToken( {
						formatversion: 2,
						action: 'wbeditentity',
						id: newitem,
						baserevid: baseRevIdTarget,
						data: JSON.stringify( newData ),
						summary: 'Moving sitelinks from [[' + olditem + ']]'
					} )
					.fail( onError )
					.done( success );
				} );
				// T221571 workaround
				setTimeout( function () {
					deferred.resolve();
				}, 1000 );
			} );
		} else {
			sitelink = sitelinks[sites[0]];

			api.postWithEditToken( {
				formatversion: 2,
				action: 'wbsetsitelink',
				id: olditem,
				baserevid: baseRevId,
				linksite: sitelink.site,
				summary: 'Moving sitelink to [[' + newitem + ']]'
			} )
			.fail( onError )
			.done( function () {
				var deferred = $.Deferred();
				deferred.then( function () {
					api.postWithEditToken( {
						formatversion: 2,
						action: 'wbsetsitelink',
						id: newitem,
						baserevid: baseRevIdTarget,
						linksite: sitelink.site,
						linktitle: sitelink.title,
						badges: sitelink.badges.join( '|' ),
						summary: 'Moving sitelink from [[' + olditem + ']]'
					} )
					.fail( onError )
					.done( success );
				} );
				// T221571 workaround
				setTimeout( function () {
					deferred.resolve();
				}, 1000 );
			} );
		}
	}

	var entityLoaded = $.Deferred();

	function performMove() {
		createSpinner();
		newitem = $( '#move-newitem' ).val().toUpperCase();
		if ( olditem === newitem ) {
			showError( 'sameid' );
			return;
		}
		if ( newitem.match( /^Q\d+$/g ) === null ) {
			showError( 'invalidid' );
			return;
		}
		$.when(
			repoApi.getEntities( newitem, ['info', 'sitelinks'] ),
			entityLoaded
		)
		.fail( onError )
		.done( function ( data ) {
			if ( !data[0].entities.hasOwnProperty( newitem ) ) {
				showError( 'notexisting', $( '<a>' )
					.attr( 'href', mw.util.getUrl( newitem ) )
					.text( newitem )
				);
				return;
			}

			var entity = data[0].entities[newitem];

			if ( entity.hasOwnProperty( 'redirects' ) ) {
				newitem = entity.redirects.to;
			}

			for ( var i in sites ) {
				if ( entity.sitelinks && entity.sitelinks[sites[i]] ) {
					showError( 'overwrite', $( '<a>' )
						.attr( 'href', mw.util.getUrl( newitem ) )
						.text( newitem )
					);
					return;
				}
			}

			baseRevIdTarget = entity.lastrevid;

			move();
		} );
	}

	function openDialog() {
		$result.empty();
		$dialog.dialog( 'open' );
	}

	function init() {
		// Add click listener
		$( '.wikibase-sitelinkview' ).each( function () {
			var site = $( this ).data( 'wbSiteid' );
			$( this )
			.prepend(
				$( '<a>' )
				.attr( {
					'class': 'move-button',
					'href': '#',
					'title': mw.msg( 'move-toolbar' )
				} )
				.click( function ( event ) {
					event.preventDefault();
					sites = [ site ];
					openDialog();
				} )
			);
		} );

		$( '.wikibase-sitelinkgroupview' ).each( function () {
			var $this = $( this );
			if ( $this.find( '.wikibase-sitelinkview.listview-item' ).length > 0 ) {
				$this.find('.wikibase-edittoolbar-container').append(
					$( '<span>' )
					.attr( 'class', 'move-group' )
					.append(
						'[',
						$( '<a>' )
						.attr( 'href', '#' )
						.text( mw.msg( 'move-toolbar' ) )
						.click( function ( event ) {
							event.preventDefault();
							sites = $this.find( '.wikibase-sitelinkview.listview-item' ).map( function () {
								return $( this ).data( 'wb-siteid' );
							} ).get();
							openDialog();
						} ),
						']'
					)
				);
			}
		} );

		$result = $( '<p>' );

		// Create dialog
		$dialog = $( '<div>' )
		.append(
			$( '<form>' )
			.submit( function ( event ) {
				event.preventDefault();
				performMove();
			} )
			.append(
				$( '<fieldset>' )
				.attr( 'id', 'sitelink-form' )
				.append(
					$( '<legend>' )
					.text( mw.msg( 'move' ) ),
					// </legend>
					$( '<p>' )
					.attr( 'id', 'sitelink-intro' )
					.text( mw.msg( 'intro' ) ),
					// </p>
					$( '<p>' )
					.append(
						$( '<label>' )
						.attr( {
							'for': 'move-newitem',
							'class': 'move-label'
						} )
						.text( mw.msg( 'newitem' ) + ': ' ),
						// </label>
						$( '<input>' )
						.attr( {
							'type': 'text',
							'id': 'move-newitem',
							'class': 'move-input',
							'onkeyup': 'this.value = this.value.replace(/.*([QPL][1-9][0-9]*).*/, \'$1\');'
						} )
					)
				) // </p>
			), // </fieldset>
			// </form>
			$result
		)
		.dialog( {
			dialogClass: 'move-dialog',
			title: mw.message( 'move' ).escaped(),
			autoOpen: false,
			modal: true,
			width: 500,
			buttons: [ {
				id: 'move-button-move',
				text: mw.msg( 'move' ),
				click: function ( event ) {
					event.preventDefault();
					performMove();
				}
			}, {
				id: 'move-button-close',
				text: mw.msg( 'close' ),
				click: function ( event ) {
					event.preventDefault();
					$dialog.dialog( 'close' );
				}
			} ]
		} );
	}

	mw.hook( 'wikibase.entityPage.entityView.rendered' ).add( function () {
		$( init );
	} );

	mw.hook( 'wikibase.entityPage.entityLoaded' ).add( function ( entity ) {
		sitelinks = entity.sitelinks;
		entityLoaded.resolve();
	} );

} ( mediaWiki, wikibase, jQuery ) );