diff --git a/misc/ebrowser/index.html b/misc/ebrowser/index.html index 51987aba..cfa2832b 100644 --- a/misc/ebrowser/index.html +++ b/misc/ebrowser/index.html @@ -76,7 +76,7 @@ You should have received a copy of the GNU General Public License along with thi let lastKeys; let lastKeys_millis = 0; - + var lastVal; fs.readFile(path.join(__dirname,'search.json'), 'utf8', (err, jsonString) => { if (err) { coloncommand(":js fetch2file(repositoryurl,'search.json')"); @@ -204,6 +204,7 @@ You should have received a copy of the GNU General Public License along with thi }else autocStrArray.push(line); } + lastVal = null; //trigger full search }catch(e){return;} } function keyPress(e){ @@ -455,7 +456,6 @@ You should have received a copy of the GNU General Public License along with thi } function autocomplete(inp,container,arr) { var currentFocus; - var lastVal; function clickItem(e){inp.value = arr[e.target.dataset.index];} function appendElement(el,dataindex){ el.dataset.index = dataindex; diff --git a/misc/ebrowser/package.json b/misc/ebrowser/package.json index 47ac0c6a..eed5c878 100644 --- a/misc/ebrowser/package.json +++ b/misc/ebrowser/package.json @@ -1,4 +1,4 @@ -{"version":"1.0.35", +{"version":"1.0.37", "name": "ebrowser", "description": "The keyboard-friendly minimal suckless web browser", "main": "webview.js", @@ -7,7 +7,9 @@ "index.html", "package.json", "README.md", - "mapkeys.json" + "translate.*", + "mapkeys.json", + "config" ], "scripts": { "release": "electron-builder" diff --git a/misc/ebrowser/webview.js b/misc/ebrowser/webview.js index cb2990a5..8e9c3803 100644 --- a/misc/ebrowser/webview.js +++ b/misc/ebrowser/webview.js @@ -27,7 +27,14 @@ else { createWindow(); }) } -topMenu(); +var translateRes; +{ + let langs = app.getPreferredSystemLanguages(); + if(langs.length==0 || langs[0].startsWith('en') || !initTranslateRes(langs[0])) + topMenu(); + else + Menu.setApplicationMenu(null); +} var repositoryurl = "https://gitlab.com/jamesfengcao/uweb/-/raw/master/misc/ebrowser/"; const fs = require('fs'); @@ -352,94 +359,94 @@ function onContextMenu(event, params){ function topMenu(){ const menuTemplate = [ { - label: '&Edit', + label: translate('Edit'), submenu: [ - { label: 'Config folder', click: ()=>{ + { label: translate('Config folder'), click: ()=>{ shell.openPath(__dirname); }}, ] }, { - label: '&Help', + label: translate('Help'), submenu: [ - { label: 'Check for updates', click: ()=>{ + { label: translate('Check for updates'), click: ()=>{ addrCommand(":update"); }}, - { label: 'Help', accelerator: 'F1', click: ()=>{ + { label: translate('Help'), accelerator: 'F1', click: ()=>{ help(); }}, - { label: 'Stop', accelerator: 'Ctrl+C', click: ()=>{ + { label: translate('Stop'), accelerator: 'Ctrl+C', click: ()=>{ let js="tabs.children[iTab].stop()" win.webContents.executeJavaScript(js,false) }}, - { label: 'getURL', accelerator: 'Ctrl+G', click: ()=>{ + { label: translate('getURL'), accelerator: 'Ctrl+G', click: ()=>{ let js="{let q=document.forms[0].q;q.focus();q.value=tabs.children[iTab].getURL()}" win.webContents.executeJavaScript(js,false) }}, - { label: 'Select', accelerator: 'Ctrl+L', click:()=>{ + { label: translate('Select'), accelerator: 'Ctrl+L', click:()=>{ win.webContents.executeJavaScript("document.forms[0].q.select()",false); }}, - { label: 'New Tab', accelerator: 'Ctrl+T', click:()=>{ + { label: translate('New Tab'), accelerator: 'Ctrl+T', click:()=>{ let js = "newTab();document.forms[0].q.select();switchTab(tabs.children.length-1)"; win.webContents.executeJavaScript(js,false); }}, - { label: 'Restore Tab', accelerator: 'Ctrl+Shift+T', click:()=>{ + { label: translate('Restore Tab'), accelerator: 'Ctrl+Shift+T', click:()=>{ let js = "{let u=closedUrls.pop();if(u){newTab();switchTab(tabs.children.length-1);tabs.children[iTab].src=u}}"; win.webContents.executeJavaScript(js,false); }}, - { label: 'No redirect', accelerator: 'Ctrl+R', click: ()=>{ + { label: translate('No redirect'), accelerator: 'Ctrl+R', click: ()=>{ gredirect_disable(); }}, - { label: 'Redirect', accelerator: 'Ctrl+Shift+R', click: ()=>{ + { label: translate('Redirect'), accelerator: 'Ctrl+Shift+R', click: ()=>{ gredirect_enable(0); }}, - { label: 'Close tab', accelerator: 'Ctrl+W', click: ()=>{ + { label: translate('Close tab'), accelerator: 'Ctrl+W', click: ()=>{ win.webContents.executeJavaScript("tabClose()",false).then((r)=>{ if(""===r) win.close(); else win.setTitle(r); }); }}, - { label: 'Next Tab', accelerator: 'Ctrl+Tab', click: ()=>{ + { label: translate('Next Tab'), accelerator: 'Ctrl+Tab', click: ()=>{ let js="tabInc(1);getWinTitle()"; win.webContents.executeJavaScript(js,false).then((r)=>{ win.setTitle(r); }); }}, - { label: 'Previous Tab', accelerator: 'Ctrl+Shift+Tab', click: ()=>{ + { label: translate('Previous Tab'), accelerator: 'Ctrl+Shift+Tab', click: ()=>{ let js="tabDec(-1);getWinTitle()"; win.webContents.executeJavaScript(js,false).then((r)=>{ win.setTitle(r); }); }}, - { label: 'Go backward', accelerator: 'Alt+Left', click: ()=>{ + { label: translate('Go backward'), accelerator: 'Alt+Left', click: ()=>{ let js="tabs.children[iTab].goBack()"; win.webContents.executeJavaScript(js,false); }}, - { label: 'Go forward', accelerator: 'Alt+Right', click: ()=>{ + { label: translate('Go forward'), accelerator: 'Alt+Right', click: ()=>{ let js="tabs.children[iTab].goForward()"; win.webContents.executeJavaScript(js,false); }}, - { label: 'Zoom in', accelerator: 'Ctrl+Shift+=', click: ()=>{ + { label: translate('Zoom in'), accelerator: 'Ctrl+Shift+=', click: ()=>{ let js="{let t=tabs.children[iTab];let s=t.getZoomFactor()*1.2;t.setZoomFactor(s)}"; win.webContents.executeJavaScript(js,false); }}, - { label: 'Zoom out', accelerator: 'Ctrl+-', click: ()=>{ + { label: translate('Zoom out'), accelerator: 'Ctrl+-', click: ()=>{ let js="{let t=tabs.children[iTab];let s=t.getZoomFactor()/1.2;t.setZoomFactor(s)}"; win.webContents.executeJavaScript(js,false); }}, - { label: 'Default zoom', accelerator: 'Ctrl+0', click: ()=>{ + { label: translate('Default zoom'), accelerator: 'Ctrl+0', click: ()=>{ let js="tabs.children[iTab].setZoomFactor(1)"; win.webContents.executeJavaScript(js,false); }}, - { label: 'No focus', accelerator: 'Esc', click: ()=>{ + { label: translate('No focus'), accelerator: 'Esc', click: ()=>{ let js = `{let e=document.activeElement; if(e)e.blur();try{tabs.children[iTab].stopFindInPage('clearSelection')}catch(er){}}`; win.webContents.executeJavaScript(js,false); }}, - { label: 'Reload', accelerator: 'F5', click: ()=>{ + { label: translate('Reload'), accelerator: 'F5', click: ()=>{ win.webContents.executeJavaScript("tabs.children[iTab].reload()",false); }}, - { label: 'Devtools', accelerator: 'F12', click: ()=>{ + { label: translate('Devtools'), accelerator: 'F12', click: ()=>{ let js = "try{tabs.children[iTab].openDevTools()}catch(e){console.log(e)}"; win.webContents.executeJavaScript(js,false); }}, @@ -596,3 +603,25 @@ function help(){ let js=`{let t=tabs.children[iTab];t.dataset.jsonce=BML_md;t.src="file://${htmlFN}"}`; win.webContents.executeJavaScript(js,false) } + +function initTranslateRes(lang){ + let basename=path.join(__dirname,"translate."); + let fname = basename+lang; + if(!fs.existsSync(fname)) + fname = basename+lang.slice(0,2); + if(!fs.existsSync(fname)) return false; + (async ()=>{ + try { + let json = await fs.promises.readFile(fname,'utf8'); + translateRes = JSON.parse(json); + } catch (e){} + topMenu(); + })(); + return true; +} + +function translate(str){ + let result; + if(translateRes && (result=translateRes[str])) return result; + return str; +}