diff --git a/SignItCoreContent.js b/SignItCoreContent.js index 72c4e38..5e08733 100644 --- a/SignItCoreContent.js +++ b/SignItCoreContent.js @@ -1,31 +1,23 @@ -var SignItCoreContent = function (locale,mapi18n) { - const sourceMap = new Map(mapi18n); - banana = { i18n: (msg) => sourceMap.get(locale)[msg] }; - console.log("Passed trough ! :", locale); - console.log("SignItCoreContent.js",banana ); - // let hlwa = browser.i18n.getMessage("si-panel-videos-title"); - // console.log("hlwa = ",hlwa); +var SignItCoreContent = function () { + console.log("SignItCoreContent.js"); this.$container = $(`

-

- ${ browser.i18n.getMessage("si_panel_videos_title") }

- ${ browser.i18n.getMessage("si_panel_videos_empty") }

+

+

-

- ${ browser.i18n.getMessage("si_panel_definitions_title") }

+

@@ -33,17 +25,14 @@ var SignItCoreContent = function (locale,mapi18n) { "icons/Spinner_font_awesome.svg" )}" width="40" height="40">
-
- ${ browser.i18n.getMessage("si_panel_definitions_empty") }
+
`); - - // Button contribute var optionsContribute = { flags: ["primary", "progressive"], - label: browser.i18n.getMessage("si_panel_videos_contribute_label") , + label: " ", href: "https://lingualibre.org/wiki/Special:RecordWizard", }; this.contributeButton = new OO.ui.ButtonWidget(optionsContribute); @@ -62,9 +51,41 @@ var SignItCoreContent = function (locale,mapi18n) { this.$definitionPanelSpinner = this.$container.find(".signit-loading"); this.$definitionPanelError = this.$container.find(".signit-error"); - // this.contributeButton.on( 'click', function () { - // // TODO: Do something - // }.bind( this ) ); + SignItCoreContent.prototype.init = async function () { + try { + var banana = {i18n: async (msg,...arg) => { + return await chrome.runtime.sendMessage({ + command:'bananai18n',arg : [msg,arg] + }) + } + }; + const translations = await Promise.all([ + banana.i18n("si-panel-videos-title"), + banana.i18n("si-panel-videos-empty"), + banana.i18n("si-panel-definitions-title"), + banana.i18n("si-panel-videos-contribute-label"), + banana.i18n("si-panel-definitions-wikt-iso"), + banana.i18n("si-panel-definitions-wikt-pointer"), + banana.i18n("si-panel-definitions-empty") // May need a different key for error message + ]); + const [videosPanelNoVideoTitle, videosPanelNoVideoEmpty, definitionsPanelTitle, contributeButtonLabel, wiktIso, wiktPointer, definitionsEmpty] = translations; + + this.$container.find(".signit-panel-videos .signit-novideo h2").text(videosPanelNoVideoTitle); + this.$container.find(".signit-panel-videos .signit-novideo p").html(videosPanelNoVideoEmpty); // -- needs additional css + this.$container.find(".signit-panel-definitions .signit-definitions h2").text(definitionsPanelTitle); + this.contributeButton.$label.text(contributeButtonLabel); + const definitionsSourceLink = `https://${wiktIso}.wiktionary.org`; + this.$container + .find(".signit-definitions-source a") + .attr("href", definitionsSourceLink) + .text(wiktPointer); + + this.$container.find(".signit-panel-definitions .signit-error").text(definitionsEmpty); + + } catch (error) { + console.error("Error fetching translations:", error); + } + }; SignItCoreContent.prototype.refresh = function (title, files) { files = files || []; diff --git a/SignItVideosGallery.js b/SignItVideosGallery.js index 7042893..2c9a53f 100644 --- a/SignItVideosGallery.js +++ b/SignItVideosGallery.js @@ -17,22 +17,12 @@ var SignItVideosGallery = function ( container ) { }; SignItVideosGallery.prototype.refresh = async function ( files ) { - var BetterBanana = await browser.storage.local.get( 'bananaInStore' ); - var messageStore = await chrome.storage.local.get( 'sourceMap' ); - var sourceMap = new Map(messageStore.sourceMap); - var locale = BetterBanana.bananaInStore.locale; var banana = { - i18n: (msg, url, speaker,index, total) => { - let string = sourceMap.get(locale)[msg]; - let Speaker = `${speaker} `; - let patterns = ["{{link|$1|$2}}", "$3", "$4"]; - let replacements = [Speaker, index, total]; - - patterns.forEach((pattern,index)=>{ - string = string.replace(pattern, replacements[index]); - }) - - return string; + i18n: async (msg, ...arg) => { + return await chrome.runtime.sendMessage({ + command: "bananai18n", + arg: [msg, arg], + }); }, }; console.log("#20 files ",files ) @@ -40,19 +30,19 @@ SignItVideosGallery.prototype.refresh = async function ( files ) { var i; files = files || []; this.$videos = []; - + this.$videoContainer.empty(); this.currentIndex = 0; - for ( i = 0; i < files.length; i++ ) { filename = files[ i ].filename, url = `https://commons.wikimedia.org/wiki/File:${ filename.split( '/' ).pop()}`, speaker = files[ i ].speaker, total = files.length; + console.log(await banana.i18n("si-panel-videos-gallery-attribution",url, speaker, i+1, total)); this.$videos.push( $( `
- ${browser.i18n.getMessage("si_panel_videos_gallery_attribution",[ url, speaker, i+1, total])} + ${await banana.i18n("si-panel-videos-gallery-attribution",url, speaker, i+1, total)}
` ) ); diff --git a/background-script.js b/background-script.js index add5293..e74bad2 100644 --- a/background-script.js +++ b/background-script.js @@ -408,6 +408,11 @@ browser.runtime.onMessage.addListener( async function ( message ) { else if (message.command === "changeUiLanguage") { await changeUiLanguage(message.argument); return; +} +else if (message.command === "storeParam") { + const [name,value] = message.argument; + storeParam(name,value); + return; } message = normalizeMessage(message); @@ -417,11 +422,10 @@ browser.runtime.onMessage.addListener( async function ( message ) { return records[ message.text ] || records[ message.text.toLowerCase() ] || []; } // When message 'signit.i18nCode' is heard, returns banada object - else if ( message.command === 'signit.getfilesb' ) { - console.log('bg>signit.getfilesB') - // var locale = await getStoredParam( 'uiLanguage' ) - // loadI18nLocalization(locale); - return banana; + else if (message.command === 'bananai18n') { + let [msg,placeholderValue] = message.arg; + const i18nMessage = banana.i18n(msg,placeholderValue); + return i18nMessage; } // Start modal @@ -429,10 +433,6 @@ browser.runtime.onMessage.addListener( async function ( message ) { else if ( message.command === 'signit.hinticon' ) { callModal(message); } - else if (message.command === "storeParam") { - storeParam([...message.arguments]); - return; - } }); /* *************************************************************** */ diff --git a/content_scripts/signit.js b/content_scripts/signit.js index 9092219..d1d76ac 100644 --- a/content_scripts/signit.js +++ b/content_scripts/signit.js @@ -152,11 +152,8 @@ // Banana test, search `bananaInStore` in files for more console.log("before") - var BetterBanana = await browser.storage.local.get( 'bananaInStore' ); - var messageStore = await browser.storage.local.get( 'sourceMap' ); - console.log("after: BetterBanana = ", BetterBanana.bananaInStore.locale,messageStore.sourceMap) - - content = new SignItCoreContent(BetterBanana.bananaInStore.locale,messageStore.sourceMap); + content = new SignItCoreContent(); + content.init(); // Setup an absolute-positionned $anchorModal we can programatically move // to be able to point exactly some coords with our popup later diff --git a/popup/popup.js b/popup/popup.js index 3b4102a..f3224e0 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -18,60 +18,44 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') } _backgroundPage = await getBackgroundPage(); console.log("Background Page = ", _backgroundPage); - - // Chrome messaging is limited to simple data types. - // So we cant import complex data types like map/sets directly through messages. - // Hence converting them before sending and recreating them after receiving remains the only way. - - const resArr = await chrome.runtime.sendMessage({ command: "getBanana" }); - const sourceMap = new Map(resArr[0]); - - // coudn't restore the functionality of i18n so made it a key which stores a functions - // which fetches the messages from sourceMap and replpace them with whatever the key-value pair - // for that particular message is - - banana = {i18n: (msg,...arg) => { - let string = sourceMap.get(resArr[1])[msg]; - for (let i = 0; i < arg.length; i++) { - let regex = new RegExp(`\\$${i + 1}`); - if (regex.test(string)) { - string = string.replace(regex, arg[i]); - } - } - return string; - }}; - console.log("banana received: ",banana); } else if (browserType === 'firefox') { // Use Firefox WebExtensions API _backgroundPage = await browser.runtime.getBackgroundPage(); - banana = _backgroundPage.banana; } /* *********************************************************** */ // Master + var banana ={i18n:async(msg,...placeholderValue)=>{ + return await chrome.runtime.sendMessage({ + command:"bananai18n", + arg:[msg,placeholderValue] + }) + }} var UI = function () { - document.querySelector('#fetchVideosList').innerHTML = browser.i18n.getMessage('si_addon_preload'); - - // Setup the main tabs - this.viewTab = new OO.ui.TabPanelLayout( 'view', { label: browser.i18n.getMessage('si_popup_browse_title') } ); - this.historyTab = new OO.ui.TabPanelLayout( 'history', { label: browser.i18n.getMessage('si_popup_history_title'), classes: [ 'signit-popup-tab-history' ] } ); - this.paramTab = new OO.ui.TabPanelLayout( 'param', { label: browser.i18n.getMessage('si_popup_settings_title'), classes: [ 'signit-popup-tab-settings' ] } ); - - // Set up the popup page layout - this.indexLayout = new OO.ui.IndexLayout( { autoFocus: false, classes: [ 'signit-popup-tabs' ] } ); - this.indexLayout.addTabPanels( [ this.viewTab, this.historyTab, this.paramTab ] ); - - // Clean up then append - document.querySelector( '#signit-popup-loaded' ).innerHTML = ""; - $( '#signit-popup-loaded' ).append( this.indexLayout.$element ); - - // Build the full tabs inner content - this.initView(); - this.initHistory(); - this.initParam(); - - // Show the UI we have just build - this.switchPanel( 'loaded' ); + (async ()=>{ + document.querySelector('#fetchVideosList').innerHTML = await banana.i18n('si-addon-preload'); + + // Setup the main tabs + this.viewTab = new OO.ui.TabPanelLayout( 'view', { label: await banana.i18n('si-popup-browse-title') } ); + this.historyTab = new OO.ui.TabPanelLayout( 'history', { label: await banana.i18n('si-popup-history-title'), classes: [ 'signit-popup-tab-history' ] } ); + this.paramTab = new OO.ui.TabPanelLayout( 'param', { label: await banana.i18n('si-popup-settings-title'), classes: [ 'signit-popup-tab-settings' ] } ); + + // Set up the popup page layout + this.indexLayout = new OO.ui.IndexLayout( { autoFocus: false, classes: [ 'signit-popup-tabs' ] } ); + this.indexLayout.addTabPanels( [ this.viewTab, this.historyTab, this.paramTab ] ); + + // Clean up then append + document.querySelector( '#signit-popup-loaded' ).innerHTML = ""; + $( '#signit-popup-loaded' ).append( this.indexLayout.$element ); + + // Build the full tabs inner content + this.initView(); + this.initHistory(); + this.initParam(); + + // Show the UI we have just build + this.switchPanel( 'loaded' ); + })(); }; async function sendMessageUp(msg,argument){ @@ -83,28 +67,27 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') // Browse tab UI.prototype.initView = async function () { // Word input 2 : text field - // browser.i18n.getMessage accepts string value as substitutes for placeholders, hence JSON.stringify - this.searchWidget = new SearchWidget( { placeholder: browser.i18n.getMessage("si_popup_browse_placeholder", JSON.stringify(Object.keys( _backgroundPage.records ).length) ) } ); + // await banana.i18n accepts string value as substitutes for placeholders, hence JSON.stringify + this.searchWidget = new SearchWidget( { placeholder: await banana.i18n("si-popup-browse-placeholder", JSON.stringify(Object.keys( _backgroundPage.records ).length) ) } ); this.searchWidget.setRecords( _backgroundPage.records ); var searchButton = new OO.ui.ButtonWidget( { icon:"search", - label: browser.i18n.getMessage("si_popup_browse_label"), + label: await banana.i18n("si-popup-browse-label"), invisibleLabel: true, - title: browser.i18n.getMessage("si_popup_browse_icon") + title: await banana.i18n("si-popup-browse-icon") } ); var searchLayout = new OO.ui.ActionFieldLayout( this.searchWidget, searchButton, { align: 'top', - label: browser.i18n.getMessage("si_popup_browse_label"), + label: await banana.i18n("si-popup-browse-label"), invisibleLabel: true, classes: [ 'signit-popup-tab-browse' ] } ); // Add the CoreContent view - // similar to what we did in signit.js since here banana is defined solely as per i18n functionality - var BetterBanana = await browser.storage.local.get( 'bananaInStore' ); - var messageStore = await browser.storage.local.get( 'sourceMap' ); - this.coreContent = new SignItCoreContent(BetterBanana.bananaInStore.locale,messageStore.sourceMap); + + this.coreContent = new SignItCoreContent(); + this.coreContent.init(); this.coreContent.getContainer().hide(); // Put all that in the tab @@ -116,7 +99,7 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') var tabs = await browser.tabs.query({active: true, currentWindow: true}); // optimizing message passing for the functions that are present in - // sw.js as well background_script.js + // sw.js as well background-script.js await sendMessageUp("checkActiveTabInjections",tabs[0].id); var selection = await browser.tabs.sendMessage( tabs[ 0 ].id, { @@ -135,7 +118,7 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') if (typeof text !== "string") { text = this.searchWidget.getValue(); } - // runs normalize function and wordToFiles in a single go and retruns an array of _word and _files + // runs normalize function and wordToFiles in a single go and retruns an array of -word and -files const [_word,_files] = await sendMessageUp("normalizeWordAndReturnFiles",text); this.coreContent.refresh(_word, _files); @@ -147,8 +130,8 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') /* *********************************************************** */ // History tab // .initHistory calls .addHistory which calls .cleanHistory - UI.prototype.initHistory = function () { - this.$noHistory = $( `
${browser.i18n.getMessage("si_popup_history_empty")}
` ); + UI.prototype.initHistory = async function () { + this.$noHistory = $( `
${await banana.i18n("si-popup-history-empty")}
` ); this.history = []; this.$history = []; this.historyTab.$element.append( this.$noHistory ); @@ -213,14 +196,14 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') } // Layout signLanguageDropdown = new OO.ui.DropdownWidget( { - label: browser.i18n.getMessage("si_popup_settings_signlanguage-dropdown"), + label: await banana.i18n("si-popup-settings-signlanguage-dropdown"), menu: { items: items }, $overlay: $( 'body' ) } ); signLanguageLayout = new OO.ui.FieldLayout( signLanguageDropdown, { - label: browser.i18n.getMessage("si_popup_settings_signlanguage"), + label: await banana.i18n("si-popup-settings-signlanguage"), align: 'top', - help: browser.i18n.getMessage("si_popup_settings_signlanguage-help"), + help: await banana.i18n("si-popup-settings-signlanguage-help"), //helpInline: true } ); @@ -240,14 +223,14 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') } // Layout uiLanguageDropdown = new OO.ui.DropdownWidget({ - label: browser.i18n.getMessage("si_popup-settings_signlanguage"), + label: await banana.i18n("si-popup-settings-signlanguage"), menu: { items: items }, $overlay: $( 'body' ) } ); uiLanguageLayout = new OO.ui.FieldLayout( uiLanguageDropdown, { - label: browser.i18n.getMessage("si_popup_settings_uilanguage"), + label: await banana.i18n("si-popup-settings-uilanguage"), align: 'top', - help: browser.i18n.getMessage("si_popup_settings_uilanguage-help"), + help: await banana.i18n("si-popup-settings-uilanguage-help"), //helpInline: true } ); @@ -257,9 +240,9 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') min: 0 } ); historyLayout = new OO.ui.FieldLayout( historyWidget, { - label: browser.i18n.getMessage("si_popup_settings_history"), + label: await banana.i18n("si-popup-settings-history"), align: 'top', - help: browser.i18n.getMessage("si_popup_settings_history_help"), + help: await banana.i18n("si-popup-settings-history-help"), } ); @@ -269,7 +252,7 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') selected: _backgroundPage.params.wpintegration, } ); wpintegrationLayout = new OO.ui.FieldLayout( wpintegrationWidget, { - label: browser.i18n.getMessage("si_popup_settings_wpintegration"), + label: await banana.i18n("si-popup-settings-wpintegration"), align: 'inline', } ); @@ -278,7 +261,7 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') selected: _backgroundPage.params.twospeed, } ); twospeedLayout = new OO.ui.FieldLayout( twospeedWidget, { - label: browser.i18n.getMessage("si_popup_settings_twospeed"), + label: await banana.i18n("si-popup-settings-twospeed"), align: 'inline', } ); // Hint icon shortcut @@ -286,7 +269,7 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') selected: _backgroundPage.params.hinticon, }); hinticonLayout = new OO.ui.FieldLayout(hinticonWidget, { - label: browser.i18n.getMessage('si_popup_settings_hint-icon'), + label: await banana.i18n('si-popup-settings-hint-icon'), align: 'inline', }); // Colored text @@ -294,29 +277,29 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') selected: _backgroundPage.params.coloredwords, }); coloredwordsLayout = new OO.ui.FieldLayout(coloredwordsWidget, { - label: browser.i18n.getMessage('si_popup_settings_enlighten'), + label: await banana.i18n('si-popup-settings-enlighten'), align: 'inline', }); // Choose panels : both, definition, video var panelsOption0 = new OO.ui.ButtonOptionWidget( { data: 'definition', - label: browser.i18n.getMessage("si_popup_settings_choosepanels_definition") + label: await banana.i18n("si-popup-settings-choosepanels-definition") } ), panelsOption1 = new OO.ui.ButtonOptionWidget( { data: 'both', - label: browser.i18n.getMessage("si_popup_settings_choosepanels_both") + label: await banana.i18n("si-popup-settings-choosepanels-both") } ); panelsOption2 = new OO.ui.ButtonOptionWidget( { data: 'video', - label: browser.i18n.getMessage("si_popup_settings_choosepanels_video") + label: await banana.i18n("si-popup-settings-choosepanels-video") } ); choosepanelsWidget = new OO.ui.ButtonSelectWidget( { items: [ panelsOption0, panelsOption1, panelsOption2 ] } ); // Layout choosepanelsLayout = new OO.ui.FieldLayout( choosepanelsWidget, { - label: browser.i18n.getMessage("si_popup_settings_choosepanels"), + label: await banana.i18n("si-popup-settings-choosepanels"), align: 'top', } ); @@ -394,13 +377,6 @@ var browser = (browserType === 'firefox') ? browser : (browserType === 'chrome') return; } ui.switchPanel( 'loading' ); - //banana = _backgroundPage.banana; - - // now in case of the chrome,both popup and modal update, - // but in case of popup you have to off->on again in order to see changes - // and in FF popup UI updates first - // in both browsers for the changes to reflect in modal you have to - // send another signit.hinticon command in order to see changes await sendMessageUp("changeUiLanguage",newLanguage); ui = new UI(); diff --git a/sw.js b/sw.js index 48f2d6f..335bc3a 100644 --- a/sw.js +++ b/sw.js @@ -438,9 +438,6 @@ async function setState(value) { // Declare localisation banana.setLocale(locale); // Change to new locale - storeParam("bananaInStore", banana); - storeParam("sourceMap", Array.from(banana.messageStore.sourceMap)); - // state = "ready"; state = await setState("ready"); @@ -717,14 +714,10 @@ async function setState(value) { sendResponse(records[message.text] || records[message.text.toLowerCase()] || []); } // When message 'signit.i18nCode' is heard, returns banada object - else if ( - message.command === "signit.getfilesb" || - message.command === "getBanana" - ) { - console.log("bg>signit.getfilesB"); - // What this does is it accesses the messageStore inside banana amd spreads the sourecMap - // which is an instanceof Map thereby converting it into an array. This is later recreated inside popup - sendResponse([[...banana.messageStore.sourceMap], banana.locale]); + else if (message.command === 'bananai18n') { + let [msg,placeholderValue] = message.arg; + const i18nMessage = banana.i18n(msg,...placeholderValue); + sendResponse(i18nMessage); } // Start modal @@ -736,7 +729,8 @@ async function setState(value) { checkActiveTabInjections(message.argument); } else if (message.command === "storeParam") { - storeParam([...message.argument]); + const [name,value] = message.argument; + storeParam(name,value); } else if (message.command === "changeUiLanguage") { await changeUiLanguage(message.argument);