jenkins-bot has submitted this change and it was merged.
Change subject: Source Selector: Set default languages
......................................................................
Source Selector: Set default languages
* Adds method to set default languages when rendering source selector
** Uses localStorage target language if it exists
** Defaults target language to wiki content language
** Uses localStorage source language if exists and valid for target language
** Defaults source language to first valid source language for target language
* Adds convenience methods for setting source and target languages
* Adds method for retrieving valid source and target languages
* Adds method for validating source language against target language
* Modifies method for validating target language against source langauge
* Updates change handlers for source language and target language
This patch also solves the issue in T76700.
Bug: T76832
Change-Id: I9c57c9d6a8dfc7bfa8f36336ef513af3a9254254
---
M modules/source/ext.cx.source.selector.js
1 file changed, 133 insertions(+), 56 deletions(-)
Approvals:
Amire80: Looks good to me, approved
jenkins-bot: Verified
diff --git a/modules/source/ext.cx.source.selector.js
b/modules/source/ext.cx.source.selector.js
index 1b71fc5..d552a01 100644
--- a/modules/source/ext.cx.source.selector.js
+++ b/modules/source/ext.cx.source.selector.js
@@ -104,15 +104,61 @@
};
/**
- * Check whether a language is available as a target language
- * for the currently selected source language.
- * @param {array} language A language code.
- * return {boolean} true if the language is available.
+ * Returns the valid source languages for the given target language
+ * @param {string} targetLanguage A language code
+ * @return {array} An array of valid source languages
*/
- CXSourceSelector.prototype.isValidTarget = function ( language ) {
+ CXSourceSelector.prototype.getValidSourceLanguages = function (
targetLanguage ) {
+ var sourceLanguage,
+ validSourceLanguages = [];
+
+ for ( sourceLanguage in this.languagePairs ) {
+ if ( $.inArray( targetLanguage, this.languagePairs[
sourceLanguage ] ) > -1 ) {
+ validSourceLanguages.push( sourceLanguage );
+ }
+ }
+
+ return validSourceLanguages;
+ };
+
+ /**
+ * Returns the valid target languages for the given source langauge
+ * @param {string} sourceLanguage A language code
+ * @return {array} An array of valid target languages
+ */
+ CXSourceSelector.prototype.getValidTargetLanguages = function (
sourceLanguage ) {
+ return this.languagePairs[ sourceLanguage ];
+ };
+
+ /**
+ * Check whether a language is available as a target language
+ * for the specified source language.
+ * @param {string} targetLanguage A language code.
+ * @param {string} sourceLanguage A language code.
+ * return {boolean} true if the target language is valid for the source
language.
+ */
+ CXSourceSelector.prototype.isValidTarget = function ( targetLanguage,
sourceLanguage ) {
return ( $.inArray(
- language,
- this.languagePairs[ this.getSourceLanguage() ]
+ targetLanguage,
+ this.languagePairs[ sourceLanguage ]
+ ) > -1 );
+ };
+
+ /**
+ * Check whether a language is available as a source language
+ * for the specified target language.
+ * @param {string} targetLanguage A language code.
+ * @param {string} sourceLanguage A language code.
+ * return {boolean} true if the target language is valid for the source
language.
+ */
+ CXSourceSelector.prototype.isValidSource = function ( sourceLanguage,
targetLanguage ) {
+ var sourceLanguages;
+
+ sourceLanguages = this.getValidSourceLanguages( targetLanguage
);
+
+ return ( $.inArray(
+ sourceLanguage,
+ sourceLanguages
) > -1 );
};
@@ -125,6 +171,23 @@
};
/**
+ * Sets the source language
+ * @param {string} language A language code
+ */
+ CXSourceSelector.prototype.setSourceLanguage = function ( language ) {
+ this.$sourceLanguage
+ .prop( {
+ lang: language,
+ dir: $.uls.data.getDir( language )
+ } )
+ .text( $.uls.data.getAutonym( language ) );
+
+ if ( localStorage ) {
+ localStorage.cxSourceLanguage = language;
+ }
+ };
+
+ /**
* Get the current target language code.
* return {string} Language code. Empty string if not set.
*/
@@ -133,12 +196,30 @@
};
/**
+ * Sets the target language
+ * @param {string} language A language code
+ */
+ CXSourceSelector.prototype.setTargetLanguage = function ( language ) {
+ this.$targetLanguage
+ .prop( {
+ lang: language,
+ dir: $.uls.data.getDir( language )
+ } )
+ .text( $.uls.data.getAutonym( language ) );
+
+ if ( localStorage ) {
+ localStorage.cxTargetLanguage = language;
+ }
+ };
+
+ /**
* Fill the target language dropdown with target languages that have
* language tools compatible with the source language.
*/
CXSourceSelector.prototype.fillTargetLanguages = function () {
var cxSourceSelector = this,
- targetUlsClass = 'cx-sourceselector-uls-target';
+ targetUlsClass = 'cx-sourceselector-uls-target',
+ sourceLanguage = this.getSourceLanguage();
// Delete the old target ULS
$( '.' + targetUlsClass ).remove();
@@ -154,7 +235,7 @@
this.$menu.addClass( targetUlsClass );
},
languageDecorator: function ( $languageLink, language )
{
- if ( !cxSourceSelector.isValidTarget( language
) ) {
+ if ( !cxSourceSelector.isValidTarget( language,
sourceLanguage ) ) {
$languageLink.addClass(
'cx-sourceselector-unavailable-target' );
}
},
@@ -211,20 +292,9 @@
* @param {string} language Language code.
*/
CXSourceSelector.prototype.sourceLanguageChangeHandler = function (
language ) {
- this.$sourceLanguage
- .prop( {
- lang: language,
- dir: $.uls.data.getDir( language )
- } )
- .text( $.uls.data.getAutonym( language ) );
-
+ this.setSourceLanguage( language );
this.fillTargetLanguages();
-
- if ( localStorage ) {
- localStorage.cxSourceLanguage =
this.getSourceLanguage();
- localStorage.cxTargetLanguage =
this.getTargetLanguage();
- }
-
+ this.setTargetLanguage( this.getValidTargetLanguages( language
)[ 0 ] );
this.check();
};
@@ -233,20 +303,17 @@
* @param {string} language Language code.
*/
CXSourceSelector.prototype.targetLanguageChangeHandler = function (
language ) {
- this.$targetLanguage
- .prop( {
- lang: language,
- dir: $.uls.data.getDir( language )
- } )
- .text( $.uls.data.getAutonym( language ) );
-
- if ( localStorage ) {
- localStorage.cxTargetLanguage =
this.getTargetLanguage();
+ // Only allow valid target languages to be selected
+ if ( !this.isValidTarget( language, this.getSourceLanguage() )
) {
+ return;
}
+
+ this.setTargetLanguage( language );
// Disable the target input if the target language is not valid
// for the current source language
- this.$targetTitleInput.prop( 'disabled', !this.isValidTarget(
language ) );
+ this.$targetTitleInput
+ .prop( 'disabled', !this.isValidTarget( language,
this.getSourceLanguage() ) );
this.check();
};
@@ -633,6 +700,37 @@
);
};
+ CXSourceSelector.prototype.setDefaultLanguages = function () {
+ var sourceLanguage, targetLanguage;
+
+ // If there is a target language code in localStorage, use that.
+ // Otherwise default to wiki content language
+ if ( localStorage && localStorage.cxTargetLanguage ) {
+ targetLanguage = localStorage.cxTargetLanguage;
+ } else {
+ targetLanguage = mw.config.get( 'wgContentLanguage' );
+ }
+
+ // If there is a source language code in localStorage and it is
valid
+ // for the target language, use that.
+ // Otherwise use the first valid source language.
+ if ( localStorage &&
+ localStorage.cxSourceLanguage &&
+ this.isValidSource( localStorage.cxSourceLanguage,
targetLanguage )
+ ) {
+ sourceLanguage = localStorage.cxSourceLanguage;
+ } else {
+ sourceLanguage = this.getValidSourceLanguages(
targetLanguage )[ 0 ];
+ }
+
+ // Set the source language
+ this.setSourceLanguage( sourceLanguage );
+ // Fill in the target languages
+ this.fillTargetLanguages();
+ // Set the target language
+ this.setTargetLanguage( targetLanguage );
+ };
+
/**
* Render the CXSourceSelector dialog.
*/
@@ -657,8 +755,7 @@
.text( mw.msg(
'cx-sourceselector-dialog-source-language-label' ) );
this.$sourceLanguage = $( '<div>' )
- .addClass( 'cx-sourceselector-dialog__language' )
- .text( $.uls.data.getAutonym( mw.config.get(
'wgContentLanguage' ) ) );
+ .addClass( 'cx-sourceselector-dialog__language' );
this.$sourceLanguage.uls( {
languages: getAutonyms( this.sourceLanguages ),
@@ -674,10 +771,9 @@
$targetLanguageLabel = $( '<label>' ).addClass(
'cx-sourceselector-dialog__language-label' )
.text( mw.msg(
'cx-sourceselector-dialog-target-language-label' ) );
this.$targetLanguage = $( '<div>' )
- .addClass( 'cx-sourceselector-dialog__language' )
- .text( $.uls.data.getAutonym( mw.config.get(
'wgContentLanguage' ) ) );
+ .addClass( 'cx-sourceselector-dialog__language' );
- this.fillTargetLanguages();
+ this.setDefaultLanguages();
this.$sourceTitleInput = $( '<input>' )
.addClass( 'cx-sourceselector-dialog__title' )
@@ -745,25 +841,6 @@
$license,
$actions
);
-
- if ( localStorage && localStorage.cxSourceLanguage ) {
- this.$sourceLanguage
- .prop( {
- lang: localStorage.cxSourceLanguage,
- dir: $.uls.data.getDir(
localStorage.cxSourceLanguage )
- } )
- .text( $.uls.data.getAutonym(
localStorage.cxSourceLanguage ) );
- this.fillTargetLanguages();
- }
-
- if ( localStorage && localStorage.cxTargetLanguage ) {
- this.$targetLanguage
- .prop( {
- lang: localStorage.cxTargetLanguage,
- dir: $.uls.data.getDir(
localStorage.cxTargetLanguage )
- } )
- .text( $.uls.data.getAutonym(
localStorage.cxTargetLanguage ) );
- }
$( 'body' ).append( this.$dialog );
};
--
To view, visit https://gerrit.wikimedia.org/r/179191
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I9c57c9d6a8dfc7bfa8f36336ef513af3a9254254
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/extensions/ContentTranslation
Gerrit-Branch: master
Gerrit-Owner: Jsahleen <[email protected]>
Gerrit-Reviewer: Amire80 <[email protected]>
Gerrit-Reviewer: Santhosh <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits