@@ -533,6 +533,9 @@ function populateTranslationList() {
533533 sortTranslationList ( ) ;
534534 $ ( '.languageCol' ) . remove ( ) ;
535535
536+ function isVariant ( lang ) {
537+ return lang . indexOf ( '_' ) !== - 1 ;
538+ }
536539 var minColumnWidth = TRANSLATION_LIST_MAX_WIDTH / TRANSLATION_LIST_MAX_COLUMNS ;
537540
538541 // figure out how much space is actually available for the columns
@@ -560,36 +563,52 @@ function populateTranslationList() {
560563 dstLangsPerCol = Math . ceil ( dstLangs . length / numDstCols ) ;
561564
562565 for ( var i = 0 ; i < numSrcCols ; i ++ ) {
563- var numSrcLang = Math . ceil ( srcLangs . length / numSrcCols ) * i ;
566+ while ( isVariant ( srcLangs [ i * srcLangsPerCol ] ) ) {
567+ srcLangsPerCol ++ ;
568+ }
569+ }
570+
571+ for ( i = 0 ; i < numDstCols ; i ++ ) {
572+ while ( isVariant ( dstLangs [ i * dstLangsPerCol ] ) ) {
573+ dstLangsPerCol ++ ;
574+ }
575+ }
576+
577+ for ( i = 0 ; i < numSrcCols ; i ++ ) {
578+ var numSrcLang = srcLangsPerCol * i ;
564579 var srcLangCol = $ ( '<div class="languageCol">' ) . appendTo ( $ ( '#srcLanguages .row' ) ) ;
565580
566- for ( var j = numSrcLang ; j < numSrcLang + srcLangsPerCol ; j ++ ) {
567- if ( numSrcLang < srcLangs . length ) {
568- var langCode = srcLangs [ j ] ;
569- var langName = getLangByCode ( langCode ) ;
570- srcLangCol . append (
571- $ ( '<div class="languageName"></div>' )
572- . attr ( 'data-code' , langCode )
573- . text ( langName )
574- ) ;
581+ for ( var j = numSrcLang ; j < srcLangs . length && j < numSrcLang + srcLangsPerCol ; j ++ ) {
582+ var langCode = srcLangs [ j ] ;
583+ var langName = getLangByCode ( langCode ) ;
584+ var langClasses = 'languageName' ;
585+ if ( isVariant ( langCode ) ) {
586+ langClasses += ' languageVariant' ;
575587 }
588+ srcLangCol . append (
589+ $ ( '<div class="' + langClasses + '"></div>' )
590+ . attr ( 'data-code' , langCode )
591+ . text ( langName )
592+ ) ;
576593 }
577594 }
578595
579596 for ( i = 0 ; i < numDstCols ; i ++ ) {
580- var numDstLang = Math . ceil ( dstLangs . length / numDstCols ) * i ;
597+ var numDstLang = dstLangsPerCol * i ;
581598 var dstLangCol = $ ( '<div class="languageCol">' ) . appendTo ( $ ( '#dstLanguages .row' ) ) ;
582599
583- for ( j = numDstLang ; j < numDstLang + dstLangsPerCol ; j ++ ) {
584- if ( numDstLang < dstLangs . length ) {
585- langCode = dstLangs [ j ] ;
586- langName = getLangByCode ( langCode ) ;
587- dstLangCol . append (
588- $ ( '<div class="languageName"></div>' )
589- . attr ( 'data-code' , langCode )
590- . text ( langName )
591- ) ;
600+ for ( j = numDstLang ; j < dstLangs . length && j < numDstLang + dstLangsPerCol ; j ++ ) {
601+ langCode = dstLangs [ j ] ;
602+ langName = getLangByCode ( langCode ) ;
603+ langClasses = 'languageName' ;
604+ if ( isVariant ( langCode ) ) {
605+ langClasses += ' languageVariant' ;
592606 }
607+ dstLangCol . append (
608+ $ ( '<div class="' + langClasses + '"></div>' )
609+ . attr ( 'data-code' , langCode )
610+ . text ( langName )
611+ ) ;
593612 }
594613 }
595614
@@ -600,10 +619,18 @@ function populateTranslationList() {
600619
601620 $ ( '.langSelect option[value!=detect]' ) . remove ( ) ;
602621 $ . each ( srcLangs , function ( ) {
603- $ ( '#srcLangSelect' ) . append ( $ ( '<option></option>' ) . prop ( 'value' , this ) . text ( getLangByCode ( this ) ) ) ;
622+ $ ( '#srcLangSelect' ) . append (
623+ $ ( '<option></option>' )
624+ . prop ( 'value' , this )
625+ . html ( ( isVariant ( this ) ? ' ' : '' ) + getLangByCode ( this ) )
626+ ) ;
604627 } ) ;
605628 $ . each ( dstLangs , function ( ) {
606- $ ( '#dstLangSelect' ) . append ( $ ( '<option></option>' ) . prop ( 'value' , this ) . text ( getLangByCode ( this ) ) ) ;
629+ $ ( '#dstLangSelect' ) . append (
630+ $ ( '<option></option>' )
631+ . prop ( 'value' , this )
632+ . html ( ( isVariant ( this ) ? ' ' : '' ) + getLangByCode ( this ) )
633+ ) ;
607634 } ) ;
608635
609636 $ ( '#srcLangSelect' ) . val ( curSrcLang ) ;
@@ -623,7 +650,6 @@ function populateTranslationList() {
623650
624651 function compareLangCodes ( a , b ) {
625652 var aVariant = a . split ( '_' ) , bVariant = b . split ( '_' ) ;
626-
627653 var directCompare ;
628654 try {
629655 directCompare = getLangByCode ( aVariant [ 0 ] ) . localeCompare ( getLangByCode ( bVariant [ 0 ] ) , sortLocale ) ;
@@ -635,10 +661,10 @@ function populateTranslationList() {
635661 if ( aVariant [ 1 ] && bVariant [ 1 ] && aVariant [ 0 ] === bVariant [ 0 ] ) {
636662 return directCompare ;
637663 }
638- else if ( aVariant && a . startsWith ( b ) ) {
664+ else if ( aVariant [ 1 ] && aVariant [ 0 ] === b ) {
639665 return 1 ;
640666 }
641- else if ( bVariant && b . startsWith ( a ) ) {
667+ else if ( bVariant [ 1 ] && bVariant [ 0 ] === a ) {
642668 return - 1 ;
643669 }
644670 else {
@@ -648,9 +674,20 @@ function populateTranslationList() {
648674
649675 srcLangs = srcLangs . sort ( compareLangCodes ) ;
650676 dstLangs = dstLangs . sort ( function ( a , b ) {
651- var aPossible = pairs [ curSrcLang ] && pairs [ curSrcLang ] . indexOf ( a ) !== - 1 ;
652- var bPossible = pairs [ curSrcLang ] && pairs [ curSrcLang ] . indexOf ( b ) !== - 1 ;
677+ var possibleDstLangs = pairs [ curSrcLang ] ;
678+ function isPossible ( lang ) {
679+ var parentLanguage = lang . split ( '_' ) [ 0 ] ;
680+
681+ return possibleDstLangs && (
682+ possibleDstLangs . indexOf ( lang ) !== - 1 ||
683+ possibleDstLangs . indexOf ( parentLanguage ) !== - 1 ||
684+ possibleDstLangs . some ( function ( possibleLang ) {
685+ return possibleLang . startsWith ( parentLanguage ) ;
686+ } )
687+ ) ;
688+ }
653689
690+ var aPossible = isPossible ( a ) , bPossible = isPossible ( b ) ;
654691 if ( aPossible === bPossible ) {
655692 return compareLangCodes ( a , b ) ;
656693 }
0 commit comments