Skip to content

Commit a794c64

Browse files
committed
Patch 1 (#1)
i18n
1 parent 25a59c8 commit a794c64

15 files changed

+254
-15
lines changed

apps.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,10 @@
132132
"name": "Default Alarm",
133133
"shortName":"Alarms",
134134
"icon": "app.png",
135-
"version":"0.05",
135+
"version":"0.06",
136136
"description": "Set and respond to alarms",
137137
"tags": "tool,alarm,widget",
138+
"custom": "alarm.html",
138139
"storage": [
139140
{"name":"alarm.app.js","url":"app.js"},
140141
{"name":"alarm.boot.js","url":"boot.js"},

apps/alarm/ChangeLog

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
0.03: More alarm scheduling issues
44
0.04: Tweaks for variable size widget system
55
0.05: Add alarm.boot.js and move code from the bootloader
6+
0.06: Internationalization

apps/alarm/alarm.html

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<html>
2+
<head>
3+
<link rel="stylesheet" href="../../css/spectre.min.css">
4+
</head>
5+
<body>
6+
7+
<p><button id="fetch" class="btn btn-primary">Fetch Language from Bangle.js</button></p>
8+
<div id="formGroup" class="form-group" style="visibility: hidden;">
9+
<p>Then please choose a language from the following list:</p>
10+
<select id="languages" class="form-select">
11+
</select>
12+
</div>
13+
<p><button id="upload" class="btn btn-primary" style="visibility: hidden;">Then Upload</button></p>
14+
15+
<script src="../../lib/customize.js"></script>
16+
<script src="https://www.puck-js.com/puck.js"></script>
17+
18+
<script>
19+
let request = url => new Promise( (resolve, reject) => {
20+
let xhr = new XMLHttpRequest();
21+
xhr.open("GET", url);
22+
xhr.onload = () => {
23+
if (xhr.status >= 200 && xhr.status < 300) {
24+
resolve(xhr.response);
25+
} else {
26+
reject(xhr.statusText);
27+
}
28+
};
29+
xhr.onerror = () => reject(xhr.statusText);
30+
xhr.onabort = () => reject(xhr.statusText);
31+
xhr.send();
32+
});
33+
34+
let appjsTranslated;
35+
let translate = () => {
36+
var languageSelector = document.getElementById("languages");
37+
var lang = languageSelector.options[languageSelector.selectedIndex].value;
38+
console.log(lang);
39+
request("app.js").then( appjs =>
40+
request("app_" + lang + ".json")
41+
.catch( () => request("app_" + lang.substring(0,2) + ".json"))
42+
.catch( () => request("app.json"))
43+
.then( langjson => {
44+
var trans = JSON.parse(langjson);
45+
appjs = appjs.replace(/"([^"]*?)"\/\*LANG\*\//g, function(m, p1) { return '"' + (trans[p1]||p1) + '"' + (trans[p1]?'':'/*LANG*/'); });
46+
appjs = appjs.replace(/'([^']*?)'\/\*LANG\*\//g, function(m, p1) { return "'" + (trans[p1]||p1) + "'" + (trans[p1]?'':'/*LANG*/'); });
47+
return appjs;
48+
}).catch( error => {
49+
console.log(error);
50+
return appjs; // unmodified
51+
})
52+
).then( appjs => {
53+
appjsTranslated = appjs;
54+
document.getElementById("upload").style.visibility = 'visible';
55+
}).catch( error => {
56+
console.log(error);
57+
document.getElementById("upload").style.visibility = 'hidden';
58+
});
59+
};
60+
61+
document.getElementById("fetch").addEventListener("click", () => {
62+
new Promise((resolve,reject) => {
63+
Puck.write("\x03",(result) => {
64+
if (result===null) return reject("");
65+
Puck.eval(`require("locale").lang`, (content,err) => {
66+
if (content===null) return reject(err || "");
67+
resolve(content);
68+
});
69+
});
70+
}).catch( error => {
71+
console.log("Error getting langFromDevice, using fallback en_GB, error was: " + error);
72+
return "en_GB";
73+
}).then( lang => {
74+
document.getElementById("languages").innerHTML = ["en_GB","de_DE","fr_FR","en_US","en_JP","nl_NL","en_CA","sv_SE","en_AU","de_AT","en_IL","es_ES","fr_BE","fi_FI","de_CH","fr_CH","it_CH","tr_TR","hu_HU"].map(l=>`<option value="${l}"${(l===lang)?" selected":""}>${l}</option>`).join("\n");
75+
document.getElementById("formGroup").style.visibility = 'visible';
76+
translate();
77+
});
78+
});
79+
80+
document.getElementById("languages").addEventListener("onchange", () => {
81+
translate();
82+
});
83+
84+
document.getElementById("upload").addEventListener("click", function() {
85+
console.log("app.js is:", appjsTranslated);
86+
sendCustomizedApp({
87+
storage:[
88+
{"name":"alarm.app.js",content: appjsTranslated},
89+
{"name":"alarm.boot.js","url":"boot.js"},
90+
{"name": "alarm.js", "url":"alarm.js"},
91+
//{"name":"alarm.json","content":"[]"},
92+
{"name":"alarm.img","url":"app-icon.js","evaluate":true},
93+
{"name":"alarm.wid.js","url":"widget.js"}
94+
]
95+
});
96+
});
97+
</script>
98+
</body>
99+
</html>

apps/alarm/app.js

+20-14
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
const locale = require("locale");
12
Bangle.loadWidgets();
23
Bangle.drawWidgets();
34

@@ -14,7 +15,10 @@ var alarms = require("Storage").readJSON("alarm.json",1)||[];
1415
function formatTime(t) {
1516
var hrs = 0|t;
1617
var mins = Math.round((t-hrs)*60);
17-
return hrs+":"+("0"+mins).substr(-2);
18+
var d = new Date();
19+
d.setHours(hrs);
20+
d.setMinutes(mins);
21+
return locale.time(d, true);
1822
}
1923

2024
function getCurrentHr() {
@@ -24,17 +28,19 @@ function getCurrentHr() {
2428

2529
function showMainMenu() {
2630
const menu = {
27-
'': { 'title': 'Alarms' },
28-
'New Alarm': ()=>editAlarm(-1)
31+
'': { 'title': 'Alarms'/*LANG*/ },
32+
'New Alarm'/*LANG*/: ()=>editAlarm(-1)
2933
};
3034
alarms.forEach((alarm,idx)=>{
31-
txt = (alarm.on?"on ":"off ")+formatTime(alarm.hr);
32-
if (alarm.rp) txt += " (repeat)";
35+
txt = alarm.on?locale.translate("on"):locale.translate("off");
36+
txt += " ".repeat(Math.max(locale.translate("on").length,locale.translate("off").length) - txt.length);
37+
txt += " " + formatTime(alarm.hr);
38+
if (alarm.rp) txt += " (" + "rpt"/*LANG*/ + ")";
3339
menu[txt] = function() {
3440
editAlarm(idx);
3541
};
3642
});
37-
menu['< Back'] = ()=>{load();};
43+
menu['< ' + 'Back'/*LANG*/] = ()=>{load();};
3844
return E.showMenu(menu);
3945
}
4046

@@ -52,21 +58,21 @@ function editAlarm(alarmIndex) {
5258
repeat = a.rp;
5359
}
5460
const menu = {
55-
'': { 'title': 'Alarms' },
56-
'Hours': {
61+
'': { 'title': 'Alarms'/*LANG*/ },
62+
'Hours'/*LANG*/: {
5763
value: hrs,
5864
onchange: function(v){if (v<0)v=23;if (v>23)v=0;hrs=v;this.value=v;} // no arrow fn -> preserve 'this'
5965
},
60-
'Minutes': {
66+
'Minutes'/*LANG*/: {
6167
value: mins,
6268
onchange: function(v){if (v<0)v=59;if (v>59)v=0;mins=v;this.value=v;} // no arrow fn -> preserve 'this'
6369
},
64-
'Enabled': {
70+
'Enabled'/*LANG*/: {
6571
value: en,
6672
format: v=>v?"On":"Off",
6773
onchange: v=>en=v
6874
},
69-
'Repeat': {
75+
'Repeat'/*LANG*/: {
7076
value: en,
7177
format: v=>v?"Yes":"No",
7278
onchange: v=>repeat=v
@@ -85,19 +91,19 @@ function editAlarm(alarmIndex) {
8591
};
8692
}
8793
if (newAlarm) {
88-
menu["> New Alarm"] = function() {
94+
menu["> " + "New Alarm"/*LANG*/] = function() {
8995
alarms.push(getAlarm());
9096
require("Storage").write("alarm.json",JSON.stringify(alarms));
9197
showMainMenu();
9298
};
9399
} else {
94-
menu["> Save"] = function() {
100+
menu["> " + "Save"/*LANG*/] = function() {
95101
alarms[alarmIndex] = getAlarm();
96102
require("Storage").write("alarm.json",JSON.stringify(alarms));
97103
showMainMenu();
98104
};
99105
}
100-
menu['< Back'] = showMainMenu;
106+
menu['< ' + 'Back'/*LANG*/] = showMainMenu;
101107
return E.showMenu(menu);
102108
}
103109

apps/alarm/app.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms":"Alarms",
3+
"Hours":"Hours",
4+
"Minutes":"Minutes",
5+
"Enabled":"Enabled",
6+
"New Alarm":"New Alarm",
7+
"Save":"Save",
8+
"Back":"Back",
9+
"Repeat":"Repeat",
10+
"repeat":"repeat",
11+
"rpt":"rpt"
12+
}

apps/alarm/app_de.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Wecker",
3+
"Hours" : "Stunden",
4+
"Minutes" : "Minuten",
5+
"Enabled" : "Aktiviert",
6+
"New Alarm" : "Neuer Wecker",
7+
"Save" : "Speichern",
8+
"Back" : "Zurück",
9+
"Repeat" : "Wiederholen",
10+
"repeat" : "Wiederholen",
11+
"rpt" : "Wdh."
12+
}

apps/alarm/app_en_GB.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Alarms",
3+
"Hours" : "Hours",
4+
"Minutes" : "Minutes",
5+
"Enabled" : "Enabled",
6+
"New Alarm" : "New Alarm",
7+
"Save" : "Save",
8+
"Back" : "Back",
9+
"Repeat" : "Repeat",
10+
"repeat" : "repeat",
11+
"rpt" : "repeat"
12+
}

apps/alarm/app_es.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Alarmas",
3+
"Hours" : "Horas",
4+
"Minutes" : "Minutos",
5+
"Enabled" : "Activados",
6+
"New Alarm" : "Alarma nueva",
7+
"Save" : "Grabar",
8+
"Back" : "Atrás",
9+
"Repeat" : "Repetición",
10+
"repeat" : "repetición",
11+
"rpt" : "rep."
12+
}

apps/alarm/app_fi.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Hälytykset",
3+
"Hours" : "Tunnit",
4+
"Minutes" : "Minuutit",
5+
"Enabled" : "Aktivoitu",
6+
"New Alarm" : "Uusi hälytys",
7+
"Save" : "Tallenna",
8+
"Back" : "Paluu",
9+
"Repeat" : "Toista",
10+
"repeat" : "toistaa",
11+
"rpt" : "toistaa"
12+
}

apps/alarm/app_fr.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Réveils",
3+
"Hours" : "Heures",
4+
"Minutes" : "Minutes",
5+
"Enabled" : "Activé",
6+
"New Alarm" : "Nouveau Réveil",
7+
"Save" : "Sauvegarder",
8+
"Back" : "Retour",
9+
"Repeat" : "Répétition",
10+
"repeat" : "répétition",
11+
"rpt" : "rép."
12+
}

apps/alarm/app_hu.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Riasztások",
3+
"Hours" : "Óra",
4+
"Minutes" : "Perc",
5+
"Enabled" : "Aktiválva",
6+
"New Alarm" : "Új riasztás",
7+
"Save" : "Mentés",
8+
"Back" : "Vissza",
9+
"Repeat" : "Ismétlés",
10+
"repeat" : "ismétlés",
11+
"rpt" : "ismétlés"
12+
}

apps/alarm/app_it.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Allarmi",
3+
"Hours" : "Ore",
4+
"Minutes" : "Minuti",
5+
"Enabled" : "Attivato",
6+
"New Alarm" : "Nuovo allarme",
7+
"Save" : "Salvare",
8+
"Back" : "Indietro",
9+
"Repeat" : "Ripetere",
10+
"repeat" : "ripetere",
11+
"rpt" : "ripetere"
12+
}

apps/alarm/app_nl.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Alarmen",
3+
"Hours" : "Uren",
4+
"Minutes" : "Minuten",
5+
"Enabled" : "Geactiveerd",
6+
"New Alarm" : "Nieuw alarm",
7+
"Save" : "Opslaan",
8+
"Back" : "Terug",
9+
"Repeat" : "Herhalen",
10+
"repeat" : "herhalen",
11+
"rpt" : "herhalen"
12+
}

apps/alarm/app_sv.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Larm",
3+
"Hours" : "Timmar",
4+
"Minutes" : "Minuter",
5+
"Enabled" : "Aktiverad",
6+
"New Alarm" : "Ny alarm",
7+
"Save" : "Spara",
8+
"Back" : "Tillbaka",
9+
"Repeat" : "Upprepning",
10+
"repeat" : "upprepning",
11+
"rpt" : "uppr."
12+
}

apps/alarm/app_tr.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"Alarms" : "Alarmlar",
3+
"Hours" : "Saat",
4+
"Minutes" : "Dakika",
5+
"Enabled" : "Etkinleştirildi",
6+
"New Alarm" : "Yeni alarm",
7+
"Save" : "Sakla",
8+
"Back" : "Geriye",
9+
"Repeat" : "Yineleme",
10+
"repeat" : "yineleme",
11+
"rpt" : "yineleme"
12+
}

0 commit comments

Comments
 (0)