Skip to content

Commit 766f974

Browse files
committed
Add suggestions based on apertium#252
1 parent e6226cc commit 766f974

File tree

8 files changed

+239
-11
lines changed

8 files changed

+239
-11
lines changed

assets/css/translation.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,19 @@ html[dir='rtl'] .form-group.d-sm-none .translateBtn { /* sass-lint:disable-line
7777
}
7878

7979
/* Action buttons use blue color instead of the primary orange, overwrite */
80-
#generate, #analyze, #request, .translateBtn {
80+
#generate, #analyze, #request, #suggestBtn, .translateBtn {
8181
/* sass-lint:disable-block no-important */
8282
background-color: #446e9b !important;
8383
border-color: #446e9b;
8484
color: #fff !important;
8585
}
8686

87+
#suggestBtn:focus,
88+
#suggestBtn:hover, #suggestBtn.focus
89+
#suggestBtn:active, #suggestBtn.active {
90+
background-color: #385a7f !important; /* sass-lint:disable-line no-important */
91+
}
92+
8793
.translateBtn:focus,
8894
.translateBtn:hover, .translateBtn.focus
8995
.translateBtn:active, .translateBtn.active {

assets/js/localization.js

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,29 @@ var locale/*: string */;
55
var languages = {'af': 'Afrikaans', 'id': 'Bahasa Indonesia', 'cy': 'Cymraeg', 'de': 'Deutsch', 'en': 'English', 'ga': 'Gaeilge', 'gv': 'Gaelg', 'gd': 'Gàidhlig', 'rn': 'Ikirundi', 'sw': 'Kiswahili', 'lg': 'Luganda', 'mt': 'Malti', 'nl': 'Nederlands', 'sq': 'Shqip', 'vi': 'Tiếng Việt', 'tr': 'Türkçe', 'az': 'azərbaycan', 'br': 'brezhoneg', 'ca': 'català', 'da': 'dansk', 'se': 'davvisámegiella', 'et': 'eesti', 'es': 'español', 'eo': 'esperanto', 'eu': 'euskara', 'fr': 'français', 'fo': 'føroyskt', 'ia': 'interlingua', 'xh': 'isiXhosa', 'zu': 'isiZulu', 'it': 'italiano', 'mfe': 'kreol morisien', 'lv': 'latviešu', 'lt': 'lietuvių', 'hu': 'magyar', 'nb': 'norsk bokmål', 'nn': 'nynorsk', 'uz': 'oʻzbekcha', 'pl': 'polski', 'pt': 'português', 'ro': 'română', 'rm': 'rumantsch', 'sk': 'slovenčina', 'sl': 'slovenščina', 'fi': 'suomi', 'sv': 'svenska', 'is': 'íslenska', 'cs': 'čeština', 'el': 'Ελληνικά', 'tg': 'Тоҷикӣ', 'ba': 'башҡортса', 'be': 'беларуская', 'bg': 'български', 'os': 'ирон', 'kum': 'къумукъча', 'ky': 'кыргызча', 'mk': 'македонски', 'ru': 'русский', 'tt': 'татарча', 'uk': 'українська', 'kk': 'қазақша', 'hy': 'հայերեն', 'he': 'עברית', 'ur': 'اردو', 'ar': 'العربية', 'fa': 'فارسی', 'ne': 'नेपाली', 'mr': 'मराठी', 'hi': 'हिंदी', 'as': 'অসমীয়া', 'bn': 'বাংলা', 'pa': 'ਪੰਜਾਬੀ', 'te': 'తెలుగు', 'ml': 'മലയാളം', 'si': 'සිංහල', 'th': 'ไทย', 'lo': 'ລາວ', 'zh': '中文', 'ko': '한국어', 'mrj': 'Мары йӹлмӹ', 'gl': 'galego', 'myv': 'Эрзянь кель', 'oc': 'occitan', 'cv': 'чӑвашла', 'arg': 'aragonés', 'ast': 'asturianu', 'msa': 'bahasa malay', 'hbs': 'srpskohrvatski', 'srp': 'српски', 'hrv': 'hrvatski', 'bos': 'bosanski', 'nog': 'ногъайша', 'sah': 'сахалыы', 'uig': 'ئۇيغۇرچە', 'tyv': 'тыва дылда'};
66
// eslint-disable-next-line
77
var iso639Codes = {'abk': 'ab', 'aar': 'aa', 'afr': 'af', 'aka': 'ak', 'sqi': 'sq', 'amh': 'am', 'ara': 'ar', 'arg': 'an', 'hye': 'hy', 'asm': 'as', 'ava': 'av', 'ave': 'ae', 'aym': 'ay', 'aze': 'az', 'bam': 'bm', 'bak': 'ba', 'eus': 'eu', 'bel': 'be', 'ben': 'bn', 'bih': 'bh', 'bis': 'bi', 'bos': 'bs', 'bre': 'br', 'bul': 'bg', 'mya': 'my', 'cat': 'ca', 'cha': 'ch', 'che': 'ce', 'nya': 'ny', 'zho': 'zh', 'chv': 'cv', 'cor': 'kw', 'cos': 'co', 'cre': 'cr', 'hrv': 'hr', 'ces': 'cs', 'dan': 'da', 'div': 'dv', 'nld': 'nl', 'dzo': 'dz', 'eng': 'en', 'epo': 'eo', 'est': 'et', 'ewe': 'ee', 'fao': 'fo', 'fij': 'fj', 'fin': 'fi', 'fra': 'fr', 'ful': 'ff', 'glg': 'gl', 'kat': 'ka', 'deu': 'de', 'ell': 'el', 'grn': 'gn', 'guj': 'gu', 'hat': 'ht', 'hau': 'ha', 'heb': 'he', 'her': 'hz', 'hin': 'hi', 'hmo': 'ho', 'hun': 'hu', 'ina': 'ia', 'ind': 'id', 'ile': 'ie', 'gle': 'ga', 'ibo': 'ig', 'ipk': 'ik', 'ido': 'io', 'isl': 'is', 'ita': 'it', 'iku': 'iu', 'jpn': 'ja', 'jav': 'jv', 'kal': 'kl', 'kan': 'kn', 'kau': 'kr', 'kas': 'ks', 'kaz': 'kk', 'khm': 'km', 'kik': 'ki', 'kin': 'rw', 'kir': 'ky', 'kom': 'kv', 'kon': 'kg', 'kor': 'ko', 'kur': 'ku', 'kua': 'kj', 'lat': 'la', 'ltz': 'lb', 'lug': 'lg', 'lim': 'li', 'lin': 'ln', 'lao': 'lo', 'lit': 'lt', 'lub': 'lu', 'lav': 'lv', 'glv': 'gv', 'mkd': 'mk', 'mlg': 'mg', 'msa': 'ms', 'mal': 'ml', 'mlt': 'mt', 'mri': 'mi', 'mar': 'mr', 'mah': 'mh', 'mon': 'mn', 'nau': 'na', 'nav': 'nv', 'nob': 'nb', 'nde': 'nd', 'nep': 'ne', 'ndo': 'ng', 'nno': 'nn', 'nor': 'no', 'iii': 'ii', 'nbl': 'nr', 'oci': 'oc', 'oji': 'oj', 'chu': 'cu', 'orm': 'om', 'ori': 'or', 'oss': 'os', 'pan': 'pa', 'pli': 'pi', 'fas': 'fa', 'pol': 'pl', 'pus': 'ps', 'por': 'pt', 'que': 'qu', 'roh': 'rm', 'run': 'rn', 'ron': 'ro', 'rus': 'ru', 'san': 'sa', 'srd': 'sc', 'snd': 'sd', 'sme': 'se', 'smo': 'sm', 'sag': 'sg', 'srp': 'sr', 'gla': 'gd', 'sna': 'sn', 'sin': 'si', 'slk': 'sk', 'slv': 'sl', 'som': 'so', 'sot': 'st', 'azb': 'az', 'spa': 'es', 'sun': 'su', 'swa': 'sw', 'ssw': 'ss', 'swe': 'sv', 'tam': 'ta', 'tel': 'te', 'tgk': 'tg', 'tha': 'th', 'tir': 'ti', 'bod': 'bo', 'tuk': 'tk', 'tgl': 'tl', 'tsn': 'tn', 'ton': 'to', 'tur': 'tr', 'tso': 'ts', 'tat': 'tt', 'twi': 'tw', 'tah': 'ty', 'uig': 'ug', 'ukr': 'uk', 'urd': 'ur', 'uzb': 'uz', 'ven': 've', 'vie': 'vi', 'vol': 'vo', 'wln': 'wa', 'cym': 'cy', 'wol': 'wo', 'fry': 'fy', 'xho': 'xh', 'yid': 'yi', 'yor': 'yo', 'zha': 'za', 'zul': 'zu', 'hbs': 'sh', 'pes': 'fa'};
8+
var localizeRecaptchaLanguages = ['ar', 'af', 'am', 'hy', 'az', 'eu', 'bn', 'bg', 'ca', 'zh-HK', 'zh-CN', 'zh-TW', 'hr', 'cs', 'da', 'nl', 'en-GB', 'en', 'et', 'fil', 'fi', 'fr', 'fr-CA', 'gl', 'ka', 'de', 'de-AT', 'de-CH', 'el', 'gu', 'iw', 'hi', 'hu', 'is', 'id', 'it', 'ja', 'kn', 'ko', 'lo', 'lv', 'lt', 'ms', 'ml', 'mr', 'mn', 'no', 'fa', 'pl', 'pt', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sr', 'si', 'sk', 'sl', 'es', 'es-419', 'sw', 'sv', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'vi', 'zu'];
9+
var localizeReacaptchaAlternativeLanguages = {'zh': 'zh-TW', 'hrv': 'hr', 'srp': 'sr', 'msa': 'ms', 'cy': 'en', 'ga': 'en', 'gv': 'en', 'gd': 'en', 'rn': 'en', 'lg': 'en', 'mt': 'en', 'sq': 'fr', 'br': 'fr', 'se': 'no', 'eo': 'en', 'fo': 'da', 'ia': 'en', 'xh': 'af', 'mfe': 'fr', 'nb': 'no', 'nn': 'no', 'uz': 'ru', 'rm': 'en', 'tg': 'ru', 'ba': 'ru', 'be': 'ru', 'os': 'ru', 'kum': 'ru', 'ky': 'ru', 'mk': 'en', 'tt': 'ru', 'kk': 'ru', 'he': 'en', 'ne': 'hi', 'as': 'hi', 'pa': 'ur', 'mrj': 'ru', 'myv': 'ru', 'oc': 'es', 'cv': 'ru', 'arg': 'es', 'ast': 'es', 'hbs': 'en', 'bos': 'en', 'nog': 'ru', 'sah': 'ru', 'uig': 'zh-TW', 'tyv': 'ru'};
810
var rtlLanguages = ['heb', 'ara', 'pes', 'urd', 'uig'];
911
var languagesInverse /*: {[string]: string} */ = {}, iso639CodesInverse /*: {[string]: string} */ = {};
1012
var localizedLanguageCodes /*: {[string]: string} */ = {}, localizedLanguageNames /*: {[string]: string} */ = {};
1113

12-
/* exported setLocale */
14+
/* exported setLocale, getRecaptchaSrc */
1315

1416
/* global config, getPairs, getGenerators, getAnalyzers, persistChoices, getURLParam, cache, ajaxSend, ajaxComplete, sendEvent,
1517
srcLangs, dstLangs, generators, analyzers, readCache, modeEnabled, populateTranslationList, populateGeneratorList,
1618
populateAnalyzerList, analyzerData, generatorData, curSrcLang, curDstLang, restoreChoices, refreshLangList, onlyUnique */
1719

20+
var newSrc;
1821
var dynamicLocalizations /*: {[lang: string]: {[string]: string}} */ = {
1922
'fallback': {
2023
'Not_Available': 'Translation not yet available!',
2124
'detected': 'detected',
2225
'File_Too_Large': 'File is too large!',
2326
'Format_Not_Supported': 'Format not supported!',
24-
'Download_File': 'Download {{fileName}}'
27+
'Download_File': 'Download {{fileName}}',
28+
'Suggest_Sentence': 'How would you suggest we translate {{targetWordCode}}?',
29+
'Suggest_Title': 'Improve Apertium\'s translation',
30+
'Suggest_Placeholder': 'New word'
2531
}
2632
};
2733

@@ -38,12 +44,32 @@ function getDynamicLocalization(stringKey /*: string */) /*: string */ {
3844

3945
var localizedHTML = false;
4046

47+
var recaptchaScriptSrc = 'https://www.google.com/recaptcha/api.js?onload=recaptchaRenderCallback&render=explicit&hl=';
48+
4149
/* exported getLangByCode */
4250

4351
if(!config.LANGNAMES) {
4452
config.LANGNAMES = {};
4553
}
4654

55+
function getRecaptchaSrc(locale2 /*: string */) {
56+
newSrc = recaptchaScriptSrc + 'en';
57+
var backoff = true;
58+
59+
for(var i = 0; i < localizeRecaptchaLanguages.length; i++) {
60+
if(locale2 === localizeRecaptchaLanguages[i]) {
61+
newSrc = recaptchaScriptSrc + locale2;
62+
backoff = false;
63+
break;
64+
}
65+
}
66+
67+
if(backoff) {
68+
newSrc = recaptchaScriptSrc + localizeReacaptchaAlternativeLanguages[locale2];
69+
}
70+
return newSrc;
71+
}
72+
4773
$(document).ready(function () {
4874
$.each(languages, function (code /*: string */, language /*: string */) {
4975
languagesInverse[language] = code;
@@ -90,6 +116,11 @@ $(document).ready(function () {
90116
localizeEverything(false);
91117
persistChoices('localization');
92118
$('.localeSelect').val(locale);
119+
120+
var locale2 = iso639Codes[locale];
121+
newSrc = getRecaptchaSrc(locale2);
122+
$('#suggestRecaptcha').empty();
123+
$.getScript(newSrc);
93124
});
94125

95126
function localizeEverything(stringsFresh /*: boolean */) {
@@ -422,7 +453,7 @@ function setLocale(newLocale /*: string */) {
422453
return newLocale;
423454
}
424455

425-
/*:: export {getLangByCode, getDynamicLocalization, iso639Codes, iso639CodesInverse, locale, localizeInterface, setLocale,
456+
/*:: export {getLangByCode, getDynamicLocalization, getRecaptchaSrc, iso639Codes, iso639CodesInverse, locale, localizeInterface, setLocale,
426457
langDirection, languages} */
427458

428459
/*:: import {curDstLang, curSrcLang, dstLangs, getPairs, populateTranslationList, refreshLangList, srcLangs} from "./translator.js" */

assets/js/translator.js

Lines changed: 153 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var srcLangs /*: string[] */ = [], dstLangs /*: string[] */ = [];
55
var curSrcLang /*: string */, curDstLang/*: string */;
66
var recentSrcLangs /*: string[] */ = [], recentDstLangs /*: string[] */ = [];
77
var droppedFile/*: ?File */;
8+
var grecaptcha;
9+
var recaptchaRenderCallback;
810
var translateRequest;
911
var translationTimer/*: ?TimeoutID */;
1012

@@ -13,7 +15,8 @@ var UPLOAD_FILE_SIZE_LIMIT = 32E6,
1315
TRANSLATION_LIST_IDEAL_ROWS = 12,
1416
TRANSLATION_LIST_MAX_WIDTH = 800,
1517
TRANSLATION_LIST_MAX_COLUMNS = 5,
16-
TRANSLATION_LISTS_BUFFER = 50;
18+
TRANSLATION_LISTS_BUFFER = 50,
19+
SUGGESTION_DESTROY_TIMEOUT = 3000;
1720

1821
var INSTANT_TRANSLATION_URL_DELAY = 500,
1922
INSTANT_TRANSLATION_PUNCTUATION_DELAY = 1000,
@@ -27,11 +30,21 @@ var PUNCTUATION_KEY_CODES = [46, 33, 58, 63, 47, 45, 190, 171, 49]; // eslint-di
2730

2831
/* global config, modeEnabled, synchronizeTextareaHeights, persistChoices, getLangByCode, sendEvent, onlyUnique, restoreChoices
2932
getDynamicLocalization, locale, ajaxSend, ajaxComplete, localizeInterface, filterLangList, cache, readCache, iso639Codes,
30-
callApy, apyRequestTimeout, isURL, removeSoftHyphens, parentLang, isVariant, langDirection, languages, iso639CodesInverse */
33+
callApy, apyRequestTimeout, isURL, getRecaptchaSrc, removeSoftHyphens, parentLang, isVariant, langDirection, languages, iso639CodesInverse */
3134
/* global ENTER_KEY_CODE, HTTP_BAD_REQUEST_CODE, HTTP_OK_CODE, SPACE_KEY_CODE, XHR_DONE, XHR_LOADING */
3235

3336
if(modeEnabled('translation')) {
3437
$(document).ready(function () {
38+
var locale2 = iso639Codes[$('.localeSelect').val()];
39+
var newSrc = getRecaptchaSrc(locale2);
40+
$.getScript(newSrc);
41+
42+
recaptchaRenderCallback = function () { // eslint-disable-line no-unused-vars
43+
grecaptcha.render('suggestRecaptcha', {
44+
'sitekey': config.SUGGESTIONS.recaptcha_site_key
45+
});
46+
};
47+
3548
function updatePairList() {
3649
pairs = $('input#chainedTranslation').prop('checked') ? chainedPairs : originalPairs;
3750
}
@@ -317,6 +330,69 @@ if(modeEnabled('translation')) {
317330
persistChoices('translator', true);
318331
});
319332

333+
$('#translatedText').css('height', $('#originalText').css('height'));
334+
$('#suggestCloseBtn').click(function () {
335+
$('#suggestedWordInput').val('');
336+
grecaptcha.reset();
337+
});
338+
$('#suggestBtn').click(function () {
339+
var fromWord = $('#suggestionTargetWord').html();
340+
var toWord = $('#suggestedWordInput').val();
341+
var recaptchaResponse = grecaptcha.getResponse();
342+
343+
if(toWord.length === 0) {
344+
$('#suggestedWordInput').tooltip('destroy');
345+
$('#suggestedWordInput').tooltip({
346+
'title': 'Suggestion cannot be empty.',
347+
'trigger': 'manual',
348+
'placement': 'bottom'
349+
});
350+
$('#suggestedWordInput').tooltip('show');
351+
setTimeout(function () {
352+
$('#suggestedWordInput').tooltip('destroy');
353+
}, SUGGESTION_DESTROY_TIMEOUT);
354+
355+
return;
356+
}
357+
358+
$.ajax({
359+
url: config.APY_URL + '/suggest',
360+
type: 'POST',
361+
beforeSend: ajaxSend,
362+
data: {
363+
'langpair': curSrcLang + '|' + curDstLang,
364+
'word': fromWord,
365+
'newWord': toWord,
366+
'context': getContext(fromWord),
367+
'g-recaptcha-response': recaptchaResponse
368+
},
369+
success: function (_data, _textStatus, _jqXHR) {
370+
$('#suggestedWordInput').tooltip('destroy');
371+
$('#suggestedWordInput').val('');
372+
$('#wordSuggestModal').modal('hide');
373+
},
374+
error: function (data /*: JQueryXHR */, _textStatus, _errorThrown) {
375+
var responseText /*: string */ = (data.responseText /*: any */);
376+
var data1 = $.parseJSON(responseText);
377+
$('#suggestedWordInput').tooltip('destroy');
378+
$('#suggestedWordInput').tooltip({
379+
'title': (data1.explanation ? data1.explanation : 'An error occurred'),
380+
'trigger': 'manual',
381+
'placement': 'bottom'
382+
});
383+
$('#suggestedWordInput').tooltip('show');
384+
setTimeout(function () {
385+
$('#suggestedWordInput').tooltip('hide');
386+
$('#suggestedWordInput').tooltip('destroy');
387+
}, SUGGESTION_DESTROY_TIMEOUT);
388+
},
389+
complete: function (_jqXHR, _textStatus) {
390+
ajaxComplete;
391+
grecaptcha.reset();
392+
}
393+
});
394+
});
395+
320396
$('input#chainedTranslation').change(function () {
321397
updatePairList();
322398
populateTranslationList();
@@ -371,6 +447,30 @@ if(modeEnabled('translation')) {
371447
});
372448
}
373449

450+
function getContext(fromWord) {
451+
var wrapLength = parseInt(config.SUGGESTIONS.context_size, 10);
452+
var mark = 'MEGAWORD!';
453+
var markedWord = mark + fromWord;
454+
var rawText = $('#translatedText').html();
455+
var cleanMarkedText = rawText.replace(/<span[^>]*id="wordGettingSuggested"[^>]*>/g, mark);
456+
cleanMarkedText = cleanMarkedText.replace(/<[/]?span[^>]*>/g, '');
457+
var splittedText = cleanMarkedText.replace(/\s+/g, ' ').split(' ');
458+
var targetIndex = -1;
459+
var wordCount = splittedText.length;
460+
for(var i = 0; i < wordCount && targetIndex === -1; i++) {
461+
if(splittedText[i].indexOf(markedWord) !== -1) {
462+
targetIndex = i;
463+
}
464+
}
465+
var beginning = (targetIndex > wrapLength) ? (targetIndex - wrapLength) : 0;
466+
var ending = (splittedText.length - targetIndex - 1 > wrapLength) ? (targetIndex + wrapLength + 1) : splittedText.length;
467+
var context = splittedText.slice(beginning, ending).join(' ').replace(mark, '');
468+
if(!context) {
469+
context = $('#translatedText').attr('pristineText');
470+
}
471+
return context;
472+
}
473+
374474
function getPairs() /*: JQueryPromise<any> */ {
375475
var deferred = $.Deferred();
376476

@@ -776,8 +876,57 @@ function translate(ignoreIfEmpty) {
776876
function translateText(ignoreIfEmpty) {
777877
function handleTranslateSuccessResponse(data) {
778878
if(data.responseStatus === HTTP_OK_CODE) {
779-
$('#translatedText').val(data.responseData.translatedText);
879+
$('#translatedText').html(data.responseData.translatedText);
780880
$('#translatedText').removeClass('notAvailable text-danger');
881+
882+
$('#translatedText').attr('pristineText', data.responseData.translatedText);
883+
884+
if(config.SUGGESTIONS.enabled) {
885+
var localizedTitle = getDynamicLocalization('Suggest_Title');
886+
var placeholder = getDynamicLocalization('Suggest_Placeholder');
887+
$('#suggestedWordInput').attr('placeholder', placeholder);
888+
$('#translatedText').html(
889+
$('#translatedText').html().replace(/(\*|@|#)([^\s0-9.,!?;:)_>"'«/»`+=-]+)/g,
890+
'<span class="wordSuggestPopover text-danger" title="' +
891+
localizedTitle + '" style="cursor: pointer">$2</span>')
892+
);
893+
}
894+
895+
$('.wordSuggestPopover').click(function () {
896+
897+
$('#translatedTextClone').html($('#translatedText').attr('pristineText'));
898+
var fromWord = $(this).html();
899+
$(this).attr('id', 'wordGettingSuggested');
900+
var context = getContext(fromWord);
901+
$('#translatedTextClone').html(context);
902+
903+
$('.wordSuggestPopover').removeAttr('id');
904+
$('.wordSuggestPopoverInline').removeAttr('id');
905+
906+
$('#translatedTextClone').html(
907+
$('#translatedTextClone').html().replace(/(\*|@|#)([^\s0-9.,!?;:)_>"'«/»`+=-]+)/g,
908+
'<span class="wordSuggestPopover text-danger" title="' +
909+
localizedTitle + '" style="cursor: pointer">$2</span>')
910+
);
911+
912+
913+
$('.wordSuggestPopoverInline').click(function () {
914+
$('.wordSuggestPopover').removeAttr('id');
915+
$('.wordSuggestPopoverInline').removeAttr('id');
916+
$(this).attr('id', 'wordGettingSuggested');
917+
918+
$('#suggestionTargetWord').html($(this).text().replace(/(\*|@|#)/g, ''));
919+
$('#suggestedWordInput').val('');
920+
});
921+
922+
$('#suggestSentenceContainer').html(getDynamicLocalization('Suggest_Sentence').replace('{{targetWordCode}}',
923+
'<code><span id="suggestionTargetWord"></span></code>')
924+
);
925+
$('#suggestionTargetWord').html($(this).text().replace(/(\*|@|#)/g, ''));
926+
927+
$('#wordSuggestModal').modal();
928+
$(this).removeAttr('id');
929+
});
781930
}
782931
else {
783932
translationNotAvailable();
@@ -1346,6 +1495,6 @@ function setDefaultSrcLang() {
13461495
/*:: import {ENTER_KEY_CODE, HTTP_BAD_REQUEST_CODE, HTTP_OK_CODE, SPACE_KEY_CODE, XHR_DONE, XHR_LOADING} from "./util.js" */
13471496
/*:: import {persistChoices, restoreChoices} from "./persistence.js" */
13481497
/*:: import {localizeInterface, getLangByCode, getDynamicLocalization, locale, iso639Codes, langDirection, languages,
1349-
iso639CodesInverse} from "./localization.js" */
1498+
iso639CodesInverse, getRecaptchaSrc} from "./localization.js" */
13501499
/*:: import {readCache, cache} from "./persistence.js" */
13511500
/*:: import {isURL} from "./util.js" */

0 commit comments

Comments
 (0)