merge upstream

pull/1433/head
hughbarney 2022-02-11 21:27:05 +00:00
commit 03c408cb0c
82 changed files with 6003 additions and 685 deletions

View File

@ -134,6 +134,7 @@ Apps are listed in the Bangle.js menu, accessible from a clock app via the middl
* `app.png` - app icon - 48x48px
* `app-icon.js` - JS version of the icon (made with http://www.espruino.com/Image+Converter) for use in Bangle.js's menu
* `app.js` - app code
* `ChangeLog` - A file containing a list of changes to your app so users can see what's changed
#### `app-icon.js`
@ -189,9 +190,23 @@ When the widget is to be drawn, `x` and `y` values are set up in `WIDGETS["mywid
and `draw` can then use `this.x` and `this.y` to figure out where it needs to draw to.
### ChangeLog
This is a file containing a list of changes to your app so users can see what's changed, for example:
```
0.01: New App!
0.02: Changed the colors
0.03: Made the app run quicker
```
Entries should be newest last, with the version number of the last entry matching the version in `metadata.json`
Please keep the same format at the example as the file needs to be parsed by the BangleApps tools.
### `app.info` format
This is the file that's **auto-generated** and loaded onto Bangle.js by the App Loader,
This is the file that's **auto-generated** from `metadata.json` and loaded onto Bangle.js by the App Loader,
and which gives information about the app for the Launcher.
```

2
apps/ac_ac/ChangeLog.txt Normal file
View File

@ -0,0 +1,2 @@
0.01: initial release
1.00: first official release (also fixes bug in Customizer)

View File

@ -321,7 +321,7 @@
function chosenClockHands () {
switch (ClockHands) {
case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simpled-clock-hands/main/ClockHands.js')"
case 'simple': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-simple-clock-hands/main/ClockHands.js')"
case 'rounded': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-rounded-clock-hands/main/ClockHands.js')"
case 'hollow': return "require('https://raw.githubusercontent.com/rozek/banglejs-2-hollow-clock-hands/main/ClockHands.js')"
case 'custom': return "require('" + ClockHandsURL + "')"

View File

@ -1,7 +1,7 @@
{ "id": "ac_ac",
"name": "A Configurable Analog Clock",
"shortName":"Configurable Clock",
"version":"0.03",
"version":"1.00",
"description": "AC-AC, a highly customizable analog clock with several clock faces, hands and complications to choose from",
"icon": "app-icon.png",
"type": "clock",

View File

@ -1 +1,2 @@
0.01: Display pressure as number and hand
0.02: Use theme color

View File

@ -1,77 +1,77 @@
const center = {
var center = {
x: g.getWidth()/2,
y: g.getHeight()/2,
};
const MIN = 940;
const MAX = 1090;
const NUMBER_OF_VALUES = MAX - MIN;
const SCALE_TICK_STEP = 5;
const SCALE_VALUES_STEP = 25;
const NUMBER_OF_LABELS = NUMBER_OF_VALUES / SCALE_VALUES_STEP;
const NUMBER_OF_TICKS = NUMBER_OF_VALUES / SCALE_TICK_STEP;
const ZERO_OFFSET = (Math.PI / 4) * 3;
const SCALE_SPAN = (Math.PI / 2) * 3;
const TICK_LENGTH = 10;
const HAND_LENGTH = 45;
const HAND_WIDTH = 5;
var MIN = 940;
var MAX = 1090;
var NUMBER_OF_VALUES = MAX - MIN;
var SCALE_TICK_STEP = 5;
var SCALE_VALUES_STEP = 25;
var NUMBER_OF_LABELS = NUMBER_OF_VALUES / SCALE_VALUES_STEP;
var NUMBER_OF_TICKS = NUMBER_OF_VALUES / SCALE_TICK_STEP;
var ZERO_OFFSET = (Math.PI / 4) * 3;
var SCALE_SPAN = (Math.PI / 2) * 3;
var TICK_LENGTH = 10;
var HAND_LENGTH = 45;
var HAND_WIDTH = 5;
function generatePoly(radius, width, angle){
const x = center.x + Math.cos(angle) * radius;
const y = center.y + Math.sin(angle) * radius;
const d = {
var x = center.x + Math.cos(angle) * radius;
var y = center.y + Math.sin(angle) * radius;
var d = {
x: width/2 * Math.cos(angle + Math.PI/2),
y: width/2 * Math.sin(angle + Math.PI/2),
};
const poly = [center.x - d.x, center.y - d.y, center.x + d.x, center.y + d.y, x + d.x, y + d.y, x - d.x, y - d.y];
var poly = [center.x - d.x, center.y - d.y, center.x + d.x, center.y + d.y, x + d.x, y + d.y, x - d.x, y - d.y];
return poly;
}
function drawHand(value){
g.setColor(256, 0, 0);
g.setColor(g.theme.fg2);
g.setFontAlign(0,0);
g.setFont("Vector",15);
g.drawString(value, center.x, center.y * 2 - 15, true);
const angle = SCALE_SPAN / NUMBER_OF_VALUES * (value - MIN) + ZERO_OFFSET;
var angle = SCALE_SPAN / NUMBER_OF_VALUES * (value - MIN) + ZERO_OFFSET;
g.fillPoly(generatePoly(HAND_LENGTH, HAND_WIDTH, angle), true);
g.fillCircle(center.x ,center.y, 4);
}
function drawTicks(){
g.setColor(1,1,1);
g.setColor(g.theme.fg);
for(let i= 0; i <= NUMBER_OF_TICKS; i++){
const angle = (i * (SCALE_SPAN/NUMBER_OF_TICKS)) + ZERO_OFFSET;
var angle = (i * (SCALE_SPAN/NUMBER_OF_TICKS)) + ZERO_OFFSET;
const tickWidth = i%5==0 ? 5 : 2;
var tickWidth = i%5==0 ? 5 : 2;
g.fillPoly(generatePoly(center.x, tickWidth, angle), true);
}
g.setColor(0,0,0);
g.setColor(g.theme.bg);
g.fillCircle(center.x,center.y,center.x - TICK_LENGTH);
}
function drawScaleLabels(){
g.setColor(1,1,1);
g.setColor(g.theme.fg);
g.setFont("Vector",12);
let label = MIN;
for (let i=0;i <= NUMBER_OF_LABELS; i++){
const angle = (i * (SCALE_SPAN/NUMBER_OF_LABELS)) + ZERO_OFFSET;
const labelDimensions = g.stringMetrics(label);
var angle = (i * (SCALE_SPAN/NUMBER_OF_LABELS)) + ZERO_OFFSET;
var labelDimensions = g.stringMetrics(label);
const LABEL_PADDING = 5;
const radius = center.x - TICK_LENGTH - LABEL_PADDING;
const x = center.x + Math.cos(angle) * radius;
const y = center.y + Math.sin(angle) * radius;
var LABEL_PADDING = 5;
var radius = center.x - TICK_LENGTH - LABEL_PADDING;
var x = center.x + Math.cos(angle) * radius;
var y = center.y + Math.sin(angle) * radius;
const visualX = x > center.x ? x - labelDimensions.width : x + labelDimensions.width > center.x ? x - (labelDimensions.width / 2) : x;
const visualY = y >= center.y - labelDimensions.height / 2 ? y - labelDimensions.height / 2 : y;
var visualX = x > center.x ? x - labelDimensions.width : x + labelDimensions.width > center.x ? x - (labelDimensions.width / 2) : x;
var visualY = y >= center.y - labelDimensions.height / 2 ? y - labelDimensions.height / 2 : y;
g.drawString(label, visualX, visualY);
@ -80,29 +80,29 @@ function drawScaleLabels(){
}
function drawIcons() {
const sunIcon = {
width : 24, height : 24, bpp : 4,
var sunIcon = {
width : 24, height : 24, bpp : 1,
transparent : 0,
buffer : require("heatshrink").decompress(atob("AAkP+ALeA40PAYf/BYv/CYYLBBwIICCQ4ACHI4ICEIgkEAg48GDApcFAoYPBBY5NDBZIjLHZpTLNZiDKTZSzMZZT7iA="))
buffer : require("heatshrink").decompress(atob("gEYAQ0IgEQjkAnEMv0wgH/gEB4eAgcA4EHgHgg0AsHmgFnAQQICBwQUCDQQgCEwQsCGQQ+IA"))
};
g.drawImage(sunIcon, center.x + 15, center.y - 12);
const sunRainIcon = {
width : 24, height : 24, bpp : 4,
var sunRainIcon = {
width : 24, height : 24, bpp : 1,
transparent : 0,
buffer : require("heatshrink").decompress(atob("AB/wBbEPBAoGEDI/wh4jJBQIMJEgUP///IpAJCBgf/+ALCAQRJFAoIHECgI7FIYwSEHAoGBEQwsEDIJdHCYYLLFwwTEQQwGFQQQACYpYpLf0AAEA"))
buffer : require("heatshrink").decompress(atob("AAeAAQmEgEQhEAhIIBg1ggEEj8AhEw4HokFAglAnEGoEGgHAgcRgEBkQCBgQCBgcAgUBwARBv/4HAcgiAFDCoIAC"))
};
g.drawImage(sunRainIcon, center.x - 12, 30);
const rainIcon = {
width : 24, height : 24, bpp : 4,
var rainIcon = {
width : 24, height : 24, bpp : 1,
transparent : 0,
buffer : require("heatshrink").decompress(atob("ADnwBRP/AIQAGh4ZKA4YLLh//EwoTFh4GCCIIfGDAQ5DIQ5bIBbQvII4gAGWLwzBOoarLCw4RKLBAAgA"))
buffer : require("heatshrink").decompress(atob("AA0gAQPMgEBgUAgQCCgPwAgMYj0AhkQgEECwICGBYMIj//+ArFgURwAqBB4NEgEQghAJ"))
};
g.drawImage(rainIcon, center.x - 44, center.y - 12);
}
g.setBgColor(0,0,0);
g.setBgColor(g.theme.bg);
g.clear();
drawTicks();

View File

@ -1,7 +1,7 @@
{ "id": "barometer",
"name": "Barometer",
"shortName":"Barometer",
"version":"0.01",
"version":"0.02",
"description": "A simple barometer that displays the current air pressure",
"icon": "barometer.png",
"tags": "tool,outdoors",

View File

@ -1,3 +1,5 @@
0.01: New app
0.20: Settings menu, different fonts, inverse fonts
0.21: Fixed settings menu, four more fonts
0.22: Changed timing code, original "Nunito" Font is back!
0.23: Customizer! Unused fonts no longer take up precious memory.

View File

@ -6,16 +6,6 @@ if (settings.fontIndex==undefined) {
settings.fontIndex=0;
require('Storage').writeJSON("myapp.json", settings);
}
require("FontTeletext10x18Ascii").add(Graphics);
function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
queueDraw();
}, 60000 - (Date.now() % 60000));
}
function draw() {
var date = new Date();
@ -28,9 +18,12 @@ function draw() {
require('contourclock').drawClock(settings.fontIndex);
}
require("FontTeletext10x18Ascii").add(Graphics);
Bangle.setUI("clock");
g.clear();
Bangle.loadWidgets();
Bangle.drawWidgets();
draw();
queueDraw();
setTimeout(function() {
setInterval(draw,60000);
}, 60000 - Date.now() % 60000);

View File

@ -0,0 +1,70 @@
<html>
<head>
<link rel="stylesheet" href="../../css/spectre.min.css">
</head>
<body>
<form>
<input type="checkbox" id="BarlowCond">
<label for="BarlowCond">Barlow Condensed</label><br>
<input type="checkbox" id="BebasNeue">
<label for="BebasNeue">Bebas Neue</label><br>
<input type="checkbox" id="Dekko">
<label for="Dekko">Dekko</label><br>
<input type="checkbox" id="DinAlternate">
<label for="DinAlternate">Din Alternate</label><br>
<input type="checkbox" id="Dosis">
<label for="Dosis">Dosis</label><br>
<input type="checkbox" id="Impact">
<label for="Impact">Impact</label><br>
<input type="checkbox" id="Nunito">
<label for="Nunito">Nunito</label><br>
<input type="checkbox" id="OpenSansEC">
<label for="OpenSansEC">Open Sans Extra Condensed</label><br>
<input type="checkbox" id="Phosphate">
<label for="Phosphate">Phosphate</label><br>
<input type="checkbox" id="Quicksand">
<label for="Quicksand">Quicksand</label><br>
<input type="checkbox" id="SairaCond">
<label for="SairaCond">Saira Condensed</label><br>
<input type="checkbox" id="SairaEC">
<label for="SairaEC">Saira Extra Condensed</label><br>
<input type="checkbox" id="Teko">
<label for="Teko">Teko</label><br>
<input type="checkbox" id="Yumaro">
<label for="Yumaro">Yumaro</label><br>
<input type="checkbox" id="YuseiMagic">
<label for="YuseiMagic">Yusei Magic</label><br>
<p>Click <button id="upload" class="btn btn-primary">Upload</button></p>
<script src="../../core/lib/customize.js"></script>
<script>
FontList = ["BarlowCond", "BebasNeue", "Dekko", "DinAlternate", "Dosis",
"Impact", "Nunito", "OpenSansEC", "Phosphate", "Quicksand", "SairaCond", "SairaEC",
"Yumaro", "YuseiMagic"]
// When the 'upload' button is clicked...
document.getElementById("upload").addEventListener("click", function() {
var n=0;
var fonts = [];
for (fontName of FontList) {
if (document.getElementById(fontName).checked==true) {
var f = new Object();
f.name="contourclock-"+n+".json";
f.url="font-"+fontName+".json";
//fonts.push({name:"contourclock-"+n+".json", url:"font-"+fontName+".json"});
fonts.push(f);
//console.log("contourclock-"+n+".json <- font-"+fontName+".json");
n++;
}
}
//console.log(fonts[0]);
sendCustomizedApp(storage=fonts);
/*sendCustomizedApp({
storage:[
{name:"myapp.app.js", url:"app.js", content:app},
]
});*/
});
</script>
</body>
</html>

View File

@ -0,0 +1,17 @@
{
"name":"Nunito",
"size":"80",
"characters":[
{"width" : "62", "buffer":"VVVVVVV//////9VVVVVVVVVVVVX////////1VVVVVVVVVVX/wAAAAAA/9VVVVVVVVVV/AAAAAAAAD/VVVVVVVVV/AAAAAAAAAA/VVVVVVVVfwAAAAAAAAAAP1VVVVVVXwAAAAAAAAAAAP1VVVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVVXwAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVXwAAAAAAA/8AAAAAAAPVV8AAAAAAA//8AAAAAAA9VXwAAAAAAP1V8AAAAAAD1VfAAAAAAD1VV8AAAAAAD1XwAAAAAA9VVV8AAAAAAPVfAAAAAAD1VVV8AAAAAA9V8AAAAAA9VVVXwAAAAAD1XwAAAAAD1VVVfAAAAAAD18AAAAAAPVVVVfAAAAAAPXwAAAAAD1VVVV8AAAAAA9fAAAAAAPVVVVXwAAAAAD18AAAAAA9VVVVfAAAAAAPXwAAAAAD1VVVV8AAAAAAPfAAAAAAPVVVVXwAAAAAA98AAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAAPVVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAD1VVVVXwAAAAAD/AAAAAAPVVVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAD1VVVVXwAAAAAD/AAAAAAPVVVVVfAAAAAAP8AAAAAA9VVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD/AAAAAAD1VVVVfAAAAAAP8AAAAAAPVVVVV8AAAAAA/wAAAAAA9VVVVXwAAAAAD3wAAAAAD1VVVVfAAAAAAPfAAAAAAPVVVVXwAAAAAA98AAAAAA9VVVVfAAAAAAD3wAAAAAD1VVVV8AAAAAA9fAAAAAAPVVVVXwAAAAAD18AAAAAA9VVVVfAAAAAAPXwAAAAAA9VVVV8AAAAAA9XwAAAAAD1VVVfAAAAAAD1fAAAAAAPVVVV8AAAAAA9V8AAAAAAPVVVXwAAAAAD1XwAAAAAA9VVV8AAAAAAPVXwAAAAAA9VVXwAAAAAA9VfAAAAAAA9VV8AAAAAAPVV8AAAAAAA9V/AAAAAAA9VV8AAAAAAA//wAAAAAAD1VXwAAAAAAA/wAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAA9VVVVXwAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVfwAAAAAAAAAAAD1VVVVVVfwAAAAAAAAAAD9VVVVVVVXwAAAAAAAAAA/VVVVVVVVX8AAAAAAAAA/VVVVVVVVVX/AAAAAAAA/1VVVVVVVVVV/8AAAAAD/1VVVVVVVVVVVf///////1VVVVVVVVVVVVV//////VVVVVVVQ=="},
{"width" : "61", "buffer":"VVVVVVVVf////VVVVVVVVVVVVVVV/////9VVVVVVVVVVVVVX/AAAAD1VVVVVVVVVVVVf8AAAAAPVVVVVVVVVVVVfwAAAAAA9VVVVVVVVVVV/AAAAAAAPVVVVVVVVVVX/AAAAAAAA9VVVVVVVVVX8AAAAAAAAPVVVVVVVVVfwAAAAAAAAD1VVVVVVVVfwAAAAAAAAA9VVVVVVVV/AAAAAAAAAAPVVVVVVVV/AAAAAAAAAAD1VVVVVVX8AAAAAAAAAAA9VVVVVVX8AAAAAAAAAAAPVVVVVVXwAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAA9VVVVVfAAAAAAAAAAAAAPVVVVVXwAAAAAAAAAAAAD1VVVVVfAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVfAAAAPAAAAAAAD1VVVVVXwAAA/8AAAAAAA9VVVVVVfAAD/XwAAAAAAPVVVVVVV///9V8AAAAAAD1VVVVVVX//1VfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVX///wAAAAAAA///9VVVV////wAAAAAAAD////VVX/wAAAAAAAAAAAAAAP9VX8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAA/VVf/////////////////VVV////////////////9VVVVVVVVVVVVVVVVVVVVVU="},
{"width" : "61", "buffer":"VVVVV////////1VVVVVVVVVVf/////////9VVVVVVVVX/8AAAAAAAA/9VVVVVVVf/AAAAAAAAAAP9VVVVVV/wAAAAAAAAAAAP1VVVVV/AAAAAAAAAAAAAP1VVVV8AAAAAAAAAAAAAA/VVVV8AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVV8AAAAAD/8AAAAAAAAD1VXwAAAD////AAAAAAAAPVVfAAA//1Vf8AAAAAAAD1VV/wP/1VVVXwAAAAAAA9VVX//9VVVVVfAAAAAAAPVVVV/VVVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAA9VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVV8AAAAAAAD1VVVVVVVVVV8AAAAAAAD1VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAA9VVVVVVVVVV8AAAAAAAAPVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAPVVVVVVVVVVfAAAAAAAAA//////1VVVXwAAAAAAAAD//////9VVXwAAAAAAAAAAAAAAA/9VXwAAAAAAAAAAAAAAAAP1V8AAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VV/AAAAAAAAAAAAAAAD9VVX////////////////9VVVX///////////////1VVVVVVVVVVVVVVVVVVVVVU="},
{"width" : "60", "buffer":"VVVVVf///////9VVVVVVVVVV//////////9VVVVVVVVf/wAAAAAAAD/1VVVVVVf/AAAAAAAAAAD/VVVVVX/wAAAAAAAAAAAP9VVVVfwAAAAAAAAAAAAA/VVVV8AAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAPVV8AAAAAD/8AAAAAAAAD1VfAAAA////8AAAAAAAD1VXwAA//9VX/AAAAAAAD1VV////VVVVXwAAAAAAD1VVf//VVVVVV8AAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVX8AAAAAAPVVVVVVVVVVV/wAAAAAA9VVVVVVVX///8AAAAAAA9VVVVVVX////AAAAAAAD1VVVVVVf8AAAAAAAAAAD1VVVVVV8AAAAAAAAAAAPVVVVVVXwAAAAAAAAAAD9VVVVVVXwAAAAAAAAAAP1VVVVVVfAAAAAAAAAAA9VVVVVVVfAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAD1VVVVVVVfAAAAAAAAAAA/VVVVVVVfAAAAAAAAAAAP1VVVVVVfAAAAAAAAAAAA/VVVVVVfAAAAAAAAAAAAP1VVVVVXwAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVV8AAAAAAAAAAAAPVVVVVVfwAAAAAAAAAAAD1VVVVVX////8AAAAAAAD1VVVVVVf////8AAAAAAA9VVVVVVVVVVX/AAAAAAA9VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVX/1VVVVVVV8AAAAAAPVX///1VVVVVXwAAAAAAPVf8AP/1VVVV/AAAAAAAPV8AAAP//9f/8AAAAAAAPXwAAAAP////AAAAAAAAPXwAAAAAADwAAAAAAAAAPfAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAD9VVVfAAAAAAAAAAAAAA/1VVVX/AAAAAAAAAAAAP9VVVVV//AAAAAAAAAAD/VVVVVVV//wAAAAAAAP/1VVVVVVVV//////////9VVVVVVVVVVf///////1VVVVVV"},
{"width" : "65", "buffer":"VVVVVVVVVVVVf///1VVVVVVVVVVVVVVVVf////9VVVVVVVVVVVVVVVX8AAAD9VVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVfAAAAAD1VVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVXwAAAAAAAD1VVVVVVVVVVV8AAAAAAAAPVVVVVVVVVVVXwAAAAAAAA9VVVVVVVVVVV8AAAAAAAAD1VVVVVVVVVVfAAAAAAAAAPVVVVVVVVVVV8AAAAAAAAA9VVVVVVVVVVfAAAAAAAAAD1VVVVVVVVVXwAAAAAAAAAPVVVVVVVVVV8AAAAAAAAAA9VVVVVVVVVXwAAAAAAAAAD1VVVVVVVVV8AAAAAAAAAAPVVVVVVVVVfAAAAAAAAAAA9VVVVVVVVV8AAAAAAAAAAD1VVVVVVVVfAAAAAAAAAAAPVVVVVVVVXwAAAAAAAAAAA9VVVVVVVVfAAAAAAAAAAAD1VVVVVVVXwAAAAAAAAAAAPVVVVVVVV8AAAAAAAAAAAA9VVVVVVVXwAAAAAAAAAAAD1VVVVVVV8AAAAAAAAAAAAPVVVVVVVfAAAAAAAAAAAAA9VVVVVVV8AAAAAwAAAAAAD1VVVVVVfAAAAAPwAAAAAAPVVVVVVXwAAAAD3wAAAAAA9VVVVVVfAAAAA9fAAAAAAD1VVVVVXwAAAAD18AAAAAAPVVVVVV8AAAAA9XwAAAAAA9VVVVVfAAAAAPVfAAAAAAD1VVVVV8AAAAA9V8AAAAAAPVVVVVfAAAAAPVXwAAAAAA9VVVVXwAAAAD1VfAAAAAAD1VVVVfAAAAAPVV8AAAAAAPVVVVXwAAAAD1VXwAAAAAA9VVVV8AAAAAPVVfAAAAAAD1VVVXwAAAAD1VV8AAAAAAPVVVV8AAAAA9VVXwAAAAAA9VVVXwAAAAD1VVfAAAAAAD1VVV8AAAAAD///wAAAAAAD/1VXwAAAAAD//8AAAAAAAD//VfAAAAAAAAAAAAAAAAAAD/XwAAAAAAAAAAAAAAAAAAAPfAAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAD3wAAAAAAAAAAAAAAAAAAAPX8AAAAAAAAAAAAAAAAAAD1X/AAAAAAAAAAAAAAAAAD9VV////////8AAAAAAAD//VVVf///////8AAAAAAA//VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVVVV8AAAAAD1VVVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVVfAAAAAA9VVVVVVVVVVVVVV8AAAAAPVVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVV8AAAAPVVVVVVVVVVVVVVVV/AAAP1VVVVVVVVVVVVVVVV////9VVVVVVVVVVVVVVVVVf//9VVVVVQ=="},
{"width" : "60", "buffer":"VVVX///////////1VVVVVV///////////////VVVVX/8AAAAAAAAAAAP/9VVVfAAAAAAAAAAAAAAA/VVV8AAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA/VVfAAAAAAAAAAAAAAP/1VVfAAAAAAA/////////VVVfAAAAAAD///////1VVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVfAAAAAAPV/////VVVVVVfAAAAAAD///////VVVVVfAAAAAAA/AAAAA/9VVVVfAAAAAAAAAAAAAA/1VVVfAAAAAAAAAAAAAAD9VVVfAAAAAAAAAAAAAAAP1VVfAAAAAAAAAAAAAAAD9VVfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9XwAAAAAA//wAAAAAAAA9XwAAAAA////wAAAAAAA9XwAAAAP/VVf8AAAAAAA9V/AAAP/VVVVfAAAAAAAPVf////1VVVVXwAAAAAAPVV///1VVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVV8AAAAAAPVVX1VVVVVVVV8AAAAAAPVX//1VVVVVVXwAAAAAAPV/8P/1VVVVVfAAAAAAA9X8AAP/9VVVX8AAAAAAA9fAAAAP//9//wAAAAAAA9fAAAAAD///8AAAAAAAA98AAAAAAADAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAAPV8AAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAD1V8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAP1VVXwAAAAAAAAAAAAAA/VVVV/AAAAAAAAAAAAAP1VVVVf/AAAAAAAAAAAD/VVVVVV//AAAAAAAAAA/1VVVVVVV//wAAAAAAD/9VVVVVVVVV//////////VVVVVVVVVVVf//////9VVVVVVV"},
{"width" : "62", "buffer":"VVVVVVVVX///////1VVVVVVVVVVVf/////////VVVVVVVVVV//AAAAAAAD/9VVVVVVVV/8AAAAAAAAAP/VVVVVVVfwAAAAAAAAAAA/VVVVVVfwAAAAAAAAAAAAPVVVVVX8AAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAAA9VVVVfAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAA9VVXwAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAA9VV8AAAAAAAAD//AAAAAPVVfAAAAAAAAP////AAAA9VV8AAAAAAAP/VVf//AA/VVXwAAAAAAD9VVVVf///1VV8AAAAAAA9VVVVVVf/1VVXwAAAAAAPVVVVVVVVVVVV8AAAAAAD1VVVVVVVVVVVXwAAAAAA9VVVVVVVVVVVVfAAAAAAPVVVVVVVVVVVVV8AAAAAA9VVVX/VVVVVVVfAAAAAAPVVX////1VVVVV8AAAAAA9VX//AP/9VVVVXwAAAAAD1X/AAAAD/VVVVfAAAAAAPX/AAAAAA/VVVV8AAAAAD1/AAAAAAAP1VVXwAAAAAPfAAAAAAAAP1VV8AAAAAAPwAAAAAAAAD1VXwAAAAAAMAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAPVXwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAA9V8AAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD18AAAAAAAAAAAAAAAAAAPXwAAAAAAAAA/AAAAAAAA9fAAAAAAAAA//wAAAAAAA98AAAAAAAA/1fwAAAAAAD3wAAAAAAAP1VXwAAAAAAPfAAAAAAAD1VVXwAAAAAA9fAAAAAAAPVVVXwAAAAAD18AAAAAAD1VVVXwAAAAAD3wAAAAAAPVVVVfAAAAAAPfAAAAAAA9VVVV8AAAAAA98AAAAAAD1VVVXwAAAAAD3wAAAAAAPVVVVfAAAAAAPXwAAAAAA9VVVV8AAAAAA9fAAAAAAD1VVVXwAAAAAPV8AAAAAAPVVVVfAAAAAA9XwAAAAAA9VVVV8AAAAAD1XwAAAAAA9VVVfAAAAAAPVfAAAAAAD1VVXwAAAAAA9V8AAAAAAD1VV8AAAAAAD1V8AAAAAAD9V/AAAAAAA9VXwAAAAAAD//wAAAAAAD1VXwAAAAAAA/wAAAAAAAPVVfAAAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAD1VVVVXwAAAAAAAAAAAAA9VVVVVXwAAAAAAAAAAAAPVVVVVVX8AAAAAAAAAAAD1VVVVVVX8AAAAAAAAAAD9VVVVVVVV/AAAAAAAAAD/VVVVVVVVV/8AAAAAAAD/VVVVVVVVVVf/wAAAAAD/VVVVVVVVVVVV////////VVVVVVVVVVVVVX//////VVVVVVQ=="},
{"width" : "63", "buffer":"VVV//////////////1VVVVX/////////////////VVV//AAAAAAAAAAAAAAP/9VX8AAAAAAAAAAAAAAAAA/VXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAA98AAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAA9X8AAAAAAAAAAAAAAAAAA9Vf/wAAAAAAAAAAAAAAAD1VX/////////wAAAAAAAD1VVVf///////8AAAAAAAPVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVfAAAAAAAD1VVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVV8AAAAAAAPVVVVVVVVVVVV8AAAAAAA9VVVVVVVVVVVXwAAAAAAA9VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAD1VVVVVVVVVVVXwAAAAAAPVVVVVVVVVVVVfAAAAAAAPVVVVVVVVVVVVfAAAAAAA9VVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVXwAAAAAD1VVVVVVVVVVVVXwAAAAAPVVVVVVVVVVVVVV8AAAAA9VVVVVVVVVVVVVVfwAAA/1VVVVVVVVVVVVVVX/////VVVVVVVVVVVVVVVVf///VVVVVVVVVVVVV"},
{"width" : "64", "buffer":"VVVVVVX///////9VVVVVVVVVVVV//////////VVVVVVVVVVX/wAAAAAAAP/1VVVVVVVVf8AAAAAAAAAD/1VVVVVVV/wAAAAAAAAAAA/VVVVVVV/AAAAAAAAAAAAA/VVVVVV8AAAAAAAAAAAAAD9VVVVV8AAAAAAAAAAAAAAD1VVVV8AAAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAAD1VV8AAAAAAAAAAAAAAAAAPVV8AAAAAAAAAAAAAAAAAD1VfAAAAAAAD//wAAAAAAA9VXwAAAAAAD///wAAAAAAPVV8AAAAAAD1VV/AAAAAAA9VfAAAAAAD1VVV8AAAAAAPVXwAAAAAD1VVVfAAAAAAD1V8AAAAAD1VVVV8AAAAAA9VfAAAAAA9VVVVfAAAAAAPVXwAAAAAPVVVVXwAAAAAD1V8AAAAAD1VVVV8AAAAAD1VfAAAAAA9VVVVfAAAAAA9VXwAAAAAPVVVVXwAAAAAPVVfAAAAAA9VVVXwAAAAAD1VXwAAAAAD1VVXwAAAAAA9VV8AAAAAAPVVXwAAAAAA9VVXwAAAAAA///wAAAAAAPVVV8AAAAAAD//wAAAAAAPVVVXwAAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAD1VVVXwAAAAAAAAAAAAAAD1VVVVfAAAAAAAAAAAAAAD1VVVVV8AAAAAAAAAAAAAD1VVVVVXwAAAAAAAAAAAAD1VVVVVVfAAAAAAAAAAAAA9VVVVVVfAAAAAAAAAAAAAD1VVVVV/AAAAAAAAAAAAAAPVVVVV/AAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAAD1VVV8AAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAAD1VfAAAAAAAAAAAAAAAAAA9VXwAAAAAAD///AAAAAAAD1XwAAAAAAP////AAAAAAA9V8AAAAAAP1VVX8AAAAAAD18AAAAAAPVVVVXwAAAAAA9fAAAAAAPVVVVVfAAAAAAPXwAAAAAPVVVVVV8AAAAAD18AAAAAD1VVVVVfAAAAAAPfAAAAAA9VVVVVV8AAAAAD3wAAAAAPVVVVVVfAAAAAA/wAAAAAD1VVVVVfAAAAAAP8AAAAAA9VVVVVXwAAAAAD/AAAAAAPVVVVVV8AAAAAA98AAAAAA9VVVVV8AAAAAAPfAAAAAAD1VVVV8AAAAAAD3wAAAAAAP9VVX8AAAAAAD18AAAAAAA////8AAAAAAA9fAAAAAAAAP//wAAAAAAAPV8AAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAAPVVVXwAAAAAAAAAAAAAAAD1VVVfAAAAAAAAAAAAAAAP1VVVV/AAAAAAAAAAAAAAP1VVVVX8AAAAAAAAAAAAA/VVVVVVX8AAAAAAAAAAAD/VVVVVVVf/AAAAAAAAAA/9VVVVVVVVf/8AAAAAAAP/1VVVVVVVVVX/////////9VVVVVVVVVVVVf///////VVVVVVU="},
{"width" : "61", "buffer":"VVVVVV///////VVVVVVVVVVVVX////////1VVVVVVVVVVf8AAAAAAD/1VVVVVVVVV/wAAAAAAAA/1VVVVVVVX/AAAAAAAAAA/VVVVVVVX8AAAAAAAAAAA9VVVVVVXwAAAAAAAAAAAD9VVVVVXwAAAAAAAAAAAAP1VVVVXwAAAAAAAAAAAAAPVVVVXwAAAAAAAAAAAAAA9VVVV8AAAAAAAAAAAAAAPVVVV8AAAAAAAAAAAAAAA9VVV8AAAAAAAAAAAAAAAD1VVfAAAAAAAAAAAAAAAA9VVfAAAAAAAAAAAAAAAAD1VXwAAAAAAAAAAAAAAAA9VV8AAAAAAA//AAAAAAAD1V8AAAAAAA//8AAAAAAA9VfAAAAAAA9VXwAAAAAAD1XwAAAAAA9VVfAAAAAAA9XwAAAAAA9VVV8AAAAAAD18AAAAAA9VVVXwAAAAAA9fAAAAAAPVVVV8AAAAAAPXwAAAAAPVVVVXwAAAAAD18AAAAAD1VVVV8AAAAAAPfAAAAAA9VVVVfAAAAAAD3wAAAAAPVVVVXwAAAAAA98AAAAAD1VVVV8AAAAAAPfAAAAAA9VVVVfAAAAAAA/wAAAAAD1VVVfAAAAAAAP8AAAAAA9VVVXwAAAAAAD/AAAAAAD1VVV8AAAAAAA/wAAAAAA9VVV8AAAAAAAP8AAAAAAD9VV8AAAAAAAD/AAAAAAAP/f8AAAAAAAA98AAAAAAAP/8AAAAAAAAPfAAAAAAAADAAAAAAAAAD3wAAAAAAAAAAAAAAAAAA9fAAAAAAAAAAAAAAAAAAPXwAAAAAAAAAAAAAAAAAD1fAAAAAAAAAAAAAAAAAA9XwAAAAAAAAAAAAAAAAAPVfAAAAAAAAAAAAAAAAAD1XwAAAAAAAAAAAAAAAAA9VfAAAAAAAAAAAAAAAAAPVV8AAAAAAAAAMAAAAAAD1VXwAAAAAAAAPwAAAAAA9VVfAAAAAAAAPfAAAAAAPVVV/AAAAAAA/XwAAAAAD1VVX/AAAAAD/V8AAAAAA9VVVX/wAAAP9VfAAAAAA9VVVVX/////1VfAAAAAAPVVVVVV////VVXwAAAAAD1VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVV8AAAAAA9VVVVVVVVVVVV8AAAAAAPVVVVVVVVVVVVfAAAAAAD1VVVVVVVVVVVfAAAAAAA9VVf//VVVVVV/AAAAAAA9VV////1VVVX/AAAAAAAPVV/AAD//9f/8AAAAAAAPVV8AAAA////wAAAAAAAD1VfAAAAAAPAAAAAAAAAD1VfAAAAAAAAAAAAAAAAA9VXwAAAAAAAAAAAAAAAA9VV8AAAAAAAAAAAAAAAAPVVfAAAAAAAAAAAAAAAAPVVXwAAAAAAAAAAAAAAAPVVV8AAAAAAAAAAAAAAAPVVVfAAAAAAAAAAAAAAAD1VVXwAAAAAAAAAAAAAAP1VVV8AAAAAAAAAAAAAAP1VVVfAAAAAAAAAAAAAAPVVVVV8AAAAAAAAAAAAA/VVVVVXwAAAAAAAAAAAA/VVVVVVf8AAAAAAAAAAP9VVVVVVV/8AAAAAAAAA/9VVVVVVVVf/wAAAAAA//VVVVVVVVVVf////////9VVVVVVVVVVVV//////9VVVVVVVVU="},
{"width" : "25", "buffer":"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX//1VVVVf///9VVV/wAA/1VV/AAAAPVV8AAAAA9V8AAAAAD1fAAAAAA9fAAAAAAD3wAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAPfAAAAAAD3wAAAAAA98AAAAAA9XwAAAAAPVfAAAAAPVV8AAAAPVVX/AAA/VVVf////VVVVX//9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf//VVVVX////1VVX/AAD/VVXwAAAA9VXwAAAAD1XwAAAAAPXwAAAAAD18AAAAAAPfAAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA/wAAAAAAP8AAAAAAD/AAAAAAA98AAAAAAPfAAAAAAD18AAAAAD1fAAAAAA9V8AAAAA9VXwAAAA9VVf8AAP9VVV////9VVVVf//VVU="}
]
}

View File

@ -1,49 +1,49 @@
exports.drawClock = function(fontIndex) {
var digits = [];
if (!require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json")) return (false);
var font = JSON.parse(require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json"));
var digits = [];
fontFile=require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json");
if (fontFile==undefined) return(false); //exit if font file not found
var font = JSON.parse(fontFile);
for (var n in font.characters) {
digits.push({width: parseInt(font.characters[n].width),
height: font.size,
bpp: 2,
transparent: 1,
buffer:E.toArrayBuffer(atob(font.characters[n].buffer))});
height: font.size,
bpp: 2,
transparent: 1,
buffer:E.toArrayBuffer(atob(font.characters[n].buffer))});
}
if (n!=10) return (false); //font file seems to be invalid
var x=0;
var y = g.getHeight()/2-digits[0].height/2;
var date = new Date();
g.clearRect(0,38,g.getWidth()-1,138);
d1=parseInt(date.getHours()/10);
d2=parseInt(date.getHours()%10);
d3=10;
d4=parseInt(date.getMinutes()/10);
d5=parseInt(date.getMinutes()%10);
w1=digits[d1].width;
w2=digits[d2].width;
w3=digits[d3].width;
w4=digits[d4].width;
w5=digits[d5].width;
squeeze=(g.getWidth()-w5)/(w1+w2+w3+w4);
if (fontIndex<0) {
fg=g.theme.fg;
bg=g.theme.bg;
g.setColor(bg);
g.setBgColor(fg);
}
g.drawImage(digits[d1],x,y);
x+=parseInt(w1*squeeze);
g.drawImage(digits[d2],x,y);
x+=parseInt(w2*squeeze);
g.drawImage(digits[d3],x,y);
x+=parseInt(w3*squeeze);
g.drawImage(digits[d4],x,y);
x+=parseInt(w4*squeeze);
g.drawImage(digits[d5],x,y);
if (fontIndex<0) {
g.setColor(fg);
g.setBgColor(bg);
}
return font.name;
}
var x=0;
var y = g.getHeight()/2-digits[0].height/2;
var date = new Date();
//g.clearRect(0,24,g.getWidth()-1,137);
g.clearRect(0,38,g.getWidth()-1,138);
d1=parseInt(date.getHours()/10);
d2=parseInt(date.getHours()%10);
d3=10;
d4=parseInt(date.getMinutes()/10);
d5=parseInt(date.getMinutes()%10);
w1=digits[d1].width;
w2=digits[d2].width;
w3=digits[d3].width;
w4=digits[d4].width;
w5=digits[d5].width;
squeeze=(g.getWidth()-w5)/(w1+w2+w3+w4);
if (fontIndex<0) {
fg=g.theme.fg;
bg=g.theme.bg;
g.setColor(bg);
g.setBgColor(fg);
}
g.drawImage(digits[d1],x,y);
x+=parseInt(w1*squeeze);
g.drawImage(digits[d2],x,y);
x+=parseInt(w2*squeeze);
g.drawImage(digits[d3],x,y);
x+=parseInt(w3*squeeze);
g.drawImage(digits[d4],x,y);
x+=parseInt(w4*squeeze);
g.drawImage(digits[d5],x,y);
if (fontIndex<0) {
g.setColor(fg);
g.setBgColor(bg);
}
return font.name;
}

View File

@ -1,11 +1,12 @@
{ "id": "contourclock",
"name": "Contour Clock",
"shortName" : "Contour Clock",
"version":"0.21",
"version":"0.23",
"icon": "app.png",
"description": "A Minimalist clockface with large Digits. Now with more fonts!",
"screenshots" : [{"url":"cc-screenshot-1.png"},{"url":"cc-screenshot-2.png"}],
"tags": "clock",
"custom": "custom.html",
"allow_emulator":true,
"supports" : ["BANGLEJS2"],
"type": "clock",
@ -13,20 +14,6 @@
{"name":"contourclock.app.js","url":"app.js"},
{"name":"contourclock.settings.js","url":"contourclock.settings.js"},
{"name":"contourclock","url":"lib.js"},
{"name":"contourclock-0.json","url":"font-Impact.json"},
{"name":"contourclock-1.json","url":"font-Yumaro.json"},
{"name":"contourclock-2.json","url":"font-DinAlternate.json"},
{"name":"contourclock-3.json","url":"font-BebasNeue.json"},
{"name":"contourclock-4.json","url":"font-Dekko.json"},
{"name":"contourclock-5.json","url":"font-Dosis.json"},
{"name":"contourclock-6.json","url":"font-Phosphate.json"},
{"name":"contourclock-7.json","url":"font-Quicksand.json"},
{"name":"contourclock-8.json","url":"font-SairaCond.json"},
{"name":"contourclock-9.json","url":"font-YuseiMagic.json"},
{"name":"contourclock-10.json","url":"font-BarlowCond.json"},
{"name":"contourclock-11.json","url":"font-OpenSansEC.json"},
{"name":"contourclock-12.json","url":"font-SairaEC.json"},
{"name":"contourclock-13.json","url":"font-Teko.json"},
{"name":"contourclock.img","url":"app-icon.js","evaluate":true}
]
}

View File

@ -2,7 +2,7 @@
"id": "floralclk",
"name": "Floral Clock",
"version": "0.01",
"description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2 but requires firmware 2v11 or later on Bangle.js 1**",
"description": "A clock with a flower background by [Lillith May](https://www.instagram.com/_lilustrations_/)",
"icon": "app.png",
"screenshots": [{"url":"screenshot_floral.png"}],
"type": "clock",

View File

@ -2,7 +2,7 @@
"id": "health",
"name": "Health Tracking",
"version": "0.11",
"description": "Logs health data and provides an app to view it (requires firmware 2v10.100 or later)",
"description": "Logs health data and provides an app to view it",
"icon": "app.png",
"tags": "tool,system,health",
"supports": ["BANGLEJS","BANGLEJS2"],

View File

@ -12,4 +12,6 @@
0.12: Added humidity as an option to display.
0.13: Improved battery visualization.
0.14: Added altitude as an option to display.
0.15: Using wpedom to count steps.
0.15: Using wpedom to count steps.
0.16: Improved stability. Wind can now be shown.
0.17: Settings for mph/kph and other minor improvements.

View File

@ -1,8 +1,9 @@
# LCARS clock
A simple LCARS inspired clock.
Note: To display the steps, the health app is required. If this app is not installed, the data will not be shown.
To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerdavid/BangleApps)
Note: To display the steps, the wpedom app is required. To show weather data
such as temperature, humidity or window you BangleJS must be connected
with Gadgetbride and the weather app must be installed.
## Control
* Tap left / right to change between screens.
@ -19,12 +20,13 @@ To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerda
* Display graphs (day or month) for steps + hrm on the second screen.
## Data that can be configured
* Steps - Steps loaded via the health module
* Steps - Steps loaded via the wpedom app.
* Battery - Current battery level in %
* VREF - Voltage of battery
* HRM - Last measured HRM
* Temp - Weather temperature loaded via the weather module + gadgetbridge
* Humidity - Humidity loaded via the weather module + gadgetbridge
* Wind - Wind loaded via the weather module + gadgetbridge. Set kph / mph in the settings.
* Altitude - Shows the altitude in m.
* CoreT - Temperature of device
@ -35,9 +37,6 @@ Access different screens via tap on the left/ right side of the screen
![](screenshot_2.png)
# Ideas
- Tap top / bottom to disable steps (also icon) and start a timer
## Contributors
- [David Peer](https://github.com/peerdavid).
- [Adam Schmalhofer](https://github.com/adamschmalhofer).

View File

@ -5,7 +5,8 @@ let settings = {
alarm: -1,
dataRow1: "Steps",
dataRow2: "Temp",
dataRow3: "Battery"
dataRow3: "Battery",
speed: "kph",
};
let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings;
for (const key in saved_settings) {
@ -121,18 +122,22 @@ function queueDraw() {
function printRow(text, value, y, c){
g.setFontAntonioMedium();
g.setFontAlign(-1,-1,0);
g.setColor(c);
g.fillRect(79, y-2, 85 ,y+18);
g.setFontAlign(0,-1,0);
g.drawString(value, 110, y);
// Print background
g.setColor(c);
g.setFontAlign(-1,-1,0);
g.fillRect(133, y-2, 165 ,y+18);
g.fillCircle(161, y+8, 10);
g.fillRect(80, y-2, 165 ,y+18);
g.fillCircle(163, y+8, 10);
g.setColor(cBlack);
g.drawString(text, 135, y);
// Plot text
width = g.stringWidth(value);
g.setColor(cBlack);
g.fillRect(130-width-8, y-2, 130, y+18);
g.setColor(c);
g.setFontAlign(1,-1,0);
g.drawString(value, 126, y);
}
@ -174,6 +179,11 @@ function _drawData(key, y, c){
var weather = getWeather();
value = weather.hum;
} else if (key == "WIND"){
text = "WND";
var weather = getWeather();
value = weather.wind;
} else if (key == "ALTITUDE"){
should_print= false;
text = "ALT";
@ -248,16 +258,16 @@ function drawState(){
hours % 4 == 1 ? iconMars :
hours % 4 == 2 ? iconMoon :
iconEarth;
g.drawImage(iconImg, 24, 118);
g.drawImage(iconImg, 23, 118);
g.setColor(cWhite);
g.drawString("STATUS", 24+25, 108);
g.drawString("STATUS", 23+26, 108);
} else {
// Alarm within symbol
g.setColor(cOrange);
g.drawString("ALARM", 24+25, 108);
g.drawString("ALARM", 23+26, 108);
g.setColor(cWhite);
g.setFontAntonioLarge();
g.drawString(getAlarmMinutes(), 24+25, 108+35);
g.drawString(getAlarmMinutes(), 23+26, 108+35);
}
g.setFontAlign(-1, -1, 0);
@ -425,22 +435,22 @@ function drawPosition1(){
}
function draw(){
// First handle alarm to show this correctly afterwards
handleAlarm();
// Queue draw first to ensure that its called in one minute again.
queueDraw();
// Next draw the watch face
g.reset();
g.clearRect(0, 0, g.getWidth(), g.getHeight());
// First handle alarm to show this correctly afterwards
handleAlarm();
// Draw current lcars position
if(lcarsViewPos == 0){
drawPosition0();
} else if (lcarsViewPos == 1) {
drawPosition1();
}
// Next draw the watch face
g.reset();
g.clearRect(0, 0, g.getWidth(), g.getHeight());
// Queue draw in one minute
queueDraw();
// Draw current lcars position
if(lcarsViewPos == 0){
drawPosition0();
} else if (lcarsViewPos == 1) {
drawPosition1();
}
}
@ -463,16 +473,16 @@ function getSteps() {
function getWeather(){
var weather;
var weatherJson;
try {
weather = require('weather').get();
weatherJson = storage.readJSON('weather.json');
} catch(ex) {
// Return default
}
if (weather === undefined){
weather = {
if(weatherJson === undefined){
return {
temp: "-",
hum: "-",
txt: "-",
@ -480,12 +490,21 @@ function getWeather(){
wdir: "-",
wrose: "-"
};
} else {
weather.temp = locale.temp(Math.round(weather.temp-273.15))
weather.hum = weather.hum + "%";
}
return weather;
var weather = weatherJson.weather;
// Temperature
weather.temp = locale.temp(weather.temp-273.15);
// Humidity
weather.hum = weather.hum + "%";
// Wind
var speedFactor = settings.speed == "kph" ? 1.60934 : 1.0;
weather.wind = Math.round(weather.wind * speedFactor);
return weather
}

View File

@ -7,7 +7,8 @@
alarm: -1,
dataRow1: "Battery",
dataRow2: "Steps",
dataRow3: "Temp"
dataRow3: "Temp",
speed: "kph",
};
let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings;
for (const key in saved_settings) {
@ -18,35 +19,45 @@
storage.write(SETTINGS_FILE, settings)
}
var data_options = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Altitude", "CoreT"];
var dataOptions = ["Steps", "Battery", "VREF", "HRM", "Temp", "Humidity", "Wind", "Altitude", "CoreT"];
var speedOptions = ["kph", "mph"];
E.showMenu({
'': { 'title': 'LCARS Clock' },
'< Back': back,
'Row 1': {
value: 0 | data_options.indexOf(settings.dataRow1),
min: 0, max: 7,
format: v => data_options[v],
value: 0 | dataOptions.indexOf(settings.dataRow1),
min: 0, max: 8,
format: v => dataOptions[v],
onchange: v => {
settings.dataRow1 = data_options[v];
settings.dataRow1 = dataOptions[v];
save();
},
},
'Row 2': {
value: 0 | data_options.indexOf(settings.dataRow2),
min: 0, max: 7,
format: v => data_options[v],
value: 0 | dataOptions.indexOf(settings.dataRow2),
min: 0, max: 8,
format: v => dataOptions[v],
onchange: v => {
settings.dataRow2 = data_options[v];
settings.dataRow2 = dataOptions[v];
save();
},
},
'Row 3': {
value: 0 | data_options.indexOf(settings.dataRow3),
min: 0, max: 7,
format: v => data_options[v],
value: 0 | dataOptions.indexOf(settings.dataRow3),
min: 0, max: 8,
format: v => dataOptions[v],
onchange: v => {
settings.dataRow3 = data_options[v];
settings.dataRow3 = dataOptions[v];
save();
},
},
'Speed': {
value: 0 | speedOptions.indexOf(settings.speed),
min: 0, max: 1,
format: v => speedOptions[v],
onchange: v => {
settings.speed = speedOptions[v];
save();
},
}

View File

@ -3,7 +3,7 @@
"name": "LCARS Clock",
"shortName":"LCARS",
"icon": "lcars.png",
"version":"0.15",
"version":"0.17",
"readme": "README.md",
"supports": ["BANGLEJS2"],
"description": "Library Computer Access Retrieval System (LCARS) clock.",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -10,6 +10,9 @@
<select id="languages" class="form-select">
</select>
</div>
<div class="form-group">
<input id="translations" type="checkbox" /> <label for="translations">Add common language translations like "Yes", "No", "On", "Off"<br/><i>(Not recommended. For translations use the option under <code>More...</code> in the app loader.</i></label>
</div>
<p>Then click <button id="upload" class="btn btn-primary">Upload</button></p>
<script src="../../core/lib/customize.js"></script>
@ -106,12 +109,18 @@ exports = { name : "en_GB", currencySym:"£",
const lang = languageSelector.options[languageSelector.selectedIndex].value;
console.log(`Language ${lang}`);
const translations = document.getElementById('translations').checked;
console.log(`Translations: ${translations}`);
const locale = locales[lang];
if (!locale) {
alert(`Language ${lang} not found!`);
return;
}
if (!translations)
locale.trans = null;
const codePageName = "ISO8859-1";
if (locale.codePage)
codePageName = locale.codePage;

View File

@ -3,7 +3,7 @@
"name": "Pastel Clock",
"shortName": "Pastel",
"version": "0.14",
"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. Requires firmware 2.11.27",
"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",
"dependencies": {"mylocation":"app","weather":"app"},
"screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}],

1
apps/red7game/ChangeLog Normal file
View File

@ -0,0 +1 @@
1.0: Initial version of game

16
apps/red7game/README.md Normal file
View File

@ -0,0 +1,16 @@
# Red 7 Card Game
Play the card game Red 7 on your Bangle.js.
![Screenshot](screenshot.png)
For rules, see [here](https://asmadigames.com/Red7Rules.pdf).
## Usage
Current rule card is shown in center of screen when viewing your hand.
Swipe left to see your palettes and right on the palette screen to go back to your hand. Tap on a card to see it's details and then swipe either left or right to play the card as a rule or a palette card.
Press the watch button to bring up the menu, which you can undo your card plays, end your turn, or start a new game.
## Creator
[Kevin Whitaker](https://www.eyecreate.org)

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A6gAAZFykrqwAXlYwTF4PXAC4v/F/4v/F/4v75O7ABfJF8O0ABfCF8PCABG7F4JfhABXCF4LvsRw4vmZIXQF9YuB3YJGF8heJF8u7LxAvkLwXJF9ZeKF8fQLxQvjLwO0BhIvhLwXCF9fCF4PQF9ReNF8JeNF8IuB3b8LF7/JF4PJF9ZeOF75ePF7/QAAIuMd8IAOF/4v/F/4vWwIAXF6gwBADIuTAH4A/AH4Al"))

BIN
apps/red7game/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

View File

@ -0,0 +1,16 @@
{ "id": "red7game",
"name": "Red 7 Card Game",
"shortName" : "Red 7",
"icon": "icon.png",
"version":"1.0",
"description": "An implementation of the card game Red 7 for your watch. Play against the AI and be the last player still in the game to win!",
"tags": "game",
"supports":["BANGLEJS2"],
"readme": "README.md",
"allow_emulator": true,
"screenshots": [{"url":"screenshot.png"},{"url":"screenshot2.png"}],
"storage": [
{"name":"red7game.app.js","url":"red7.js"},
{"name":"red7game.img","url":"app-icon.js","evaluate":true}
]
}

781
apps/red7game/red7.js Normal file
View File

@ -0,0 +1,781 @@
const colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"];
const colorRank = {"red":6, "orange":5, "yellow":4, "green":3, "blue":2, "indigo":1, "violet":0};
const colorsHex = ["#b01f26", "#d45727", "#cfb82e", "#309c47", "#36aeac", "#2c3a93", "#784298"];
const colorsRules = ["high-\nest\n card", "most\none #", "most\none\ncolor", "most\nevens", "most\nunique\ncolors","most\nin a\nrow", "most\n< 4"];
const numbers = [1,2,3,4,5,6,7];
const handPos = [0,24,24*2,24*3,24*4,24*5,24*6];
function pointRectangleIntersection(p, r) {
return p.x > r.x1 && p.x < r.x2 && p.y > r.y1 && p.y < r.y2;
}
class Card {
constructor(cardNum, cardColor) {
this.cardNum = cardNum;
this.cardColor = cardColor;
this.selected = false;
//this.rect = {};
this.clippedRect = {};
}
get number() {
return this.cardNum;
}
get color() {
return this.cardColor;
}
set isSelected(sel) {
this.selected = sel;
}
get isSelected() {
return this.isSelected;
}
get fullRect() {
return this.rect;
}
get clipRect() {
return this.clippedRect;
}
draw(x,y,outlined) {
this.rect = {x1: x, x2: x+80, y1: y, y2: y+100};
this.clippedRect = {x1: x, x2: x+24, y1: y, y2: y+100};
var colorIndex = colors.indexOf(this.cardColor);
var colorArr = colorsHex[colorIndex];
var colorRule = colorsRules[colorIndex];
g.setColor(colorArr);
g.setBgColor(colorArr);
g.fillRect(x,y,x+80,y+100);
if(outlined) {
g.setColor(0,0,0);
g.drawRect(x,y,x+80,y+100);
}
g.setColor(255,255,255);
g.setFont("Vector:40");
g.setFontAlign(0,0,0);
//g.drawString(this.cardNum,x+40,y+70,true);
g.setFont("6x8:3");
g.drawString(this.cardNum, x+14, y+14, true);
g.setFont("6x8:2");
g.drawString(colorRule, x+45, y+50, true);
g.flip();
}
drawBack(x,y,flipped) {
this.rect = {x1: x, x2: x+80, y1: y, y2: y-100};
this.clippedRect = {x1: x, x2: x+24, y1: y, y2: y-100};
g.setColor(255,255,255);
g.setBgColor(0,0,0);
if(flipped) {
g.fillRect(x,y,x+80,-100);
g.setColor(0,0,0);
g.drawRect(x,y,x+80,-100);
g.setFontAlign(0,0,2);
g.setColor(255,0,0);
g.setBgColor(255,255,255);
g.setFont("Vector:40");
//g.drawString(7,x+40,y-40,true);
} else {
g.fillRect(x,y,x+80,y+100);
g.setColor(0,0,0);
g.drawRect(x,y,x+80,y+100);
g.setFontAlign(0,0,0);
g.setColor(255,0,0);
g.setBgColor(255,255,255);
g.setFont("Vector:40");
//g.drawString(7,x+40,y+40,true);
}
g.flip();
}
drawRot(x,y) {
this.rect = {x1: x, x2: x+45, y1: y, y2: y+110};
var colorIndex = colors.indexOf(this.cardColor);
var colorArr = colorsHex[colorIndex];
var colorRule = colorsRules[colorIndex];
g.setColor(colorArr);
g.setBgColor(colorArr);
g.fillRect(x,y,x+110,y+45);
g.setColor(255,255,255);
g.setFontAlign(0,0,0);
g.setFont("6x8:2");
g.drawString(colorRule, x+55, y+23, true);
g.flip();
}
drawMicro(x,y) {
this.rect = {x1: x, x2: x+20, y1: y, y2: y+20};
var colorIndex = colors.indexOf(this.cardColor);
var colorArr = colorsHex[colorIndex];
g.setColor(colorArr);
g.setBgColor(colorArr);
g.fillRect(x,y,x+20,y+20);
g.setFontAlign(0,0,0);
g.setFont("6x8:2");
g.setColor(255,255,255);
g.drawString(this.cardNum, x+12, y+12, true);
g.flip();
}
isHigher(card) {
if(this.number > card.number) {
return true;
} else if(this.number === card.number) {
if(colorRank[this.color] > colorRank[card.color]) {
return true;
} else {
return false;
}
} else {
return false;
}
}
}
class Hand {
constructor(cards) {
if(typeof cards === "undefined") {
this.hand = [];
} else {
this.hand = cards;
}
}
//Can be single card or array of cards
addCard(card) {
this.hand = this.hand.concat(card);
}
//removes card from hand and returns it
removeCard(card) {
var index = this.hand.indexOf(card);
return this.hand.splice(index,1)[0];
}
get handCards() {
return this.hand;
}
draw(y, outlined) {
var count = 0;
for(let c of this.hand) {
c.draw(handPos[count],y, outlined);
count++;
}
}
drawMicro(x, y) {
var count = 0;
for(let c of this.hand) {
c.drawMicro(x+handPos[count],y);
count++;
}
}
drawBacks(y, flipped) {
var count = 0;
for(let c of this.hand) {
c.drawBack(handPos[count], y, flipped);
count++;
}
}
checkForClick(cord) {
for(let card of this.hand) {
//If last card, you can check the whole rectangle
if(this.hand.indexOf(card) === this.hand.length - 1) {
if(pointRectangleIntersection(cord,card.fullRect)) {
return card;
}
}
else if(pointRectangleIntersection(cord,card.clippedRect)) {
return card;
}
}
}
bestHighestCard() {
if(this.hand.length === 0) {
return undefined;
}
var highestCard = this.hand[0];
this.hand.forEach(function(card){
if(card.isHigher(highestCard)) {
highestCard = card;
}
});
return new Hand(highestCard);
}
allCardsMatchingNumber(number) {
var matchingHand = new Hand();
this.hand.forEach(function(card){
if(card.number === number) {
matchingHand.addCard(card);
}
});
return matchingHand;
}
bestCardsOneNumber() {
if(this.hand.length === 0) {
return undefined;
}
var counts = {'1':0,'2':0,'3':0,'4':0,'5':0,'6':0,'7':0};
this.hand.forEach(function(card){
counts[card.number]++;
});
var highestNumber = '1';
for(let n of Object.keys(counts)) {
if(counts[n] > counts[highestNumber]) {
highestNumber = n;
}
if(counts[n] === counts[highestNumber] && n != highestNumber) {
if(n > highestNumber) {
highestNumber = n;
}
}
}
return this.allCardsMatchingNumber(highestNumber);
}
allCardsMatchingColor(color) {
var matchingHand = new Hand();
this.hand.forEach(function(card) {
if(card.color === color) {
matchingHand.addCard(card);
}
});
return matchingHand;
}
bestCardsOneColor() {
if(this.hand.length === 0) {
return undefined;
}
var counts = {'red':0, 'orange':0, 'yellow':0, 'green':0, 'blue':0, 'indigo':0, 'violet':0};
this.hand.forEach(function(card){
counts[card.color]++;
});
var highestColor = 'red';
for(let n of Object.keys(counts)) {
if(counts[n] > counts[highestColor]) {
highestColor = n;
}
if(counts[n] === counts[highestColor] && n != highestColor && counts[highestColor] > 0) {
var h1 = this.allCardsMatchingColor(n);
var h2 = this.allCardsMatchingColor(highestColor);
if(h1.bestHighestCard().handCards.isHigher(h2.bestHighestCard().handCards)) {
highestColor = n;
}
}
}
return this.allCardsMatchingColor(highestColor);
}
bestEvenCards() {
if(this.hand.length === 0) {
return undefined;
}
var matchingHand = new Hand();
this.hand.forEach(function(card){
if(card.number % 2 === 0) {
matchingHand.addCard(card);
}
});
return matchingHand;
}
bestCardsDiffColors() {
if(this.hand.length === 0) {
return undefined;
}
var cloneHand = new Hand();
for(let c of this.handCards) {
cloneHand.addCard(c);
}
var diffHand = new Hand();
diffHand.addCard(cloneHand.bestHighestCard().handCards);
cloneHand.removeCard(cloneHand.bestHighestCard().handCards);
while(cloneHand.handCards.length > 0) {
var highCard = cloneHand.bestHighestCard().handCards;
var colorExists = false;
diffHand.handCards.forEach(function(card){
if(card.color === highCard.color) {
colorExists = true;
}
});
if(!colorExists) {
diffHand.addCard(highCard);
}
cloneHand.removeCard(highCard);
}
return diffHand;
}
bestRun() {
if(this.hand.length === 0) {
return undefined;
}
var runs = {1:0,2:0,3:0,4:0,5:0,6:0,7:0};
var highestCard = {0:new Card(0,"violet"),1:new Card(0,"violet"),2:new Card(0,"violet"),3:new Card(0,"violet"),4:new Card(0,"violet"),5:new Card(0,"violet"),6:new Card(0,"violet"),7:new Card(0,"violet")};
var hands = {0:new Hand(),1:new Hand(),2:new Hand(),3:new Hand(),4:new Hand(),5:new Hand(),6:new Hand(),7:new Hand()};
for(let start = 1; start < 8; start++) {
//check length of run starting from each number
var currentLen = 0;
var highCard = new Card(0,"violet");
for(let num = start; num < 8; num++) {
var hasNum = false;
var matchingCard = undefined;
this.hand.forEach(function(card){
if(card.number === num) {
hasNum = true;
if(matchingCard != undefined) {
if(card.isHigher(matchingCard)) {
matchingCard = card;
}
} else {
matchingCard = card;
}
}
});
if(hasNum) {
currentLen++;
hands[start].addCard(matchingCard);
highCard = matchingCard;
} else {
break;
}
}
runs[start] = currentLen;
highestCard[start] = highCard;
}
//determine best run
var highestRun = 0;
var highestCount = 0;
for(let n = 1; n < 8; n++) {
if(runs[n] > highestCount) {
highestRun = n;
highestCount = runs[n];
} else if (runs[n] === highestCount) {
if(highestCard[n].isHigher(highestCard[highestRun])) {
highestRun = n;
highestCount = runs[n];
}
}
}
return hands[highestRun];
}
bestCardsBelow4() {
if(this.hand.length === 0) {
return undefined;
}
var matchingHand = new Hand();
this.hand.forEach(function(card){
if(card.number < 4) {
matchingHand.addCard(card);
}
});
return matchingHand;
}
}
function isWinningCombo(ruleCard, palette, otherPalette) {
//The rules of red7 say that you are winning if you match the rule better than anyone else(more cards match rule with highest card in match breaking ties).
switch(ruleCard.color) {
case "red":
if(palette.bestHighestCard().handCards.isHigher(otherPalette.bestHighestCard().handCards)) return true;
break;
case "orange":
var best1 = palette.bestCardsOneNumber();
var best2 = otherPalette.bestCardsOneNumber();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
case "yellow":
var best1 = palette.bestCardsOneColor();
var best2 = otherPalette.bestCardsOneColor();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
case "green":
var best1 = palette.bestEvenCards();
var best2 = otherPalette.bestEvenCards();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.handCards.length === 0) {
return false;
}
else if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
case "blue":
var best1 = palette.bestCardsDiffColors();
var best2 = otherPalette.bestCardsDiffColors();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
case "indigo":
var best1 = palette.bestRun();
var best2 = otherPalette.bestRun();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
case "violet":
var best1 = palette.bestCardsBelow4();
var best2 = otherPalette.bestCardsBelow4();
if(best1.handCards.length >= best2.handCards.length) {
if(best1.handCards.length === best2.handCards.length) {
if(best1.handCards.length === 0) {
return false;
}
else if(best1.bestHighestCard().handCards.isHigher(best2.bestHighestCard().handCards)) {
return true;
}
} else {
return true;
}
}
break;
}
return false;
}
function canPlay(hand, palette, otherPalette) {
var clonePalette = new Hand();
for(let c of palette) {
clonePalette.addCard(c);
}
//Check if any card to palette can win first.
for(let c of hand.handCards) {
clonePalette.addCard(c);
if(isWinningCombo(ruleCards.handCards[ruleCards.handCards.length-1],clonePalette, otherPalette)) {
return true;
}
clonePalette.removeCard(c);
}
//Next check for wins with rule change.
for(let c of hand.handCards) {
if(isWinningCombo(c, clonePalette, otherPalette)) {
return true;
} else {
//Check if any palette play can win with rule.
for(let h of hand.handCards) {
if(h === c) {}
else {
clonePalette.addCard(c);
if(isWinningCombo(c, clonePalette, otherPalette)) {
return true;
}
clonePalette.removeCard(c);
}
}
}
}
return false;
}
class AI {
constructor(hand, palette) {
this.hand = hand;
this.palette = palette;
}
takeTurn(ruleStack, otherPalette) {
var clonePalette = new Hand();
for(let c of this.palette) {
clonePalette.addCard(c);
}
//Check if any card to palette can win first.
for(let c of this.hand.handCards) {
clonePalette.addCard(c);
if(isWinningCombo(ruleStack.handCards[ruleStack.handCards.length-1],clonePalette, otherPalette)) {
//Play card that wins
this.palette.addCard(c);
this.hand.removeCard(c);
return true;
}
clonePalette.removeCard(c);
}
//Next check for wins with rule change.
for(let c of this.hand.handCards) {
if(isWinningCombo(c, clonePalette, otherPalette)) {
//Play rule card that wins
ruleStack.addCard(c);
this.hand.removeCard(c);
return true;
} else {
//Check if any palette play can win with rule.
for(let h of this.hand.handCards) {
if(h === c) {}
else {
clonePalette.addCard(c);
if(isWinningCombo(c, clonePalette, otherPalette)) {
ruleStack.addCard(c);
this.hand.removeCard(c);
this.palette.addCard(h);
this.hand.removeCard(h);
return true;
}
clonePalette.removeCard(c);
}
}
}
}
return false;
}
}
function shuffleDeck(deckArray) {
E.srand(Date.now());
deckArray.sort(() => Math.random() - 0.5);
}
var deck = [];
var screen = 1;
var startedGame = false;
var playerHand = new Hand();
var playerPalette = new Hand();
var AIhand = new Hand();
var AIPalette = new Hand();
var ruleCards = new Hand();
var undoStack = [];
var aiPlayer = new AI(AIhand, AIPalette);
function drawScreen1_2(card) {
Bangle.removeAllListeners("touch");
Bangle.removeAllListeners("swipe");
//determine what actions can be taken
var playedRule = false;
var playedPalette = false;
for(let stack of undoStack) {
if(stack.to === ruleCards) {
playedRule = true;
}
if(stack.to === playerPalette) {
playedPalette = true;
}
}
Bangle.on('swipe', function(direction){
if(direction === -1 && !playedRule) {
undoStack.push({from:playerHand,to:ruleCards,card:card});
ruleCards.addCard(card);
playerHand.removeCard(card);
drawScreen1();
}
if(direction === 1 && !playedPalette) {
undoStack.push({from:playerHand,to:playerPalette,card:card});
playerPalette.addCard(card);
playerHand.removeCard(card);
drawScreen1();
}
});
Bangle.on("touch", function(z,cord){
if(!pointRectangleIntersection(cord, card.fullRect)) {
drawScreen1();
}
});
//draw elements
g.setBgColor(0,0,0);
g.clear();
playerHand.draw(130, true);
AIhand.drawBacks(40, true);
card.draw(47,47,true);
g.setColor(255,255,255);
if(!playedRule) g.fillPoly([20,50,20,70,40,70,40,90,20,90,20,110,0,80]);
if(!playedPalette) g.fillPoly([155,50,155,70,135,70,135,90,155,90,155,110,175,80]);
g.setFont("4x6:1");
g.setBgColor(255,255,255);
g.setColor(0,0,0);
if(!playedRule) g.drawString("Rule", 20,80, true);
if(!playedPalette) g.drawString("Palette", 155,80, true);
}
function drawScreen1() {
Bangle.removeAllListeners("touch");
Bangle.removeAllListeners("swipe");
Bangle.on('swipe', function(direction){
if(direction === -1) {
drawScreen2();
screen = 2;
} else if(direction === 1) {
drawScreen1();
screen = 1;
}
});
g.setBgColor(0,0,0);
g.clear();
playerHand.draw(130, true);
Bangle.on("touch", function(z,cord){
var card = playerHand.checkForClick(cord);
if (card !== undefined) {
drawScreen1_2(card);
}
});
AIhand.drawBacks(40, true);
//Draw win indicator
var winning = isWinningCombo(ruleCards.handCards[ruleCards.handCards.length-1], playerPalette, AIPalette);
winning ? g.setColor(0,255,0) : g.setColor(255,0,0);
g.fillEllipse(50,50,130,70);
g.setFont("4x6:2");
g.setFontAlign(0,0,0);
g.setColor(255,255,255);
winning ? g.setBgColor(0,255,0) : g.setBgColor(255,0,0);
g.drawString(winning ? "Winning" : "Losing", 90,60, true);
//Draw current rule
var rules = ruleCards.handCards;
if(rules.length > 0) {
rules[rules.length-1].drawRot(40,80);
}
}
function drawScreen2() {
Bangle.removeAllListeners("touch");
g.setBgColor(0,0,0);
g.clear();
g.setColor(255,255,255);
g.setFont("6x8:2");
g.setFontAlign(0,0,0);
g.drawString("AI Palette",85,40,false);
g.drawString("Your Palette", 85, 130, false);
playerPalette.drawMicro(5,150);
AIPalette.drawMicro(5,0);
}
function drawScreenHelp() {
E.showAlert("Rules can be found on asmadigames.com").then(function(){drawMainMenu();});
}
function drawGameOver(win) {
E.showAlert(win ? "AI has given up. You Win!" : "You cannot play. AI wins.").then(function(){
startedGame = false;
undoStack = [];
drawMainMenu();
});
}
function finishTurn() {
undoStack = [];
//Check if AI has cards
if(AIhand.handCards.length === 0) {
drawGameOver(true);
} else {
var takenTurn = aiPlayer.takeTurn(ruleCards, playerPalette);
//Check if game over conditions met.
if(!takenTurn) {
drawGameOver(true);
} else if(playerHand.handCards.length === 0) {
drawGameOver(false);
} else if(!canPlay(playerHand, playerPalette, AIPalette)) {
console.log("no play");
//drawGameOver(false);
drawScreen1();
} else {
E.showMenu();
drawScreen1();
}
}
}
function resetToNewGame() {
g.setBgColor(0,0,0);
g.clear();
deck = [];
//Fill deck with cards
for(let c of colors) {
for(let n of numbers) {
deck.push(new Card(n,c));
}
}
shuffleDeck(deck);
playerHand = new Hand();
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerHand.addCard(deck.pop());
playerPalette = new Hand();
playerPalette.addCard(deck.pop());
AIhand = new Hand();
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIhand.addCard(deck.pop());
AIPalette = new Hand();
AIPalette.addCard(deck.pop());
ruleCards = new Hand();
ruleCards.addCard(new Card(0,"red"));
undoStack = [];
startedGame = true;
aiPlayer = new AI(AIhand, AIPalette);
//determine first player
if(isWinningCombo(new Card(0,"red"), playerPalette, AIPalette)) {
//AI needs to play first
finishTurn();
} else {
drawScreen1();
}
}
function drawMainMenu() {
Bangle.removeAllListeners("touch");
Bangle.removeAllListeners("swipe");
var menu = {"": {"title":"Red 7"}};
if(startedGame === true) {
menu["Continue"] = function(){
E.showMenu();
drawScreen1();
};
if(undoStack.length > 0) {
menu["Undo Turn"] = function(){
for(let stack of undoStack) {
stack.from.addCard(stack.card);
stack.to.removeCard(stack.card);
}
undoStack = [];
E.showMenu();
drawScreen1();
};
}
if(isWinningCombo(ruleCards.handCards[ruleCards.handCards.length-1], playerPalette, AIPalette)) {
menu["Finish Turn"] = function(){
finishTurn();
};
}
}
menu["New Game"] = function() {
E.showMenu();
resetToNewGame();
};
menu["Help"] = function() {
drawScreenHelp();
};
menu["Exit"] = function() {
E.showMenu();
setTimeout(load,300);
};
E.showMenu(menu);
}
drawMainMenu();
setWatch(function(){
drawMainMenu();
},BTN, {edge: "rising", debounce: 50, repeat: true});

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,2 +1,3 @@
0.01: New App!
0.02: Change color from red->yellow to ease readability (fix #710)
0.03: Color/positioning change to allow it to work with Bangle.js 1 (although not pretty)

View File

@ -17,7 +17,7 @@
<li>Go to <a href="https://umap.openstreetmap.fr/en/">https://umap.openstreetmap.fr/en/</a></li>
<li>Create a map</li>
<li>Draw a polyline (right hand side)</li>
<li>Embed and share (leb>ft hand side)</li>
<li>Embed and share (left hand side)</li>
<li>Download data as KML</li>
</ul>
@ -104,141 +104,146 @@ document.getElementById('fileLoader').addEventListener('change', handleFileSelec
document.getElementById("upload").addEventListener("click", function() {
var app = `${js}
var gcoords = new Uint8Array(coords.length);
var coordDistance = new Uint16Array(coords.length/2);
var gcoords = new Uint8Array(coords.length);
var coordDistance = new Uint16Array(coords.length/2);
var colHL = g.theme.dark ? "#FF0" : "#00F";
var W = g.getWidth(), H = g.getHeight();
var PT_DISTANCE = 30; // distance to a point before we consider it complete
var PT_DISTANCE = 30; // distance to a point before we consider it complete
function toScr(p) {
return {
x : 10 + (p.x-min.x)*100/(max.x-min.x),
y : 230 - (p.y-min.y)*100/(max.y-min.y)
};
}
var last;
var totalDistance = 0;
for (var i=0;i<coords.length;i+=2) {
var c = {x:coords[i],y:coords[i+1]};
var s = toScr(c);
gcoords[i ] = s.x;
gcoords[i+1] = s.y;
if (last) {
var dx = c.x-last.x;
var dy = c.y-last.y;
totalDistance += Math.sqrt(dx*dx+dy*dy)*coordScale;
coordDistance[i/2] = totalDistance;
}
last = c;
}
var fix, lastFix;
var nextPtIdx = 0; // 2x the number of points
var nextPt = {x:coords[nextPtIdx], y:coords[nextPtIdx+1]};
var nextAngle = 0;
var nextDist = 0;
var currentDist = 0;
function drawMap() {
g.clearRect(0,0,239,120);
g.setFontAlign(0,0);
g.setColor(1,1,0);
g.setFontVector(40);
g.drawString((currentDist===undefined)?"?":(Math.round(currentDist)+"m"), 160, 30);
g.setColor(1,1,1);
g.setFont("6x8",2);
g.drawString(Math.round(totalDistance)+"m", 160, 70);
g.drawString((nextPtIdx/2)+"/"+coordDistance.length, 50, 20);
if (!fix.fix) {
g.setColor(1,1,0);
g.drawString("No GPS", 50, 50);
g.setFont("6x8",1);
g.drawString(fix.satellites+" Sats", 50, 70);
function toScr(p) {
return {
x : 10 + (p.x-min.x)*100/(max.x-min.x),
y : H - 10 - (p.y-min.y)*100/(max.y-min.y)
};
}
if (lastFix && lastFix.fix) {
g.setColor(0,0,0);
g.drawCircle(lastFix.s.x,lastFix.s.y,10);
var last;
var totalDistance = 0;
for (var i=0;i<coords.length;i+=2) {
var c = {x:coords[i],y:coords[i+1]};
var s = toScr(c);
gcoords[i ] = s.x;
gcoords[i+1] = s.y;
if (last) {
var dx = c.x-last.x;
var dy = c.y-last.y;
totalDistance += Math.sqrt(dx*dx+dy*dy)*coordScale;
coordDistance[i/2] = totalDistance;
}
last = c;
}
var c1 = g.toColor(1,1,0);
var c2 = g.toColor(0.7,0.7,0.7);
for (var i=0;i<gcoords.length;i+=2)
g.setColor((i<=nextPtIdx) ? c1 : c2).fillRect(gcoords[i]-2,gcoords[i+1]-2,gcoords[i]+2,gcoords[i+1]+2);
g.setColor(1,1,0); // first part of path
g.drawPoly(new Uint8Array(gcoords.buffer, 0, nextPtIdx+2));
g.setColor(1,1,1); // remaining part of path
g.drawPoly(new Uint8Array(gcoords.buffer, nextPtIdx));
var fix, lastFix;
var nextPtIdx = 0; // 2x the number of points
var nextPt = {x:coords[nextPtIdx], y:coords[nextPtIdx+1]};
var nextAngle = 0;
var nextDist = 0;
var currentDist = 0;
if (fix && fix.fix) {
g.setColor(1,1,0);
g.drawCircle(fix.s.x,fix.s.y,10);
function drawMap() {
var R = W*180/240;
var L = W*50/240;
g.clearRect(0,0,W,H/2);
g.setFontAlign(0,0);
g.setColor(colHL);
g.setFontVector(40);
g.drawString((currentDist===undefined)?"?":(Math.round(currentDist)+"m"), R, 30);
g.setColor(g.theme.fg);
g.setFont("6x8",2);
g.drawString(Math.round(totalDistance)+"m", R, 70);
g.drawString((nextPtIdx/2)+"/"+coordDistance.length, L, 20);
if (!fix.fix) {
g.setColor(colHL);
g.drawString("No GPS", L, 50);
g.setFont("6x8",1);
g.drawString(fix.satellites+" Sats", L, 70);
}
if (lastFix && lastFix.fix) {
g.setColor(g.theme.bg);
g.drawCircle(lastFix.s.x,lastFix.s.y,10);
}
var c1 = g.toColor(colHL);
var c2 = g.toColor("#888");
for (var i=0;i<gcoords.length;i+=2)
g.setColor((i<=nextPtIdx) ? c1 : c2).fillRect(gcoords[i]-2,gcoords[i+1]-2,gcoords[i]+2,gcoords[i+1]+2);
g.setColor(colHL); // first part of path
g.drawPoly(new Uint8Array(gcoords.buffer, 0, nextPtIdx+2));
g.setColor(g.theme.fg); // remaining part of path
g.drawPoly(new Uint8Array(gcoords.buffer, nextPtIdx));
if (fix && fix.fix) {
g.setColor(colHL);
g.drawCircle(fix.s.x,fix.s.y,10);
}
lastFix = fix;
}
lastFix = fix;
}
function getNextPtInfo() {
var dx = nextPt.x - fix.p.x;
var dy = nextPt.y - fix.p.y;
nextAngle = Math.atan2(dx,dy)*180/Math.PI;
nextDist = Math.sqrt(dx*dx+dy*dy)*coordScale;
}
function getNextPtInfo() {
var dx = nextPt.x - fix.p.x;
var dy = nextPt.y - fix.p.y;
nextAngle = Math.atan2(dx,dy)*180/Math.PI;
nextDist = Math.sqrt(dx*dx+dy*dy)*coordScale;
}
function onGPS(f) {
fix = f;
fix.p = Bangle.project(fix);
fix.s = toScr(fix.p);
getNextPtInfo();
if ((nextDist < PT_DISTANCE) &&
(nextPtIdx < coords.length)) {
nextPtIdx+=2;
nextPt = {x:coords[nextPtIdx], y:coords[nextPtIdx+1]};
function onGPS(f) {
fix = f;
fix.p = Bangle.project(fix);
fix.s = toScr(fix.p);
getNextPtInfo();
}
// work out how far we are (based on distance to next point)
if (!fix.fix) {
currentDist = undefined
} else if (nextPtIdx+2 < coordDistance.length) {
currentDist = coordDistance[1+(nextPtIdx/2)] - nextDist;
} else if (nextPtIdx+2 == coordDistance.length) {
currentDist = totalDistance - nextDist;
} else {
currentDist = totalDistance;
if ((nextDist < PT_DISTANCE) &&
(nextPtIdx < coords.length)) {
nextPtIdx+=2;
nextPt = {x:coords[nextPtIdx], y:coords[nextPtIdx+1]};
getNextPtInfo();
}
// work out how far we are (based on distance to next point)
if (!fix.fix) {
currentDist = undefined
} else if (nextPtIdx+2 < coordDistance.length) {
currentDist = coordDistance[1+(nextPtIdx/2)] - nextDist;
} else if (nextPtIdx+2 == coordDistance.length) {
currentDist = totalDistance - nextDist;
} else {
currentDist = totalDistance;
}
if (!Bangle.isLCDOn()) return;
drawMap();
}
if (!Bangle.isLCDOn()) return;
drawMap();
}
function arrow(r,c) {
r=r*Math.PI/180;
var p = Math.PI*3/4;
g.setColor(c);
g.fillPoly([
180+40*Math.sin(r), 180-40*Math.cos(r),
180+20*Math.sin(r+p), 180-20*Math.cos(r+p),
180-10*Math.sin(r), 180+10*Math.cos(r),
180+20*Math.sin(r+-p), 180-20*Math.cos(r-p),
]);
}
function arrow(r,c) {
r=r*Math.PI/180;
var p = Math.PI*3/4;
g.setColor(c);
g.fillPoly([
180+40*Math.sin(r), 180-40*Math.cos(r),
180+20*Math.sin(r+p), 180-20*Math.cos(r+p),
180-10*Math.sin(r), 180+10*Math.cos(r),
180+20*Math.sin(r+-p), 180-20*Math.cos(r-p),
]);
}
function onCompass(m) {
if (!Bangle.isLCDOn()) return;
function onCompass(m) {
if (!Bangle.isLCDOn()) return;
arrow(oldHeading,0);
var heading = m.heading + nextAngle;
arrow(heading,0xF800);
oldHeading = heading;
}
arrow(oldHeading,g.theme.bg);
var heading = m.heading + nextAngle;
arrow(heading,"#f00");
oldHeading = heading;
}
// draw the heading
var oldHeading = 0;
Bangle.on('GPS', onGPS);
Bangle.on('mag', onCompass);
Bangle.setGPSPower(1);
Bangle.setCompassPower(1);
g.clear();
// draw the heading
var oldHeading = 0;
Bangle.on('GPS', onGPS);
Bangle.on('mag', onCompass);
Bangle.setGPSPower(1);
Bangle.setCompassPower(1);
g.clear();
`;
sendCustomizedApp({

View File

@ -1,11 +1,11 @@
{
"id": "route",
"name": "Route Viewer",
"version": "0.02",
"version": "0.03",
"description": "Upload a KML file of a route, and have your watch display a map with how far around it you are",
"icon": "app.png",
"tags": "",
"supports": ["BANGLEJS"],
"supports": ["BANGLEJS","BANGLEJS2"],
"custom": "custom.html",
"storage": [
{"name":"route.app.js"},

View File

@ -188,7 +188,7 @@ function showBLEMenu() {
},
/*LANG*/'HID': {
value: Math.max(0,0 | hidV.indexOf(settings.HID)),
min: 0, max: 3,
min: 0, max: hidN.length-1,
format: v => hidN[v],
onchange: v => {
settings.HID = hidV[v];

2
apps/sleeplog/ChangeLog Normal file
View File

@ -0,0 +1,2 @@
0.01: New App!
0.02: Fix crash on start

142
apps/sleeplog/README.md Normal file
View File

@ -0,0 +1,142 @@
# Sleep Log
This app logs and displays the four following states:
_unknown, not worn, awake, sleeping_
It derived from the [SleepPhaseAlarm](https://banglejs.com/apps/#sleepphasealarm) and uses the accelerometer to estimate sleep and wake states with the principle of Estimation of Stationary Sleep-segments ([ESS](https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en)) and the internal temperature to decide _sleeping_ or _not worn_ when the watch is resting.
#### Operating Principle
* __ESS calculation__
The accelerometer polls values with 12.5Hz. On each poll the magnitude value is saved. When 13 values are collected, every 1.04 seconds, the standard deviation over this values is calculated.
Is the calculated standard deviation lower than the "no movement" threshold (__NoMoThresh__) a "no movement" counter is incremented. Each time the "no movement" threshold is reached the "no movement" counter will be reset.
When the "no movement" counter reaches the sleep threshold the watch is considered as resting. (The sleep threshold is calculated from the __MinDuration__ setting, Example: _sleep threshold = MinDuration * 60 / calculation interval => 10min * 60s/min / 1.04s ~= 576,9 rounded up to 577_)
To check if a resting watch indicates as sleeping, the internal temperature must be greater than the temperature threshold (__TempThresh__). Otherwise the watch is considered as not worn.
* __True Sleep__
The true sleep value is a simple addition of all registert sleeping periods.
* __Consecutive Sleep__
In addition the consecutive sleep value tries to predict the complete time you were asleep, even the light sleeping phases with registered movements. All periods after a sleeping period will be summarized til the first following non sleeping period that is longer then the maximal awake duration (__MaxAwake__). If this sum is lower than the minimal consecutive sleep duration (__MinConsec__) it is not considered, otherwise it will be added to the consecutive sleep value.
* __Logging__
To minimize the log size only a changed state is logged.
---
### Control
---
* __Swipe__
Swipe left/right to display the previous/following day.
* __Touch__ / __BTN__
Touch the screen to open the settings menu to exit or change settings.
---
### Settings
---
* __BreakTod__ break at time of day
_0_ / _1_ / _..._ / __10__ / _..._ / _12_
Change time of day on wich the lower graph starts and the upper graph ends.
* __MaxAwake__ maximal awake duration
_15min_ / _20min_ / _..._ / __60min__ / _..._ / _120min_
Adjust the maximal awake duration upon the exceeding of which aborts the consecutive sleep period.
* __MinConsec__ minimal consecutive sleep duration
_15min_ / _20min_ / _..._ / __30min__ / _..._ / _120min_
Adjust the minimal consecutive sleep duration that will be considered for the consecutive sleep value.
* __TempThresh__ temperature threshold
_20°C_ / _20.5°C_ / _..._ / __25°C__ / _..._ / _40°C_
The internal temperature must be greater than this threshold to log _sleeping_, otherwise it is _not worn_.
* __NoMoThresh__ no movement threshold
_0.006_ / _0.007_ / _..._ / __0.012__ / _..._ / _0.020_
The standard deviation over the measured values needs to be lower then this threshold to count as not moving.
The defaut threshold value worked best for my watch. A threshold value below 0.008 may get triggert by noise.
* __MinDuration__ minimal no movement duration
_5min_ / _6min_ / _..._ / __10min__ / _..._ / _15min_
If no movement is detected for this duration, the watch is considered as resting.
* __Enabled__
__on__ / _off_
En-/Disable the service (all background activities). _Saves battery, but might make this app useless._
* __Logfile__
__default__ / _off_
En-/Disable logging by setting the logfile to _sleeplog.log_ / _undefined_.
If the logfile has been customized it is displayed with _custom_.
---
### Global Object and Module Functions
---
For easy access from the console or other apps the following parameters, values and functions are noteworthy:
```
>global.sleeplog
={
enabled: true, // bool / service status indicator
logfile: "sleeplog.log", // string / used logfile
resting: false, // bool / indicates if the watch is resting
status: 2, // int / actual status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping
firstnomodate: 1644435877595, // number / Date.now() from first recognised no movement
stop: function () { ... }, // funct / stops the service until the next load()
start: function () { ... }, // funct / restarts the service
...
}
>require("sleeplog")
={
setEnabled: function (enable, logfile) { ... },
// en-/disable the service and/or logging
// * enable / bool / service status to change to
// * logfile / bool or string
// - true = enables logging to "sleeplog.log"
// - "some_file.log" = enables logging to "some_file.log"
// - false = disables logging
// returns: bool or undefined
// - true = changes executed
// - false = no changes needed
// - undefined = no global.sleeplog found
readLog: function (since, until) { ... },
// read the raw log data for a specific time period
// * since / Date or number / startpoint of period
// * until / Date or number / endpoint of period
// returns: array
// * [[number, int, string], [...], ... ] / sorting: latest first
// - number // timestamp in ms
// - int // status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping
// - string // additional information
// * [] = no data available or global.sleeplog found
getReadableLog: function (printLog, since, until) { ... }
// read the log data as humanreadable string for a specific time period
// * since / Date or number / startpoint of period
// * until / Date or number / endpoint of period
// returns: string
// * "{substring of ISO date} - {status} for {duration}min\n...", sorting: latest last
// * undefined = no data available or global.sleeplog found
restoreLog: function (logfile) { ... }
// eliminate some errors inside a specific logfile
// * logfile / string / name of the logfile that will be restored
// returns: int / number of changes that were made
reinterpretTemp: function (logfile, tempthresh) { ... }
// reinterpret worn status based on given temperature threshold
// * logfile / string / name of the logfile
// * tempthresh / float / new temperature threshold
// returns: int / number of changes that were made
}
```
---
### Worth Mentioning
---
#### To do list
* Send the logged information to Gadgetbridge.
_(For now I have no idea how to achieve this, help is appreciated.)_
* Calculate and display overall sleep statistics.
#### Requests, Bugs and Feedback
Please leave requests and bug reports by raising an issue at [github.com/storm64/BangleApps](https://github.com/storm64/BangleApps) or send me a [mail](mailto:banglejs@storm64.de).
#### Creator
Storm64 ([Mail](mailto:banglejs@storm64.de), [github](https://github.com/storm64))
#### Contributors
nxdefiant ([github](https://github.com/nxdefiant))
#### Attributions
* ESS calculation based on nxdefiant interpretation of the following publication by:
Marko Borazio, Eugen Berlin, Nagihan Kücükyildiz, Philipp M. Scholl and Kristof Van Laerhoven
[Towards a Benchmark for Wearable Sleep Analysis with Inertial Wrist-worn Sensing Units](https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en),
ICHI 2014, Verona, Italy, IEEE Press, 2014.
* Icons used in this app are from [https://icons8.com](https://icons8.com).
#### License
[MIT License](LICENSE)

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEw4cA///4H8m2ZtVN/nl1P9vXXBoJT/AGcbtuwCJ3btu2CBsG7fZ23ACJk2CIXYCBcB2w1C7YRO/oR/CKp9CCIJ9MUIQRBUI8CpMgYpwRGdJQRGABQRUhdtCJ9btugCJsiM4O0kmSpICFCKJUCCMpZDCJx9CCJsyBIQRxBpACDyAR/CJZeCAA8BCPIA/AFQ"))

194
apps/sleeplog/app.js Normal file
View File

@ -0,0 +1,194 @@
// set storage and define settings
var storage = require("Storage");
var breaktod, maxawake, minconsec;
// read required settings from storage
function readSettings(settings) {
breaktod = settings.breaktod || (settings.breaktod === 0 ? 0 : 10); // time of day when to start/end graphs
maxawake = settings.maxawake || 36E5; // 60min in ms
minconsec = settings.minconsec || 18E5; // 30min in ms
}
// define draw log function
function drawLog(topY, viewUntil) {
// set default view time
viewUntil = viewUntil || Date();
// define parameters
var statusValue = [0, 0.4, 0.6, 1]; // unknown, not worn, awake, sleeping, consecutive sleep
var statusColor = [0, 63488, 2016, 32799, 31]; // black, red, green, violet, blue
var period = 432E5; // 12h
var graphHeight = 18;
var labelHeight = 12;
var width = g.getWidth();
var timestamp0 = viewUntil.valueOf() - period;
var y = topY + graphHeight;
// read 12h wide log
var log = require("sleeplog").readLog(timestamp0, viewUntil.valueOf());
// format log array if not empty
if (log.length) {
// if the period goes into the future add unknown status at the beginning
if (viewUntil > Date()) log.unshift([Date().valueOf(), 0]);
// check if the period goes earlier than logged data
if (log[log.length - 1][0] < timestamp0) {
// set time of last entry according to period
log[log.length - 1][0] = timestamp0;
} else {
// add entry with unknown status at the end
log.push([timestamp0, 0]);
}
// remap each element to [status, relative beginning, relative end, duration]
log = log.map((element, index) => [
element[1],
element[0] - timestamp0,
(log[index - 1] || [viewUntil.valueOf()])[0] - timestamp0,
(log[index - 1] || [viewUntil.valueOf()])[0] - element[0]
]);
// start with the oldest entry to build graph left to right
log.reverse();
}
// clear area
g.reset().clearRect(0, topY, width, y + labelHeight);
// draw x axis
g.drawLine(0, y + 1, width, y + 1);
// draw x label
var hours = period / 36E5;
var stepwidth = width / hours;
var startHour = 24 + viewUntil.getHours() - hours;
for (var x = 0; x < hours; x++) {
g.fillRect(x * stepwidth, y + 2, x * stepwidth, y + 4);
g.setFontAlign(-1, -1).setFont("6x8")
.drawString((startHour + x) % 24, x * stepwidth, y + 6);
}
// define variables for sleep calculation
var consecutive = 0;
var output = [0, 0]; // [estimated, true]
var i, nosleepduration;
// draw graph
log.forEach((element, index) => {
// set bar color depending on type
g.setColor(statusColor[consecutive ? 4 : element[0]]);
// check for sleeping status
if (element[0] === 3) {
// count true sleeping hours
output[1] += element[3];
// count duration of subsequent non sleeping periods
i = index + 1;
nosleepduration = 0;
while (log[i] !== undefined && log[i][0] < 3 && nosleepduration < maxawake) {
nosleepduration += log[i++][3];
}
// check if counted duration lower than threshold to start/stop counting
if (log[i] !== undefined && nosleepduration < maxawake) {
// start counting consecutive sleeping hours
consecutive += element[3];
// correct color to match consecutive sleeping
g.setColor(statusColor[4]);
} else {
// check if counted consecutive sleeping greater then threshold
if (consecutive >= minconsec) {
// write verified consecutive sleeping hours to output
output[0] += consecutive + element[3];
} else {
// correct color to display a canceled consecutive sleeping period
g.setColor(statusColor[3]);
}
// stop counting consecutive sleeping hours
consecutive = 0;
}
} else {
// count durations of non sleeping periods for consecutive sleeping
if (consecutive) consecutive += element[3];
}
// calculate points
var x1 = Math.ceil(element[1] / period * width);
var x2 = Math.floor(element[2] / period * width);
var y2 = y - graphHeight * statusValue[element[0]];
// draw bar
g.clearRect(x1, topY, x2, y);
g.fillRect(x1, y, x2, y2).reset();
if (y !== y2) g.fillRect(x1, y2, x2, y2);
});
// clear variables
log = undefined;
// return convert output into minutes
return output.map(value => value /= 6E4);
}
// define draw night to function
function drawNightTo(prevDays) {
// calculate 10am of this or a previous day
var date = Date();
date = Date(date.getFullYear(), date.getMonth(), date.getDate() - prevDays, breaktod);
// get width
var width = g.getWidth();
// clear app area
g.clearRect(0, 24, width, width);
// define variable for sleep calculation
var outputs = [0, 0]; // [estimated, true]
// draw log graphs and read outputs
drawLog(110, date).forEach(
(value, index) => outputs[index] += value);
drawLog(145, Date(date.valueOf() - 432E5)).forEach(
(value, index) => outputs[index] += value);
// reduce date by 1s to ensure correct headline
date = Date(date.valueOf() - 1E3);
// draw headline, on red bg if service or loggging disabled
g.setColor(global.sleeplog && sleeplog.enabled && sleeplog.logfile ? g.theme.bg : 63488);
g.fillRect(0, 30, width, 66).reset();
g.setFont("12x20").setFontAlign(0, -1);
g.drawString("Night to " + require('locale').dow(date, 1) + "\n" +
require('locale').date(date, 1), width / 2, 30);
// draw outputs
g.reset(); // area: 0, 70, width, 105
g.setFont("6x8").setFontAlign(-1, -1);
g.drawString("consecutive\nsleeping", 10, 70);
g.drawString("true\nsleeping", 10, 90);
g.setFont("12x20").setFontAlign(1, -1);
g.drawString(Math.floor(outputs[0] / 60) + "h " +
Math.floor(outputs[0] % 60) + "min", width - 10, 70);
g.drawString(Math.floor(outputs[1] / 60) + "h " +
Math.floor(outputs[1] % 60) + "min", width - 10, 90);
}
// define function to draw and setup UI
function startApp() {
readSettings(storage.readJSON("sleeplog.json", true) || {});
drawNightTo(prevDays);
Bangle.setUI("leftright", (cb) => {
if (!cb) {
eval(storage.read("sleeplog.settings.js"))(startApp);
} else if (prevDays + cb >= -1) {
drawNightTo((prevDays += cb));
}
});
}
// define day to display
var prevDays = 0;
// setup app
g.clear();
Bangle.loadWidgets();
Bangle.drawWidgets();
// start app
startApp();

BIN
apps/sleeplog/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 B

140
apps/sleeplog/boot.js Normal file
View File

@ -0,0 +1,140 @@
// Sleep/Wake detection with Estimation of Stationary Sleep-segments (ESS):
// Marko Borazio, Eugen Berlin, Nagihan Kücükyildiz, Philipp M. Scholl and Kristof Van Laerhoven, "Towards a Benchmark for Wearable Sleep Analysis with Inertial Wrist-worn Sensing Units", ICHI 2014, Verona, Italy, IEEE Press, 2014.
// https://ubicomp.eti.uni-siegen.de/home/datasets/ichi14/index.html.en
// sleeplog.status values: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping
// load settings into global object
global.sleeplog = Object.assign({
enabled: true, // en-/disable completely
logfile: "sleeplog.log", // logfile
winwidth: 13, // 13 values, read with 12.5Hz = every 1.04s
nomothresh: 0.012, // values lower than 0.008 getting triggert by noise
sleepthresh: 577, // 577 times no movement * 1.04s window width > 10min
tempthresh: 27, // every temperature above ist registered as worn
}, require("Storage").readJSON("sleeplog.json", true) || {});
// delete app settings
["breaktod", "maxawake", "minconsec"].forEach(property => delete global.sleeplog[property]);
// check if service enabled
if (global.sleeplog.enabled) {
// add cached values and functions to global object
global.sleeplog = Object.assign(global.sleeplog, {
// set cached values
ess_values: [],
nomocount: 0,
firstnomodate: undefined,
resting: undefined,
status: 0,
// define acceleration listener function
accel: function(xyz) {
// save acceleration magnitude and start calculation on enough saved data
if (global.sleeplog.ess_values.push(xyz.mag) >= global.sleeplog.winwidth) global.sleeplog.calc();
},
// define calculator function
calc: function() {
// calculate standard deviation over
var mean = this.ess_values.reduce((prev, cur) => cur + prev) / this.winwidth;
var stddev = Math.sqrt(this.ess_values.map(val => Math.pow(val - mean, 2)).reduce((prev, cur) => prev + cur) / this.winwidth);
// reset saved acceleration data
this.ess_values = [];
// check for non-movement according to the threshold
if (stddev < this.nomothresh) {
// increment non-movement sections count, set date of first non-movement
if (++this.nomocount == 1) this.firstnomodate = Math.floor(Date.now());
// check resting state and non-movement count against threshold
if (this.resting !== true && this.nomocount >= this.sleepthresh) {
// change resting state, status and write to log
this.resting = true;
// check if the watch is worn
if (E.getTemperature() > this.tempthresh) {
// set status and write to log as sleping
this.status = 3;
this.log(this.firstnomodate, 3, E.getTemperature());
} else {
// set status and write to log as not worn
this.status = 1;
this.log(this.firstnomodate, 1, E.getTemperature());
}
}
} else {
// reset non-movement sections count
this.nomocount = 0;
// check resting state
if (this.resting !== false) {
// change resting state
this.resting = false;
// set status and write to log as awake
this.status = 2;
this.log(Math.floor(Date.now()), 2);
}
}
},
// define logging function
log: function(date, status, temperature, info) {
// skip logging if logfile is undefined or does not end with ".log"
if (!this.logfile || !this.logfile.endsWith(".log")) return;
// prevent logging on implausible date
if (date < 9E11 || Date() < 9E11) return;
// set default value for status
status = status || 0;
// define storage
var storage = require("Storage");
// read previous logfile
var logContent = storage.read(this.logfile) || "";
// parse previous logfile
var log = JSON.parse(logContent.length > 0 ? atob(logContent) : "[]") ;
// remove last state if it was unknown and is less then 10min ago
if (log.length > 0 && log[0][1] === 0 &&
Math.floor(Date.now()) - log[0][0] < 600000) log.shift();
// add actual status at the first position if it has changed
if (log.length === 0 || log[0][1] !== status)
log.unshift(info ? [date, status, temperature, info] : temperature ? [date, status, temperature] : [date, status]);
// write log to storage
storage.write(this.logfile, btoa(JSON.stringify(log)));
// clear variables
log = undefined;
storage = undefined;
},
// define stop function (logging will restart if enabled and boot file is executed)
stop: function() {
// remove acceleration and kill listener
Bangle.removeListener('accel', global.sleeplog.accel);
E.removeListener('kill', global.sleeplog.stop);
// write log with undefined sleeping status
global.sleeplog.log(Math.floor(Date.now()));
// reset cached values
global.sleeplog.ess_values = [];
global.sleeplog.nomocount = 0;
global.sleeplog.firstnomodate = undefined;
global.sleeplog.resting = undefined;
global.sleeplog.status = 0;
},
// define restart function (also use for initial starting)
start: function() {
// add acceleration listener
Bangle.on('accel', global.sleeplog.accel);
// add kill listener
E.on('kill', global.sleeplog.stop);
},
});
// initial starting
global.sleeplog.start();
}

150
apps/sleeplog/lib.js Normal file
View File

@ -0,0 +1,150 @@
exports = {
// define en-/disable function
setEnabled: function(enable, logfile) {
// check if sleeplog is available
if (typeof global.sleeplog !== "object") return;
// set default logfile
logfile = logfile.endsWith(".log") ? logfile :
logfile === false ? undefined :
"sleeplog.log";
// check if status needs to be changed
if (enable === global.sleeplog.enabled ||
logfile === global.sleeplog.logfile) return false;
// stop if enabled
if (global.sleeplog.enabled) global.sleeplog.stop();
// define storage and filename
var storage = require("Storage");
var filename = "sleeplog.json";
// change enabled value in settings
storage.writeJSON(filename, Object.assign(storage.readJSON(filename, true) || {}, {
enabled: enable,
logfile: logfile
}));
// force changes to take effect by executing the boot script
eval(storage.read("sleeplog.boot.js"));
// clear variables
storage = undefined;
filename = undefined;
return true;
},
// define read log function
// sorting: latest first, format:
// [[number, int, float, string], [...], ... ]
// - number // timestamp in ms
// - int // status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping
// - float // internal temperature
// - string // additional information
readLog: function(since, until) {
// set logfile
var logfile = (global.sleeplog || {}).logfile || "sleeplog.log";
// check if since is in the future
if (since > Date()) return [];
// read log json to array
var log = JSON.parse(atob(require("Storage").read(logfile)));
// search for latest entry befor since
since = (log.find(element => element[0] <= since) || [0])[0];
// filter selected time period
log = log.filter(element => (element[0] >= since) && (element[0] <= (until || 1E14)));
// output log
return log;
},
// define log to humanreadable string function
// sorting: latest last, format:
// "{substring of ISO date} - {status} for {duration}min\n..."
getReadableLog: function(printLog, since, until) {
// read log and check
var log = this.readLog(since, until);
if (!log.length) return;
// reverse array to set last timestamp to the end
log.reverse();
// define status description and log string
var statusText = ["unknown ", "not worn", "awake ", "sleeping"];
var logString = [];
// rewrite each entry
log.forEach((element, index) => {
logString[index] = "" +
Date(element[0] - Date().getTimezoneOffset() * 6E4).toISOString().substr(0, 19).replace("T", " ") + " - " +
statusText[element[1]] +
(index === log.length - 1 ? "" : " for " + Math.round((log[index + 1][0] - element[0]) / 60000) + "min") +
(element[2] ? " | Temp: " + element[2] + "°C" : "") +
(element[3] ? " | " + element[3] : "");
});
logString = logString.join("\n");
// if set print and return string
if (printLog) {
print(logString);
print("- first", Date(log[0][0]));
print("- last", Date(log[log.length - 1][0]));
var period = log[log.length - 1][0] - log[0][0];
print("- period= " + Math.floor(period / 864E5) + "d " + Math.floor(period % 864E5 / 36E5) + "h " + Math.floor(period % 36E5 / 6E4) + "min");
}
return logString;
},
// define function to eliminate some errors inside the log
restoreLog: function(logfile) {
// define storage
var storage = require("Storage");
// read log json to array
var log = JSON.parse(atob(storage.read(logfile)));
// define output variable to show number of changes
var output = log.length;
// remove non decremental entries
log = log.filter((element, index) => log[index][0] >= (log[index + 1] || [0])[0]);
// write log to storage
storage.write(logfile, btoa(JSON.stringify(log)));
// return difference in length
return output - log.length;
},
// define function to reinterpret worn status based on given temperature threshold
reinterpretTemp: function(logfile, tempthresh) {
// define storage
var storage = require("Storage");
// read log json to array
var log = JSON.parse(atob(storage.read(logfile)));
// define output variable to show number of changes
var output = 0;
// remove non decremental entries
log = log.map(element => {
if (element[2]) {
var tmp = element[1];
element[1] = element[2] > tempthresh ? 3 : 1;
if (tmp !== element[1]) output++;
}
return element;
});
// write log to storage
storage.write(logfile, btoa(JSON.stringify(log)));
// return output
return output;
}
};

View File

@ -0,0 +1,28 @@
{
"id":"sleeplog",
"name":"Sleep Log",
"shortName": "SleepLog",
"version": "0.02",
"description": "Log and view your sleeping habits. This app derived from SleepPhaseAlarm and uses also the principe of Estimation of Stationary Sleep-segments (ESS).",
"icon": "app.png",
"type": "app",
"tags": "tool,boot",
"supports": ["BANGLEJS2"],
"readme": "README.md",
"storage": [
{"name": "sleeplog.app.js", "url": "app.js"},
{"name": "sleeplog.img", "url": "app-icon.js", "evaluate":true},
{"name": "sleeplog.boot.js", "url": "boot.js"},
{"name": "sleeplog", "url": "lib.js"},
{"name": "sleeplog.settings.js", "url": "settings.js"}
],
"data": [
{"name": "sleeplog.json"},
{"name": "sleeplog.log"}
],
"screenshots": [
{"url": "screenshot1.png"},
{"url": "screenshot2.png"},
{"url": "screenshot3.png"}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

118
apps/sleeplog/settings.js Normal file
View File

@ -0,0 +1,118 @@
(function(back) {
var filename = "sleeplog.json";
// set storage and load settings
var storage = require("Storage");
var settings = Object.assign({
breaktod: 10, // time of day when to start/end graphs
maxawake: 36E5, // 60min in ms
minconsec: 18E5, // 30min in ms
tempthresh: 27, // every temperature above ist registered as worn
nomothresh: 0.012, // values lower than 0.008 getting triggert by noise
sleepthresh: 577, // 577 times no movement * 1.04s window width > 10min
winwidth: 13, // 13 values, read with 12.5Hz = every 1.04s
enabled: true, // en-/disable completely
logfile: "sleeplog.log", // logfile
}, storage.readJSON(filename, true) || {});
// write change to global.sleeplog and storage
function writeSetting(key, value) {
// change key in global.sleeplog
if (typeof global.sleeplog === "object") global.sleeplog[key] = value;
// reread settings to only change key
settings = Object.assign(settings, storage.readJSON(filename, true) || {});
// change the value of key
settings[key] = value;
// write to storage
storage.writeJSON(filename, settings);
}
// define circulate function
function circulate(min, max, value) {
return value > max ? min : value < min ? max : value;
}
// calculate sleepthresh factor
var stFactor = settings.winwidth / 12.5 / 60;
// show main menu
function showMain() {
var mainMenu = E.showMenu({
"": {
title: "Sleep Log"
},
"< Exit": () => load(),
"< Back": () => back(),
"BreakTod": {
value: settings.breaktod,
step: 1,
onchange: function(v) {
this.value = v = circulate(0, 23, v);
writeSetting("breaktod", v);
}
},
"MaxAwake": {
value: settings.maxawake / 6E4,
step: 5,
format: v => v + "min",
onchange: function(v) {
this.value = v = circulate(15, 120, v);
writeSetting("maxawake", v * 6E4);
}
},
"MinConsec": {
value: settings.minconsec / 6E4,
step: 5,
format: v => v + "min",
onchange: function(v) {
this.value = v = circulate(15, 120, v);
writeSetting("minconsec", v * 6E4);
}
},
"TempThresh": {
value: settings.tempthresh,
step: 0.5,
format: v => v + "°C",
onchange: function(v) {
this.value = v = circulate(20, 40, v);
writeSetting("tempthresh", v);
}
},
"NoMoThresh": {
value: settings.nomothresh,
step: 0.001,
format: v => ("" + v).padEnd(5, "0"),
onchange: function(v) {
this.value = v = circulate(0.006, 0.02, v);
writeSetting("nomothresh", v);
}
},
"MinDuration": {
value: Math.floor(settings.sleepthresh * stFactor),
step: 1,
format: v => v + "min",
onchange: function(v) {
this.value = v = circulate(5, 15, v);
writeSetting("sleepthresh", Math.ceil(v / stFactor));
}
},
"Enabled": {
value: settings.enabled,
format: v => v ? "on" : "off",
onchange: function(v) {
writeSetting("enabled", v);
}
},
"Logfile ": {
value: settings.logfile === "sleeplog.log" ? true : settings.logfile.endsWith(".log") ? "custom" : false,
format: v => v === true ? "default" : v ? "custom" : "off",
onchange: function(v) {
if (v !== "custom") writeSetting("logfile", v ? "sleeplog.log" : undefined);
}
},
});
}
// draw main menu
showMain();
})

View File

@ -3,3 +3,4 @@
0.03: Bangle.js 2 support
0.04: Adds costumizable colours and the respective settings menu
0.05: "Chime the time" (buzz or beep) with up/down swipe added
0.06: Redraw widgets when time is updated

View File

@ -80,6 +80,8 @@ function draw() {
pushCommand(drawVectorText, dateText, dateFontSize, x + width/2, y, 0, -1, datecol);
executeCommands();
Bangle.drawWidgets();
}
var timeout;

View File

@ -1,7 +1,7 @@
{
"id": "vectorclock",
"name": "Vector Clock",
"version": "0.05",
"version": "0.06",
"description": "A digital clock that uses the built-in vector font.",
"icon": "app.png",
"type": "clock",

View File

@ -2,7 +2,7 @@
"id": "waveclk",
"name": "Wave Clock",
"version": "0.02",
"description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/). **Note: Works on any Bangle.js 2, but requires firmware 2v11 or later on Bangle.js 1**",
"description": "A clock using a wave image by [Lillith May](https://www.instagram.com/_lilustrations_/)",
"icon": "app.png",
"screenshots": [{"url":"screenshot.png"}],
"type": "clock",

View File

@ -5,6 +5,6 @@ A simple widget that shows the on/off status of the GPS.
The GPS can quickly run the battery down if it is on all the time so
it is useful to know if it has been switched on or not.
- Uses Bangle.isGPSOn(), requires firmware v2.08.167 or later
- Uses Bangle.isGPSOn()
- Shows in grey when the GPS is off
- Shows in amber when the GPS is on

View File

@ -8,7 +8,7 @@
"type": "widget",
"supports": ["BANGLEJS", "BANGLEJS2"],
"readme": "README.md",
"description": "Displays the current step count from `Bangle.getHealthStatus(\"day\").steps` in 12x16 font, requires firmware v2.11.21 or later",
"description": "Displays the current step count from `Bangle.getHealthStatus(\"day\").steps` in 12x16 font",
"tags": "widget,battery",
"storage": [
{"name":"widpa.wid.js","url":"widpa.wid.js"}

View File

@ -8,7 +8,7 @@
"type": "widget",
"supports": ["BANGLEJS", "BANGLEJS2"],
"readme": "README.md",
"description": "Displays the current step count from `Bangle.getHealthStatus(\"day\").steps` in the Lato font, requires firmware v2.11.21 or later",
"description": "Displays the current step count from `Bangle.getHealthStatus(\"day\").steps` in the Lato font",
"tags": "widget,battery",
"storage": [
{"name":"widpb.wid.js","url":"widpb.wid.js"}

View File

@ -5,6 +5,16 @@ outputs a list of strings that have been found.
See https://github.com/espruino/BangleApps/issues/1311
*/
let translate = false;
if (process.env.DEEPL) {
// Requires translate
// npm i translate
translate = require("translate");
translate.engine = "deepl"; // Or "yandex", "libre", "deepl"
translate.key = process.env.DEEPL; // Requires API key (which are free)
translate.url = process.env.TURL;
}
var IGNORE_STRINGS = [
"5x5","6x8","6x8:2","4x6","12x20","6x15","5x9Numeric7Seg", "Vector", // fonts
"---","...","*","##","00","GPS","ram",
@ -12,7 +22,11 @@ var IGNORE_STRINGS = [
"sortorder","tl","tr",
"function","object", // typeof===
"txt", // layout styles
"play","stop","pause", // music state
"play","stop","pause", "volumeup", "volumedown", // music state
"${hours}:${minutes}:${seconds}", "${hours}:${minutes}",
"BANGLEJS",
"fgH", "bgH", "m/s",
"undefined", "kbmedia", "NONE",
];
var IGNORE_FUNCTION_PARAMS = [
@ -64,13 +78,20 @@ function isNotString(s, wasFnCall, wasArrayAccess) {
if (wasArrayAccess && IGNORE_ARRAY_ACCESS.includes(wasArrayAccess)) return true;
if (s=="Storage") console.log("isNotString",s,wasFnCall);
if (s.length<2) return true; // too short
if (s.length<3) return true; // too short
if (s.length>40) return true; // too long
if (s[0]=="#") return true; // a color
if (s.endsWith(".json") || s.endsWith(".img")) return true; // a filename
if (s.endsWith('.log') || s.endsWith('.js') || s.endsWith(".info") || s.endsWith(".csv") || s.endsWith(".json") || s.endsWith(".img") || s.endsWith(".txt")) return true; // a filename
if (s.endsWith("=")) return true; // probably base64
if (s.startsWith("BTN")) return true; // button name
if (IGNORE_STRINGS.includes(s)) return true; // one we know to ignore
if (!isNaN(parseFloat(s)) && isFinite(s)) return true; //is number
if (s.match(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/)) return true; //roman number
if (!s.match(/.*[A-Z].*/i)) return true; // No letters
if (s.match(/.*[0-9].*/i)) return true; // No letters
if (s.match(/.*\(.*\).*/)) return true; // is function
if (s.match(/[A-Za-z]+[A-Z]([A-Z]|[a-z])*/)) return true; // is camel case
if (s.includes('_')) return true;
return false;
}
@ -115,6 +136,7 @@ apps.forEach((app,appIdx) => {
if (previousString.includes("/*LANG*/")) { // translated!
addString(translatedStrings, tok.value, shortFilePath);
} else { // untranslated - potential to translate?
// filter out numbers
if (!isNotString(tok.value, wasFnCall, wasArrayAccess)) {
addString(untranslatedStrings, tok.value, shortFilePath);
}
@ -137,6 +159,27 @@ untranslatedStrings.sort((a,b)=>a.uses - b.uses);
translatedStrings.sort((a,b)=>a.uses - b.uses);
/*
* @description Add lang to start of string
* @param str string to add LANG to
* @param file file that string is found
* @returns void
*/
//TODO fix settings bug
function applyLANG(str, file) {
fs.readFile(file, 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
const regex = new RegExp(`(.*)((?<!\/\*LANG\*\/)["|']${str}[^A-Z].*)`, 'gi');
const result = data.replace(regex, '$1/*LANG*/$2');
console.log(str, file);
fs.writeFile(file, result, 'utf8', function (err) {
if (err) return console.log(err);
});
});
}
var report = "";
log("Translated Strings that are not tagged with LANG");
@ -144,8 +187,15 @@ log("=================================================================");
log("");
log("Maybe we should add /*LANG*/ to these automatically?");
log("");
log(untranslatedStrings.filter(e => translatedStrings.find(t=>t.str==e.str)).map(e=>`${JSON.stringify(e.str)} (${e.files.join(",")})`).join("\n"));
const wordsToAdd = untranslatedStrings.filter(e => translatedStrings.find(t=>t.str==e.str));
// Uncomment to add LANG to all strings
// THIS IS EXPERIMENTAL
//wordsToAdd.forEach(e => e.files.forEach(a => applyLANG(e.str, a)));
log(wordsToAdd.map(e=>`${JSON.stringify(e.str)} (${e.uses} uses)`).join("\n"));
log("");
//process.exit(1);
log("Possible English Strings that could be translated");
log("=================================================================");
@ -158,15 +208,16 @@ log("");
//process.exit(1);
let languages = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/index.json`).toString());
languages.forEach(language => {
for (let language of languages) {
if (language.code == "en_GB") {
console.log(`Ignoring ${language.code}`);
return;
continue;
}
console.log(`Scanning ${language.code}`);
log(language.code);
log("==========");
let translations = JSON.parse(fs.readFileSync(`${BASEDIR}/lang/${language.url}`).toString());
let translationPromises = [];
translatedStrings.forEach(translationItem => {
if (!translations.GLOBAL[translationItem.str]) {
console.log(`Missing GLOBAL translation for ${JSON.stringify(translationItem)}`);
@ -176,11 +227,21 @@ languages.forEach(language => {
let appName = m[0].replaceAll("/", "");
if (translations[appName] && translations[appName][translationItem.str]) {
console.log(` but LOCAL translation found in \"${appName}\"`);
} else if (translate && language.code !== "tr_TR") { // Auto Translate
translationPromises.push(new Promise(async (resolve) => {
const translation = await translate(translationItem.str, language.code.split("_")[0]);
console.log("Translating:", translationItem.str, translation);
translations.GLOBAL[translationItem.str] = translation;
resolve()
}))
}
}
});
}
});
Promise.all(translationPromises).then(() => {
fs.writeFileSync(`${BASEDIR}/lang/${language.url}`, JSON.stringify(translations, null, 4))
});
log("");
});
}
console.log("Done.");

View File

@ -144,7 +144,7 @@
<div class="form-group">
<select class="form-select form-inline" id="settings-lang" style="width: 10em">
<option value="">None (English)</option>
</select>&nbsp;&nbsp;<span>Translations (<a href="https://github.com/espruino/BangleApps/issues/1311" target="_blank">BETA - more info</a>)</span>
</select>&nbsp;&nbsp;<span>Translations (<a href="https://github.com/espruino/BangleApps/issues/1311" target="_blank">BETA - more info</a>). Any apps that are uploaded to Bangle.js after changing this will have any text automatically translated.</span>
</div>
<button class="btn" id="defaultsettings">Default settings</button>
</div>

163
lang/bg_BG.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Bulgarian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Connected": "Свързан",
"circle 1": "кръг 1",
"week": "седмица",
"weather circle": "метеорологичен кръг",
"Timer": "Таймер",
"circle count": "брой кръгове",
"Keep Msgs": "Дръжте Msgs",
"Auto snooze": "Автоматична дрямка",
"Foreground": "На преден план",
"battery warn": "предупреждение за батерията",
"color": "цвят",
"Vibration": "Вибрации",
"New Timer": "Нов таймер",
"App Source\nNot found": "Източник на приложения\nНе е намерен",
"circle 2": "кръг 2",
"Circle": "Кръг",
"Record Run": "Записване на рекорд",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"steps": "стъпки",
"Beep": "Бип",
"Unread timer": "Непрочетен таймер",
"Delete all messages": "Изтриване на всички съобщения",
"Music": "Музика",
"minimum": "минимум",
"BLE": "BLE",
"goal": "цел",
"Save": "Запазете",
"maximum": "максимален",
"(repeat)": "(повторение)",
"circle 3": "кръг 3",
"Steps": "Стъпки",
"Bluetooth": "Bluetooth",
"Alarm": "Аларма",
"colorize icon": "оцветяване на икона",
"circle 4": "кръг 4",
"Loading": "Зареждане на",
"step length": "дължина на стъпката",
"HID": "HID",
"Heartrate": "Сърдечен ритъм",
"Dark BW": "Тъмно BW",
"Customize": "Персонализиране на",
"valid period": "валиден период",
"Sleep": "Сън",
"distance goal": "цел за разстояние",
"LCD": "LCD",
"data": "данни",
"Vector font size": "Размер на векторния шрифт",
"Mark Unread": "Маркирайте непрочетеното",
"heartrate": "сърдечен ритъм",
"Show clocks": "Показване на часовници",
"New Alarm": "Нова аларма",
"Are you sure": "Сигурни ли сте, че",
"Highlight BG": "Подчертаване на BG",
"Remove": "Премахване на",
"No Messages": "Няма съобщения",
"Delete All Messages": "Изтриване на всички съобщения",
"Foreground 2": "Преден план 2",
"Launcher Settings": "Настройки на стартера",
"Compact Storage": "Компактно съхранение",
"min. confidence": "мин. доверие",
"Connect device\nto add to\nwhitelist": "Свързване на устройството\nда добавите към\nбял списък",
"LCD Brightness": "Яркост на LCD дисплея",
"Highlight FG": "Изтъкване на FG",
"Twist Threshold": "Праг на усукване",
"Add Device": "Добавяне на устройство",
"LCD Timeout": "Време за изключване на LCD",
"Twist Timeout": "Време за завъртане",
"Log": "Log",
"Time Zone": "Часова зона",
"Clock Style": "Стил на часовника",
"Debug Info": "Информация за отстраняването на грешки",
"Wake on Touch": "Събуждане при докосване",
"View Message": "Преглед на съобщението",
"Quiet Mode": "Тих режим",
"Background 2": "Контекст 2",
"Light BW": "Светлина BW",
"show widgets": "показване на уиджети",
"Font": "Шрифт",
"Piezo": "Piezo",
"Make Connectable": "Свържете се",
"Apps": "Приложения",
"Background": "Фон",
"Twist Max Y": "Twist Max Y",
"Utils": "Услуги",
"Programmable": "Програмируем",
"Wake on BTN2": "Събуждане на BTN2",
"Utilities": "Комунални услуги",
"TAP right top/bottom": "TAP дясно отгоре/отдолу",
"Wake on BTN1": "Събуждане на BTN1",
"Passkey BETA": "Passkey BETA",
"Wake on BTN3": "Събуждане на BTN3",
"Wake on Twist": "Събуждане на Twist",
"Wake on FaceUp": "Събуждане в FaceUp",
"No Clocks Found": "Не са намерени часовници",
"Reset to Defaults": "Възстановяване на настройките по подразбиране",
"Compacting...\nTakes approx\n1 minute": "Уплътняване...\nОтнема приблизително\n1 минута",
"Rewrite Settings": "Настройки за пренаписване",
"Stay Connectable": "Останете свързани",
"Turn Off": "Изключване",
"This will remove everything": "Това ще премахне всичко",
"Flatten Battery": "Сплескайте батерията",
"Reset Settings": "Нулиране на настройките",
"Connectable": "Свързване на",
"Storage": "Съхранение",
"start&lap/reset, BTN1: EXIT": "стартиране и застъпване/ нулиране, BTN1: EXIT",
"Month": "Месец",
"App Settings": "Настройки на приложението",
"Side": "Страна",
"Invalid settings": "Невалидни настройки",
"Date": "Дата",
"No app has settings": "Няма приложение с настройки",
"on": "на",
"Left": "Вляво",
"Minute": "Минута",
"Year": "Година",
"Second": "Втори",
"Hour": "Час",
"Reset all widgets": "Нулиране на всички уиджети",
"Widgets": "Уиджети",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Сплескване на батерията - това може да отнеме часове.\nДълго натиснете бутона, за да отмените",
"TIMER": "ТАЙМЕР",
"Right": "Вдясно",
"Reset": "Нулиране на",
"Reset All": "Нулиране на всички",
"Sort Order": "Ред на сортиране",
"ALARM": "АЛАРМА",
"Minutes": "Протоколи",
"Hours": "Часове",
"Vibrate": "Вибрация",
"off": "от",
"Delete": "Изтриване на",
"Repeat": "Повторете",
"Message": "Съобщение",
"Enabled": "Разрешено",
"Settings": "Настройки",
"System": "Система",
"Alerts": "Сигнали",
"Theme": "Тема",
"Hide": "Скрий",
"Show": "Покажи",
"Messages": "Съобщения",
"Set Time": "Време за настройка",
"Whitelist": "Бял списък",
"On": "На",
"Select Clock": "Избор на часовник",
"Locale": "Местоположение",
"No": "Не",
"Error in settings": "Грешка в настройките",
"Factory Reset": "Фабрично нулиране",
"Disable": "Деактивиране на",
"Off": "Изключено",
"Yes": "Да",
"Ok": "Добре",
"Back": "Обратно"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,53 +1,185 @@
{
"//":"Czech language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarm" : "Budík",
"Hour" : "Hodina",
"Hours" : "Hodiny",
"Minute" : "Minuta",
"Minutes" : "Minuty",
"Second" : "Sekunda",
"Seconds" : "Sekundy",
"Month" : "Měsíc",
"Enabled" : "Povoleno",
"Background" : "Pozadí",
"Connected" : "Připojeno",
"Settings" : "Nastavení",
"Save" : "Uložit",
"Back" : "Zpět",
"Repeat" : "Opakovat",
"Delete" : "Smazat",
"Sleep" : "Uspat",
"Alarms" : "Budíky",
"ALARM!" : "BUDÍK!",
" (repeat)" : " (opakovat)",
"< Back" : "< Zpět",
"> Delete" : "> Smazat",
"> Save" : " > Uložit",
"ALARM " : "BUDÍK ",
"Add Device" : "Přidat zařízení",
"App Settings" : "Nast. Aplikací",
"Apps" : "Aplikace"
},
"alarm": {
"//":"App-specific overrides",
"Alarm/Timer" : "Budik/Časovač",
"rpt" : "Opk.",
"New Alarm" : "Nový budík",
"New Timer" : "Nový časovač",
"Auto snooze" : "Auto odložit"
},
"setting" : {
"Quiet Mode" : "Tichý režim"
},
"messages": {
"Are you sure?" : "Opravdu?"
}
}
"//": "Czech language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarm": "Budík",
"Hour": "Hodina",
"Hours": "Hodiny",
"Minute": "Minuta",
"Minutes": "Minuty",
"Second": "Sekunda",
"Seconds": "Sekundy",
"Month": "Měsíc",
"Enabled": "Povoleno",
"Background": "Pozadí",
"Connected": "Připojeno",
"Settings": "Nastavení",
"Save": "Uložit",
"Back": "Zpět",
"Repeat": "Opakovat",
"Delete": "Smazat",
"Sleep": "Uspat",
"Alarms": "Budíky",
"ALARM!": "BUDÍK!",
" (repeat)": " (opakovat)",
"< Back": "< Zpět",
"> Delete": "> Smazat",
"> Save": " > Uložit",
"ALARM ": "BUDÍK ",
"Add Device": "Přidat zařízení",
"App Settings": "Nast. Aplikací",
"Apps": "Aplikace",
"valid period": "doba platnosti",
"Font": "Písmo",
"circle count": "počet kroužků",
"min. confidence": "min. důvěra",
"circle 1": "okruh 1",
"circle 3": "kruh 3",
"step length": "délka kroku",
"Highlight FG": "Zvýraznění FG",
"Storage": "Úložiště",
"show widgets": "zobrazit widgety",
"Highlight BG": "Zvýraznění BG",
"Foreground 2": "Popředí 2",
"BLE": "BLE",
"Light BW": "Light BW",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Show clocks": "Zobrazit hodiny",
"Delete All Messages": "Odstranění všech zpráv",
"data": "data",
"Mark Unread": "Označit nepřečtené",
"Launcher Settings": "Nastavení spouštěče",
"circle 4": "kruh 4",
"App Source\nNot found": "Zdroj aplikace\nNenalezeno",
"Twist Timeout": "Twist Timeout",
"Dark BW": "Dark BW",
"Flatten Battery": "Zploštění baterie",
"Make Connectable": "Připojení",
"Wake on Touch": "Probuzení při dotyku",
"Twist Threshold": "Prahová hodnota Twist",
"Debug Info": "Informace o ladění",
"Time Zone": "Časové pásmo",
"battery warn": "upozornění na baterii",
"Remove": "Odstranění stránky",
"maximum": "maximum",
"Vector font size": "Velikost vektorového písma",
"Vibration": "Vibrace",
"(repeat)": "(opakování)",
"week": "týden",
"Yes\ndefinitely": "Ano\nurčitě",
"heartrate": "srdeční frekvence",
"Foreground": "Přední stránka",
"Clock Style": "Styl hodin",
"music": "hudba",
"Delete all messages": "Odstranění všech zpráv",
"Piezo": "Piezo",
"Log": "Přihlásit se",
"Twist Max Y": "Twist Max Y",
"STEPS": "KROKY",
"View Message": "Zobrazit zprávu",
"Heartrate": "Srdeční frekvence",
"TAP right top/bottom": "TAP vpravo nahoře/dole",
"Utils": "Utils",
"Programmable": "Programovatelné",
"Rewrite Settings": "Nastavení přepisu",
"Wake on BTN2": "Probuďte se na BTN2",
"Utilities": "Komunální služby",
"Compacting...\nTakes approx\n1 minute": "Zhutňování...\nTrvá přibližně\n1 minuta",
"Wake on FaceUp": "Probuzení na FaceUp",
"Wake on BTN1": "Probuďte se na BTN1",
"Wake on Twist": "Probuzení na Twistu",
"This will remove everything": "Tím se odstraní vše.",
"Keep Msgs": "Uchovávejte zprávy Msgs",
"Background 2": "Pozadí 2",
"Reset Settings": "Obnovení nastavení",
"Are you sure": "Jste si jistý, že",
"Stay Connectable": "Zůstaňte ve spojení",
"HID": "HID",
"colorize icon": "vybarvit ikonu",
"distance goal": "vzdálenostní cíl",
"circle 2": "kruh 2",
"Record Run": "Rekordní běh",
"Connectable": "Připojitelné",
"Side": "Strana",
"No app has settings": "Žádná aplikace nemá nastavení",
"Date": "Datum",
"OFF": "OFF",
"No Messages": "Žádné zprávy",
"Turn Off": "Vypnout",
"Invalid settings": "Neplatné nastavení",
"Unread timer": "Nepřečtený časovač",
"weather circle": "povětrnostní kruh",
"minimum": "minimum",
"Customize": "Přizpůsobení",
"Bluetooth": "Bluetooth",
"Circle": "Kruh",
"LCD": "LCD",
"Compact Storage": "Kompaktní úložiště",
"LCD Timeout": "Časový limit LCD",
"Connect device\nto add to\nwhitelist": "Připojení zařízení\npřidat do\nwhitelist",
"LCD Brightness": "Jas displeje LCD",
"TIMER": "ČASOVAČ",
"Reset All": "Obnovit vše",
"Left": "Vlevo",
"Reset": "Obnovení",
"goal": "cíl",
"Alerts": "Upozornění",
"Locale": "Lokalita",
"Beep": "Pípnutí",
"Vibrate": "Vibrace",
"Message": "Zpráva",
"System": "Systém",
"on": "na adrese",
"Sort Order": "Pořadí řazení",
"Right": "Vpravo",
"Select Clock": "Vybrat hodiny",
"Reset to Defaults": "Obnovení výchozího nastavení",
"Wake on BTN3": "Probuďte se na BTN3",
"Passkey BETA": "Passkey BETA",
"No Clocks Found": "Nebyly nalezeny žádné hodiny",
"Reset all widgets": "Obnovení všech widgetů",
"Widgets": "Widgety",
"Sleep Phase Alarm": "Alarm fáze spánku",
"Error in settings": "Chyba v nastavení",
"Timer": "Časovač",
"ALARM": "ALARM",
"Disable": "Zakázat",
"BACK": "ZPĚT",
"Whitelist": "Bílá listina",
"Factory Reset": "Obnovení továrního nastavení",
"Set Time": "Nastavený čas",
"Hide": "Skrýt",
"Messages": "Zprávy",
"On": "Na adrese",
"Show": "Zobrazit",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Zploštění baterie - může trvat hodiny.\nDlouhým stisknutím tlačítka zrušíte",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"No": "Ne",
"Ok": "Ok",
"Yes": "Ano",
"Steps": "Kroky",
"Year": "Rok",
"steps": "kroky",
"back": "zpět",
"Music": "Hudba",
"Loading": "Načítání",
"off": "mimo",
"color": "barva",
"Off": "Vypnuto",
"Theme": "Téma"
},
"alarm": {
"//": "App-specific overrides",
"Alarm/Timer": "Budik/Časovač",
"rpt": "Opk.",
"New Alarm": "Nový budík",
"New Timer": "Nový časovač",
"Auto snooze": "Auto odložit"
},
"setting": {
"Quiet Mode": "Tichý režim"
},
"messages": {
"Are you sure?": "Opravdu?"
}
}

163
lang/da_DA.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Danish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Ny alarm",
"Alarm": "Alarm",
"New Timer": "Ny timer",
"Save": "Gem",
"(repeat)": "(gentagelse)",
"circle 1": "kreds 1",
"circle 3": "kreds 3",
"circle 2": "kreds 2",
"Auto snooze": "Automatisk slumretid",
"circle 4": "cirkel 4",
"show widgets": "vise widgets",
"Connected": "Tilsluttet",
"Keep Msgs": "Behold msgs",
"min. confidence": "min. tillid",
"heartrate": "hjertefrekvens",
"steps": "trin",
"week": "uge",
"Sleep": "Søvn",
"circle count": "antal cirkler",
"goal": "mål",
"Timer": "Timer",
"Steps": "Trin",
"valid period": "gyldighedsperiode",
"step length": "trinlængde",
"minimum": "minimum",
"weather circle": "vejrkreds",
"maximum": "maksimum",
"data": "data",
"Circle": "Cirkel",
"Heartrate": "Hjertefrekvens",
"battery warn": "batteri advarer",
"App Source\nNot found": "App-kilde\nIkke fundet",
"colorize icon": "farvelægge ikonet",
"distance goal": "mål for afstand",
"TAP right top/bottom": "TAP højre top/bund",
"color": "farve",
"View Message": "Vis besked",
"Show clocks": "Vis ure",
"Mark Unread": "Markér ulæst",
"Unread timer": "Ulæst timer",
"Loading": "Indlæsning",
"Launcher Settings": "Indstillinger for startopsætningen",
"Bluetooth": "Bluetooth",
"Music": "Musik",
"Font": "Skrifttype",
"Vector font size": "Vektor skriftstørrelse",
"BTNs 1:startlap 2:exit 3:reset": "BTN'er 1:startlap 2:exit 3:reset",
"No Messages": "Ingen meddelelser",
"Are you sure": "Er du sikker på",
"Delete All Messages": "Slet alle meddelelser",
"Record Run": "Rekordløb",
"Delete all messages": "Slet alle meddelelser",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Vibration": "Vibrationer",
"HID": "HID",
"Make Connectable": "Gør det muligt at forbinde",
"LCD": "LCD",
"BLE": "BLE",
"Utils": "Utils",
"Piezo": "Piezo",
"Apps": "Apps",
"Background": "Baggrund",
"Customize": "Tilpas",
"Beep": "Bip",
"Quiet Mode": "Stille tilstand",
"Dark BW": "Mørk BW",
"Programmable": "Programmerbar",
"Passkey BETA": "Passkey BETA",
"Light BW": "Light BW",
"Highlight FG": "fremhæve FG",
"Background 2": "Baggrund 2",
"Foreground": "Forgrund",
"Highlight BG": "fremhæve BG",
"Foreground 2": "Forgrund 2",
"LCD Timeout": "LCD Timeout",
"Remove": "Fjern",
"Wake on BTN2": "Wake på BTN2",
"LCD Brightness": "LCD lysstyrke",
"Add Device": "Tilføj enhed",
"Wake on BTN1": "Vågn op på BTN1",
"Connect device\nto add to\nwhitelist": "Tilslut enhed\ntil at tilføje til\nwhitelist",
"Wake on BTN3": "Wake på BTN3",
"Wake on FaceUp": "Vågn op på FaceUp",
"Log": "Log",
"Debug Info": "Info om fejlfinding",
"Wake on Twist": "Vågn op på Twist",
"Wake on Touch": "Vågn op ved berøring",
"Clock Style": "Ur stil",
"Time Zone": "Tidszone",
"Twist Max Y": "Drej Max Y",
"Twist Threshold": "Twist tærskel",
"Compact Storage": "Kompakt opbevaring",
"Twist Timeout": "Twist Timeout",
"Storage": "Opbevaring",
"Utilities": "Hjælpeprogrammer",
"Rewrite Settings": "Omskrivning af indstillinger",
"No Clocks Found": "Ingen ure fundet",
"Reset to Defaults": "Nulstil til standardindstillingerne",
"Compacting...\nTakes approx\n1 minute": "Komprimering...\nTager ca.\n1 minut",
"Connectable": "Tilslutbar",
"Reset Settings": "Nulstil indstillinger",
"Stay Connectable": "Forbliv forbundet",
"Flatten Battery": "Flade batterier",
"Minute": "Minut",
"This will remove everything": "Dette vil fjerne alt",
"Turn Off": "Sluk for",
"Hour": "Timer",
"Month": "Måned",
"Second": "Anden",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Udfladning af batteriet - dette kan tage flere timer.\nTryk længe på knappen for at annullere",
"Year": "År",
"Widgets": "Widgets",
"Date": "Dato",
"Side": "Side",
"Left": "Venstre",
"App Settings": "App-indstillinger",
"No app has settings": "Ingen app har indstillinger",
"Invalid settings": "Ugyldige indstillinger",
"Reset All": "Nulstil alt",
"on": "på",
"TIMER": "TIMER",
"Right": "Højre",
"Sort Order": "Sorteringsrækkefølge",
"Reset": "Nulstil",
"Reset all widgets": "Nulstil alle widgets",
"ALARM": "ALARM",
"Settings": "Indstillinger",
"Alerts": "Advarsler",
"System": "System",
"Theme": "Tema",
"Locale": "Lokale",
"Vibrate": "Vibrere",
"Enabled": "Aktiveret",
"Hours": "Timer",
"Delete": "Slet",
"Minutes": "Protokol",
"Message": "Besked",
"Repeat": "Gentag",
"off": "off",
"Whitelist": "Whitelist",
"Show": "Vis",
"Messages": "Meddelelser",
"On": "På",
"Hide": "Skjul",
"Set Time": "Indstil tid",
"Factory Reset": "Fabriksnulstilling",
"Disable": "Deaktivere",
"Error in settings": "Fejl i indstillingerne",
"Select Clock": "Vælg ur",
"No": "Nej",
"Yes": "Ja",
"Ok": "Ok",
"Off": "Off",
"Back": "Tilbage"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,28 +1,173 @@
{
"//":"German language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarm" : "Wecker",
"Hours" : "Stunden",
"Minutes" : "Minuten",
"Enabled" : "Aktiviert",
"Settings" : "Einstellungen",
"Save" : "Speichern",
"Back" : "Zurück",
"Repeat" : "Wiederholen",
"Delete" : "Löschen",
"Sleep" : "Schlummern",
"Alarms" : "Wecker",
"New Alarm" : "Neuer Wecker",
"ALARM!" : "ALARM!",
"Yes" : "Ja",
"No" : "Nein",
"On" : "Ein",
"Off" : "Aus",
"Ok" : "OK"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "Wdh."
}
}
"//": "German language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarm": "Wecker",
"Hours": "Stunden",
"Minutes": "Minuten",
"Enabled": "Aktiviert",
"Settings": "Einstellungen",
"Save": "Speichern",
"Back": "Zurück",
"Repeat": "Wiederholen",
"Delete": "Löschen",
"Sleep": "Schlummern",
"Alarms": "Wecker",
"New Alarm": "Neuer Wecker",
"ALARM!": "ALARM!",
"Yes": "Ja",
"No": "Nein",
"On": "Ein",
"Off": "Aus",
"Ok": "OK",
"New Timer": "Neue Zeitschaltuhr",
"(repeat)": "(Wiederholung)",
"music": "Musik",
"Keep Msgs": "Msgs behalten",
"circle count": "Kreiszahl",
"Auto snooze": "Automatisches Schlummern",
"week": "Woche",
"Heartrate": "Herzfrequenz",
"minimum": "Minimum",
"weather circle": "Wetterkreis",
"circle 3": "Kreis 3",
"show widgets": "Widgets anzeigen",
"circle 4": "Kreis 4",
"circle 1": "Kreis 1",
"circle 2": "Kreis 2",
"battery warn": "Batteriewarnung",
"heartrate": "Herzfrequenz",
"data": "Daten",
"step length": "Schrittlänge",
"valid period": "Gültigkeitsdauer",
"colorize icon": "Symbol einfärben",
"min. confidence": "Mindestvertrauen",
"maximum": "maximal",
"distance goal": "Fernziel",
"Circle": "Kreis",
"Yes\ndefinitely": "Ja\ndefinitiv",
"TAP right top/bottom": "TAP rechts oben/unten",
"Are you sure": "Sind Sie sicher, dass",
"STEPS": "SCHRITTE",
"Mark Unread": "Ungelesen markieren",
"Delete all messages": "Alle Nachrichten löschen",
"Unread timer": "Ungelesener Timer",
"Quiet Mode": "Leiser Modus",
"Utils": "Werkzeuge",
"Piezo": "Piezo",
"LCD": "LCD",
"Record Run": "Rekordlauf",
"Apps": "Apps",
"Delete All Messages": "Alle Nachrichten löschen",
"start&lap/reset, BTN1: EXIT": "Start&Runde/Zurücksetzen, BTN1: EXIT",
"No Messages": "Keine Nachrichten",
"Bluetooth": "Bluetooth",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"View Message": "Nachricht anzeigen",
"Vector font size": "Vektor-Schriftgröße",
"Light BW": "Licht BW",
"BLE": "BLE",
"Make Connectable": "Verbindbar machen",
"Vibration": "Vibration",
"Foreground": "Vorderseite",
"Customize": "Anpassen",
"HID": "HID",
"Dark BW": "Dunkel BW",
"Passkey BETA": "Hauptschlüssel BETA",
"Show clocks": "Uhren anzeigen",
"Font": "Schriftart",
"Launcher Settings": "Launcher-Einstellungen",
"App Source\nNot found": "App-Quelle\nNicht gefunden",
"Programmable": "Programmierbar",
"Background 2": "Hintergrund 2",
"Foreground 2": "Vordergrund 2",
"Add Device": "Gerät hinzufügen",
"Highlight BG": "Hervorhebung BG",
"Background": "Hintergrund",
"Highlight FG": "Highlight FG",
"Wake on Touch": "Wecken bei Berührung",
"Twist Timeout": "Twist Timeout",
"Twist Max Y": "Twist Max Y",
"LCD Timeout": "LCD-Zeitüberschreitung",
"LCD Brightness": "LCD-Helligkeit",
"Utilities": "Versorgungsunternehmen",
"Log": "Protokoll",
"Compact Storage": "Kompakte Lagerung",
"Wake on BTN3": "Wake auf BTN3",
"Twist Threshold": "Schwellenwert verdrehen",
"Remove": "entfernen",
"Connect device\nto add to\nwhitelist": "Gerät verbinden\nzum Hinzufügen zur\nWhitelist",
"Debug Info": "Debug-Informationen",
"Time Zone": "Zeitzone",
"Clock Style": "Uhr Stil",
"Wake on BTN2": "Wake auf BTN2",
"Wake on FaceUp": "Wake on FaceUp",
"Wake on BTN1": "Wake auf BTN1",
"Wake on Twist": "Wake on Twist",
"Connectable": "Anschließbar",
"Second": "Zweite",
"Minute": "Minute",
"Turn Off": "Ausschalten",
"No Clocks Found": "Keine Uhren gefunden",
"App Settings": "App-Einstellungen",
"Hour": "Stunde",
"Reset to Defaults": "Auf Standardwerte zurücksetzen",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Entladen der Batterie - dies kann Stunden dauern.\nLanger Tastendruck zum Abbrechen",
"Reset Settings": "Einstellungen zurücksetzen",
"Rewrite Settings": "Einstellungen umschreiben",
"Compacting...\nTakes approx\n1 minute": "Verdichten...\nDauert ca.\n1 Minute",
"Stay Connectable": "Anschlussfähig bleiben",
"Storage": "Lagerung",
"This will remove everything": "Dadurch wird alles entfernt",
"on": "auf",
"TIMER": "TIMER",
"Widgets": "Widgets",
"goal": "Ziel",
"Beep": "Piep",
"Reset": "Zurücksetzen",
"No app has settings": "Keine App hat Einstellungen",
"Month": "Monat",
"Reset All": "Alle zurücksetzen",
"Flatten Battery": "Batterie abflachen",
"Right": "Rechts",
"Side": "Seite",
"Left": "Links",
"Sleep Phase Alarm": "Schlafphasenalarm",
"Date": "Datum",
"Sort Order": "Sortierreihenfolge",
"OFF": "AUS",
"Invalid settings": "Ungültige Einstellungen",
"Message": "Nachricht",
"Vibrate": "Vibrieren",
"Reset all widgets": "Alle Widgets zurücksetzen",
"System": "System",
"Alerts": "Warnungen",
"Locale": "Schauplatz",
"Whitelist": "Whitelist",
"Select Clock": "Uhr auswählen",
"Disable": "Deaktivieren Sie",
"Timer": "Zeitschaltuhr",
"Error in settings": "Fehler in den Einstellungen",
"Set Time": "Zeit einstellen",
"ALARM": "ALARM",
"BACK": "ZURÜCK",
"Factory Reset": "Werksreset",
"steps": "Schritte",
"Connected": "Verbunden",
"Show": "anzeigen",
"Messages": "Nachrichten",
"Hide": "Ausblenden",
"back": "zurück",
"Steps": "Schritte",
"Year": "Jahr",
"Loading": "Laden",
"Music": "Musik",
"color": "Farbe",
"off": "aus",
"Theme": "Thema"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "Wdh."
}
}

163
lang/el_EL.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Greek language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Save": "Αποθήκευση",
"week": "εβδομάδα",
"Keep Msgs": "Κρατήστε τα Msgs",
"New Alarm": "Νέος συναγερμός",
"Connected": "Συνδεδεμένο",
"Circle": "Κύκλος",
"maximum": "μέγιστο",
"Heartrate": "Καρδιακός ρυθμός",
"step length": "μήκος βήματος",
"valid period": "περίοδος ισχύος",
"(repeat)": "(επανάληψη)",
"min. confidence": "ελάχιστη εμπιστοσύνη",
"New Timer": "Νέος χρονοδιακόπτης",
"Sleep": "Ύπνος",
"Timer": "Χρονοδιακόπτης",
"Alarm": "Συναγερμός",
"goal": "γκολ",
"distance goal": "στόχος απόστασης",
"Steps": "Βήματα",
"minimum": "ελάχιστο",
"circle 4": "κύκλος 4",
"steps": "βήματα",
"circle 2": "κύκλος 2",
"circle 1": "κύκλος 1",
"weather circle": "κύκλος καιρού",
"circle count": "Αριθμός κύκλων",
"heartrate": "καρδιακός ρυθμός",
"circle 3": "κύκλος 3",
"show widgets": "Εμφάνιση widgets",
"battery warn": "προειδοποίηση μπαταρίας",
"Vector font size": "Μέγεθος γραμματοσειράς διανύσματος",
"Font": "Γραμματοσειρά",
"colorize icon": "χρωματισμός εικονιδίου",
"Show clocks": "Εμφάνιση ρολογιών",
"color": "χρώμα",
"Launcher Settings": "Ρυθμίσεις εκτοξευτή",
"App Source\nNot found": "Πηγή εφαρμογής\nΔεν βρέθηκε",
"Loading": "Φόρτωση",
"data": "δεδομένα",
"View Message": "Προβολή μηνύματος",
"Delete all messages": "Διαγραφή όλων των μηνυμάτων",
"Mark Unread": "Mark Unread",
"Are you sure": "Είσαι σίγουρος",
"Delete All Messages": "Διαγραφή όλων των μηνυμάτων",
"Unread timer": "Χρονοδιακόπτης χωρίς ανάγνωση",
"Apps": "Εφαρμογές",
"Record Run": "Τρέξιμο ρεκόρ",
"No Messages": "Δεν υπάρχουν μηνύματα",
"Music": "Μουσική",
"Bluetooth": "Bluetooth",
"LCD": "LCD",
"Piezo": "Piezo",
"Quiet Mode": "Αθόρυβη λειτουργία",
"Make Connectable": "Κάντε Connectable",
"Utils": "Utils",
"Vibration": "Δονήσεις",
"Programmable": "Προγραμματιζόμενο",
"Beep": "Μπιπ",
"Passkey BETA": "Passkey BETA",
"Wake on Touch": "Αφύπνιση στο άγγιγμα",
"Twist Max Y": "Twist Max Y",
"Time Zone": "Ζώνη ώρας",
"Remove": "Αφαιρέστε το",
"Add Device": "Προσθήκη συσκευής",
"LCD Brightness": "Φωτεινότητα LCD",
"LCD Timeout": "Χρονικό όριο LCD",
"Twist Timeout": "Twist Timeout",
"Highlight BG": "Επισημάνετε το BG",
"Highlight FG": "Επισημάνετε το FG",
"Light BW": "Ελαφρύ BW",
"Foreground 2": "Πρόσθιο πεδίο 2",
"Background": "Ιστορικό",
"Background 2": "Ιστορικό 2",
"HID": "HID",
"Dark BW": "Σκούρο BW",
"BLE": "BLE",
"Customize": "Προσαρμογή",
"Debug Info": "Πληροφορίες εντοπισμού σφαλμάτων",
"Rewrite Settings": "Ρυθμίσεις επανεγγραφής",
"Storage": "Αποθήκευση",
"Flatten Battery": "Επίπεδη μπαταρία",
"Clock Style": "Στυλ ρολογιού",
"Compact Storage": "Συμπαγής αποθήκευση",
"Utilities": "Υπηρεσίες κοινής ωφέλειας",
"Log": "Ημερολόγιο",
"Right": "Δεξιά",
"Month": "Μήνας",
"Side": "Πλευρά",
"No app has settings": "Καμία εφαρμογή δεν έχει ρυθμίσεις",
"Widgets": "Widgets",
"Left": "Αριστερά",
"Reset All": "Επαναφορά όλων",
"Invalid settings": "Μη έγκυρες ρυθμίσεις",
"Reset": "Επαναφορά",
"Sort Order": "Σειρά ταξινόμησης",
"TAP right top/bottom": "TAP δεξιά πάνω/κάτω",
"Wake on BTN2": "Wake στο BTN2",
"Connect device\nto add to\nwhitelist": "Σύνδεση συσκευής\nγια να προσθέσετε\nλευκή λίστα",
"Wake on FaceUp": "Wake στο FaceUp",
"Wake on BTN1": "Wake στο BTN1",
"Wake on BTN3": "Wake στο BTN3",
"Foreground": "Πρόσφατα στοιχεία",
"Wake on Twist": "Wake on Twist",
"Auto snooze": "Αυτόματη επαναφορά",
"Twist Threshold": "Κατώφλι συστροφής",
"Compacting...\nTakes approx\n1 minute": "Συμπίεση...\nΠαίρνει περίπου\n1 λεπτό",
"Connectable": "Συνδεόμενο",
"Repeat": "Επανάληψη",
"No Clocks Found": "Δεν βρέθηκαν ρολόγια",
"TIMER": "TIMER",
"App Settings": "Ρυθμίσεις εφαρμογής",
"Stay Connectable": "Μείνετε συνδεδεμένοι",
"Second": "Δεύτερο",
"Minute": "Λεπτό",
"Date": "Ημερομηνία",
"This will remove everything": "Αυτό θα αφαιρέσει τα πάντα",
"Reset to Defaults": "Επαναφορά στις προεπιλογές",
"Vibrate": "Δονήσεις",
"Hour": "Ώρα",
"Turn Off": "Απενεργοποίηση",
"Reset Settings": "Επαναφορά ρυθμίσεων",
"Year": "Έτος",
"Message": "Μήνυμα",
"Locale": "Τοπική τοποθεσία",
"Alerts": "Ειδοποιήσεις",
"Theme": "Θέμα",
"Error in settings": "Σφάλμα στις ρυθμίσεις",
"Disable": "Απενεργοποίηση",
"Factory Reset": "Επαναφορά εργοστασιακών ρυθμίσεων",
"System": "Σύστημα",
"Ok": "Εντάξει",
"Yes": "Ναι",
"On": "Στο",
"Settings": "Ρυθμίσεις",
"Select Clock": "Επιλέξτε Ρολόι",
"Off": "Off",
"Back": "Πίσω",
"No": "Όχι",
"Delete": "Διαγραφή",
"Enabled": "Ενεργοποιημένο",
"Hours": "Ώρες",
"ALARM": "ALARM",
"on": "στο",
"off": "off",
"Minutes": "Πρακτικά",
"Reset all widgets": "Επαναφορά όλων των widgets",
"Hide": "Απόκρυψη",
"Messages": "Μηνύματα",
"Show": "Εμφάνιση",
"Set Time": "Ρύθμιση χρόνου",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"start&lap/reset, BTN1: EXIT": "εκκίνηση&γύρος/επαναφορά, BTN1: ΕΞΟΔΟΣ",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Εξομάλυνση της μπαταρίας - αυτό μπορεί να διαρκέσει ώρες.\nΠατήστε παρατεταμένα το κουμπί για ακύρωση",
"Whitelist": "Λευκή λίστα"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,28 +1,173 @@
{
"//":"Spanish language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Alarmas",
"Hours" : "Horas",
"Minutes" : "Minutos",
"Enabled" : "Activados",
"Save" : "Ahorrar",
"Back" : "Regresa",
"Repeat" : "Repetición",
"Delete" : "Borrar",
"ALARM!" : "ALARM",
"Sleep" : "Dormir",
"Alarms" : "Alarmas",
"New Alarm" : "Nueva alarma",
"ALARM!" : "ALARM!",
"Yes" : "Si",
"No" : "No",
"On" : "Encendido",
"Off" : "Apagado",
"Ok" : "OK"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "rep."
}
}
"//": "Spanish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Alarmas",
"Hours": "Horas",
"Minutes": "Minutos",
"Enabled": "Activados",
"Save": "Ahorrar",
"Back": "Regresa",
"Repeat": "Repetición",
"Delete": "Borrar",
"ALARM!": "ALARM!",
"Sleep": "Dormir",
"New Alarm": "Nueva alarma",
"Yes": "Si",
"No": "No",
"On": "Encendido",
"Off": "Apagado",
"Ok": "OK",
"(repeat)": "(repetir)",
"New Timer": "Nuevo temporizador",
"music": "música",
"circle 2": "círculo 2",
"circle 1": "círculo 1",
"Keep Msgs": "Mantener Msgs",
"circle 3": "círculo 3",
"week": "semana",
"Auto snooze": "Repetición automática de la alarma",
"show widgets": "mostrar widgets",
"min. confidence": "confianza mínima",
"circle 4": "círculo 4",
"circle count": "recuento de círculos",
"heartrate": "ritmo cardíaco",
"Heartrate": "El ritmo cardíaco",
"weather circle": "círculo meteorológico",
"battery warn": "aviso de batería",
"minimum": "mínimo",
"distance goal": "objetivo de distancia",
"valid period": "período de validez",
"maximum": "máximo",
"step length": "longitud del paso",
"data": "datos",
"colorize icon": "colorear el icono",
"Circle": "Círculo",
"Launcher Settings": "Configuración del lanzador",
"App Source\nNot found": "Fuente de la aplicación\nNo se ha encontrado",
"Show clocks": "Mostrar relojes",
"Font": "Fuente",
"TAP right top/bottom": "TAP derecho superior/inferior",
"Yes\ndefinitely": "Sí\ndefinitivamente",
"View Message": "Ver mensaje",
"Delete all messages": "Borrar todos los mensajes",
"STEPS": "PASOS",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Are you sure": "¿Está seguro de que",
"Vector font size": "Tamaño de la fuente vectorial",
"Mark Unread": "Marcar como no leído",
"No Messages": "No hay mensajes",
"Delete All Messages": "Borrar todos los mensajes",
"LCD": "LCD",
"Apps": "Aplicaciones",
"Unread timer": "Temporizador no leído",
"Record Run": "Carrera de récords",
"Bluetooth": "Bluetooth",
"Quiet Mode": "Modo silencioso",
"Piezo": "Piezo",
"Make Connectable": "Hacer conectable",
"Programmable": "Programable",
"Vibration": "Vibración",
"Passkey BETA": "Passkey BETA",
"Customize": "Personalice",
"HID": "HID",
"Utils": "Utilidades",
"Light BW": "Luz BW",
"BLE": "BLE",
"Dark BW": "BW oscuro",
"Background 2": "Antecedentes 2",
"Foreground 2": "Primer plano 2",
"Foreground": "Primer plano",
"Highlight BG": "Resaltar BG",
"Connect device\nto add to\nwhitelist": "Conectar dispositivo\npara añadirlo a la\nlista blanca",
"Highlight FG": "Destacar FG",
"Background": "Antecedentes",
"Add Device": "Añadir dispositivo",
"Remove": "Eliminar",
"Wake on BTN3": "Wake en BTN3",
"Twist Max Y": "Twist Max Y",
"LCD Timeout": "Tiempo de espera del LCD",
"Twist Threshold": "Umbral de giro",
"Wake on BTN2": "Wake en BTN2",
"Wake on BTN1": "Wake en BTN1",
"Wake on Twist": "Despertar en Twist",
"LCD Brightness": "Brillo del LCD",
"Log": "Registro",
"Time Zone": "Huso horario",
"Wake on FaceUp": "Despierta en FaceUp",
"Wake on Touch": "Despertar al tacto",
"Twist Timeout": "Tiempo de espera de la torsión",
"Compact Storage": "Almacenamiento compacto",
"Clock Style": "Estilo de reloj",
"Storage": "Almacenamiento",
"Utilities": "Servicios públicos",
"Compacting...\nTakes approx\n1 minute": "La compactación...\nTarda aproximadamente\n1 minuto",
"Debug Info": "Información de depuración",
"Rewrite Settings": "Reescribir la configuración",
"Flatten Battery": "Aplastar la batería",
"Turn Off": "Apagar",
"This will remove everything": "Esto eliminará todo",
"Reset Settings": "Restablecer la configuración",
"Month": "Mes",
"Second": "Segundo",
"Date": "Fecha",
"Reset to Defaults": "Restablecer los valores predeterminados",
"Hour": "Hora",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Aplastar la batería - esto puede llevar horas.\nPulsar prolongadamente el botón para cancelar",
"Stay Connectable": "Manténgase conectado",
"Minute": "Minuta",
"No Clocks Found": "No se han encontrado relojes",
"Connectable": "Conectable",
"No app has settings": "Ninguna aplicación tiene ajustes",
"Invalid settings": "Ajustes no válidos",
"App Settings": "Configuración de la aplicación",
"Side": "Lado",
"OFF": "OFF",
"Sleep Phase Alarm": "Alarma de fase de sueño",
"Widgets": "Widgets",
"Left": "Izquierda",
"Sort Order": "Orden de clasificación",
"TIMER": "TEMPORIZADOR",
"goal": "objetivo",
"Right": "A la derecha",
"on": "en",
"Alarm": "Alarma",
"Reset All": "Restablecer todo",
"Reset all widgets": "Restablecer todos los widgets",
"Reset": "Reiniciar",
"Beep": "Bip",
"System": "Sistema",
"Locale": "Localidad",
"Message": "Mensaje",
"Set Time": "Hora de la cita",
"Vibrate": "Vibrar",
"Alerts": "Alertas",
"Timer": "Temporizador",
"Error in settings": "Error en la configuración",
"Select Clock": "Seleccionar reloj",
"Whitelist": "Lista blanca",
"Disable": "Desactivar",
"BACK": "VOLVER",
"Factory Reset": "Restablecimiento de fábrica",
"Connected": "Conectado",
"ALARM": "ALARMA",
"Messages": "Mensajes",
"Settings": "Ajustes",
"Show": "Mostrar",
"Hide": "Ocultar",
"steps": "pasos",
"back": "volver",
"Steps": "Pasos",
"Year": "Año",
"Loading": "Cargando",
"Music": "Música",
"color": "color",
"off": "fuera de",
"Theme": "Tema"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "rep."
}
}

163
lang/et_ET.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Estonian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Uus häire",
"Alarm": "Häire",
"Save": "Salvesta",
"Timer": "Taimer",
"(repeat)": "(kordus)",
"New Timer": "Uus taimer",
"circle 2": "ring 2",
"week": "nädal",
"circle 4": "ring 4",
"circle count": "ringide arv",
"Sleep": "Sleep",
"circle 3": "ring 3",
"Keep Msgs": "Hoidke Msgs",
"heartrate": "südame löögisagedus",
"circle 1": "ring 1",
"Connected": "Ühendatud",
"steps": "sammud",
"battery warn": "aku hoiatus",
"show widgets": "Näita vidinaid",
"minimum": "minimaalne",
"Heartrate": "Südame löögisagedus",
"weather circle": "ilmastikuring",
"Loading": "Laadimine",
"Launcher Settings": "Käivitajate seaded",
"color": "värv",
"Font": "Font",
"colorize icon": "värvida ikooni",
"Steps": "Sammud",
"step length": "sammu pikkus",
"Auto snooze": "Automaatne snooze",
"TAP right top/bottom": "TAP paremal üleval/alla",
"maximum": "maksimaalne",
"distance goal": "kauguse eesmärk",
"valid period": "kehtivusaeg",
"min. confidence": "min. usaldus",
"data": "andmed",
"Circle": "Ring",
"goal": "eesmärk",
"Delete all messages": "Kustuta kõik sõnumid",
"Are you sure": "Oled sa kindel, et",
"App Source\nNot found": "Rakenduse allikas\nEi leitud",
"Show clocks": "Näita kellasid",
"View Message": "Vaata sõnumit",
"Vector font size": "Vektori kirjasuurus",
"Mark Unread": "Märgi lugemata",
"Delete All Messages": "Kustuta kõik sõnumid",
"No Messages": "Sõnumid puuduvad",
"Bluetooth": "Bluetooth",
"LCD": "LCD",
"Unread timer": "Lugemata taimer",
"Record Run": "Record Run",
"Music": "Muusika",
"Beep": "Helisema",
"Piezo": "Piezo",
"Apps": "Rakendused",
"Utils": "Utils",
"Vibration": "Vibratsioon",
"BLE": "BLE",
"Make Connectable": "Tee ühendatavaks",
"Programmable": "Programmeeritav",
"Light BW": "Kerge BW",
"Passkey BETA": "Passkey BETA",
"HID": "HID",
"Quiet Mode": "Vaikne režiim",
"Background": "Taustaks",
"Customize": "Kohandada",
"Dark BW": "Tume BW",
"LCD Timeout": "LCD Timeout",
"Background 2": "Taust 2",
"Highlight FG": "FG esiletõstmine",
"Add Device": "Seadme lisamine",
"Highlight BG": "Rõhutage BG",
"Remove": "Eemaldage",
"LCD Brightness": "LCD heledus",
"Foreground 2": "Teadmised 2",
"Time Zone": "Ajavöönd",
"Debug Info": "Debug-info",
"Twist Max Y": "Twist Max Y",
"Twist Timeout": "Twist Timeout",
"Foreground": "Esialgsed teadmised",
"Wake on BTN3": "Wake on BTN3",
"Connect device\nto add to\nwhitelist": "Seadme ühendamine\nlisada\nvalimisnimekirja",
"Wake on BTN2": "Wake on BTN2",
"Wake on Touch": "Wake on Touch",
"Wake on FaceUp": "FaceUp'i ärkamine",
"Compact Storage": "Kompaktne ladustamine",
"Wake on Twist": "Wake on Twist",
"Clock Style": "Kella stiil",
"Wake on BTN1": "Wake on BTN1",
"Utilities": "Kommunaalteenused",
"Twist Threshold": "Twist künnis",
"Log": "Logi",
"Reset Settings": "Seadete lähtestamine",
"Rewrite Settings": "Ümberkirjutamise seaded",
"Hour": "Tund",
"Stay Connectable": "Jääge ühendatavaks",
"Flatten Battery": "Aku tasandamine",
"This will remove everything": "See eemaldab kõik",
"Minute": "Hetk",
"App Settings": "Rakenduse seaded",
"No app has settings": "Ühelgi rakendusel ei ole seadeid",
"Invalid settings": "Väärad seaded",
"Date": "Kuupäev",
"Year": "Aasta",
"Side": "Side",
"Turn Off": "Lülita välja",
"Storage": "Ladustamine",
"Second": "Teine",
"Right": "Õigus",
"Left": "Vasakpoolne",
"Month": "Kuu",
"TIMER": "TIMER",
"Reset to Defaults": "Lähtestamine vaikimisi seadistustele",
"Compacting...\nTakes approx\n1 minute": "Tihendamine...\nKulub umbes\n1 minut",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Aku tasandamine - see võib võtta tunde.\nTühistamiseks vajutage pikalt nuppu",
"ALARM": "ALARM",
"Reset All": "Reset All",
"Hours": "Tunnid",
"off": "välja",
"Widgets": "Vidinad",
"Reset all widgets": "Nullida kõik vidinad",
"on": "aadressil",
"Connectable": "Ühendatav",
"No Clocks Found": "Kellasid ei leitud",
"BTNs 1:startlap 2:exit 3:reset": "BTNid 1:startlap 2:exit 3:reset",
"Sort Order": "Sorteerimisjärjekord",
"Reset": "Reset",
"System": "Süsteem",
"Message": "Sõnum",
"Settings": "Seaded",
"Locale": "Locale",
"Alerts": "Hoiatused",
"Enabled": "Lubatud",
"Theme": "Teema",
"Minutes": "Protokoll",
"Delete": "Kustuta",
"Set Time": "Määratud aeg",
"Select Clock": "Valige kell",
"Hide": "Peida",
"Messages": "Sõnumid",
"Ok": "Ok",
"Show": "Näita",
"On": "Veebilehel",
"Factory Reset": "Tehase lähtestamine",
"Error in settings": "Viga seadetes",
"Disable": "Lülita välja",
"Repeat": "Kordus",
"Vibrate": "Vibreerima",
"Whitelist": "Valge nimekiri",
"No": "Ei",
"Yes": "Jah",
"Off": "Väljaspool",
"Back": "Tagasi"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,21 +1,173 @@
{
"//":"Finnish language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Hälytykset",
"Hours" : "Tunnit",
"Minutes" : "Minuutit",
"Enabled" : "Aktivoitu",
"New Alarm" : "Uusi hälytys",
"Save" : "Tallenna",
"Back" : "Paluu",
"Repeat" : "Toista",
"Delete" : "Poista",
"ALARM!" : "ALARM",
"Sleep" : "Nukkuminen"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "toistaa"
}
}
"//": "Finnish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Hälytykset",
"Hours": "Tunnit",
"Minutes": "Minuutit",
"Enabled": "Aktivoitu",
"New Alarm": "Uusi hälytys",
"Save": "Tallenna",
"Back": "Paluu",
"Repeat": "Toista",
"Delete": "Poista",
"ALARM!": "ALARM",
"Sleep": "Nukkuminen",
"New Timer": "Uusi ajastin",
"(repeat)": "(toista)",
"music": "musiikki",
"circle count": "ympyröiden lukumäärä",
"Keep Msgs": "Pidä Msgs",
"Auto snooze": "Automaattinen torkku",
"battery warn": "akkuvaroitus",
"heartrate": "syke",
"circle 4": "ympyrä 4",
"circle 2": "ympyrä 2",
"min. confidence": "min. luottamus",
"show widgets": "näytä widgetit",
"step length": "askelpituus",
"weather circle": "sääpiiri",
"circle 1": "ympyrä 1",
"circle 3": "ympyrä 3",
"week": "viikko",
"minimum": "vähintään",
"colorize icon": "väritä kuvake",
"data": "tiedot",
"distance goal": "etäisyystavoite",
"Circle": "Circle",
"valid period": "voimassaoloaika",
"maximum": "maksimi",
"Heartrate": "Sydämen syke",
"Mark Unread": "Merkitse lukematon",
"Delete all messages": "Poista kaikki viestit",
"LCD": "LCD",
"Apps": "Sovellukset",
"TAP right top/bottom": "TAP oikealle ylhäältä/alhaalta",
"App Source\nNot found": "Sovelluksen lähde\nEi löydy",
"STEPS": "STEPS",
"Launcher Settings": "Laukaisimen asetukset",
"Show clocks": "Näytä kellot",
"Vector font size": "Vektorin fonttikoko",
"Font": "Fontti",
"Yes\ndefinitely": "Kyllä\nehdottomasti",
"Bluetooth": "Bluetooth",
"Record Run": "Ennätysjuoksu",
"View Message": "Näytä viesti",
"No Messages": "Ei viestejä",
"Unread timer": "Lukematon ajastin",
"Are you sure": "Oletko varma, että",
"Delete All Messages": "Poista kaikki viestit",
"Highlight FG": "Korosta FG",
"Foreground 2": "Tulosaineisto 2",
"Foreground": "Tulosaineisto",
"Make Connectable": "Tee liitettäväksi",
"Quiet Mode": "Hiljainen tila",
"BLE": "BLE",
"Dark BW": "Tumma BW",
"Background": "Tausta",
"Background 2": "Tausta 2",
"Utils": "Utils",
"Vibration": "Tärinä",
"Piezo": "Piezo",
"HID": "HID",
"Light BW": "Vaalea BW",
"Programmable": "Ohjelmoitava",
"Customize": "Mukauta",
"Passkey BETA": "Passkey BETA",
"BTNs 1:startlap 2:exit 3:reset": "BTN:t 1:käynnistys 2:poistuminen 3:nollaus",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Utilities": "Apuohjelmat",
"Time Zone": "Aikavyöhyke",
"Clock Style": "Kello tyyli",
"Compact Storage": "Kompakti varastointi",
"Log": "Tukki",
"Debug Info": "Vianmääritystiedot",
"Twist Max Y": "Twist Max Y",
"Twist Timeout": "Twist Timeout",
"Remove": "Poista",
"LCD Timeout": "LCD-aikakatkaisu",
"LCD Brightness": "LCD-kirkkaus",
"Wake on Touch": "Herätys kosketuksesta",
"Wake on BTN3": "Wake BTN3:lla",
"Wake on Twist": "Wake on Twist",
"Wake on BTN2": "Wake BTN2:lla",
"Wake on FaceUp": "Wake on FaceUp",
"Twist Threshold": "Twist-kynnysarvo",
"Add Device": "Lisää laite",
"Highlight BG": "Korosta BG",
"Wake on BTN1": "Wake BTN1:llä",
"Connect device\nto add to\nwhitelist": "Yhdistä laite\nlisätäksesi\nwhitelist",
"Reset to Defaults": "Nollaa oletusasetukset",
"No Clocks Found": "Kelloja ei löydy",
"Hour": "Tunti",
"Date": "Päivämäärä",
"Stay Connectable": "Pysy yhteyksissä",
"Minute": "Minuutti",
"Second": "Toinen",
"Connectable": "Liitettävissä",
"Turn Off": "Kytke pois päältä",
"This will remove everything": "Tämä poistaa kaiken",
"Reset Settings": "Nollaa asetukset",
"Right": "Oikea",
"Left": "Vasen",
"Side": "Sivu",
"Sort Order": "Lajittelujärjestys",
"Reset All": "Nollaa kaikki",
"Widgets": "Widgetit",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Akun tyhjentäminen - tämä voi kestää tunteja.\nPeruuta painamalla pitkään painiketta",
"Compacting...\nTakes approx\n1 minute": "Tiivistäminen...\nKestää noin\n1 minuutti",
"Storage": "Varastointi",
"Rewrite Settings": "Uudelleenkirjoitusasetukset",
"Flatten Battery": "Litistä akku",
"Invalid settings": "Virheelliset asetukset",
"OFF": "OFF",
"Sleep Phase Alarm": "Univaiheen hälytys",
"No app has settings": "Missään sovelluksessa ei ole asetuksia",
"App Settings": "Sovelluksen asetukset",
"Month": "Kuukausi",
"Reset": "Nollaa",
"Alarm": "Hälytys",
"Beep": "Beep",
"goal": "tavoite",
"on": "osoitteessa",
"Reset all widgets": "Nollaa kaikki widgetit",
"Select Clock": "Valitse Kello",
"Vibrate": "Värinä",
"Message": "Viesti",
"TIMER": "AJASTIN",
"Alerts": "Hälytykset",
"Locale": "Paikkakunta",
"Set Time": "Aseta aika",
"System": "Järjestelmä",
"Disable": "Poista käytöstä",
"Whitelist": "Whitelist",
"Error in settings": "Virhe asetuksissa",
"BACK": "TAKAISIN",
"Factory Reset": "Tehdasasetusten palautus",
"Timer": "Ajastin",
"Connected": "Yhdistetty",
"ALARM": "HÄLYTYS",
"Messages": "Viestit",
"Hide": "Piilota",
"Ok": "Ok",
"Show": "Näytä",
"On": "Osoitteessa",
"No": "Ei",
"Settings": "Asetukset",
"steps": "vaiheet",
"back": "takaisin",
"Steps": "Askeleet",
"Yes": "Kyllä",
"Year": "Vuosi",
"Loading": "Ladataan",
"Music": "Musiikki",
"color": "väri",
"off": "off",
"Off": "Off",
"Theme": "Teema"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "toistaa"
}
}

View File

@ -1,21 +1,173 @@
{
"//":"French language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Réveils",
"Hours" : "Heures",
"Minutes" : "Minutes",
"Enabled" : "Activé",
"New Alarm" : "Nouveau Réveil",
"Save" : "Sauvegarder",
"Back" : "Retour",
"Repeat" : "Répétition",
"Delete" : "Supprimer",
"ALARM!" : "ALARM!",
"Sleep" : "Sommeil"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "rép."
}
}
"//": "French language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Réveils",
"Hours": "Heures",
"Minutes": "Minutes",
"Enabled": "Activé",
"New Alarm": "Nouveau Réveil",
"Save": "Sauvegarder",
"Back": "Retour",
"Repeat": "Répétition",
"Delete": "Supprimer",
"ALARM!": "ALARM!",
"Sleep": "Sommeil",
"New Timer": "Nouveau Timer",
"Keep Msgs": "Garder les messages",
"(repeat)": "(répétition)",
"week": "semaine",
"Auto snooze": "Réveil automatique",
"music": "musique",
"circle 2": "cercle 2",
"circle 3": "cercle 3",
"circle count": "nombre de cercles",
"weather circle": "cercle météorologique",
"circle 4": "cercle 4",
"show widgets": "afficher les widgets",
"heartrate": "fréquence cardiaque",
"battery warn": "alerte batterie",
"circle 1": "cercle 1",
"maximum": "maximum",
"min. confidence": "confiance minimale",
"step length": "longueur des pas",
"minimum": "minimum",
"Circle": "Cercle",
"valid period": "période de validité",
"Heartrate": "Fréquence cardiaque",
"distance goal": "objectif de distance",
"Yes\ndefinitely": "Oui\ndéfinitivement",
"data": "données",
"colorize icon": "coloriser l'icône",
"TAP right top/bottom": "TAP droit haut/bas",
"App Source\nNot found": "Source de l'application\nNon trouvé",
"Font": "Police",
"STEPS": "ÉTAPES",
"Vector font size": "Taille de la police vectorielle",
"Show clocks": "Montrer les horloges",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"No Messages": "Aucun message",
"View Message": "Afficher le message",
"Launcher Settings": "Paramètres du lanceur",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1 : EXIT",
"Make Connectable": "Rendre connectable",
"Piezo": "Piezo",
"Programmable": "Programmable",
"HID": "HID",
"Mark Unread": "Marquer comme non lu",
"Are you sure": "Vous êtes sûr",
"Dark BW": "Dark BW",
"Delete all messages": "Supprimer tous les messages",
"Delete All Messages": "Supprimer tous les messages",
"Vibration": "Vibration",
"Quiet Mode": "Mode silencieux",
"Passkey BETA": "Passkey BETA",
"BLE": "BLE",
"Foreground 2": "Premier plan 2",
"Background": "Contexte",
"Record Run": "Record Run",
"Utils": "Utils",
"Bluetooth": "Bluetooth",
"Apps": "Apps",
"Customize": "Personnalisez",
"Background 2": "Contexte 2",
"Light BW": "Light BW",
"LCD": "LCD",
"Unread timer": "Minuterie non lue",
"Foreground": "Premier plan",
"Remove": "Retirer",
"Highlight FG": "Highlight FG",
"Add Device": "Ajouter un dispositif",
"Highlight BG": "Mettre en évidence BG",
"Wake on BTN1": "Réveil sur BTN1",
"Connect device\nto add to\nwhitelist": "Connecter le dispositif\nà ajouter à\nliste blanche",
"LCD Timeout": "Temporisation de l'écran LCD",
"LCD Brightness": "Luminosité de l'écran LCD",
"Wake on BTN2": "Wake sur BTN2",
"Wake on BTN3": "Wake sur BTN3",
"Wake on FaceUp": "Réveillez-vous sur FaceUp",
"Wake on Touch": "Réveil au toucher",
"Twist Threshold": "Seuil de torsion",
"Wake on Twist": "Réveil sur Twist",
"Reset to Defaults": "Réinitialisation des valeurs par défaut",
"Utilities": "Utilitaires",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Mise à plat de la batterie - cela peut prendre des heures.\nAppuyez longuement sur le bouton pour annuler",
"Flatten Battery": "Aplatir la batterie",
"Storage": "Stockage",
"Reset Settings": "Réinitialiser les paramètres",
"Log": "Journal de bord",
"Rewrite Settings": "Paramètres de réécriture",
"Compacting...\nTakes approx\n1 minute": "Compactage...\nPrend environ\n1 minute",
"Time Zone": "Fuseau horaire",
"Clock Style": "Style de l'horloge",
"Debug Info": "Informations de débogage",
"Twist Max Y": "Twist Max Y",
"Twist Timeout": "Twist Timeout",
"Compact Storage": "Stockage compact",
"App Settings": "Paramètres de l'application",
"No app has settings": "Aucune application n'a de paramètres",
"Sleep Phase Alarm": "Alarme de phase de sommeil",
"Month": "Mois",
"Turn Off": "Désactiver",
"This will remove everything": "Cela va supprimer tout",
"Date": "Date",
"Hour": "Heure",
"Right": "Droit",
"Left": "Gauche",
"No Clocks Found": "Aucune horloge trouvée",
"Sort Order": "Ordre de tri",
"OFF": "OFF",
"Side": "Côté",
"TIMER": "TIMER",
"Reset All": "Réinitialiser tout",
"Second": "Deuxièmement",
"Connectable": "Connectable",
"Minute": "Minute",
"Stay Connectable": "Restez connecté",
"Invalid settings": "Paramètres non valides",
"Widgets": "Widgets",
"Vibrate": "Vibrer",
"Reset all widgets": "Réinitialiser tous les widgets",
"Whitelist": "Liste blanche",
"Set Time": "Définir l'heure",
"System": "Système",
"Connected": "Connecté",
"Alerts": "Alertes",
"Locale": "Locale",
"Alarm": "Alarme",
"Reset": "Réinitialiser",
"on": "sur",
"Beep": "Bip",
"Factory Reset": "Réinitialisation d'usine",
"Select Clock": "Sélectionner l'horloge",
"Disable": "Désactiver",
"Message": "Message",
"goal": "objectif",
"Show": "Afficher",
"Hide": "Cacher",
"Messages": "Messages",
"BACK": "BACK",
"Error in settings": "Erreur dans les paramètres",
"Timer": "Minuterie",
"On": "Sur",
"No": "Non",
"Ok": "Ok",
"steps": "étapes",
"Settings": "Paramètres",
"ALARM": "ALARME",
"back": "dos",
"Yes": "Oui",
"Steps": "Étapes",
"Year": "Année",
"Loading": "Chargement",
"Music": "Musique",
"color": "couleur",
"Off": "Off",
"off": "off",
"Theme": "Thème"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "rép."
}
}

View File

@ -1,21 +1,173 @@
{
"//":"Spanish language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Riasztások",
"Hours" : "Óra",
"Minutes" : "Perc",
"Enabled" : "Aktiválva",
"New Alarm" : "Új riasztás",
"Save" : "Mentés",
"Back" : "Vissza",
"Repeat" : "Ismétlés",
"Delete" : "Törlés",
"ALARM!" : "ALARM!",
"Sleep" : "Alvás"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "ismétlés"
}
}
"//": "Spanish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Riasztások",
"Hours": "Óra",
"Minutes": "Perc",
"Enabled": "Aktiválva",
"New Alarm": "Új riasztás",
"Save": "Mentés",
"Back": "Vissza",
"Repeat": "Ismétlés",
"Delete": "Törlés",
"ALARM!": "ALARM!",
"Sleep": "Alvás",
"New Timer": "Új időzítő",
"Auto snooze": "Automatikus szundi",
"(repeat)": "(ismétlés)",
"Keep Msgs": "Msgs megtartása",
"music": "zene",
"week": "hét",
"min. confidence": "min. bizalom",
"minimum": "minimum",
"data": "adatok",
"Heartrate": "Szívritmus",
"battery warn": "akkumulátor figyelmeztetés",
"maximum": "maximum",
"show widgets": "widgetek megjelenítése",
"circle count": "körök száma",
"circle 1": "1. kör",
"circle 4": "4. kör",
"heartrate": "szívritmus",
"circle 3": "3. kör",
"circle 2": "2. kör",
"valid period": "érvényes időszak",
"step length": "lépéshossz",
"distance goal": "távolsági cél",
"Circle": "Kör",
"colorize icon": "ikon színezése",
"weather circle": "időjárási kör",
"TAP right top/bottom": "TAP jobbra fent/alul",
"Launcher Settings": "Indító beállításai",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Yes\ndefinitely": "Igen\nhatározottan",
"App Source\nNot found": "Alkalmazás forrása\nNem található",
"No Messages": "Nincs üzenet",
"Unread timer": "Olvasatlan időzítő",
"Record Run": "Rekord futás",
"Font": "Betűtípus",
"Vector font size": "Vektor betűméret",
"Show clocks": "Mutassa az órákat",
"Delete all messages": "Minden üzenet törlése",
"Are you sure": "Biztos vagy benne, hogy",
"Delete All Messages": "Minden üzenet törlése",
"STEPS": "LÉPÉSEK",
"Apps": "Alkalmazások",
"View Message": "Üzenet megtekintése",
"LCD": "LCD",
"Bluetooth": "Bluetooth",
"Piezo": "Piezo",
"Utils": "Utils",
"BTNs 1:startlap 2:exit 3:reset": "BTN-ek 1:startlap 2:exit 3:reset",
"Mark Unread": "Mark Unread",
"LCD Brightness": "LCD fényerő",
"Customize": "Testreszabás",
"Light BW": "Világos BW",
"Background": "Háttér",
"Highlight BG": "Kiemelés BG",
"Highlight FG": "FG kiemelése",
"Foreground": "Új információk és jogok",
"Foreground 2": "Előtérben 2",
"Background 2": "Háttér 2",
"Remove": "Távolítsa el a",
"Connect device\nto add to\nwhitelist": "Eszköz csatlakoztatása\nhozzáadni a\nfehérlistára",
"Add Device": "Eszköz hozzáadása",
"Dark BW": "Sötét BW",
"Passkey BETA": "Passkey BETA",
"HID": "HID",
"Wake on BTN3": "Wake a BTN3-on",
"Wake on BTN1": "Wake a BTN1-en",
"Wake on BTN2": "Wake a BTN2-n",
"BLE": "BLE",
"Vibration": "Rezgés",
"Make Connectable": "Csatlakoztathatóvá tenni",
"Programmable": "Programozható",
"Quiet Mode": "Csendes üzemmód",
"Twist Threshold": "Twist küszöbérték",
"Wake on FaceUp": "Ébredj a FaceUp-on",
"Twist Timeout": "Twist Timeout",
"Utilities": "Közművek",
"Twist Max Y": "Twist Max Y",
"Time Zone": "Időzóna",
"Log": "Napló",
"Clock Style": "Óra stílus",
"Compact Storage": "Kompakt tárolás",
"Storage": "Tárolás",
"Wake on Twist": "Wake on Twist",
"Debug Info": "Hibaelhárítási információ",
"Flatten Battery": "Lapos akkumulátor",
"Wake on Touch": "Ébresztés érintésre",
"LCD Timeout": "LCD Timeout",
"Rewrite Settings": "Újraírási beállítások",
"This will remove everything": "Ez mindent eltávolít",
"Turn Off": "Kikapcsolás",
"Stay Connectable": "Maradjon összekapcsolható",
"Reset to Defaults": "Alapértelmezettre visszaállítása",
"Reset Settings": "Beállítások visszaállítása",
"Compacting...\nTakes approx\n1 minute": "Tömörítés...\nKb.\n1 perc",
"No Clocks Found": "Nem találtak órákat",
"TIMER": "TIMER",
"Connectable": "Csatlakoztatható",
"Side": "Oldal",
"Reset all widgets": "Minden widget alaphelyzetbe állítása",
"Reset All": "Minden visszaállítása",
"Left": "Balra",
"Widgets": "Widgetek",
"Right": "Jobbra",
"Sort Order": "Rendezési sorrend",
"Date": "Dátum",
"Hour": "Óra",
"goal": "cél",
"Beep": "Beep",
"Reset": "Reset",
"on": "a oldalon",
"App Settings": "Alkalmazás beállításai",
"OFF": "OFF",
"No app has settings": "Egyetlen alkalmazás sem rendelkezik beállításokkal",
"Invalid settings": "Érvénytelen beállítások",
"Minute": "Perc",
"Sleep Phase Alarm": "Alvási fázis riasztás",
"Second": "Második",
"Month": "Hónap",
"Alarm": "Riasztás",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Az akkumulátor lapítása - ez órákig is eltarthat.\nHosszan nyomja meg a gombot a törléshez",
"Whitelist": "Fehér lista",
"Alerts": "Riasztások",
"Disable": "A letiltása",
"Set Time": "Beállított idő",
"Select Clock": "Óra kiválasztása",
"Message": "Üzenet",
"System": "Rendszer",
"Vibrate": "Rezgés",
"Locale": "Helyszín",
"Factory Reset": "Gyári visszaállítás",
"BACK": "VISSZA",
"ALARM": "ALARM",
"Timer": "Időzítő",
"Connected": "Csatlakoztatva",
"Error in settings": "Hiba a beállításokban",
"Messages": "Üzenetek",
"Ok": "Oké",
"No": "Nem",
"back": "vissza",
"steps": "lépések",
"Year": "Év",
"Steps": "Lépések",
"On": "A oldalon.",
"Settings": "Beállítások",
"Hide": "Rejtsd el",
"Show": "Mutasd meg a",
"Yes": "Igen",
"Loading": "Betöltés",
"Music": "Zene",
"color": "szín",
"off": "off",
"Off": "Off",
"Theme": "Téma"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "ismétlés"
}
}

View File

@ -9,5 +9,17 @@
{"code":"it_IT","name":"Italian","url":"it_IT.json"},
{"code":"nl_NL","name":"Dutch","url":"nl_NL.json"},
{"code":"sv_SE","name":"Swedish","url":"sv_SE.json"},
{"code":"tr_TR","name":"Turkish","url":"tr_TR.json"}
{"code":"tr_TR","name":"Turkish","url":"tr_TR.json"},
{"code":"ru_RU","name":"Russian","url":"ru_RU.json", "disabled":"Characters not in ISO Latin codepage"},
{"code":"pt_PT","name":"Portuguese","url":"pt_PT.json"},
{"code":"bg_BG","name":"Bulgarian","url":"bg_BG.json", "disabled":"Characters not in ISO Latin codepage"},
{"code":"da_DA","name":"Danish","url":"da_DA.json"},
{"code":"el_EL","name":"Greek","url":"el_EL.json", "disabled":"Characters not in ISO Latin codepage"},
{"code":"et_ET","name":"Estonian","url":"et_ET.json"},
{"code":"lt_LT","name":"Lithuanian","url":"lt_LT.json"},
{"code":"lv_LV","name":"Latvian","url":"lv_LV.json"},
{"code":"pl_PL","name":"Polish","url":"pl_PL.json"},
{"code":"ro_RO","name":"Romanian","url":"ro_RO.json"},
{"code":"sk_SK","name":"Slovak","url":"sk_SK.json"},
{"code":"sl_SL","name":"Slovenian","url":"sl_SL.json"}
]

View File

@ -1,148 +1,186 @@
{
"//1": "Italian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"On": "On",
"on": "on",
"Off": "Off",
"off": "off",
"Ok": "Ok",
"Yes": "Sì",
"No": "No",
"Alarm": "Sveglia",
"ALARM": "SVEGLIA",
"Alarms": "Sveglie",
"Date": "Data",
"Year": "Anno",
"Month": "Mese",
"Day": "Giorno",
"Hour": "Ora",
"Hours": "Ore",
"Minute": "Minuto",
"Minutes": "Minuti",
"Second": "Secondo",
"Seconds": "Secondi",
"week": "settimana",
"Week": "Settimana",
"Enabled": "Attivo/a",
"New Alarm": "Nuova sveglia",
"Save": "Salva",
"Cancel": "Annulla",
"Back": "Indietro",
"Repeat": "Ripeti",
"Delete": "Cancella",
"ALARM!": "SVEGLIA!",
"Sleep": "Dormi",
"Timer": "Timer",
"TIMER": "TIMER",
"New Timer": "Nuovo timer",
"(repeat)": "(ripeti)",
"Auto snooze": "Posticipa automaticamente",
"Connected": "Connesso",
"Delete all messages": "Cancella tutti i messaggi",
"Delete All Messages": "Cancella tutti i messaggi",
"Message": "Messaggio",
"Messages": "Messaggi",
"No Messages": "Nessun messaggio",
"Keep Msgs": "Tieni i messaggi",
"Mark Unread": "Segna come non letto",
"Vibrate": "Vibrazione",
"Are you sure": "Sei sicuro/a",
"Music": "Musica",
"Apps": "App",
"App Settings": "Impostazioni app",
"Bluetooth": "Bluetooth",
"BLE": "BLE",
"Make Connectable": "Rendi collegabile",
"Programmable": "Programmabile",
"Remove": "Rimuovi",
"Utils": "Utilità",
"LCD": "LCD",
"LCD Brightness": "Luminosità LCD",
"LCD Timeout": "Timeout LCD",
"Wake on BTN1": "Risveglia con BTN1",
"Wake on BTN2": "Risveglia con BTN2",
"Wake on BTN3": "Risveglia con BTN3",
"Wake on FaceUp": "Risveglia a faccia in su",
"Wake on Touch": "Risveglia al tocco",
"Wake on Twist": "Risveglia con polso",
"Twist Timeout": "Timeout torsione",
"Twist Max Y": "Torsione Y max",
"Twist Threshold": "Soglia torsione",
"Customize": "Personalizza",
"Add Device": "Aggiungi dispositivo",
"Left": "Sinistra",
"Right": "Destra",
"Widgets": "Widget",
"Settings": "Impostazioni",
"No app has settings": "Non ci sono app con delle impostazioni",
"System": "Sistema",
"Alerts": "Avvisi",
"Theme": "Tema",
"Foreground": "Primo piano",
"Background": "Sfondo",
"Foreground 2": "Primo piano 2",
"Background 2": "Sfondo 2",
"Highlight FG": "Selezione PP",
"Highlight BG": "Selezione Sf",
"Utilities": "Utilità",
"Storage": "Memoria",
"Compact Storage": "Compatta memoria",
"Select Clock": "Seleziona orologio",
"No Clocks Found": "Nessun orologio trovato",
"Locale": "Localizzazione",
"Set Time": "Imposta orario",
"Time Zone": "Fuso orario",
"Whitelist": "Whitelist",
"Quiet Mode": "Modalità silenziosa",
"Disable": "Disabilita",
"Vibration": "Vibrazione",
"Show": "Mostra",
"Hide": "Nascondi",
"Rewrite Settings": "Riscrivi impostazioni",
"Reset Settings": "Reset impostazioni",
"Factory Reset": "Ripristino condizioni iniziali",
"Flatten Battery": "Scarica la batteria",
"Turn Off": "Spegni",
"This will remove everything": "Questo rimuoverà TUTTO",
"Error in settings": "Errore nelle impostazioni",
"Invalid settings": "Impostazioni non valide",
"Loading": "Caricamento",
"Launcher Settings": "Impostazioni Launcher",
"Font": "Font",
"Show clocks": "Mostra orologi",
"Log": "Log",
"Steps": "Passi",
"steps": "passi"
},
"//2": "App-specific overrides",
"launch": {
"Vector font size": "Dim. font vett.",
"App Source\nNot found": "Codice app\nnon trovato"
},
"messages": {
"Unread timer": "Timer msg non letti"
},
"run": {
"Record Run": "Registra corsa"
},
"setting": {
"Clock Style": "Formato ora",
"Compacting...\nTakes approx\n1 minute": "Compattamento in corso...\nCi vorrà circa un minuto",
"//1": "The new line before 'operazione' improves the layout",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Scaricamento batteria in corso - l'\noperazione può richiedere ore. Tieni premuto il pulsante per annullare",
"Reset to Defaults": "Ripristinare le impostazioni predefinite",
"Connectable": "Collegamento",
"Connect device\nto add to\nwhitelist": "Collega un\ndispositivo\nper metterlo\nin whitelist",
"Stay Connectable": "Rimanere collegabile",
"Light BW": "Chiaro",
"Dark BW": "Scuro"
},
"wid_edit": {
"Reset": "Ripristina",
"Reset All": "Ripristina tutto",
"Reset all widgets": "Ripristina tutti i widget",
"Sort Order": "Ordinamento",
"Side": "Lato"
}
}
"//1": "Italian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"On": "On",
"on": "on",
"Off": "Off",
"off": "off",
"Ok": "Ok",
"Yes": "Sì",
"No": "No",
"Alarm": "Sveglia",
"ALARM": "SVEGLIA",
"Alarms": "Sveglie",
"Date": "Data",
"Year": "Anno",
"Month": "Mese",
"Day": "Giorno",
"Hour": "Ora",
"Hours": "Ore",
"Minute": "Minuto",
"Minutes": "Minuti",
"Second": "Secondo",
"Seconds": "Secondi",
"week": "settimana",
"Week": "Settimana",
"Enabled": "Attivo/a",
"New Alarm": "Nuova sveglia",
"Save": "Salva",
"Cancel": "Annulla",
"Back": "Indietro",
"Repeat": "Ripeti",
"Delete": "Cancella",
"ALARM!": "SVEGLIA!",
"Sleep": "Dormi",
"Timer": "Timer",
"TIMER": "TIMER",
"New Timer": "Nuovo timer",
"(repeat)": "(ripeti)",
"Auto snooze": "Posticipa automaticamente",
"Connected": "Connesso",
"Delete all messages": "Cancella tutti i messaggi",
"Delete All Messages": "Cancella tutti i messaggi",
"Message": "Messaggio",
"Messages": "Messaggi",
"No Messages": "Nessun messaggio",
"Keep Msgs": "Tieni i messaggi",
"Mark Unread": "Segna come non letto",
"Vibrate": "Vibrazione",
"Are you sure": "Sei sicuro/a",
"Music": "Musica",
"Apps": "App",
"App Settings": "Impostazioni app",
"Bluetooth": "Bluetooth",
"BLE": "BLE",
"Make Connectable": "Rendi collegabile",
"Programmable": "Programmabile",
"Remove": "Rimuovi",
"Utils": "Utilità",
"LCD": "LCD",
"LCD Brightness": "Luminosità LCD",
"LCD Timeout": "Timeout LCD",
"Wake on BTN1": "Risveglia con BTN1",
"Wake on BTN2": "Risveglia con BTN2",
"Wake on BTN3": "Risveglia con BTN3",
"Wake on FaceUp": "Risveglia a faccia in su",
"Wake on Touch": "Risveglia al tocco",
"Wake on Twist": "Risveglia con polso",
"Twist Timeout": "Timeout torsione",
"Twist Max Y": "Torsione Y max",
"Twist Threshold": "Soglia torsione",
"Customize": "Personalizza",
"Add Device": "Aggiungi dispositivo",
"Left": "Sinistra",
"Right": "Destra",
"Widgets": "Widget",
"Settings": "Impostazioni",
"No app has settings": "Non ci sono app con delle impostazioni",
"System": "Sistema",
"Alerts": "Avvisi",
"Theme": "Tema",
"Foreground": "Primo piano",
"Background": "Sfondo",
"Foreground 2": "Primo piano 2",
"Background 2": "Sfondo 2",
"Highlight FG": "Selezione PP",
"Highlight BG": "Selezione Sf",
"Utilities": "Utilità",
"Storage": "Memoria",
"Compact Storage": "Compatta memoria",
"Select Clock": "Seleziona orologio",
"No Clocks Found": "Nessun orologio trovato",
"Locale": "Localizzazione",
"Set Time": "Imposta orario",
"Time Zone": "Fuso orario",
"Whitelist": "Whitelist",
"Quiet Mode": "Modalità silenziosa",
"Disable": "Disabilita",
"Vibration": "Vibrazione",
"Show": "Mostra",
"Hide": "Nascondi",
"Rewrite Settings": "Riscrivi impostazioni",
"Reset Settings": "Reset impostazioni",
"Factory Reset": "Ripristino condizioni iniziali",
"Flatten Battery": "Scarica la batteria",
"Turn Off": "Spegni",
"This will remove everything": "Questo rimuoverà TUTTO",
"Error in settings": "Errore nelle impostazioni",
"Invalid settings": "Impostazioni non valide",
"Loading": "Caricamento",
"Launcher Settings": "Impostazioni Launcher",
"Font": "Font",
"Show clocks": "Mostra orologi",
"Log": "Log",
"Steps": "Passi",
"steps": "passi",
"music": "musica",
"circle 4": "cerchio 4",
"circle 3": "cerchio 3",
"circle 1": "cerchio 1",
"circle 2": "cerchio 2",
"circle count": "conteggio dei cerchi",
"minimum": "minimo",
"weather circle": "cerchio meteorologico",
"show widgets": "mostra i widget",
"heartrate": "frequenza cardiaca",
"battery warn": "avvertire la batteria",
"Heartrate": "Battito cardiaco",
"valid period": "periodo valido",
"distance goal": "obiettivo di distanza",
"min. confidence": "fiducia minima",
"maximum": "massimo",
"Circle": "Cerchio",
"data": "dati",
"step length": "lunghezza del passo",
"View Message": "Visualizza il messaggio",
"Yes\ndefinitely": "Sì\nsicuramente",
"Piezo": "Piezo",
"colorize icon": "colorare l'icona",
"STEPS": "PASSI",
"TAP right top/bottom": "TAP in alto/basso a destra",
"HID": "HID",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Passkey BETA": "Passkey BETA",
"goal": "obiettivo",
"Beep": "Bip",
"Debug Info": "Informazioni di debug",
"OFF": "OFF",
"Reset": "Reset",
"Sleep Phase Alarm": "Allarme della fase di sonno",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"back": "indietro",
"color": "colore",
"BACK": "INDIETRO"
},
"//2": "App-specific overrides",
"launch": {
"Vector font size": "Dim. font vett.",
"App Source\nNot found": "Codice app\nnon trovato"
},
"messages": {
"Unread timer": "Timer msg non letti"
},
"run": {
"Record Run": "Registra corsa"
},
"setting": {
"Clock Style": "Formato ora",
"Compacting...\nTakes approx\n1 minute": "Compattamento in corso...\nCi vorrà circa un minuto",
"//1": "The new line before 'operazione' improves the layout",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Scaricamento batteria in corso - l'\noperazione può richiedere ore. Tieni premuto il pulsante per annullare",
"Reset to Defaults": "Ripristinare le impostazioni predefinite",
"Connectable": "Collegamento",
"Connect device\nto add to\nwhitelist": "Collega un\ndispositivo\nper metterlo\nin whitelist",
"Stay Connectable": "Rimanere collegabile",
"Light BW": "Chiaro",
"Dark BW": "Scuro"
},
"wid_edit": {
"Reset": "Ripristina",
"Reset All": "Ripristina tutto",
"Reset all widgets": "Ripristina tutti i widget",
"Sort Order": "Ordinamento",
"Side": "Lato"
}
}

163
lang/lt_LT.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Lithuanian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Naujas žadintuvas",
"(repeat)": "(pakartoti)",
"Alarm": "Signalizacija",
"Save": "Išsaugoti",
"New Timer": "Naujas laikmatis",
"Sleep": "Miegas",
"circle count": "ratų skaičius",
"Timer": "Laikmatis",
"week": "savaitė",
"Connected": "Prijungta",
"circle 2": "2 ratas",
"Auto snooze": "Automatinis snaudimas",
"circle 1": "1 ratas",
"show widgets": "rodyti valdiklius",
"Keep Msgs": "Laikyti Msgs",
"weather circle": "orų ratas",
"step length": "žingsnio ilgis",
"steps": "žingsniai",
"circle 3": "3 ratas",
"battery warn": "įspėjimas apie akumuliatorių",
"min. confidence": "min. pasitikėjimas",
"maximum": "didžiausias",
"valid period": "galiojantis laikotarpis",
"minimum": "minimalus",
"heartrate": "širdies ritmas",
"circle 4": "4 ratas",
"goal": "tikslas",
"data": "duomenys",
"distance goal": "atstumo tikslas",
"Steps": "Žingsniai",
"Heartrate": "Širdies ritmas",
"Show clocks": "Rodyti laikrodžius",
"View Message": "Peržiūrėti žinutę",
"color": "",
"colorize icon": "nuspalvinti piktogramą",
"Circle": "Apskritimas",
"Delete all messages": "Ištrinti visus pranešimus",
"Font": "Šriftas",
"TAP right top/bottom": "TAP dešinėje viršuje / apačioje",
"No Messages": "Jokių pranešimų",
"Launcher Settings": "Paleidimo programos nustatymai",
"App Source\nNot found": "Programėlės šaltinis\nNerastas",
"Loading": "Pakrovimas",
"Vector font size": "Vektorinio šrifto dydis",
"Music": "Muzika",
"Are you sure": "Ar tikrai",
"Delete All Messages": "Ištrinti visus pranešimus",
"Mark Unread": "Pažymėti Neskaityta",
"LCD": "LCD",
"Apps": "Programėlės",
"Record Run": "Rekordinis paleidimas",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Unread timer": "Neperskaitytas laikmatis",
"Bluetooth": "\"Bluetooth\"",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Dark BW": "Tamsus BW",
"Programmable": "Programuojamas",
"Make Connectable": "Sukurkite \"Connectable",
"BLE": "BLE",
"Passkey BETA": "Passkey BETA",
"HID": "HID",
"Utils": "Paslaugos",
"Quiet Mode": "Tylusis režimas",
"Beep": "Pyptelėjimas",
"Piezo": "Piezo",
"Vibration": "Vibracija",
"Background": "Pagrindinė informacija",
"Customize": "Tinkinti",
"Foreground": "Naujos žinios",
"Light BW": "Šviesus BW",
"Add Device": "Pridėti įrenginį",
"Remove": "Pašalinti",
"Wake on BTN1": "Pabusti dėl BTN1",
"Wake on BTN3": "Pabusti dėl BTN3",
"Highlight FG": "Pabrėžti FG",
"Highlight BG": "Išryškinti BG",
"Twist Max Y": "Twist Max Y",
"Foreground 2": "Pirmas planas 2",
"Background 2": "Pagrindinė informacija 2",
"Clock Style": "Laikrodžio stilius",
"Log": "Žurnalas",
"Debug Info": "Derinimo informacija",
"Time Zone": "Laiko juosta",
"Wake on Touch": "Pabudimas palietus",
"Twist Threshold": "Sukimo slenkstis",
"Wake on FaceUp": "Atsibusti \"FaceUp",
"Wake on BTN2": "Pabusti dėl BTN2",
"Wake on Twist": "Pabusti dėl Twist",
"LCD Brightness": "LCD ekrano ryškumas",
"Twist Timeout": "Twist Timeout",
"Compact Storage": "Kompaktiškas saugojimas",
"Storage": "Saugykla",
"Utilities": "Komunalinės paslaugos",
"Compacting...\nTakes approx\n1 minute": "Suspaudžiant...\nUžtrunka maždaug\n1 minutė",
"No Clocks Found": "Laikrodžių nerasta",
"Reset Settings": "Nustatymų atstatymas",
"Flatten Battery": "Išlyginti akumuliatorių",
"Connect device\nto add to\nwhitelist": "Prijungti įrenginį\npridėti prie\nbaltąjį sąrašą",
"LCD Timeout": "LCD ekrano laiko limitas",
"Hour": "Valanda",
"Second": "Antrasis",
"Date": "Data",
"Turn Off": "Išjungti",
"This will remove everything": "Tai pašalins viską.",
"Connectable": "Prijungiama",
"Stay Connectable": "Palaikykite ryšį",
"Left": "Kairėje pusėje",
"Right": "Dešinė",
"Side": "Šoninė pusė",
"Invalid settings": "Netinkami nustatymai",
"Month": "Mėnuo",
"Year": "Metai",
"App Settings": "Programėlės nustatymai",
"Sort Order": "Rūšiavimo tvarka",
"Minute": "Minutė",
"No app has settings": "Jokia programa neturi nustatymų",
"Rewrite Settings": "Perrašymo nustatymai",
"Reset All": "Iš naujo nustatyti viską",
"Reset": "Iš naujo nustatyti",
"Reset to Defaults": "Iš naujo nustatyti numatytąsias reikšmes",
"Hours": "Valandos",
"ALARM": "ALARMAS",
"TIMER": "LAIKMATIS",
"Widgets": "Valdikliai",
"Reset all widgets": "Iš naujo nustatyti visus valdiklius",
"Minutes": "Protokolas",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Akumuliatoriaus išlyginimas - tai gali užtrukti kelias valandas.\nIlgai paspauskite mygtuką, kad atšauktumėte",
"on": "svetainėje",
"off": "iš",
"Message": "Žinutė",
"Repeat": "Pakartokite",
"Delete": "Ištrinti",
"Enabled": "Įjungta",
"System": "Sistema",
"Theme": "Tema",
"Vibrate": "Vibruoti",
"Settings": "Nustatymai",
"Alerts": "Įspėjimai",
"Error in settings": "Klaida nustatymuose",
"Messages": "Žinutės",
"Set Time": "Nustatytas laikas",
"Locale": "Vietovė",
"Select Clock": "Pasirinkite laikrodį",
"Whitelist": "Baltasis sąrašas",
"Disable": "Išjungti",
"Factory Reset": "Gamyklinis atstatymas",
"Show": "Rodyti",
"Hide": "Paslėpti",
"Yes": "Taip",
"Ok": "Gerai",
"No": "Ne",
"On": "Svetainėje",
"Off": "Išjungta",
"Back": "Atgal"
},
"alarm": {
"//": "App-specific overrides"
}
}

163
lang/lv_LV.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Latvian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Save": "Saglabāt",
"Auto snooze": "Automātiskā snaudiena atlikšana",
"circle 1": "1 aplis",
"New Timer": "Jauns taimeris",
"New Alarm": "Jauns modinātājs",
"Sleep": "Miega režīms",
"circle count": "apļu skaits",
"Keep Msgs": "Glabāt Msgs",
"Timer": "Taimeris",
"week": "nedēļa",
"Connected": "Savienots",
"(repeat)": "(atkārtot)",
"circle 3": "aplis 3",
"circle 4": "4 aplis",
"Alarm": "Trauksmes signāls",
"steps": "soļi",
"heartrate": "sirdsdarbības ātrums",
"weather circle": "laikapstākļu aplis",
"circle 2": "2. aplis",
"minimum": "minimālais",
"battery warn": "brīdinājums par akumulatoru",
"min. confidence": "min. uzticēšanās",
"show widgets": "parādīt logrīkus",
"step length": "soļa garums",
"goal": "mērķis",
"distance goal": "attāluma mērķis",
"valid period": "derīguma termiņš",
"Circle": "Aplis",
"data": "dati",
"Steps": "Soļi",
"color": "krāsa",
"colorize icon": "iekrāsot ikonu",
"maximum": "maksimālais",
"Heartrate": "Sirdsdarbība",
"View Message": "Skatīt ziņojumu",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"TAP right top/bottom": "TAP pa labi augšā/apakšā",
"Mark Unread": "Atzīmēt Neizlasīts",
"Delete all messages": "Dzēst visus ziņojumus",
"Vector font size": "Vektora fonta lielums",
"Loading": "Iekraušana",
"Show clocks": "Rādīt pulksteņus",
"Font": "Fonts",
"App Source\nNot found": "Lietotņu avots\nNav atrasts",
"Launcher Settings": "Palaidēja iestatījumi",
"Delete All Messages": "Dzēst visus ziņojumus",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:izeja 3:resetēšana",
"Bluetooth": "Bluetooth",
"Are you sure": "Vai esat pārliecināts, ka",
"Utils": "Utils",
"Unread timer": "Neizlasīts taimeris",
"LCD": "LCD",
"Music": "Mūzika",
"No Messages": "Nav ziņojumu",
"Record Run": "Rekorda skrējiens",
"HID": "HID",
"Quiet Mode": "Klusais režīms",
"Highlight FG": "Izcelt FG",
"Programmable": "Programmējams",
"Passkey BETA": "Passkey BETA",
"Light BW": "Gaismas BW",
"Piezo": "Piezo",
"Make Connectable": "Padarīt savienojamu",
"Beep": "Pīkstiens",
"Dark BW": "Tumšs BW",
"Background": "Pamatinformācija",
"Vibration": "Vibrācija",
"Apps": "Aplikācijas",
"Foreground 2": "Priekšplāns 2",
"Background 2": "Pamatinformācija 2",
"Foreground": "Priekšplāns",
"Customize": "Pielāgojiet",
"Highlight BG": "Izcelt BG",
"BLE": "BLE",
"LCD Timeout": "LCD displeja laika ierobežojums",
"Twist Max Y": "Twist Max Y",
"Add Device": "Pievienot ierīci",
"Connect device\nto add to\nwhitelist": "Savienot ierīci\nlai pievienotu\nbalto sarakstu",
"Wake on Touch": "Pamosties pēc pieskāriena",
"Time Zone": "Laika josla",
"Wake on BTN3": "Wake par BTN3",
"Wake on BTN1": "Pamosties par BTN1",
"Wake on BTN2": "Wake par BTN2",
"LCD Brightness": "LCD ekrāna spilgtums",
"Remove": "Noņemt",
"Clock Style": "Pulksteņa stils",
"Debug Info": "Dzesēšanas informācija",
"Twist Timeout": "Twist laika ierobežojums",
"Wake on FaceUp": "Pamosties FaceUp",
"Twist Threshold": "Pagrieziena slieksnis",
"This will remove everything": "Tādējādi tiks noņemts viss",
"Utilities": "Komunālie pakalpojumi",
"Connectable": "Savienojams",
"Minute": "Minūtes",
"Stay Connectable": "Palieciet savienojami",
"Storage": "Uzglabāšana",
"Log": "Log",
"Wake on Twist": "Wake on Twist",
"Flatten Battery": "Izlīdzināt akumulatoru",
"Rewrite Settings": "Pārrakstīšanas iestatījumi",
"Compact Storage": "Kompakta uzglabāšana",
"Compacting...\nTakes approx\n1 minute": "Blīvēšanas...\nAizņem aptuveni\n1 minūte",
"Second": "Otrais",
"Reset Settings": "Iestatījumu atiestatīšana",
"Turn Off": "Izslēgt",
"Date": "Datums",
"Right": "Tiesības",
"Sort Order": "Kārtot pēc kārtas",
"No Clocks Found": "Nav atrasti pulksteņi",
"Reset to Defaults": "Atiestatīt noklusējuma iestatījumus",
"No app has settings": "Nevienā lietotnē nav iestatījumu",
"ALARM": "ALARM",
"Widgets": "Logrīki",
"off": "izslēgts",
"Invalid settings": "Nederīgi iestatījumi",
"Month": "Mēnesis",
"Side": "Sānu",
"Reset": "Atiestatīt",
"Reset All": "Atiestatīt visu",
"Hours": "Stundas",
"Repeat": "Atkārtojiet",
"Enabled": "Ieslēgts",
"Settings": "Iestatījumi",
"Message": "Ziņa",
"Minutes": "Protokols",
"App Settings": "Lietotņu iestatījumi",
"System": "Sistēma",
"Locale": "Vietne",
"Theme": "Tēma",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Akumulatora saplacināšana - tas var aizņemt vairākas stundas.\nIlgi nospiediet pogu, lai atceltu",
"Select Clock": "Izvēlieties pulksteni",
"Set Time": "Iestatītais laiks",
"Vibrate": "Vibrēt",
"Reset all widgets": "Visu logrīku atiestatīšana",
"Hour": "Stunda",
"Left": "Kreisā",
"TIMER": "TIMER",
"Year": "Gads",
"on": "vietnē",
"Alerts": "Brīdinājumi",
"Delete": "Dzēst",
"Whitelist": "Baltais saraksts",
"Messages": "Ziņojumi",
"Disable": "Atslēgt",
"Hide": "Paslēpt",
"Show": "Rādīt",
"On": "Uz",
"Factory Reset": "Rūpnīcas atiestatīšana",
"Error in settings": "Kļūda iestatījumos",
"Ok": "Labi",
"Yes": "Jā",
"No": "Nē",
"Back": "Atpakaļ",
"Off": "Izslēgts"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,21 +1,173 @@
{
"//":"Dutch language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Alarmen",
"Hours" : "Uren",
"Minutes" : "Minuten",
"Enabled" : "Geactiveerd",
"New Alarm" : "Nieuw alarm",
"Save" : "Opslaan",
"Back" : "Terug",
"Repeat" : "Herhalen",
"Delete" : "Verwijderen",
"ALARM!" : "ALARV.",
"Sleep" : "Stand-by"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "herhalen"
}
}
"//": "Dutch language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Alarmen",
"Hours": "Uren",
"Minutes": "Minuten",
"Enabled": "Geactiveerd",
"New Alarm": "Nieuw alarm",
"Save": "Opslaan",
"Back": "Terug",
"Repeat": "Herhalen",
"Delete": "Verwijderen",
"ALARM!": "ALARV.",
"Sleep": "Stand-by",
"New Timer": "Nieuwe Timer",
"(repeat)": "(herhaling)",
"music": "muziek",
"week": "week",
"Auto snooze": "Auto snooze",
"Keep Msgs": "Houd Msgs",
"circle count": "cirkeltelling",
"Heartrate": "Hartslag",
"weather circle": "weercirkel",
"circle 1": "cirkel 1",
"show widgets": "widgets tonen",
"circle 4": "cirkel 4",
"maximum": "maximum",
"circle 3": "cirkel 3",
"circle 2": "cirkel 2",
"minimum": "minimum",
"valid period": "geldige periode",
"heartrate": "hartslag",
"battery warn": "batterijwaarschuwing",
"data": "gegevens",
"step length": "staplengte",
"min. confidence": "min. vertrouwen",
"colorize icon": "pictogram inkleuren",
"distance goal": "afstandsdoel",
"Circle": "Cirkel",
"TAP right top/bottom": "TAP rechts boven/onder",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Are you sure": "Weet je het zeker?",
"Font": "Lettertype",
"App Source\nNot found": "App Bron\nNiet gevonden",
"Launcher Settings": "Launcher Instellingen",
"Yes\ndefinitely": "Ja\nzeker",
"STEPS": "STAPPEN",
"Show clocks": "Toon klokken",
"Record Run": "Record run",
"No Messages": "Geen berichten.",
"View Message": "Bekijk bericht",
"Piezo": "Piëzo",
"BTNs 1:startlap 2:exit 3:reset": "BTN's 1:startlap 2:exit 3:reset",
"Vector font size": "Vector lettergrootte",
"Mark Unread": "Markeer ongelezen",
"Delete all messages": "Alle berichten verwijderen",
"LCD": "LCD",
"Utils": "Utils",
"Bluetooth": "Bluetooth",
"Delete All Messages": "Alle berichten verwijderen",
"Unread timer": "Ongelezen timer",
"Make Connectable": "Maak Verbindbaar",
"Quiet Mode": "Rustige modus",
"BLE": "BLE",
"Dark BW": "Donker BW",
"Apps": "Apps",
"Programmable": "Programmeerbaar",
"Vibration": "Trilling",
"HID": "HID",
"Foreground 2": "Voorgrond 2",
"Passkey BETA": "Passkey BETA",
"Background": "Achtergrond",
"Light BW": "Licht BW",
"Customize": "Aanpassen",
"Background 2": "Achtergrond 2",
"Highlight FG": "Markeer FG",
"Highlight BG": "Markeer BG",
"Foreground": "Voorgrond",
"LCD Timeout": "LCD Timeout",
"LCD Brightness": "LCD-helderheid",
"Remove": "Verwijder",
"Add Device": "Apparaat toevoegen",
"Connect device\nto add to\nwhitelist": "Apparaat aansluiten\ntoe te voegen aan\nwhitelist",
"Wake on Twist": "Wake on Twist",
"Wake on BTN2": "Wake op BTN2",
"Wake on BTN1": "Wake op BTN1",
"Wake on FaceUp": "Wakker worden op FaceUp",
"Log": "Log",
"Debug Info": "Debug info",
"Wake on BTN3": "Wake op BTN3",
"Flatten Battery": "Batterij plat maken",
"Rewrite Settings": "Instellingen herschrijven",
"Compact Storage": "Compacte opslag",
"Utilities": "Nutsbedrijven",
"Clock Style": "Klok Stijl",
"Time Zone": "Tijdzone",
"Twist Timeout": "Time-out draaien",
"Twist Max Y": "Twist Max Y",
"Twist Threshold": "Twist Drempel",
"Wake on Touch": "Wakker worden bij aanraking",
"Compacting...\nTakes approx\n1 minute": "Verdichten...\nDuurt ongeveer\n1 minuut",
"Reset to Defaults": "Terugzetten op standaardwaarden",
"No Clocks Found": "Geen klokken gevonden",
"Month": "Maand",
"Minute": "Minuutje",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Batterij leegmaken - dit kan uren duren.\nDruk lang op de knop om te annuleren",
"Sleep Phase Alarm": "Slaapfase alarm",
"Second": "Tweede",
"Turn Off": "Zet uit.",
"Hour": "Uur",
"Storage": "Opslag",
"Date": "Datum",
"Reset Settings": "Reset Instellingen",
"This will remove everything": "Dit zal alles verwijderen",
"Connectable": "Aansluitbaar",
"App Settings": "App-instellingen",
"No app has settings": "Geen app heeft instellingen",
"Stay Connectable": "Blijf verbonden",
"on": "op",
"Sort Order": "Sorteer volgorde",
"Widgets": "Widgets",
"Invalid settings": "Ongeldige instellingen",
"Reset All": "Alles resetten",
"Reset all widgets": "Reset alle widgets",
"OFF": "UIT",
"Left": "Links",
"Right": "Rechts",
"Side": "Zijde",
"TIMER": "TIMER",
"Alarm": "Alarm",
"goal": "doel",
"Reset": "Reset",
"Beep": "Beep",
"System": "Systeem",
"Locale": "Locale",
"Vibrate": "Trillen",
"Message": "Bericht",
"Alerts": "Waarschuwingen",
"Select Clock": "Selecteer Klok",
"Timer": "Timer",
"ALARM": "ALARM",
"Factory Reset": "Fabrieks reset",
"Hide": "Verberg",
"Messages": "Berichten",
"Error in settings": "Fout in instellingen",
"BACK": "ACHTER",
"Whitelist": "Whitelist",
"Set Time": "Tijd instellen",
"Disable": "Uitschakelen",
"Connected": "Aangesloten",
"On": "Op",
"Show": "Toon",
"Ok": "Ok",
"No": "Geen",
"Settings": "Instellingen",
"Steps": "Stappen",
"steps": "stappen",
"back": "terug",
"Year": "Jaar",
"Yes": "Ja",
"Loading": "Laden",
"Music": "Muziek",
"color": "kleur",
"off": "van",
"Off": "Uit",
"Theme": "Thema"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "herhalen"
}
}

163
lang/pl_PL.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Polish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Nowy Alarm",
"(repeat)": "(powtórzenie)",
"Connected": "Podłączony",
"Timer": "Timer",
"Alarm": "Alarm",
"New Timer": "Nowy zegar",
"Sleep": "Sen",
"Save": "Zapisz",
"circle 1": "krąg 1",
"circle 3": "krąg 3",
"circle count": "liczenie okręgów",
"week": "tydzień",
"circle 2": "krąg 2",
"Keep Msgs": "Keep Msgs",
"weather circle": "koło klimatyczne",
"circle 4": "krąg 4",
"heartrate": "częstość akcji serca",
"Heartrate": "Heartrate",
"maximum": "maksimum",
"min. confidence": "min. pewność siebie",
"valid period": "okres ważności",
"distance goal": "cel odległościowy",
"Circle": "Koło",
"step length": "długość kroku",
"Steps": "Kroki",
"show widgets": "wyświetlać widżety",
"steps": "kroki",
"battery warn": "ostrzeżenie o akumulatorze",
"minimum": "minimum",
"data": "dane",
"color": "kolor",
"goal": "bramka",
"Auto snooze": "Automatyczna drzemka",
"TAP right top/bottom": "TAP prawy górny/dolny",
"Font": "Czcionka",
"Launcher Settings": "Ustawienia programu uruchamiającego",
"Mark Unread": "Zaznacz nieprzeczytane",
"Loading": "Ładowanie",
"Vector font size": "Rozmiar czcionki wektorowej",
"Show clocks": "Pokaż zegary",
"App Source\nNot found": "Źródło aplikacji\nNie znaleziono",
"colorize icon": "ubarwiać ikonę",
"Delete all messages": "Usuń wszystkie wiadomości",
"No Messages": "Brak komunikatów",
"Delete All Messages": "Usuń wszystkie wiadomości",
"Are you sure": "Czy jesteś pewien, że",
"View Message": "Wyświetl wiadomość",
"Music": "Muzyka",
"Record Run": "Rekordowy bieg",
"Bluetooth": "Bluetooth",
"Unread timer": "Nieprzeczytany zegar",
"Quiet Mode": "Tryb cichy",
"Make Connectable": "Spraw, aby można było się połączyć",
"Utils": "Narzędzia",
"Beep": "Beep",
"Apps": "Aplikacje",
"Piezo": "Piezo",
"BLE": "BLE",
"LCD": "LCD",
"Vibration": "Wibracje",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: WYJŚCIE",
"Foreground": "Foreground",
"Light BW": "Światło BW",
"HID": "HID",
"Dark BW": "Ciemna BW",
"Customize": "Dostosuj",
"Passkey BETA": "Passkey BETA",
"Background": "Tło",
"Background 2": "Tło 2",
"Highlight BG": "Podświetlenie BG",
"Foreground 2": "Nowa wiedza 2",
"Highlight FG": "Highlight FG",
"LCD Brightness": "Jasność LCD",
"Wake on Touch": "Wake on Touch",
"LCD Timeout": "LCD Timeout",
"Remove": "Usuń",
"Wake on Twist": "Wake on Twist",
"Wake on BTN3": "Wake na BTN3",
"Wake on BTN2": "Wake na BTN2",
"Connect device\nto add to\nwhitelist": "Podłącz urządzenie\ndodać do\nwhitelist",
"Wake on BTN1": "Wake na BTN1",
"Add Device": "Dodaj urządzenie",
"Programmable": "Programowalna strona",
"Wake on FaceUp": "Wake on FaceUp",
"Clock Style": "Styl zegara",
"Twist Threshold": "Próg skrętu",
"Time Zone": "Strefa czasowa",
"Twist Max Y": "Twist Max Y",
"Twist Timeout": "Twist Timeout",
"Utilities": "Narzędzia",
"Debug Info": "Debug Info",
"This will remove everything": "To spowoduje usunięcie wszystkiego",
"Compact Storage": "Kompaktowe przechowywanie",
"Flatten Battery": "Spłaszcz baterię",
"Log": "Dziennik Ustaw",
"Rewrite Settings": "Ustawienia przepisywania",
"Storage": "Przechowywanie",
"Reset Settings": "Resetuj ustawienia",
"Turn Off": "Wyłączyć",
"Minute": "Minuta",
"Stay Connectable": "Pozostań w kontakcie",
"Date": "Data",
"App Settings": "Ustawienia aplikacji",
"No app has settings": "Żadna aplikacja nie ma ustawień",
"Connectable": "Możliwość podłączenia",
"Year": "Rok",
"Second": "Drugi",
"No Clocks Found": "Nie znaleziono zegarów",
"Hour": "Godzina",
"Reset to Defaults": "Resetuj do ustawień domyślnych",
"Compacting...\nTakes approx\n1 minute": "Zagęszczanie...\nTrwa ok.\n1 minuta",
"Reset all widgets": "Wyzeruj wszystkie widżety",
"Right": "Prawo",
"Side": "Strona",
"TIMER": "TIMER",
"Sort Order": "Kolejność sortowania",
"Reset": "Reset",
"Invalid settings": "Nieprawidłowe ustawienia",
"Month": "Miesiąc",
"Widgets": "Widżety",
"Left": "Lewa",
"on": "na stronie",
"Delete": "Usuń",
"Hours": "Godziny",
"ALARM": "ALARM",
"Message": "Wiadomość",
"off": "poza",
"Reset All": "Resetuj wszystko",
"Minutes": "Protokół",
"Repeat": "Powtórz",
"Enabled": "Włączone",
"Vibrate": "Vibrate",
"Whitelist": "Whitelist",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Rozładowanie baterii - może to trwać godzinami.\nNaciśnij długo przycisk, aby anulować",
"Select Clock": "Wybierz zegar",
"Theme": "Temat",
"Locale": "Locale",
"Error in settings": "Błąd w ustawieniach",
"Disable": "Wyłącz",
"Settings": "Ustawienia",
"On": "Na stronie",
"Hide": "Ukryj",
"Messages": "Wiadomości",
"Factory Reset": "Reset fabryczny",
"System": "System",
"Alerts": "Wpisy",
"Set Time": "Ustawianie czasu",
"Ok": "Ok",
"Yes": "Tak",
"Show": "Pokaż",
"No": "Nie",
"Back": "Powrót",
"Off": "Poza"
},
"alarm": {
"//": "App-specific overrides"
}
}

167
lang/pt_PT.json Normal file
View File

@ -0,0 +1,167 @@
{
"//": "Portuguese language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Timer": "Novo Temporizador",
"New Alarm": "Novo Alarme",
"Auto snooze": "Soneca automática",
"week": "semana",
"circle 3": "círculo 3",
"(repeat)": "(repetir)",
"Save": "Salvar",
"Keep Msgs": "Manter Msgs",
"music": "música",
"circle 4": "círculo 4",
"circle 2": "círculo 2",
"circle count": "contagem em círculo",
"circle 1": "círculo 1",
"battery warn": "aviso de bateria",
"show widgets": "widgets de exposição",
"data": "dados",
"heartrate": "banda funerária",
"distance goal": "golo da distância",
"Circle": "Círculo",
"colorize icon": "ícone colorir",
"min. confidence": "min. confiança",
"minimum": "mínimo",
"maximum": "máximo",
"Heartrate": "Banda cardíaca",
"weather circle": "círculo meteorológico",
"step length": "comprimento do passo",
"valid period": "período válido",
"TAP right top/bottom": "TAP superior/inferior direita",
"Vector font size": "Tamanho de letra vectorial",
"Yes\ndefinitely": "Sim\ndefinitivamente",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"STEPS": "ETAPAS",
"Font": "Fonte",
"Show clocks": "Mostrar relógios",
"App Source\nNot found": "Fonte do aplicativo\nNão encontrado",
"Mark Unread": "Marcar como não lido",
"View Message": "Ver Mensagem",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: SAÍDA",
"Launcher Settings": "Configurações do lançador",
"Delete All Messages": "Apagar todas as mensagens",
"Delete all messages": "Apagar todas as mensagens",
"Utils": "Utils",
"LCD": "LCD",
"Apps": "Apps",
"Record Run": "Record Run",
"No Messages": "Sem Mensagens",
"Unread timer": "Temporizador não lido",
"Are you sure": "Tens a certeza",
"Make Connectable": "Tornar Conectável",
"Piezo": "Piezo",
"Bluetooth": "Bluetooth",
"BLE": "BLE",
"Programmable": "Programável",
"Vibration": "Vibração",
"Quiet Mode": "Modo Silencioso",
"Foreground": "Primeiro plano",
"Passkey BETA": "Passkey BETA",
"HID": "HID",
"Light BW": "BW Leve",
"Foreground 2": "Primeiro plano 2",
"Dark BW": "BW Escuro",
"Background": "Antecedentes",
"Highlight FG": "Destaque FG",
"Customize": "Personalizar",
"Background 2": "Antecedentes 2",
"Wake on BTN3": "Acorde no BTN3",
"Wake on BTN2": "Acorde no BTN2",
"Highlight BG": "Destaque BG",
"LCD Timeout": "Tempo limite do LCD",
"Wake on FaceUp": "Acorde no FaceUp",
"Wake on BTN1": "Acorde no BTN1",
"Wake on Twist": "Acorde na Twist",
"Wake on Touch": "Acorde ao Toque",
"Connect device\nto add to\nwhitelist": "Ligar dispositivo\npara adicionar a\nlista branca",
"Remove": "Remover",
"Add Device": "Adicionar dispositivo",
"LCD Brightness": "Luminosidade do LCD",
"Twist Max Y": "Torcer Max Y",
"Utilities": "Utilidades",
"Twist Threshold": "Limiar de Torção",
"Time Zone": "Fuso horário",
"Twist Timeout": "Twist Timeout",
"Clock Style": "Estilo Relógio",
"Debug Info": "Informação de Depuração",
"Log": "Diário de Bordo",
"Storage": "Armazenamento",
"Rewrite Settings": "Re-escrever configurações",
"Compacting...\nTakes approx\n1 minute": "A compactação...\nLeva aproximadamente\n1 minuto",
"Flatten Battery": "Bateria achatada",
"Reset Settings": "Redefinir configurações",
"Compact Storage": "Armazenamento compacto",
"Stay Connectable": "Fique Conectável",
"Turn Off": "Desligar",
"Connectable": "Conectável",
"This will remove everything": "Isto irá remover tudo",
"Date": "Data",
"Month": "Mês",
"Second": "Segundo",
"Minute": "Ata",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Bateria plana - isto pode demorar horas.\nBotão de pressão prolongada para cancelar",
"Reset to Defaults": "Redefinir para Padrões",
"Hour": "Hora",
"No Clocks Found": "Não foram encontrados relógios",
"Right": "Certo",
"No app has settings": "Nenhum aplicativo tem configurações",
"App Settings": "Configurações do aplicativo",
"OFF": "DESLIGADO",
"Side": "Lado",
"Left": "Esquerda",
"Sort Order": "Ordem de classificação",
"Widgets": "Widgets",
"Invalid settings": "Configurações inválidas",
"Sleep Phase Alarm": "Alarme da Fase do Sono",
"Alarm": "Alarme",
"Minutes": "Acta",
"TIMER": "TIMER",
"Hours": "Horário",
"on": "em",
"Reset All": "Reinicializar tudo",
"Repeat": "Repita",
"Delete": "Eliminar",
"Enabled": "Habilitado",
"Reset all widgets": "Redefinir todos os widgets",
"Reset": "Reinicialização",
"goal": "meta",
"Message": "Mensagem",
"Beep": "Bip",
"Vibrate": "Vibrar",
"System": "Sistema",
"Alerts": "Alertas",
"Locale": "Localização",
"Set Time": "Tempo Definido",
"Whitelist": "Lista branca",
"Select Clock": "Selecione Relógio",
"BACK": "VOLTAR",
"Timer": "Temporizador",
"Error in settings": "Erro nas configurações",
"Disable": "Desabilitar",
"Factory Reset": "Reinicialização de Fábrica",
"Connected": "Conectado",
"ALARM": "ALARME",
"Sleep": "Dormir",
"Messages": "Mensagens",
"Hide": "Esconder",
"Show": "Mostrar",
"On": "Em",
"Ok": "Ok",
"No": "Não",
"Settings": "Configurações",
"steps": "passos",
"back": "voltar",
"Steps": "Passos",
"Year": "Ano",
"Yes": "Sim",
"Loading": "Carregamento",
"Music": "Música",
"color": "cor",
"off": "em",
"Off": "Fora",
"Theme": "Tema",
"Back": "Voltar"
}
}

163
lang/ro_RO.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Romanian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Alarma nouă",
"New Timer": "Noul cronometru",
"(repeat)": "(repetă)",
"Save": "Salvați",
"Auto snooze": "Repaus automat",
"Timer": "Cronometru",
"Alarm": "Alarma",
"circle 2": "cercul 2",
"circle 1": "cercul 1",
"Sleep": "Somnul",
"week": "săptămâna",
"circle count": "număr de cercuri",
"Connected": "Conectat",
"steps": "etape",
"battery warn": "avertizare baterie",
"heartrate": "ritmul cardiac",
"show widgets": "arată widget-uri",
"Keep Msgs": "Păstrați Msgs",
"circle 4": "cercul 4",
"circle 3": "cercul 3",
"minimum": "minim",
"Heartrate": "Ritmul cardiac",
"min. confidence": "încredere minimă",
"distance goal": "obiectivul de distanță",
"Steps": "Pași",
"color": "culoare",
"Circle": "Cerc",
"step length": "lungimea pasului",
"data": "date",
"maximum": "maxim",
"valid period": "perioada de valabilitate",
"weather circle": "cercul meteorologic",
"goal": "obiectiv",
"App Source\nNot found": "Sursa aplicației\nNu a fost găsit",
"Vector font size": "Dimensiunea fontului vectorial",
"colorize icon": "colorați pictograma",
"Show clocks": "Arată ceasuri",
"Loading": "Încărcare",
"Launcher Settings": "Setări lansator",
"Font": "Font",
"TAP right top/bottom": "TAP dreapta sus/jos",
"View Message": "Vezi mesajul",
"LCD": "LCD",
"Beep": "Beep",
"Vibration": "Vibrații",
"Bluetooth": "Bluetooth",
"Utils": "Utils",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"BTNs 1:startlap 2:exit 3:reset": "BTN-uri 1:startlap 2:exit 3:reset",
"Piezo": "Piezoelectrice",
"Customize": "Personalizați",
"Delete all messages": "Ștergeți toate mesajele",
"Apps": "Aplicații",
"Are you sure": "Ești sigur că",
"Music": "Muzică",
"Record Run": "Record Run",
"Mark Unread": "Marcați Unread",
"Foreground": "Prim-plan",
"Foreground 2": "Prim-plan 2",
"Background": "Fond",
"Passkey BETA": "Passkey BETA",
"Light BW": "Lumină BW",
"Dark BW": "Dark BW",
"Make Connectable": "Asigurați conectabilitatea",
"HID": "HID",
"Delete All Messages": "Ștergeți toate mesajele",
"No Messages": "Nu există mesaje",
"Unread timer": "Cronometru necitit",
"Quiet Mode": "Modul silențios",
"Programmable": "Programabil",
"BLE": "BLE",
"Highlight BG": "Evidențiați BG",
"Background 2": "Context 2",
"Highlight FG": "Evidențiați FG",
"Remove": "Eliminați",
"Connect device\nto add to\nwhitelist": "Conectați dispozitivul\npentru a adăuga la\nlista albă",
"LCD Brightness": "Luminozitatea LCD",
"Wake on FaceUp": "Trezirea pe FaceUp",
"LCD Timeout": "Timeout LCD",
"Add Device": "Adăugați dispozitiv",
"Wake on Touch": "Trezire la atingere",
"Wake on BTN1": "Trezirea pe BTN1",
"Wake on BTN3": "Trezirea pe BTN3",
"Debug Info": "Informații de depanare",
"Log": "Jurnal",
"Clock Style": "Stilul ceasului",
"Utilities": "Utilități",
"Wake on Twist": "Trezirea pe Twist",
"Wake on BTN2": "Trezirea pe BTN2",
"Twist Threshold": "Pragul de răsucire",
"Time Zone": "Fusul orar",
"Twist Timeout": "Twist Timeout",
"Twist Max Y": "Twist Max Y",
"Minute": "Minute",
"Month": "Luna",
"Second": "Al doilea",
"Hour": "Ora",
"Flatten Battery": "Aplatizare baterie",
"Storage": "Depozitare",
"Compact Storage": "Depozitare compactă",
"Reset Settings": "Resetare setări",
"Rewrite Settings": "Resetare Setări de rescriere",
"Stay Connectable": "Rămâneți conectați",
"No Clocks Found": "Nu s-au găsit ceasuri",
"Turn Off": "Oprire",
"This will remove everything": "Acest lucru va elimina totul",
"App Settings": "Setări aplicație",
"Year": "Anul",
"Connectable": "Conectabil",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Baterie de aplatizare - acest lucru poate dura ore.\nApăsați lung butonul pentru a anula",
"Compacting...\nTakes approx\n1 minute": "Compactarea...\nDurează aproximativ\n1 minut",
"Reset to Defaults": "Resetare la valorile implicite",
"Reset": "Resetare",
"Widgets": "Widgeturi",
"Reset all widgets": "Resetați toate widget-urile",
"No app has settings": "Nici o aplicație nu are setări",
"Left": "Stânga",
"Side": "Lateral",
"Date": "Data",
"Sort Order": "Ordinea de sortare",
"Invalid settings": "Setări nevalabile",
"Right": "Dreapta",
"Reset All": "Resetați toate",
"on": "pe",
"TIMER": "TIMER",
"off": "off",
"Message": "Mesaj",
"Vibrate": "Vibrare",
"ALARM": "ALARMĂ",
"Delete": "Ștergeți",
"Repeat": "Repetați",
"Enabled": "Activat",
"Settings": "Setări",
"Minutes": "Proces-verbal",
"Hours": "Ore",
"Theme": "Tema",
"Messages": "Mesaje",
"Hide": "Ascundeți",
"Alerts": "Alerte",
"Error in settings": "Eroare în setări",
"System": "Sistem",
"Disable": "Dezactivați",
"Set Time": "Set Time",
"Factory Reset": "Resetare din fabrică",
"Yes": "Da",
"Select Clock": "Selectați ceasul",
"Whitelist": "Lista albă",
"Locale": "Locale",
"Ok": "Ok",
"Show": "Arată",
"On": "Pe",
"No": "Nu",
"Off": "Off",
"Back": "Înapoi"
},
"alarm": {
"//": "App-specific overrides"
}
}

167
lang/ru_RU.json Normal file
View File

@ -0,0 +1,167 @@
{
"//": "Russian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Новая сигнализация",
"(repeat)": "(повтор)",
"New Timer": "Новый таймер",
"Auto snooze": "Автоматическая дозагрузка",
"circle 4": "круг 4",
"Save": "Сохранить",
"Keep Msgs": "Сохраняйте сообщения",
"week": "неделя",
"circle count": "счётчик окружностей",
"circle 2": "круг 2",
"music": "музыка",
"battery warn": "предупреждение о разряде батареи",
"circle 1": "круг 1",
"maximum": "максимальный",
"min. confidence": "мин. уверенность",
"heartrate": "частота сердечных сокращений",
"Circle": "Круг",
"minimum": "минимум",
"Heartrate": "Пульс",
"show widgets": "показывать виджеты",
"weather circle": "метеорологический круг",
"data": "данные",
"step length": "длина шага",
"valid period": "период действия",
"distance goal": "дальняя цель",
"circle 3": "круг 3",
"TAP right top/bottom": "TAP справа сверху/снизу",
"Delete all messages": "Удалить все сообщения",
"Mark Unread": "Отметить непрочитанным",
"Unread timer": "Непрочитанный таймер",
"Launcher Settings": "Настройки запуска",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"View Message": "Посмотреть сообщение",
"No Messages": "Нет сообщений",
"Are you sure": "Вы уверены",
"Vector font size": "Размер векторного шрифта",
"colorize icon": "раскрасить иконку",
"Yes\ndefinitely": "Да\nопределенно",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"App Source\nNot found": "Источник приложения\nНе найдено",
"STEPS": "СТЕПЕНИ",
"Font": "Шрифт",
"Show clocks": "Показать часы",
"Vibration": "Вибрация",
"Bluetooth": "Bluetooth",
"Make Connectable": "Сделать соединяемым",
"Apps": "Приложения",
"Quiet Mode": "Тихий режим",
"LCD": "ЖК-ДИСПЛЕЙ",
"Programmable": "Программируемый",
"Passkey BETA": "Passkey BETA",
"Record Run": "Рекордный пробег",
"Delete All Messages": "Удалить все сообщения",
"Utils": "Утилиты",
"Piezo": "Пьезо",
"Foreground": "Передний план",
"Background": "Справочная информация",
"Dark BW": "Темный BW",
"HID": "HID",
"BLE": "BLE",
"Light BW": "Светлый BW",
"Highlight FG": "Выделите FG",
"Foreground 2": "Передний план 2",
"Customize": "Настроить",
"Wake on BTN2": "Вейк на BTN2",
"Wake on BTN1": "Проснись на BTN1",
"Wake on BTN3": "Уэйк на BTN3",
"Add Device": "Добавить устройство",
"LCD Brightness": "Яркость ЖК-дисплея",
"Wake on FaceUp": "Проснуться на FaceUp",
"Storage": "Хранение",
"Wake on Twist": "Проснуться на твисте",
"Connect device\nto add to\nwhitelist": "Подключить устройство\nдля добавления в\nбелый список",
"Background 2": "Справочная информация 2",
"Remove": "Удалить",
"Highlight BG": "Выделение BG",
"LCD Timeout": "Тайм-аут ЖК-дисплея",
"Twist Timeout": "Тайм-аут скручивания",
"Twist Threshold": "Порог скручивания",
"Wake on Touch": "Пробуждение при касании",
"Twist Max Y": "Twist Max Y",
"Stay Connectable": "Оставайтесь на связи",
"This will remove everything": "Это удалит все",
"Turn Off": "Выключить",
"Hour": "Час",
"Minute": "Минута",
"Reset to Defaults": "Сброс настроек по умолчанию",
"No Clocks Found": "Часы не найдены",
"Log": "Журнал",
"Debug Info": "Отладочная информация",
"Utilities": "Утилиты",
"Compact Storage": "Компактное хранение",
"Reset Settings": "Сброс настроек",
"Compacting...\nTakes approx\n1 minute": "Уплотнение...\nЗанимает приблизительно\n1 минута",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Сплющивание батареи - это может занять несколько часов.\nДлительное нажатие кнопки для отмены",
"Connectable": "Подключаемый",
"Clock Style": "Часовой стиль",
"Time Zone": "Часовой пояс",
"Flatten Battery": "Расплющить батарею",
"Rewrite Settings": "Настройки перезаписи",
"Sort Order": "Порядок сортировки",
"Right": "Справа",
"Left": "Слева",
"Side": "Сторона",
"Hours": "Часы",
"on": "на сайте",
"Widgets": "Виджеты",
"TIMER": "ТАЙМЕР",
"Date": "Дата",
"Month": "Месяц",
"OFF": "OFF",
"Reset All": "Сбросить все",
"Alarm": "Сигнализация",
"Reset all widgets": "Сброс всех виджетов",
"Delete": "Удалить",
"Invalid settings": "Недопустимые настройки",
"Second": "Второй",
"Sleep Phase Alarm": "Сигнализация фазы сна",
"No app has settings": "Ни одно приложение не имеет настроек",
"App Settings": "Настройки приложения",
"Repeat": "Повторите",
"System": "Система",
"Minutes": "Протоколы",
"Enabled": "Включено",
"Reset": "Сброс",
"Vibrate": "Вибрация",
"Alerts": "Оповещения",
"Select Clock": "Выберите часы",
"Set Time": "Установленное время",
"Locale": "Местность",
"Beep": "Звуковой сигнал",
"goal": "гол",
"Message": "Сообщение",
"ALARM": "АЛАРМ",
"Disable": "Отключить",
"Factory Reset": "Заводской сброс",
"Sleep": "Сон",
"Whitelist": "Белый список",
"Timer": "Таймер",
"Error in settings": "Ошибка в настройках",
"BACK": "BACK",
"Messages": "Сообщения",
"Show": "Показать",
"Hide": "Скрыть",
"Connected": "Подключено",
"On": "На сайте",
"No": "Нет",
"Ok": "Хорошо",
"Settings": "Настройки",
"steps": "шаги",
"back": "назад",
"Year": "Год",
"Steps": "Шаги",
"Yes": "Да",
"Loading": "Загрузка",
"color": "цвет",
"Music": "Музыка",
"Off": "На сайте",
"off": "отключен",
"Theme": "Тема",
"Back": "Назад"
}
}

163
lang/sk_SK.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Slovak language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "Nový alarm",
"New Timer": "Nový časovač",
"(repeat)": "(opakovanie)",
"Alarm": "Alarm",
"Save": "Uložiť",
"week": "týždeň",
"circle count": "počet kruhov",
"Timer": "Časovač",
"Sleep": "Spánok",
"circle 1": "okruh 1",
"Connected": "Pripojené",
"Auto snooze": "Automatické odloženie",
"circle 4": "kruh 4",
"heartrate": "srdcová frekvencia",
"steps": "kroky",
"circle 2": "kruh 2",
"Keep Msgs": "Uchovávajte správy Msgs",
"goal": "cieľ",
"circle 3": "kruh 3",
"distance goal": "cieľ vzdialenosti",
"show widgets": "zobraziť widgety",
"maximum": "maximum",
"minimum": "minimálne",
"Circle": "Kruh",
"valid period": "obdobie platnosti",
"Steps": "Kroky",
"data": "údaje",
"min. confidence": "min. dôvera",
"battery warn": "upozornenie na batériu",
"Heartrate": "Srdcová frekvencia",
"weather circle": "kruh počasia",
"step length": "dĺžka kroku",
"colorize icon": "vyfarbenie ikony",
"color": "farba",
"TAP right top/bottom": "TAP vpravo hore/dole",
"App Source\nNot found": "Zdroj aplikácie\nNenájdené",
"Loading": "Načítavanie",
"Font": "Písmo",
"Unread timer": "Neprečítaný časovač",
"Music": "Hudba",
"Mark Unread": "Označiť neprečítané",
"View Message": "Zobraziť správu",
"Launcher Settings": "Nastavenia spúšťača",
"Delete All Messages": "Odstránenie všetkých správ",
"Vector font size": "Veľkosť vektorového písma",
"Delete all messages": "Odstránenie všetkých správ",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Are you sure": "Ste si istý, že",
"Show clocks": "Zobraziť hodiny",
"No Messages": "Žiadne správy",
"Record Run": "Rekordný beh",
"Apps": "Aplikácie",
"Piezo": "Piezoelektrické zariadenie",
"LCD": "LCD",
"Programmable": "Programovateľné",
"Utils": "Utils",
"Foreground 2": "Popredie 2",
"HID": "HID",
"Vibration": "Vibrácie",
"Make Connectable": "Urobiť pripojiteľné",
"Bluetooth": "Bluetooth",
"Quiet Mode": "Tichý režim",
"Beep": "Pípnutie",
"Passkey BETA": "Passkey BETA",
"Dark BW": "Tmavá BW",
"Light BW": "Light BW",
"Foreground": "Prvé miesto",
"Customize": "Prispôsobenie stránky",
"Background": "Pozadie",
"BLE": "BLE",
"LCD Brightness": "Jas LCD displeja",
"LCD Timeout": "Časový limit LCD displeja",
"Add Device": "Pridať zariadenie",
"Connect device\nto add to\nwhitelist": "Pripojenie zariadenia\npridať do\nwhitelist",
"Remove": "Odstránenie stránky",
"Highlight FG": "Zvýraznenie FG",
"Wake on Touch": "Prebudenie na dotyk",
"Background 2": "Pozadie 2",
"Wake on BTN1": "Prebuďte sa na BTN1",
"Wake on BTN2": "Prebuďte sa na BTN2",
"Wake on BTN3": "Prebuďte sa na BTN3",
"Highlight BG": "Zvýraznenie BG",
"Wake on FaceUp": "Prebudiť sa na FaceUp",
"Wake on Twist": "Prebudiť sa na Twiste",
"Utilities": "Komunálne služby",
"Rewrite Settings": "Nastavenia prepísania",
"Log": "Prihlásiť sa",
"Debug Info": "Informácie o ladení",
"Storage": "Úložisko",
"Compact Storage": "Kompaktné úložisko",
"Twist Max Y": "Twist Max Y",
"Twist Timeout": "Twist Timeout",
"Time Zone": "Časové pásmo",
"Reset Settings": "Obnovenie nastavení",
"Clock Style": "Štýl hodín",
"Compacting...\nTakes approx\n1 minute": "Zhutňovanie...\nTrvá približne\n1 minúta",
"Twist Threshold": "Prahová hodnota Twist",
"Stay Connectable": "Zostaňte pripojení",
"Flatten Battery": "Sploštenie batérie",
"This will remove everything": "Tým sa odstráni všetko.",
"Connectable": "Pripojiteľné",
"Turn Off": "Vypnúť",
"Reset to Defaults": "Obnovenie predvolených nastavení",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Sploštenie batérie - môže trvať niekoľko hodín.\nDlhým stlačením tlačidla zrušíte",
"No Clocks Found": "Nenašli sa žiadne hodiny",
"Side": "Strana",
"Date": "Dátum",
"Second": "Druhý",
"Hour": "Hodina",
"Minute": "Minúta",
"Left": "Vľavo",
"Year": "Rok",
"App Settings": "Nastavenia aplikácie",
"Widgets": "Widgety",
"Month": "Mesiac",
"No app has settings": "Žiadna aplikácia nemá nastavenia",
"Invalid settings": "Neplatné nastavenia",
"Sort Order": "Poradie triedenia",
"Reset All": "Obnoviť všetky",
"Reset": "Obnovenie",
"TIMER": "ČASOVAČ",
"Right": "Vpravo",
"Reset all widgets": "Obnovenie všetkých widgetov",
"ALARM": "ALARM",
"Minutes": "Zápisnica",
"Delete": "Odstrániť",
"off": "mimo",
"on": "na stránke .",
"Repeat": "Opakujte",
"System": "Systém",
"Enabled": "Povolené",
"Vibrate": "Vibrovať",
"Hours": "Hodiny",
"Settings": "Nastavenia",
"Select Clock": "Vybrať hodiny",
"Alerts": "Upozornenia",
"Message": "Správa",
"Theme": "Téma",
"Set Time": "Nastavený čas",
"Locale": "Lokalita",
"Disable": "Zakázať",
"Messages": "Správy",
"Error in settings": "Chyba v nastaveniach",
"Hide": "Skryť",
"Show": "Zobraziť",
"On": "Na stránke",
"Whitelist": "Biela listina",
"Yes": "Áno",
"Ok": "Ok",
"Factory Reset": "Obnovenie továrenského nastavenia",
"No": "Nie",
"Off": "Vypnuté",
"Back": "Späť"
},
"alarm": {
"//": "App-specific overrides"
}
}

163
lang/sl_SL.json Normal file
View File

@ -0,0 +1,163 @@
{
"//": "Slovenian language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarm": "Alarm",
"(repeat)": "(ponovitev)",
"New Timer": "Nov časovnik",
"New Alarm": "Nov alarm",
"Timer": "Časomer",
"Save": "Shrani",
"Connected": "Povezano",
"Keep Msgs": "Hranite sporočila Msgs",
"circle 4": "krog 4",
"circle 3": "krog 3",
"Auto snooze": "Samodejni dremež",
"circle 1": "krog 1",
"week": "teden",
"circle 2": "krog 2",
"Sleep": "Spanje",
"circle count": "štetje krogov",
"steps": "koraki",
"show widgets": "prikaži gradnike",
"heartrate": "srčni utrip",
"valid period": "veljavno obdobje",
"maximum": "največ",
"battery warn": "opozorilo o bateriji",
"weather circle": "vremenski krog",
"data": "podatki",
"goal": "cilj",
"step length": "dolžina koraka",
"minimum": "najmanjši",
"min. confidence": "min. zaupanje",
"Heartrate": "Srčni utrip",
"distance goal": "ciljna razdalja",
"Steps": "Koraki",
"color": "barva",
"colorize icon": "obarvanje ikone",
"App Source\nNot found": "Vir aplikacije\nNi najden",
"Show clocks": "Prikaži ure",
"TAP right top/bottom": "TAP desno zgoraj/spodaj",
"View Message": "Ogled sporočila",
"Circle": "Krog",
"Launcher Settings": "Nastavitve zaganjalnika",
"Vector font size": "Velikost vektorske pisave",
"Font": "Pisava",
"Loading": "Nalaganje",
"Delete all messages": "Brisanje vseh sporočil",
"No Messages": "Brez sporočil",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Are you sure": "Ste prepričani, da",
"start&lap/reset, BTN1: EXIT": "start&lap/reset, BTN1: EXIT",
"Mark Unread": "Označi neprebrano",
"Utils": "Utils",
"Record Run": "Rekordna vožnja",
"Delete All Messages": "Brisanje vseh sporočil",
"Unread timer": "Neprebrani časovnik",
"Music": "Glasba",
"LCD": "LCD",
"Apps": "Aplikacije",
"Bluetooth": "Bluetooth",
"Dark BW": "Temna BW",
"Vibration": "Vibracije",
"Quiet Mode": "Tihi način",
"Beep": "Beep",
"Passkey BETA": "Passkey BETA",
"Piezo": "Piezo",
"HID": "HID",
"Make Connectable": "Povežite se",
"BLE": "BLE",
"Programmable": "Programirljiv",
"Light BW": "Light BW",
"Background": "Ozadje",
"Customize": "Prilagodite",
"Background 2": "Ozadje 2",
"LCD Brightness": "Svetlost LCD-ja",
"Wake on BTN2": "Zbudi se na BTN2",
"Wake on BTN1": "Zbudite se na BTN1",
"LCD Timeout": "Časovna omejitev LCD",
"Twist Max Y": "Twist Max Y",
"Wake on Twist": "Prebudite se na Twist",
"Twist Threshold": "Prag zasuka",
"Foreground 2": "V ospredju 2",
"Foreground": "Novo okolje",
"Remove": "Odstranite",
"Time Zone": "Časovni pas",
"Wake on BTN3": "Wake na BTN3",
"Highlight FG": "Poudarite FG",
"Wake on Touch": "Zbujanje na dotik",
"Clock Style": "Stil ure",
"Highlight BG": "Poudarite BG",
"Add Device": "Dodajanje naprave",
"Connect device\nto add to\nwhitelist": "Povežite napravo\nza dodajanje v\nbeli seznam",
"Utilities": "Storitve",
"Wake on FaceUp": "Prebudite se v aplikaciji FaceUp",
"Compact Storage": "Kompaktno shranjevanje",
"Log": "Dnevnik",
"Debug Info": "Informacije o odpravljanju napak",
"Turn Off": "Izklopite",
"Flatten Battery": "Sploščena baterija",
"Reset to Defaults": "Ponastavitev na privzete nastavitve",
"Reset Settings": "Ponastavitev nastavitev",
"Twist Timeout": "Twist Timeout",
"This will remove everything": "To bo odstranilo vse",
"Rewrite Settings": "Nastavitve prepisovanja",
"Storage": "Shranjevanje",
"Compacting...\nTakes approx\n1 minute": "Zgoščevanje...\nVzame približno\n1 minuta",
"No Clocks Found": "Ure niso bile najdene",
"Stay Connectable": "Ostanite povezljivi",
"Minute": "Minuta",
"Connectable": "Povezljivost",
"Hour": "Ura",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Ploščati baterijo - to lahko traja več ur.\nDolgo pritisnite gumb za preklic",
"Second": "Drugi",
"Month": "Mesec",
"Date": "Datum",
"ALARM": "ALARM",
"Reset all widgets": "Ponastavitev vseh gradnikov",
"Reset All": "Ponastavi vse",
"TIMER": "TIMER",
"Widgets": "Pripomočki",
"Hours": "Ure",
"Minutes": "Zapisnik",
"Year": "Leto",
"No app has settings": "Nobena aplikacija nima nastavitev",
"App Settings": "Nastavitve aplikacije",
"Repeat": "Ponovite",
"Invalid settings": "Neveljavne nastavitve",
"Enabled": "Omogočeno",
"Reset": "Ponastavitev",
"off": "izklop",
"Side": "Stran",
"Sort Order": "Vrstni red",
"Left": "Leva stran",
"Right": "Desno",
"on": "na spletni strani .",
"Theme": "Tema",
"Locale": "Lokacija",
"Alerts": "Opozorila",
"Select Clock": "Izberite uro",
"System": "Sistem",
"Settings": "Nastavitve",
"Set Time": "Čas nastavitve",
"Whitelist": "Bela lista",
"Message": "Sporočilo",
"Vibrate": "Vibriranje",
"Delete": "Izbriši",
"Error in settings": "Napaka v nastavitvah",
"Messages": "Sporočila",
"Disable": "Onemogočite",
"Show": "Prikaži",
"Ok": "Ok",
"On": "Na spletni strani",
"Hide": "Skrij",
"Factory Reset": "Ponastavitev tovarniške nastavitve",
"Yes": "Da",
"No": "Ne",
"Off": "Izklopljeno",
"Back": "Nazaj"
},
"alarm": {
"//": "App-specific overrides"
}
}

View File

@ -1,21 +1,173 @@
{
"//":"Swedish language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Larm",
"Hours" : "Timmar",
"Minutes" : "Minuter",
"Enabled" : "Aktiverad",
"New Alarm" : "Ny alarm",
"Save" : "Spara",
"Back" : "Tillbaka",
"Repeat" : "Upprepning",
"Delete" : "Radera",
"ALARM!" : "ALURH!",
"Sleep" : "Sömn"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "uppr."
}
}
"//": "Swedish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Larm",
"Hours": "Timmar",
"Minutes": "Minuter",
"Enabled": "Aktiverad",
"New Alarm": "Ny alarm",
"Save": "Spara",
"Back": "Tillbaka",
"Repeat": "Upprepning",
"Delete": "Radera",
"ALARM!": "ALURH!",
"Sleep": "Sömn",
"circle 3": "cirkel 3",
"circle 1": "cirkel 1",
"music": "musik",
"week": "vecka",
"Keep Msgs": "Behåll meddelanden",
"Auto snooze": "Automatisk snooze",
"step length": "steglängd",
"Circle": "Cirkel",
"data": "uppgifter",
"colorize icon": "färglägga ikonen",
"min. confidence": "Min. förtroende",
"show widgets": "visa widgets",
"valid period": "giltig period",
"Heartrate": "Hjärtfrekvens",
"distance goal": "mål för distans",
"circle 4": "cirkel 4",
"circle count": "antal cirklar",
"minimum": "minimum",
"maximum": "maximal",
"New Timer": "Ny timer",
"battery warn": "batteri varning",
"heartrate": "hjärtfrekvens",
"circle 2": "cirkel 2",
"(repeat)": "(upprepning)",
"weather circle": "Vädercirkel",
"Delete All Messages": "Radera alla meddelanden",
"No Messages": "Inga meddelanden",
"Show clocks": "Visa klockor",
"STEPS": "STEG",
"TAP right top/bottom": "TAP höger upp/ner",
"View Message": "Visa meddelande",
"Mark Unread": "Markera oläst",
"Are you sure": "Är du säker på att",
"Delete all messages": "Radera alla meddelanden",
"Record Run": "Rekordkörning",
"Unread timer": "Oläst timer",
"Vibration": "Vibrationer",
"Utils": "Användaruppgifter",
"Quiet Mode": "Tyst läge",
"Passkey BETA": "Passkey BETA",
"Dark BW": "Mörk BW",
"BTNs 1:startlap 2:exit 3:reset": "BTN 1:startlap 2:exit 3:reset",
"start&lap/reset, BTN1: EXIT": "start&lap/återställning, BTN1: EXIT",
"BLE": "BLE",
"Programmable": "Programmerbar",
"Launcher Settings": "Inställningar för lanseringen",
"Vector font size": "Vektor teckensnittsstorlek",
"Font": "Typsnitt",
"Yes\ndefinitely": "Ja\ndefinitivt",
"App Source\nNot found": "App-källa\nEj funnen",
"Make Connectable": "Gör det möjligt att ansluta",
"HID": "HID",
"Bluetooth": "Bluetooth",
"Apps": "Appar",
"Piezo": "Piezo",
"LCD": "LCD",
"Foreground 2": "Förgrund 2",
"Light BW": "Ljus BW",
"Background": "Bakgrund",
"Remove": "Ta bort",
"Highlight BG": "Markera BG",
"Customize": "Anpassa",
"Highlight FG": "Highlight FG",
"Background 2": "Bakgrund 2",
"LCD Brightness": "Ljusstyrka på LCD-skärmen",
"Add Device": "Lägg till enhet",
"Wake on BTN1": "Vakna på BTN1",
"Wake on BTN2": "Vakna på BTN2",
"Twist Timeout": "Twist Timeout",
"Wake on Touch": "Vakna vid beröring",
"LCD Timeout": "LCD Timeout",
"Foreground": "Förgrund",
"Connect device\nto add to\nwhitelist": "Anslut enhet\nför att lägga till\nvitlista",
"Wake on FaceUp": "Vakna på FaceUp",
"Twist Threshold": "Tröskelvärde för vridning",
"Wake on BTN3": "Wake på BTN3",
"Clock Style": "Klockstil",
"Time Zone": "Tidszon",
"Twist Max Y": "Vridning Max Y",
"Stay Connectable": "Håll dig tillgänglig",
"This will remove everything": "Detta kommer att ta bort allt",
"Turn Off": "Stäng av",
"Connectable": "Anslutningsbar",
"Flattening battery - this can take hours.\nLong-press button to cancel": "Platta batterier - detta kan ta flera timmar.\nTryck länge på knappen för att avbryta",
"Reset to Defaults": "Återställ till standardvärden",
"Utilities": "Verktyg",
"Flatten Battery": "Platta batterier",
"Debug Info": "Info om felsökning",
"Reset Settings": "Återställa inställningar",
"Wake on Twist": "Väckning på Twist",
"Compact Storage": "Kompakt förvaring",
"Log": "Logg",
"Rewrite Settings": "Omskrivning av inställningar",
"Compacting...\nTakes approx\n1 minute": "Komprimering...\nTar ca.\n1 minut",
"Storage": "Lagring",
"Second": "Andra",
"App Settings": "App-inställningar",
"Invalid settings": "Ogiltiga inställningar",
"Minute": "Protokoll",
"Sleep Phase Alarm": "Larm om sömnfas",
"No app has settings": "Ingen app har inställningar",
"Hour": "Timme",
"No Clocks Found": "Inga klockor hittades",
"Date": "Datum",
"Month": "Månad",
"Alarm": "Larm",
"Reset": "Återställ",
"Reset all widgets": "Återställ alla widgetar",
"TIMER": "TIMER",
"on": "på",
"OFF": "OFF",
"Side": "Sidan",
"Sort Order": "Sortering",
"Left": "Vänster",
"Right": "Höger",
"Reset All": "Återställ alla",
"Widgets": "Widgets",
"goal": "mål",
"Vibrate": "Vibrera",
"Message": "Meddelande",
"Beep": "Piper",
"Disable": "Inaktivera",
"Select Clock": "Välj klocka",
"Locale": "Lokalisering",
"Alerts": "Varningar",
"System": "System",
"Set Time": "Ställ in tid",
"Factory Reset": "Fabriksåterställning",
"Messages": "Meddelanden",
"Timer": "Timer",
"BACK": "TILLBAKA",
"Error in settings": "Fel i inställningarna",
"Whitelist": "Whitelist",
"ALARM": "ALARM",
"Hide": "Dölj",
"Connected": "Ansluten",
"Show": "Visa",
"On": "På",
"Ok": "Ok",
"No": "Ingen",
"Settings": "Inställningar",
"steps": "steg",
"back": "tillbaka",
"Steps": "Steg",
"Year": "År",
"Yes": "Ja",
"Loading": "Laddar",
"Music": "Musik",
"color": "färg",
"off": "off",
"Off": "Av",
"Theme": "Tema"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "uppr."
}
}

View File

@ -1,21 +1,21 @@
{
"//":"Turkish language translations",
"GLOBAL": {
"//":"Translations that apply for all apps",
"Alarms" : "Alarmlar",
"Hours" : "Saat",
"Minutes" : "Dakika",
"Enabled" : "Etkinleştirildi",
"New Alarm" : "Yeni alarm",
"Save" : "Sakla",
"Back" : "Geriye",
"Repeat" : "Yineleme",
"Delete" : "Sil",
"ALARM!" : "ALARM!",
"Sleep" : "Uyku"
},
"alarm": {
"//":"App-specific overrides",
"rpt" : "yineleme"
}
}
"//": "Turkish language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"Alarms": "Alarmlar",
"Hours": "Saat",
"Minutes": "Dakika",
"Enabled": "Etkinleştirildi",
"New Alarm": "Yeni alarm",
"Save": "Sakla",
"Back": "Geriye",
"Repeat": "Yineleme",
"Delete": "Sil",
"ALARM!": "ALARM!",
"Sleep": "Uyku"
},
"alarm": {
"//": "App-specific overrides",
"rpt": "yineleme"
}
}

View File

@ -0,0 +1,167 @@
{
"//": "Japanese language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"New Alarm": "新型アラーム",
"New Timer": "新型タイマー",
"Save": "保存",
"Keep Msgs": "Keep Msgs",
"circle count": "サークルカウント",
"(repeat)": "(繰り返し)",
"music": "音楽",
"Auto snooze": "オートスヌーズ",
"week": "ウィーク",
"circle 1": "サークル1",
"circle 3": "サークル3",
"circle 2": "サークル2",
"show widgets": "show widgets",
"heartrate": "心拍数",
"circle 4": "サークル4",
"battery warn": "バッテリー警告",
"valid period": "有効期間",
"maximum": "最大",
"weather circle": "ウェザーサークル",
"minimum": "ミニマム",
"step length": "ステップ長",
"distance goal": "距離目標",
"Circle": "サークル",
"min. confidence": "最低限の自信",
"colorize icon": "カラライズアイコン",
"Heartrate": "心拍数",
"data": "データ",
"Yes\ndefinitely": "はい。\n間違いなく",
"Launcher Settings": "ランチャー設定",
"TAP right top/bottom": "TAP右上/左下",
"Font": "フォント",
"Mark Unread": "マーク・アンリード",
"start&lap/reset, BTN1: EXIT": "スタートラップリセット、BTN1EXIT",
"App Source\nNot found": "アプリソース\n見つからない",
"Show clocks": "時計の表示",
"STEPS": "ステップ",
"Vector font size": "ベクターのフォントサイズ",
"View Message": "メッセージを見る",
"Are you sure": "本当にいいの?",
"Bluetooth": "ブルートゥース",
"Unread timer": "未読のタイマー",
"Delete all messages": "すべてのメッセージの削除",
"No Messages": "メッセージなし",
"Record Run": "レコード・ラン",
"Apps": "アプリ",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Delete All Messages": "全メッセージの削除",
"Vibration": "振動",
"Utils": "ユーティライゼーション",
"Piezo": "ピエゾ",
"BLE": "BLE",
"Make Connectable": "接続可能にする",
"HID": "HID",
"Light BW": "ライトBW",
"LCD": "LCD",
"Background": "背景",
"Foreground": "フォアグラウンド",
"Programmable": "プログラム可能",
"Customize": "カスタマイズ",
"Dark BW": "ダークBW",
"Background 2": "背景2",
"Quiet Mode": "クワイエットモード",
"Highlight FG": "ハイライトFG",
"Foreground 2": "フォアグラウンド2",
"Remove": "削除",
"Passkey BETA": "Passkey BETA",
"Add Device": "デバイスの追加",
"LCD Timeout": "LCDタイムアウト",
"Highlight BG": "ハイライトBG",
"LCD Brightness": "液晶ディスプレイの明るさ",
"Connect device\nto add to\nwhitelist": "接続機器\nに追加します。\nホワイトリスト",
"Wake on BTN3": "Wake on BTN3",
"Wake on BTN2": "Wake on BTN2",
"Time Zone": "タイムゾーン",
"Wake on Touch": "ウェイクオンタッチ",
"Twist Timeout": "ツイストタイムアウト",
"Wake on Twist": "ウェイクオンツイスト",
"Wake on BTN1": "Wake on BTN1",
"Log": "ログ",
"Wake on FaceUp": "Wake on FaceUp",
"Twist Max Y": "ツイストマックスY",
"Utilities": "ユーティリティー",
"Clock Style": "クロックスタイル",
"Rewrite Settings": "リライト設定",
"Flatten Battery": "バッテリーを平らにする",
"Debug Info": "デバッグ情報",
"Storage": "ストレージ",
"Reset Settings": "設定のリセット",
"Twist Threshold": "ツイスト・スレッショルド",
"Turn Off": "電源オフ",
"Compact Storage": "コンパクトなストレージ",
"Reset to Defaults": "初期設定へのリセット",
"Second": "セカンド",
"Compacting...\nTakes approx\n1 minute": "コンパクトにして...。\n所要時間約\n1分",
"Date": "日付",
"Minute": "分",
"Connectable": "接続可能",
"Stay Connectable": "Stay Connectable",
"Hour": "時間",
"No Clocks Found": "No Clock Found",
"App Settings": "アプリの設定",
"Flattening battery - this can take hours.\nLong-press button to cancel": "バッテリーのフラット化 - これには数時間かかります。\nボタンの長押しでキャンセル",
"Month": "月",
"OFF": "OFF",
"Right": "右",
"Widgets": "ウィジェット",
"Left": "左",
"Sort Order": "並び替え",
"Side": "サイド",
"No app has settings": "設定のないアプリ",
"Sleep Phase Alarm": "スリープフェーズアラーム",
"Invalid settings": "無効な設定",
"TIMER": "TIMER",
"Reset All": "すべてをリセット",
"This will remove everything": "これにより、すべてのものが削除されます。",
"Alarm": "アラーム",
"on": "で",
"Minutes": "分",
"Reset all widgets": "全ウィジェットのリセット",
"Hours": "時間",
"Enabled": "有効",
"Repeat": "リピート",
"Delete": "削除",
"Reset": "リセット",
"goal": "ゴール",
"Beep": "ビープ",
"Message": "メッセージ",
"System": "システム",
"Select Clock": "セレクトクロック",
"Locale": "ロケール",
"Vibrate": "振動",
"Alerts": "アラート",
"Whitelist": "ホワイトリスト",
"Set Time": "セット時間",
"Disable": "Disable",
"BACK": "BACK",
"ALARM": "ALARM",
"Timer": "タイマー",
"Error in settings": "設定のエラー",
"Factory Reset": "ファクトリーリセット",
"Sleep": "睡眠",
"Connected": "コネクテッド",
"Messages": "メッセージ",
"Hide": "隠す",
"Show": "ショー",
"On": "オン",
"Ok": "OK",
"No": "いいえ",
"Settings": "設定",
"steps": "ステップ",
"back": "バック",
"Steps": "ステップ",
"Year": "年",
"Yes": "はい。",
"Loading": "ローディング",
"Music": "音楽",
"color": "カラー",
"off": "オフ",
"Off": "オフ",
"Theme": "テーマ",
"Back": "バック"
}
}

View File

@ -0,0 +1,167 @@
{
"//": "Chinese language translations",
"GLOBAL": {
"//": "Translations that apply for all apps",
"music": "音乐",
"distance goal": "距离目标",
"Save": "拯救",
"circle 3": "第3圈",
"Show clocks": "显示时钟",
"data": "数据",
"battery warn": "电池警告",
"heartrate": "心率",
"circle 2": "第2圈",
"circle 1": "第1圈",
"STEPS": "步骤",
"step length": "步长",
"New Timer": "新的计时器",
"colorize icon": "给图标着色",
"Auto snooze": "自动休眠",
"maximum": "最大限度",
"View Message": "查看留言",
"show widgets": "显示小工具",
"weather circle": "气象圈",
"Delete all messages": "删除所有信息",
"Launcher Settings": "启动器设置",
"Circle": "圆圈",
"No Messages": "没有消息",
"min. confidence": "最低限度的信心",
"circle count": "圈数",
"Keep Msgs": "保持信息畅通",
"(repeat)": "(重复)",
"App Source\nNot found": "应用程序来源\n未找到",
"Mark Unread": "标记未读",
"week": "周",
"Delete All Messages": "删除所有信息",
"New Alarm": "新警报",
"minimum": "最低限度",
"Heartrate": "心率",
"circle 4": "第4圈",
"Font": "字体",
"Vector font size": "矢量字体大小",
"Bluetooth": "蓝牙",
"Record Run": "记录运行",
"Are you sure": "你确定吗?",
"Unread timer": "未读计时器",
"Apps": "应用",
"start&lap/reset, BTN1: EXIT": "开始&lap/复位BTN1EXIT",
"TAP right top/bottom": "右侧顶部/底部的TAP",
"Yes\ndefinitely": "是的\n绝对",
"valid period": "有效期限",
"Utils": "充分利用",
"Customize": "定制",
"Quiet Mode": "静音模式",
"LCD": "液晶显示器",
"Programmable": "可编程",
"Light BW": "轻型BW",
"Vibration": "震动",
"Passkey BETA": "通行证 BETA",
"Make Connectable": "使之成为可连接的",
"Background 2": "背景2",
"Background": "背景介绍",
"HID": "氙气灯",
"Remove": "移除",
"Add Device": "添加设备",
"Highlight FG": "亮点FG",
"BTNs 1:startlap 2:exit 3:reset": "BTNs 1:startlap 2:exit 3:reset",
"Highlight BG": "突出显示BG",
"Dark BW": "深色BW",
"Foreground 2": "前景2",
"Piezo": "压电式",
"Connect device\nto add to\nwhitelist": "连接设备\n来添加到\n白名单",
"LCD Brightness": "液晶显示器的亮度",
"LCD Timeout": "LCD超时",
"Wake on FaceUp": "在FaceUp上唤醒",
"Twist Timeout": "扭曲超时",
"Wake on BTN1": "在BTN1上唤醒",
"Wake on Twist": "在扭曲中醒来",
"Wake on Touch": "触摸时唤醒",
"Utilities": "公用事业",
"Twist Max Y": "扭转最大Y",
"Time Zone": "时区",
"Log": "纪录",
"Twist Threshold": "扭曲阈值",
"Wake on BTN3": "唤醒BTN3网站",
"Wake on BTN2": "在BTN2上唤醒",
"Debug Info": "调试信息",
"BLE": "BLE",
"Compact Storage": "紧凑型存储",
"Storage": "储存",
"Compacting...\nTakes approx\n1 minute": "压实...\n需要大约\n1分钟",
"Reset Settings": "重置设置",
"Clock Style": "钟表风格",
"Rewrite Settings": "重写设置",
"Flatten Battery": "扁平化电池",
"Foreground": "前景",
"Hour": "一小时",
"Reset to Defaults": "重置为默认值",
"Turn Off": "关掉",
"Connectable": "可连接",
"Stay Connectable": "保持联系",
"Minute": "分钟",
"Month": "月份",
"Flattening battery - this can take hours.\nLong-press button to cancel": "压扁电池 - 这可能需要几个小时。\n长按按钮可取消",
"Second": "第二次",
"This will remove everything": "这将删除一切",
"App Settings": "应用程序设置",
"Side": "侧面",
"No Clocks Found": "没有发现时钟",
"OFF": "关闭",
"Widgets": "小工具",
"Invalid settings": "无效的设置",
"Right": "对",
"No app has settings": "没有应用程序有设置",
"Left": "左边",
"Sleep Phase Alarm": "睡眠阶段报警",
"Sort Order": "排序顺序",
"Date": "日期",
"Reset all widgets": "重置所有小工具",
"on": "关于",
"Reset All": "全部重设",
"TIMER": "计时器",
"Hours": "小时",
"Alarm": "警报",
"Repeat": "重复进行",
"Reset": "复位",
"Minutes": "会议记录",
"Enabled": "已启用",
"goal": "目标",
"Beep": "哔哔声",
"Vibrate": "震动",
"Delete": "删除",
"Locale": "地区",
"System": "系统",
"Disable": "禁用",
"Select Clock": "选择时钟",
"Set Time": "设置时间",
"Alerts": "警报",
"Whitelist": "白名单",
"Error in settings": "设置中的错误",
"Factory Reset": "工厂重置",
"BACK": "返回",
"Timer": "计时器",
"Sleep": "睡眠",
"Messages": "留言",
"Hide": "隐藏",
"Connected": "已连接",
"ALARM": "警报",
"On": "在",
"Show": "显示",
"Ok": "好的",
"Message": "留言",
"steps": "步骤",
"No": "没有",
"Settings": "设置",
"back": "背面",
"Year": "年",
"Steps": "阶梯",
"Yes": "是",
"Loading": "负载",
"Music": "音乐",
"color": "颜色",
"off": "关闭",
"Off": "关闭",
"Theme": "主题",
"Back": "溯源"
}
}

View File

@ -179,6 +179,7 @@ window.addEventListener('load', (event) => {
} catch(e) {
console.error("lang/index.json Corrupted", e);
}
languages = languages.filter( l=> l.disabled===undefined );
function reloadLanguage() {
LANGUAGE = undefined;