Skip to content

Commit 536a5d5

Browse files
authored
Language variant UI (fixes #82)
2 parents 24d8659 + 70da8f6 commit 536a5d5

File tree

3 files changed

+101
-27
lines changed

3 files changed

+101
-27
lines changed

assets/css/translation.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ html[dir='rtl'] .languageName {
66
padding-right: .5em;
77
}
88

9+
html[dir='ltr'] .languageVariant {
10+
font-size: 12px;
11+
padding-left: 2.5em;
12+
}
13+
14+
html[dir='rtl'] .languageVariant {
15+
font-size: 12px;
16+
padding-right: 2.5em;
17+
}
18+
919
.languageName {
1020
position: relative;
1121
}

assets/js/compat.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,30 @@ if (!String.prototype.trim) {
184184
if (!Date.now) {
185185
Date.now = function() { return new Date().getTime(); };
186186
}
187+
188+
// From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill
189+
if (!Array.prototype.some) {
190+
Array.prototype.some = function(fun/*, thisArg*/) {
191+
'use strict';
192+
193+
if (this == null) {
194+
throw new TypeError('Array.prototype.some called on null or undefined');
195+
}
196+
197+
if (typeof fun !== 'function') {
198+
throw new TypeError();
199+
}
200+
201+
var t = Object(this);
202+
var len = t.length >>> 0;
203+
204+
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
205+
for (var i = 0; i < len; i++) {
206+
if (i in t && fun.call(thisArg, t[i], i, t)) {
207+
return true;
208+
}
209+
}
210+
211+
return false;
212+
};
213+
}

assets/js/translator.js

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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) ? '&nbsp;&nbsp;&nbsp;&nbsp;' : '') + 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) ? '&nbsp;&nbsp;&nbsp;&nbsp;' : '') + 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

Comments
 (0)