summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js')
-rw-r--r--www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js261
1 files changed, 141 insertions, 120 deletions
diff --git a/www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js b/www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js
index 58438261..103cfb8c 100644
--- a/www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js
+++ b/www/wiki/extensions/Translate/resources/js/ext.translate.special.translate.js
@@ -1,9 +1,10 @@
-( function ( $, mw ) {
+( function () {
'use strict';
var state = {
group: null,
- language: null
+ language: null,
+ messageList: null
};
mw.translate = mw.translate || {};
@@ -26,88 +27,62 @@
state.group = group.id;
changes = {
- group: group.id
+ group: group.id,
+ showMessage: null
+
};
mw.translate.changeUrl( changes );
mw.translate.updateTabLinks( changes );
- mw.translate.loadMessages( changes );
+ $( '.tux-editor-header .group-warning' ).empty();
+ state.messageList.changeSettings( changes );
updateGroupInformation( state );
},
changeLanguage: function ( language ) {
- var changes, targetDir, targetLangAttrib,
- userLanguageCode = mw.config.get( 'wgUserLanguage' );
-
- if ( !checkDirty() ) {
- return;
- }
-
- state.language = language;
-
- changes = {
- language: language
+ var changes = {
+ language: language,
+ showMessage: null
};
- if ( language === mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {
- targetLangAttrib = userLanguageCode;
- targetDir = $.uls.data.getDir( userLanguageCode );
- } else {
- targetLangAttrib = language;
- targetDir = $.uls.data.getDir( language );
- }
-
- // Changes to attributes must also be reflected
- // when the element is created on the server side
- $( '.ext-translate-language-selector > .uls' )
- .text( $.uls.data.getAutonym( language ) )
- .attr( {
- lang: targetLangAttrib,
- dir: targetDir
- } );
- $( '.tux-messagelist' ).data( {
- targetlangcode: language,
- targetlangdir: targetDir
- } );
+ state.language = language;
mw.translate.changeUrl( changes );
mw.translate.updateTabLinks( changes );
- mw.translate.loadMessages();
+ $( '.tux-editor-header .group-warning' ).empty();
+ state.messageList.changeSettings( changes );
updateGroupInformation( state );
+
},
changeFilter: function ( filter ) {
- var realFilters, uri;
-
if ( !checkDirty() ) {
return;
}
- realFilters = [ '!ignored' ];
- uri = new mw.Uri( window.location.href );
- if ( uri.query.optional !== '1' ) {
- realFilters.push( '!optional' );
- }
- if ( filter ) {
- realFilters.push( filter );
- }
-
- mw.translate.changeUrl( { filter: filter } );
- mw.translate.loadMessages( { filter: realFilters.join( '|' ) } );
+ mw.translate.changeUrl( { filter: filter, showMessage: null } );
+ state.messageList.changeSettings( { filter: getActualFilter( filter ) } );
},
- changeUrl: function ( params ) {
+ changeUrl: function ( params, forceChange ) {
var uri = new mw.Uri( window.location.href );
uri.extend( params );
+ // Support removing keys from the query
+ $.each( params, function ( key, val ) {
+ if ( val === null ) {
+ delete uri.query[ key ];
+ }
+ } );
+
if ( uri.toString() === window.location.href ) {
return;
}
- // Change the URL with this URI, but don't leave the page.
- if ( history.pushState && $( '.tux-messagelist' ).length ) {
- // IE<10 does not support pushState. Never mind.
+ // If supported by the browser and requested, change the URL with
+ // this URI but try not to leave the page.
+ if ( !forceChange && history.pushState && $( '.tux-messagelist' ).length ) {
history.pushState( uri, null, uri.toString() );
} else {
// For old browsers, just reload
@@ -133,9 +108,25 @@
}
} );
+ function getActualFilter( filter ) {
+ var realFilters, uri;
+
+ realFilters = [ '!ignored' ];
+ uri = new mw.Uri( window.location.href );
+ if ( uri.query.optional !== '1' ) {
+ realFilters.push( '!optional' );
+ }
+ if ( filter ) {
+ realFilters.push( filter );
+ }
+
+ return realFilters.join( '|' );
+ }
+
function checkDirty() {
if ( mw.translate.isDirty() ) {
- return window.confirm( mw.msg( 'translate-js-support-unsaved-warning' ) );
+ // eslint-disable-next-line no-alert
+ return confirm( mw.msg( 'translate-js-support-unsaved-warning' ) );
}
return true;
}
@@ -151,6 +142,10 @@
/**
* Updates all group specific stuff on the page.
+ *
+ * @param {Object} state Information about current group and language.
+ * @param {string} state.group Message group id.
+ * @param {string} state.language Language.
*/
function updateGroupInformation( state ) {
var props = 'id|priority|prioritylangs|priorityforce|description';
@@ -168,10 +163,15 @@
api = new mw.Api(),
$description = $( '.tux-editor-header .description' );
+ if ( group.description === null ) {
+ $description.empty();
+ return;
+ }
+
api.parse( group.description ).done( function ( parsedDescription ) {
// The parsed text is returned in a <p> tag,
// so it's removed here.
- $description.html( $( parsedDescription ).html() );
+ $description.html( parsedDescription );
} ).fail( function () {
$description.empty();
mw.log( 'Error parsing description for group ' + group.id );
@@ -182,15 +182,7 @@
var preferredLanguages, headerMessage, languagesMessage,
$groupWarning = $( '.tux-editor-header .group-warning' );
- $groupWarning.empty();
-
- // Check whether the group has priority languages
- if ( !group.prioritylangs ) {
- return;
- }
-
- // And if the current language is among them, we can return early
- if ( $.inArray( language, group.prioritylangs ) !== -1 ) {
+ if ( isPriorityLanguage( language, group.prioritylangs ) ) {
return;
}
@@ -200,15 +192,17 @@
return '<bdi>' + $.uls.data.getAutonym( lang ) + '</bdi>';
} ).join( ', ' );
- headerMessage = mw.message( group.priorityforce ?
- 'tpt-discouraged-language-force-header' :
- 'tpt-discouraged-language-header',
+ headerMessage = mw.message(
+ group.priorityforce ?
+ 'tpt-discouraged-language-force-header' :
+ 'tpt-discouraged-language-header',
$.uls.data.getAutonym( language )
).parse();
- languagesMessage = mw.message( group.priorityforce ?
- 'tpt-discouraged-language-force-content' :
- 'tpt-discouraged-language-content',
+ languagesMessage = mw.message(
+ group.priorityforce ?
+ 'tpt-discouraged-language-force-content' :
+ 'tpt-discouraged-language-content',
preferredLanguages
).parse();
@@ -219,20 +213,67 @@
);
}
- $( document ).ready( function () {
- var $translateContainer, $hideTranslatedButton, $controlOwnButton, $messageList,
- docLanguageAutonym, docLanguageCode, ulsOptions, filter, uri, position;
+ function isPriorityLanguage( language, priorityLanguages ) {
+ // Don't show priority notice if the language is message documentation.
+ if ( language === mw.config.get( 'wgTranslateDocumentationLanguageCode' ) ) {
+ return true;
+ }
+
+ // If no priority language is set, return early.
+ if ( !priorityLanguages ) {
+ return true;
+ }
+
+ if ( priorityLanguages.indexOf( language ) !== -1 ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function setupLanguageSelector( $element ) {
+ var ulsOptions = {
+ languages: mw.config.get( 'wgTranslateLanguages' ),
+ showRegions: [ 'SP' ].concat( $.fn.lcd.defaults.showRegions ),
+ onSelect: function ( language ) {
+ mw.translate.changeLanguage( language );
+ $element.text( $.uls.data.getAutonym( language ) );
+ },
+ ulsPurpose: 'translate-special-translate',
+ quickList: function () {
+ return mw.uls.getFrequentLanguageList();
+ }
+ };
+
+ mw.translate.addExtraLanguagesToLanguageData( ulsOptions.languages, [ 'SP' ] );
+ $element.uls( ulsOptions );
+ }
+
+ $( function () {
+ var $translateContainer, $hideTranslatedButton, $messageList,
+ filter, uri, position, offset, limit;
$messageList = $( '.tux-messagelist' );
+ state.group = $( '.tux-messagetable-loader' ).data( 'messagegroup' );
+ state.language = $messageList.data( 'targetlangcode' );
+
if ( $messageList.length ) {
+ $messageList.messagetable();
+ state.messageList = $messageList.data( 'messagetable' );
+
uri = new mw.Uri( window.location.href );
filter = uri.query.filter;
+ offset = uri.query.showMessage;
+ if ( offset ) {
+ limit = uri.query.limit || 1;
+ // Default to no filters
+ filter = filter || '';
+ }
if ( filter === undefined ) {
filter = '!translated';
}
- mw.translate.changeFilter( filter );
$( '.tux-message-selector li' ).each( function () {
var $this = $( this );
@@ -240,11 +281,24 @@
$this.addClass( 'selected' );
}
} );
- }
- state.group = $( '.tux-messagetable-loader' ).data( 'messagegroup' );
- state.language = $messageList.data( 'targetlangcode' ) || // for tux=1
- mw.config.get( 'wgUserLanguage' ); // for tux=0
+ mw.translate.changeUrl( {
+ group: state.group,
+ language: state.language,
+ filter: filter,
+ showMessage: offset,
+ optional: offset ? 1 : undefined
+ } );
+
+ // Start loading messages
+ state.messageList.changeSettings( {
+ group: state.group,
+ language: state.language,
+ offset: offset,
+ limit: limit,
+ filter: getActualFilter( filter )
+ } );
+ }
if ( $( 'body' ).hasClass( 'rtl' ) ) {
position = {
@@ -252,7 +306,7 @@
at: 'right+80 bottom+5'
};
}
- $( '.tux-breadcrumb .grouplink' ).msggroupselector( {
+ $( '.tux-breadcrumb__item--aggregate' ).msggroupselector( {
onSelect: mw.translate.changeGroup,
language: state.language,
position: position,
@@ -261,30 +315,13 @@
updateGroupInformation( state );
- $messageList.messagetable();
- // Use ULS for language selection if it's available
- ulsOptions = {
- onSelect: function ( language ) {
- mw.translate.changeLanguage( language );
- },
- languages: mw.config.get( 'wgULSLanguages' ),
- searchAPI: mw.util.wikiScript( 'api' ) + '?action=languagesearch&format=json',
- quickList: function () {
- return mw.uls.getFrequentLanguageList();
- }
- };
-
- // If a documentation pseudo-language is defined,
- // add it to the language selector
- docLanguageCode = mw.config.get( 'wgTranslateDocumentationLanguageCode' );
- if ( docLanguageCode ) {
- docLanguageAutonym = mw.msg( 'translate-documentation-language' );
- ulsOptions.languages[ docLanguageCode ] = docLanguageAutonym;
- mw.translate.addDocumentationLanguage();
- ulsOptions.showRegions = [ 'WW', 'SP', 'AM', 'EU', 'ME', 'AF', 'AS', 'PA' ];
- }
-
- $( '.ext-translate-language-selector .uls' ).uls( ulsOptions );
+ $( '.ext-translate-language-selector .uls' ).one( 'click', function () {
+ var $target = $( this );
+ mw.loader.using( 'ext.uls.mediawiki' ).done( function () {
+ setupLanguageSelector( $target );
+ $target.click();
+ } );
+ } );
if ( $.fn.translateeditor ) {
// New translation editor
@@ -305,22 +342,6 @@
$( this ).prop( 'disabled', true );
} );
- $controlOwnButton = $translateContainer.find( '.tux-proofread-own-translations-button' );
- $controlOwnButton.click( function () {
- var $this = $( this ),
- ownTranslatedMessages = $translateContainer.find( '.own-translation' ),
- hideMessage = mw.msg( 'tux-editor-proofreading-hide-own-translations' ),
- showMessage = mw.msg( 'tux-editor-proofreading-show-own-translations' );
-
- if ( $this.hasClass( 'down' ) ) {
- ownTranslatedMessages.removeClass( 'hide' );
- $this.removeClass( 'down' ).text( hideMessage );
- } else {
- ownTranslatedMessages.addClass( 'hide' );
- $this.addClass( 'down' ).text( showMessage );
- }
- } );
-
// Message filter click handler
$translateContainer.find( '.row.tux-message-selector > li' ).on( 'click', function () {
var newFilter,
@@ -375,4 +396,4 @@
} );
} );
-}( jQuery, mediaWiki ) );
+}() );