summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'MLEB/Translate/resources/js/ext.translate.statsbar.js')
-rw-r--r--MLEB/Translate/resources/js/ext.translate.statsbar.js186
1 files changed, 186 insertions, 0 deletions
diff --git a/MLEB/Translate/resources/js/ext.translate.statsbar.js b/MLEB/Translate/resources/js/ext.translate.statsbar.js
new file mode 100644
index 00000000..8f14c00a
--- /dev/null
+++ b/MLEB/Translate/resources/js/ext.translate.statsbar.js
@@ -0,0 +1,186 @@
+/**
+ * Translate language statistics bar - jQuery plugin.
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @license GPL-2.0+
+ * @since 2012-11-30
+ */
+
+/*
+ * Usage:
+ * $( '<div>' ).languagestatsbar( {
+ * language: 'fi',
+ * group: 'core'
+ * } );
+ * The status bar will be rendered to the newly created div. Or use any container.
+ */
+( function ( mw, $ ) {
+ 'use strict';
+
+ // Use mw.translate namespace for storing the language statistics.
+ mw.translate = mw.translate || {};
+
+ var LanguageStatsBar = function ( container, options ) {
+ this.$container = $( container );
+ this.group = options.group;
+ this.language = options.language;
+ this.$statsBar = null;
+ this.init();
+ };
+
+ LanguageStatsBar.prototype = {
+ init: function () {
+ if ( mw.translate.languagestats[this.language] ) {
+ this.render();
+ } else {
+ mw.translate.loadLanguageStats( this.language )
+ .done( $.proxy( this.render, this ) );
+ }
+ },
+
+ /**
+ * Listen for the change events and update the statsbar
+ */
+ listen: function () {
+ var i,
+ statsbar = this,
+ languageStats = mw.translate.languagestats[this.language];
+
+ statsbar.$statsBar.on( 'change', function ( event, to, from ) {
+ for ( i = 0; i < languageStats.length; i++ ) {
+ if ( languageStats[i].group === statsbar.group ) {
+ if ( to === 'translated' && from === 'untranslated' ) {
+ languageStats[i].translated++;
+ }
+ if ( to === 'proofread' ) {
+ languageStats[i].proofread++;
+ }
+ if ( to === 'fuzzy' ) {
+ languageStats[i].fuzzy++;
+ }
+
+ if ( from === 'fuzzy' ) {
+ languageStats[i].fuzzy--;
+ }
+ if ( from === 'proofread' ) {
+ languageStats[i].proofread--;
+ }
+ if ( from === 'translated' ) {
+ languageStats[i].translated--;
+ }
+ break;
+ }
+ }
+
+ // Update the stats bar
+ statsbar.update();
+ } );
+
+ statsbar.$container.hover( function () {
+ statsbar.$statsBar.find( '.tux-statsbar-info' ).removeClass( 'hide' );
+ }, function () {
+ statsbar.$statsBar.find( '.tux-statsbar-info' ).addClass( 'hide' );
+ } );
+ },
+
+ render: function () {
+ this.$statsBar = $( '<div>' )
+ .addClass( 'tux-statsbar' )
+ .data( 'group', this.group );
+
+ this.$statsBar.append(
+ $( '<span>' ).addClass( 'tux-proofread' ),
+ $( '<span>' ).addClass( 'tux-translated' ),
+ $( '<span>' ).addClass( 'tux-fuzzy' ),
+ $( '<span>' ).addClass( 'tux-untranslated' ),
+ $( '<div>' ).addClass( 'tux-statsbar-info hide' )
+ );
+
+ this.$container.append( this.$statsBar );
+ this.update();
+
+ this.listen();
+ },
+
+ update: function () {
+ var proofread, translated, fuzzy, untranslated, untranslatedCount,
+ stats = this.getStatsForGroup( this.group );
+
+ this.$statsBar.data( 'total', stats.total );
+
+ proofread = 100 * stats.proofread / stats.total;
+ // Proofread messages are also translated, so remove those for
+ // the bar showing only translated count.
+ translated = stats.translated - stats.proofread;
+ translated = 100 * translated / stats.total;
+ fuzzy = 100 * stats.fuzzy / stats.total;
+ untranslated = 100 - proofread - translated - fuzzy;
+ // Again, proofread counts are subset of translated counts
+ untranslatedCount = stats.total - stats.translated - stats.fuzzy;
+
+ this.$statsBar.find( '.tux-proofread' )
+ .data( 'proofread', stats.proofread )
+ .css( 'width', proofread + '%' );
+ this.$statsBar.find( '.tux-translated' )
+ .data( 'translated', stats.translated )
+ .css( 'width', translated + '%' );
+ this.$statsBar.find( '.tux-fuzzy' )
+ .data( 'fuzzy', stats.fuzzy )
+ .css( 'width', fuzzy + '%' );
+ this.$statsBar.find( '.tux-untranslated' )
+ .data( 'untranslated', untranslatedCount )
+ .css( 'width', untranslated + '%' );
+
+ translated = !translated ? 0 : translated + proofread;
+ proofread = !proofread ? 0 : proofread;
+
+ if ( fuzzy ) {
+ this.$statsBar.find( '.tux-statsbar-info' )
+ .text( mw.msg( 'translate-statsbar-tooltip-with-fuzzy',
+ translated.toFixed(), proofread.toFixed(),
+ fuzzy.toFixed() ) );
+ } else {
+ this.$statsBar.find( '.tux-statsbar-info' )
+ .text( mw.msg( 'translate-statsbar-tooltip',
+ translated.toFixed(), proofread.toFixed() ) );
+ }
+ },
+
+ getStatsForGroup: function ( group ) {
+ var i,
+ languageStats = mw.translate.languagestats[this.language];
+
+ for ( i = 0; i < languageStats.length; i++ ) {
+ if ( languageStats[i].group === group ) {
+ return languageStats[i];
+ }
+ }
+
+ return {
+ proofread: 0,
+ total: 0,
+ fuzzy: 0,
+ translated: 0
+ };
+ }
+ };
+
+ /*
+ * languagestatsbar PLUGIN DEFINITION
+ */
+
+ $.fn.languagestatsbar = function ( options ) {
+ return this.each( function () {
+ var $this = $( this ),
+ data = $this.data( 'languagestatsbar' );
+
+ if ( !data ) {
+ $this.data( 'languagestatsbar', ( data = new LanguageStatsBar( this, options ) ) );
+ }
+ } );
+ };
+
+ $.fn.languagestatsbar.Constructor = LanguageStatsBar;
+
+ mw.translate = mw.translate || {};
+} ( mediaWiki, jQuery ) );