forked from FOSS/BangleApps
Merge remote-tracking branch 'upstream/master'
commit
26320aadfe
|
@ -2,3 +2,4 @@ apps/animclk/V29.LBM.js
|
||||||
apps/banglerun/rollup.config.js
|
apps/banglerun/rollup.config.js
|
||||||
apps/schoolCalendar/fullcalendar/main.js
|
apps/schoolCalendar/fullcalendar/main.js
|
||||||
apps/authentiwatch/qr_packed.js
|
apps/authentiwatch/qr_packed.js
|
||||||
|
*.test.js
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
0.01: Release
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Info
|
||||||
|
|
||||||
|
A very simple app that shows information on 3 different screens.
|
||||||
|
Go to the next screen via tab right, go to the previous screen
|
||||||
|
via tab left and reload the data via tab in the middle of the
|
||||||
|
screen. Very useful if combined with pattern launcher ;)
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
- [David Peer](https://github.com/peerdavid).
|
||||||
|
|
||||||
|
## Thanks To
|
||||||
|
<a href="https://www.flaticon.com/free-icons/info" title="info icons">Info icons created by Freepik - Flaticon</a>
|
|
@ -0,0 +1,108 @@
|
||||||
|
var s = require("Storage");
|
||||||
|
const locale = require('locale');
|
||||||
|
var ENV = process.env;
|
||||||
|
var W = g.getWidth(), H = g.getHeight();
|
||||||
|
var screen = 0;
|
||||||
|
const maxScreen = 2;
|
||||||
|
|
||||||
|
function getVersion(file) {
|
||||||
|
var j = s.readJSON(file,1);
|
||||||
|
var v = ("object"==typeof j)?j.version:false;
|
||||||
|
return v?((v?"v"+v:"Unknown")):"NO ";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function drawData(name, value, y){
|
||||||
|
g.drawString(name, 5, y);
|
||||||
|
g.drawString(value, 100, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSteps(){
|
||||||
|
try{
|
||||||
|
return Bangle.getHealthStatus("day").steps;
|
||||||
|
} catch(e) {
|
||||||
|
return ">= 2v12";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBpm(){
|
||||||
|
try{
|
||||||
|
return Math.round(Bangle.getHealthStatus("day").bpm) + "bpm";
|
||||||
|
} catch(e) {
|
||||||
|
return ">= 2v12";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function drawInfo() {
|
||||||
|
g.reset().clearRect(Bangle.appRect);
|
||||||
|
var h=18, y = h;//-h;
|
||||||
|
|
||||||
|
// Header
|
||||||
|
g.setFont("Vector", h+2).setFontAlign(0,-1);
|
||||||
|
g.drawString("--==|| INFO ||==--", W/2, 0);
|
||||||
|
g.setFont("Vector",h).setFontAlign(-1,-1);
|
||||||
|
|
||||||
|
// Dynamic data
|
||||||
|
if(screen == 0){
|
||||||
|
drawData("Steps", getSteps(), y+=h);
|
||||||
|
drawData("HRM", getBpm(), y+=h);
|
||||||
|
drawData("Battery", E.getBattery() + "%", y+=h);
|
||||||
|
drawData("Voltage", E.getAnalogVRef().toFixed(2) + "V", y+=h);
|
||||||
|
drawData("IntTemp.", locale.temp(parseInt(E.getTemperature())), y+=h);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(screen == 1){
|
||||||
|
drawData("Charging?", Bangle.isCharging() ? "Yes" : "No", y+=h);
|
||||||
|
drawData("Bluetooth", NRF.getSecurityStatus().connected ? "Conn." : "Disconn.", y+=h);
|
||||||
|
drawData("GPS", Bangle.isGPSOn() ? "On" : "Off", y+=h);
|
||||||
|
drawData("Compass", Bangle.isCompassOn() ? "On" : "Off", y+=h);
|
||||||
|
drawData("HRM", Bangle.isHRMOn() ? "On" : "Off", y+=h);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Static data
|
||||||
|
if(screen == 2){
|
||||||
|
drawData("Firmw.", ENV.VERSION, y+=h);
|
||||||
|
drawData("Boot.", getVersion("boot.info"), y+=h);
|
||||||
|
drawData("Settings", getVersion("setting.info"), y+=h);
|
||||||
|
drawData("Storage", "", y+=h);
|
||||||
|
drawData(" Total", ENV.STORAGE>>10, y+=h);
|
||||||
|
drawData(" Free", require("Storage").getFree()>>10, y+=h);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Bangle.isLocked()){
|
||||||
|
g.setFont("Vector",h-2).setFontAlign(-1,-1);
|
||||||
|
g.drawString("Locked", 0, H-h+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setFont("Vector",h-2).setFontAlign(1,-1);
|
||||||
|
g.drawString((screen+1) + "/3", W, H-h+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
drawInfo();
|
||||||
|
setWatch(_=>load(), BTN1);
|
||||||
|
|
||||||
|
Bangle.on('touch', function(btn, e){
|
||||||
|
var left = parseInt(g.getWidth() * 0.3);
|
||||||
|
var right = g.getWidth() - left;
|
||||||
|
var isLeft = e.x < left;
|
||||||
|
var isRight = e.x > right;
|
||||||
|
|
||||||
|
if(isRight){
|
||||||
|
screen = (screen + 1) % (maxScreen+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isLeft){
|
||||||
|
screen -= 1;
|
||||||
|
screen = screen < 0 ? maxScreen : screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawInfo();
|
||||||
|
});
|
||||||
|
|
||||||
|
Bangle.on('lock', function(isLocked) {
|
||||||
|
drawInfo();
|
||||||
|
});
|
||||||
|
|
||||||
|
Bangle.loadWidgets();
|
||||||
|
for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
|
||||||
|
// Bangle.drawWidgets();
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("mEwwcBkmSpICDBwcJBYwCDpAhFggRJGg8SCI+ABgU//gSDCI4JBj//AAX4JRAIBg4QDAAPgBIJWGgIQFAAI+BLglAgEPCI/wEgJoEgYQHAAPANwhWFAApcBCIWQgAQJAAMAgSMDCJiSCwB6GQA6eCn5TFL4q5BUgIRF/wuBv4RGkCeGO4IREUgMBCJCVGCISwIWw0BYRLIICLBHHCJRrGCIQIFR44I5LIoRaPpARcdIwRJfYMBCJuACKUkgE/a5f8gEJCJD7FCIeAg78FAAvggFJCIMACJZOBCIOQCJsCCIOSgEfCBP4gESCIZTFOIwRDoDIGaguSCIVIgCkFTwcAggRDpIYBQAx6BgAOCAQYIBLghWBTwQRFFgIABXIIFDBwgCDBYQAENAYCFLgIAEKwpKIIhA="))
|
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"id": "info",
|
||||||
|
"name": "Info",
|
||||||
|
"version": "0.01",
|
||||||
|
"description": "An application that displays information such as battery level, steps etc.",
|
||||||
|
"icon": "info.png",
|
||||||
|
"type": "app",
|
||||||
|
"tags": "tool",
|
||||||
|
"readme": "README.md",
|
||||||
|
"supports": ["BANGLEJS2"],
|
||||||
|
"screenshots": [
|
||||||
|
{"url":"screenshot_1.png"},
|
||||||
|
{"url":"screenshot_2.png"},
|
||||||
|
{"url":"screenshot_3.png"}],
|
||||||
|
"storage": [
|
||||||
|
{"name":"info.app.js","url":"info.app.js"},
|
||||||
|
{"name":"info.img","url":"info.icon.js","evaluate":true}
|
||||||
|
]
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
|
@ -1 +1,2 @@
|
||||||
0.01: Initial release
|
0.01: Initial release
|
||||||
|
0.02: Optional fullscreen mode
|
|
@ -14,7 +14,11 @@ the app/widget settings menu of the Bangle.js
|
||||||
Activate the Neon IO X clock look, a bit hard to read until one gets used to it.
|
Activate the Neon IO X clock look, a bit hard to read until one gets used to it.
|
||||||
|
|
||||||
### Thickness
|
### Thickness
|
||||||
The thickness of watch lines, from 1 to 5.
|
The thickness of watch lines, from 1 to 6.
|
||||||
|
|
||||||
### Date on touch
|
### Date on touch
|
||||||
Shows the current date as DD MM on touch and reverts back to time after 5 seconds or with another touch.
|
Shows the current date as DD MM on touch and reverts back to time after 5 seconds or with another touch.
|
||||||
|
|
||||||
|
### Fullscreen
|
||||||
|
Shows the watchface in fullscreen mode.
|
||||||
|
Note: In fullscreen mode, widgets are hidden, but still loaded.
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "neonx",
|
"id": "neonx",
|
||||||
"name": "Neon X & IO X Clock",
|
"name": "Neon X & IO X Clock",
|
||||||
"shortName": "Neon X Clock",
|
"shortName": "Neon X Clock",
|
||||||
"version": "0.01",
|
"version": "0.02",
|
||||||
"description": "Pebble Neon X & Neon IO X for Bangle.js",
|
"description": "Pebble Neon X & Neon IO X for Bangle.js",
|
||||||
"icon": "neonx.png",
|
"icon": "neonx.png",
|
||||||
"type": "clock",
|
"type": "clock",
|
||||||
|
|
|
@ -34,6 +34,7 @@ const colors = {
|
||||||
|
|
||||||
const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false;
|
const is12hour = (require("Storage").readJSON("setting.json",1)||{})["12hour"]||false;
|
||||||
const screenWidth = g.getWidth();
|
const screenWidth = g.getWidth();
|
||||||
|
const screenHeight = g.getHeight();
|
||||||
const halfWidth = screenWidth / 2;
|
const halfWidth = screenWidth / 2;
|
||||||
const scale = screenWidth / 240;
|
const scale = screenWidth / 240;
|
||||||
const REFRESH_RATE = 10E3;
|
const REFRESH_RATE = 10E3;
|
||||||
|
@ -58,16 +59,19 @@ function drawLine(poly, thickness){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let settings = require('Storage').readJSON('neonx.json', 1);
|
let settings = {
|
||||||
|
thickness: 4,
|
||||||
if (!settings) {
|
io: 0,
|
||||||
settings = {
|
showDate: 1,
|
||||||
thickness: 4,
|
fullscreen: false,
|
||||||
io: 0,
|
};
|
||||||
showDate: 1
|
let saved_settings = require('Storage').readJSON('neonx.json', 1) || settings;
|
||||||
};
|
for (const key in saved_settings) {
|
||||||
|
settings[key] = saved_settings[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function drawClock(num){
|
function drawClock(num){
|
||||||
let tx, ty;
|
let tx, ty;
|
||||||
|
|
||||||
|
@ -79,13 +83,15 @@ function drawClock(num){
|
||||||
g.setColor(colors[settings.io ? 'io' : 'x'][y][x]);
|
g.setColor(colors[settings.io ? 'io' : 'x'][y][x]);
|
||||||
|
|
||||||
if (!settings.io) {
|
if (!settings.io) {
|
||||||
tx = (x * 100 + 18) * newScale;
|
newScale *= settings.fullscreen ? 1.18 : 1.0;
|
||||||
ty = (y * 100 + 32) * newScale;
|
let dx = settings.fullscreen ? 0 : 18
|
||||||
|
tx = (x * 100 + dx) * newScale;
|
||||||
|
ty = (y * 100 + dx*2) * newScale;
|
||||||
} else {
|
} else {
|
||||||
newScale = 0.33 + current * 0.4;
|
newScale = 0.33 + current * (settings.fullscreen ? 0.48 : 0.4);
|
||||||
|
|
||||||
tx = (halfWidth - 139) * newScale + halfWidth;
|
tx = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 2 : 0);
|
||||||
ty = (halfWidth - 139) * newScale + halfWidth + 12;
|
ty = (halfWidth - 139) * newScale + halfWidth + (settings.fullscreen ? 2 : 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < digits[num[y][x]].length; i++) {
|
for (let i = 0; i < digits[num[y][x]].length; i++) {
|
||||||
|
@ -116,7 +122,11 @@ function draw(date){
|
||||||
l2 = ('0' + d.getMinutes()).substr(-2);
|
l2 = ('0' + d.getMinutes()).substr(-2);
|
||||||
}
|
}
|
||||||
|
|
||||||
g.clearRect(0,24,240,240);
|
if(settings.fullscreen){
|
||||||
|
g.clearRect(0,0,screenWidth,screenHeight);
|
||||||
|
} else {
|
||||||
|
g.clearRect(0,24,240,240);
|
||||||
|
}
|
||||||
|
|
||||||
drawClock([l1, l2]);
|
drawClock([l1, l2]);
|
||||||
}
|
}
|
||||||
|
@ -150,4 +160,9 @@ Bangle.on('lcdPower', function(on){
|
||||||
});
|
});
|
||||||
|
|
||||||
Bangle.loadWidgets();
|
Bangle.loadWidgets();
|
||||||
Bangle.drawWidgets();
|
|
||||||
|
if(settings.fullscreen){
|
||||||
|
for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
|
||||||
|
} else {
|
||||||
|
Bangle.drawWidgets();
|
||||||
|
}
|
|
@ -7,7 +7,8 @@
|
||||||
neonXSettings = {
|
neonXSettings = {
|
||||||
thickness: 4,
|
thickness: 4,
|
||||||
io: 0,
|
io: 0,
|
||||||
showDate: 1
|
showDate: 1,
|
||||||
|
fullscreen: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
updateSettings();
|
updateSettings();
|
||||||
|
@ -17,7 +18,7 @@
|
||||||
|
|
||||||
if (!neonXSettings) resetSettings();
|
if (!neonXSettings) resetSettings();
|
||||||
|
|
||||||
let thicknesses = [1, 2, 3, 4, 5];
|
let thicknesses = [1, 2, 3, 4, 5, 6];
|
||||||
|
|
||||||
const menu = {
|
const menu = {
|
||||||
"" : { "title":"Neon X & IO"},
|
"" : { "title":"Neon X & IO"},
|
||||||
|
@ -48,7 +49,15 @@
|
||||||
neonXSettings.showDate = v;
|
neonXSettings.showDate = v;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
'Fullscreen': {
|
||||||
|
value: false | neonXSettings.fullscreen,
|
||||||
|
format: () => (neonXSettings.fullscreen ? 'Yes' : 'No'),
|
||||||
|
onchange: () => {
|
||||||
|
neonXSettings.fullscreen = !neonXSettings.fullscreen;
|
||||||
|
updateSettings();
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
E.showMenu(menu);
|
E.showMenu(menu);
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,3 +16,4 @@
|
||||||
0.14: incorporated lazybones idle timer, configuration settings to come
|
0.14: incorporated lazybones idle timer, configuration settings to come
|
||||||
0.15: fixed tendancy for mylocation to default to London
|
0.15: fixed tendancy for mylocation to default to London
|
||||||
added setting to enable/disable idle timer warning
|
added setting to enable/disable idle timer warning
|
||||||
|
0.16: make check_idle boolean setting work properly with new B2 menu
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "pastel",
|
"id": "pastel",
|
||||||
"name": "Pastel Clock",
|
"name": "Pastel Clock",
|
||||||
"shortName": "Pastel",
|
"shortName": "Pastel",
|
||||||
"version": "0.15",
|
"version": "0.16",
|
||||||
"description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times",
|
"description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times",
|
||||||
"icon": "pastel.png",
|
"icon": "pastel.png",
|
||||||
"dependencies": {"mylocation":"app","weather":"app"},
|
"dependencies": {"mylocation":"app","weather":"app"},
|
||||||
|
|
|
@ -38,38 +38,28 @@
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'Show Grid': {
|
'Show Grid': {
|
||||||
value: s.grid,
|
value: !!s.grid,
|
||||||
format: () => (s.grid ? 'Yes' : 'No'),
|
format: v => v ? /*LANG*/"Yes":/*LANG*/"No",
|
||||||
onchange: () => {
|
onchange: v => {
|
||||||
s.grid = !s.grid;
|
s.grid = v;
|
||||||
save();
|
save();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'Show Weather': {
|
'Show Weather': {
|
||||||
value: s.weather,
|
value: !!s.weather,
|
||||||
format: () => (s.weather ? 'Yes' : 'No'),
|
format: v => v ? /*LANG*/"Yes":/*LANG*/"No",
|
||||||
onchange: () => {
|
onchange: v => {
|
||||||
s.weather = !s.weather;
|
s.weather = v;
|
||||||
save();
|
save();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// for use when the new menu system goes live
|
|
||||||
/*
|
|
||||||
'Idle Warning': {
|
'Idle Warning': {
|
||||||
value: s.idle_check,
|
value: !!s.idle_check,
|
||||||
onchange : v => {
|
format: v => v ? /*LANG*/"Yes":/*LANG*/"No",
|
||||||
|
onchange: v => {
|
||||||
s.idle_check = v;
|
s.idle_check = v;
|
||||||
save();
|
save();
|
||||||
},
|
},
|
||||||
},
|
|
||||||
*/
|
|
||||||
'Idle Warning': {
|
|
||||||
value: s.idle_check,
|
|
||||||
format: () => (s.idle_check ? 'Yes' : 'No'),
|
|
||||||
onchange: () => {
|
|
||||||
s.idle_check = !s.idle_check;
|
|
||||||
save();
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
0.01: New Widget!
|
0.01: New Widget!
|
||||||
|
0.02: Battery bar turns yellow on charge
|
||||||
|
Memory status bar does not trigger garbage collect
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "widbars",
|
"id": "widbars",
|
||||||
"name": "Bars Widget",
|
"name": "Bars Widget",
|
||||||
"version": "0.01",
|
"version": "0.02",
|
||||||
"description": "Display several measurements as vertical bars.",
|
"description": "Display several measurements as vertical bars.",
|
||||||
"icon": "icon.png",
|
"icon": "icon.png",
|
||||||
"screenshots": [{"url":"screenshot.png"}],
|
"screenshots": [{"url":"screenshot.png"}],
|
||||||
|
|
|
@ -42,19 +42,25 @@
|
||||||
if (top) g .clearRect(x,y, x+w-1,y+top-1); // erase above bar
|
if (top) g .clearRect(x,y, x+w-1,y+top-1); // erase above bar
|
||||||
if (f) g.setColor(col).fillRect(x,y+top, x+w-1,y+h-1); // even for f=0.001 this is still 1 pixel high
|
if (f) g.setColor(col).fillRect(x,y+top, x+w-1,y+h-1); // even for f=0.001 this is still 1 pixel high
|
||||||
}
|
}
|
||||||
|
let batColor='#0f0';
|
||||||
function draw() {
|
function draw() {
|
||||||
g.reset();
|
g.reset();
|
||||||
const x = this.x, y = this.y,
|
const x = this.x, y = this.y,
|
||||||
m = process.memory();
|
m = process.memory(false);
|
||||||
let b=0;
|
let b=0;
|
||||||
// ==HRM== bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space
|
// ==HRM== bar(x+(w*b++),y,'#f00'/*red */,bpm/200); // >200 seems very unhealthy; if we have no valid bpm this will just be empty space
|
||||||
// ==Temperature== bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C
|
// ==Temperature== bar(x+(w*b++),y,'#ff0'/*yellow */,E.getTemperature()/50); // you really don't want to wear a watch that's hotter than 50°C
|
||||||
bar(x+(w*b++),y,g.theme.dark?'#0ff':'#00f'/*cyan/blue*/,1-(require('Storage').getFree() / process.env.STORAGE));
|
bar(x+(w*b++),y,g.theme.dark?'#0ff':'#00f'/*cyan/blue*/,1-(require('Storage').getFree() / process.env.STORAGE));
|
||||||
bar(x+(w*b++),y,'#f0f'/*magenta*/,m.usage/m.total);
|
bar(x+(w*b++),y,'#f0f'/*magenta*/,m.usage/m.total);
|
||||||
bar(x+(w*b++),y,'#0f0'/*green */,E.getBattery()/100);
|
bar(x+(w*b++),y,batColor,E.getBattery()/100);
|
||||||
}
|
}
|
||||||
|
|
||||||
let redraw;
|
let redraw;
|
||||||
|
Bangle.on('charging', function(charging) {
|
||||||
|
batColor=charging?'#ff0':'#0f0';
|
||||||
|
WIDGETS["bars"].draw();
|
||||||
|
});
|
||||||
|
|
||||||
Bangle.on('lcdPower', on => {
|
Bangle.on('lcdPower', on => {
|
||||||
if (redraw) clearInterval(redraw)
|
if (redraw) clearInterval(redraw)
|
||||||
redraw = undefined;
|
redraw = undefined;
|
||||||
|
|
2
core
2
core
|
@ -1 +1 @@
|
||||||
Subproject commit bf29f5697445686255a785476e6b1ed6a13ff697
|
Subproject commit a7a80a13fa187a4ff5f89669992babca2d95812c
|
|
@ -202,7 +202,6 @@ window.addEventListener('load', (event) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
var selectLang = document.getElementById("settings-lang");
|
var selectLang = document.getElementById("settings-lang");
|
||||||
console.log(languages);
|
|
||||||
languages.forEach(lang => {
|
languages.forEach(lang => {
|
||||||
selectLang.innerHTML += `<option value="${lang.code}" ${SETTINGS.language==lang.code?"selected":""}>${lang.name} (${lang.code})</option>`;
|
selectLang.innerHTML += `<option value="${lang.code}" ${SETTINGS.language==lang.code?"selected":""}>${lang.name} (${lang.code})</option>`;
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue