summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Translate/resources/js/ext.translate.base.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Translate/resources/js/ext.translate.base.js')
-rw-r--r--www/wiki/extensions/Translate/resources/js/ext.translate.base.js192
1 files changed, 192 insertions, 0 deletions
diff --git a/www/wiki/extensions/Translate/resources/js/ext.translate.base.js b/www/wiki/extensions/Translate/resources/js/ext.translate.base.js
new file mode 100644
index 00000000..36ffeed2
--- /dev/null
+++ b/www/wiki/extensions/Translate/resources/js/ext.translate.base.js
@@ -0,0 +1,192 @@
+( function () {
+ 'use strict';
+
+ mw.translate = mw.translate || {};
+
+ mw.translate = $.extend( mw.translate, {
+ dirty: false,
+ // A cache for language stats loaded from API,
+ // indexed by language code
+ languagestats: {},
+
+ /**
+ * Checks if the input placeholder attribute
+ * is supported on this element in this browser.
+ *
+ * @param {jQuery} $element
+ * @return {boolean}
+ */
+ isPlaceholderSupported: function ( $element ) {
+ return ( 'placeholder' in $element[ 0 ] );
+ },
+
+ // Storage for language stats loader functions from API,
+ // indexed by language code
+ languageStatsLoader: {},
+
+ /**
+ * Get language stats for a language from the API.
+ *
+ * @param {string} language Language code.
+ * @return {deferred}
+ */
+ loadLanguageStats: function ( language ) {
+ if ( !mw.translate.languageStatsLoader[ language ] ) {
+ mw.translate.languageStatsLoader[ language ] = new mw.Api().get( {
+ action: 'query',
+ meta: 'languagestats',
+ lslanguage: language
+ } );
+ }
+
+ mw.translate.languageStatsLoader[ language ].done( function ( result ) {
+ mw.translate.languagestats[ language ] = result.query.languagestats;
+ } );
+
+ return mw.translate.languageStatsLoader[ language ];
+ },
+
+ /**
+ * Load message group information asynchronously.
+ *
+ * @param {string} id Message group id
+ * @param {string|Array} [props] List of properties to load
+ * @return {jQuery.Promise} Object containing the requested properties on success.
+ */
+ getMessageGroup: function ( id, props ) {
+ var params, api;
+
+ if ( Array.isArray( props ) ) {
+ props = props.join( '|' );
+ } else if ( props === undefined ) {
+ props = 'id|label|description|icon|priority|prioritylangs|priorityforce|workflowstates';
+ }
+
+ params = {
+ meta: 'messagegroups',
+ mgformat: 'flat',
+ mgprop: props,
+ mgroot: id,
+ formatversion: 2
+ };
+
+ api = new mw.Api();
+
+ return api.get( params ).then( function ( result ) {
+ return result.query.messagegroups[ 0 ];
+ } );
+ },
+
+ /**
+ * Find a group from an array of message groups as returned by web api
+ * and recurse it through sub groups.
+ *
+ * @param {string} id Group id to search for.
+ * @param {Array} groups Array of message grous
+ * @return {Object} Message group object
+ */
+ findGroup: function ( id, groups ) {
+ var result = null;
+
+ if ( !id ) {
+ return groups;
+ }
+
+ $.each( groups, function ( index, group ) {
+ if ( group.id === id ) {
+ result = group;
+ return false;
+ }
+
+ if ( group.groups ) {
+ group = mw.translate.findGroup( id, group.groups );
+
+ if ( group ) {
+ result = group;
+ return false;
+ }
+ }
+ } );
+
+ return result;
+ },
+
+ /**
+ * Check if the current user is allowed to translate on this wiki.
+ *
+ * @return {boolean}
+ */
+ canTranslate: function () {
+ return mw.config.get( 'TranslateRight' );
+ },
+
+ /**
+ * Check if the current user is allowed to proofread on this wiki.
+ *
+ * @return {boolean}
+ */
+ canProofread: function () {
+ return mw.config.get( 'TranslateMessageReviewRight' );
+ },
+
+ /**
+ * Check if the current user can delete translations on this wiki.
+ *
+ * @return {boolean}
+ */
+ canDelete: function () {
+ return mw.config.get( 'DeleteRight' ) && mw.config.get( 'TranslateRight' );
+ },
+
+ /**
+ * Adds missing languages to the language database so that they can be used in ULS.
+ *
+ * @param {Object} languages Language tags mapped to language names
+ * @param {Array} regions Which regions to add the languages.
+ */
+ addExtraLanguagesToLanguageData: function ( languages, regions ) {
+ var code;
+ for ( code in languages ) {
+ if ( code in $.uls.data.languages ) {
+ continue;
+ }
+
+ $.uls.data.addLanguage( code, {
+ script: 'Zyyy',
+ regions: regions,
+ autonym: languages[ code ]
+ } );
+ }
+ },
+
+ isDirty: function () {
+ return $( '.mw-ajax-dialog:visible' ).length || // For old Translate
+ // For new Translate, something being typed in the current editor.
+ mw.translate.dirty ||
+ // For new translate, previous editors has some unsaved edits
+ $( '.tux-status-unsaved' ).length;
+ }
+ } );
+
+ function pageShowHandler() {
+ $( window ).on( 'beforeunload.translate', function () {
+ if ( mw.translate.isDirty() ) {
+ // Return our message
+ return mw.msg( 'translate-js-support-unsaved-warning' );
+ }
+ } );
+ }
+
+ /**
+ * A warning to be shown if a user tries to close the page or navigate away
+ * from it without saving the written translation.
+ */
+ function translateOnBeforeUnloadRegister() {
+ pageShowHandler();
+ $( window ).on( 'pageshow.translate', pageShowHandler );
+ }
+
+ $( function () {
+ translateOnBeforeUnloadRegister();
+ } );
+}() );