Merge pull request #914 from alvinhochun/text-handling

Refactoring of text handling (on using large font when starting with \n)
This commit is contained in:
Ben V. Brown
2021-04-05 19:05:29 +10:00
committed by GitHub
37 changed files with 745 additions and 512 deletions

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<title>TS100 Translation Editor</title>
<title>IronOS Translation Editor</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="translations_commons.js"></script>
@@ -191,11 +191,67 @@
delim = " and ";
}
return str;
},
getWholeScreenMessageMaxLen: function(valMap, id, prop) {
var v = prop ? valMap[id][prop] : valMap[id];
var maxLen;
if (this.isSmall(v)) {
maxLen = defMap[id].maxLen2 || 16;
} else {
maxLen = defMap[id].maxLen || 8;
}
return maxLen;
},
validateWholeScreenMessage: function(valMap, id, prop) {
var v = prop ? valMap[id][prop] : valMap[id];
var maxLen = this.getWholeScreenMessageMaxLen(valMap, id, prop);
if (this.isSmall(v)) {
if (v[0].length === 0) {
return "invalid";
} else if (Math.max(v[0].length, v[1].length) > maxLen) {
return "invalid";
}
} else {
if (v.length > maxLen) {
return "invalid";
}
}
},
constraintWholeScreenMessage: function(valMap, id, prop) {
return "len <= " + this.getWholeScreenMessageMaxLen(valMap, id, prop);
},
isSmall: function(v) {
return v instanceof Array;
},
convertToLarge: function(valMap, id, prop) {
var v = prop ? valMap[id][prop] : valMap[id];
var message = v[0] + (v[1] !== "" ? " " + v[1] : "");
if (prop) {
valMap[id][prop] = message;
} else {
valMap[id] = message;
}
},
convertToSmall: function(valMap, id, prop) {
var v = prop ? valMap[id][prop] : valMap[id];
var message = [ v, "" ];
if (prop) {
valMap[id][prop] = message;
} else {
valMap[id] = message;
}
}
}
});
app.def = def;
copyArrayToMap(app.def.messages, defMap);
copyArrayToMap(app.def.messagesWarn, defMap);
copyArrayToMap(app.def.characters, defMap);
copyArrayToMap(app.def.menuGroups, defMap);
copyArrayToMap(app.def.menuOptions, defMap);
@@ -208,7 +264,7 @@
<body>
<div id="app">
<h1>TS100 Translation Editor<span v-if="meta.currentLoaded"> - {{ current.languageLocalName }} [{{current.languageCode}}]</span></h1>
<h1>IronOS Translation Editor<span v-if="meta.currentLoaded"> - {{ current.languageLocalName }} [{{current.languageCode}}]</span></h1>
<table class="header data">
<tr>
<td class="label">Referent Language</td>
@@ -273,6 +329,27 @@
</tr>
</table>
<h2>Warning Messages</h2>
<table class="data">
<tr v-for="message in def.messagesWarn" v-bind:class="validateWholeScreenMessage(current.messagesWarn, message.id)">
<td class="label"><div class="stringId">{{message.id}}</div></td>
<td class="value">
<div class="constraint">{{constraintWholeScreenMessage(current.messagesWarn, message.id)}}</div>
<div class="ref">{{referent.messagesWarn[message.id]}}</div>
<div class="note" v-if="message.note">{{message.note}}</div>
<div class="tran" v-if="isSmall(current.messagesWarn[message.id])">
<input :id="'in_'+message.id+'_0'" type="text" v-model="current.messagesWarn[message.id][0]" v-bind:class="{unchanged : current.messagesWarn[message.id][0] == referent.messagesWarn[message.id][0] && current.messagesWarn[message.id][1] == referent.messagesWarn[message.id][1], empty : current.messagesWarn[message.id][0] == '' && current.messagesWarn[message.id][1] == ''}">
<input :id="'in_'+message.id+'_1'" type="text" v-model="current.messagesWarn[message.id][1]" v-bind:class="{unchanged : current.messagesWarn[message.id][0] == referent.messagesWarn[message.id][0] && current.messagesWarn[message.id][1] == referent.messagesWarn[message.id][1], empty : current.messagesWarn[message.id][0] == '' && current.messagesWarn[message.id][1] == ''}">
<button type="button" @click="convertToLarge(current.messagesWarn, message.id)">Convert to large text</button>
</div>
<div class="tran" v-else>
<input :id="'in_'+message.id" type="text" v-model="current.messagesWarn[message.id]" v-bind:class="{unchanged : current.messagesWarn[message.id] == referent.messagesWarn[message.id], empty : current.messagesWarn[message.id]==''}">
<button type="button" @click="convertToSmall(current.messagesWarn, message.id)">Convert to small text</button>
</div>
</td>
</tr>
</table>
<h2>Characters</h2>
<table class="data">
<tr v-for="char in def.characters" v-bind:class="validateInput(current.characters, char.id)">
@@ -287,13 +364,21 @@
<h2>Menu Groups</h2>
<table class="data">
<tr v-for="menu in def.menuGroups" v-bind:class="validateInput(current.menuGroups, menu.id, 2)">
<tr v-for="menu in def.menuGroups" v-bind:class="validateWholeScreenMessage(current.menuGroups, menu.id, 'text2')">
<td class="label"><div class="stringId">{{menu.id}}</div></td>
<td class="value">
<div class="label">Menu Name</div>
<div class="constraint">{{constraintString(menu)}}</div>
<div class="constraint">{{constraintWholeScreenMessage(current.menuGroups, menu.id, 'text2')}}</div>
<div class="ref">{{referent.menuGroups[menu.id].text2}}</div>
<div class="tran" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' || current.menuGroups[menu.id].text2[1] == ''}"><input type="text" v-model="current.menuGroups[menu.id].text2[0]"><input type="text" v-model="current.menuGroups[menu.id].text2[1]"></div>
<div class="tran" v-if="isSmall(current.menuGroups[menu.id].text2)">
<input type="text" v-model="current.menuGroups[menu.id].text2[0]" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' && current.menuGroups[menu.id].text2[1] == ''}">
<input type="text" v-model="current.menuGroups[menu.id].text2[1]" v-bind:class="{unchanged : current.menuGroups[menu.id].text2[0] == referent.menuGroups[menu.id].text2[0] && current.menuGroups[menu.id].text2[1] == referent.menuGroups[menu.id].text2[1], empty : current.menuGroups[menu.id].text2[0] == '' && current.menuGroups[menu.id].text2[1] == ''}">
<button type="button" @click="convertToLarge(current.menuGroups, menu.id, 'text2')">Convert to large text</button>
</div>
<div class="tran" v-else>
<input type="text" v-model="current.menuGroups[menu.id].text2" v-bind:class="{unchanged : current.menuGroups[menu.id].text2 == referent.menuGroups[menu.id].text2, empty : current.menuGroups[menu.id].text2==''}">
<button type="button" @click="convertToSmall(current.menuGroups, menu.id, 'text2')">Convert to small text</button>
</div>
<div class="label">Description</div>
<div class="ref">{{referent.menuGroups[menu.id].desc}}</div>
<div class="tran"><input type="text" v-model="current.menuGroups[menu.id].desc" v-bind:class="{unchanged : current.menuGroups[menu.id].desc == referent.menuGroups[menu.id].desc, empty : current.menuGroups[menu.id].desc == ''}"></div>
@@ -303,14 +388,22 @@
<h2>Menu Options</h2>
<table class="data">
<tr v-for="menu in def.menuOptions" v-bind:class="validateInput(current.menuOptions, menu.id, 2)">
<tr v-for="menu in def.menuOptions" v-bind:class="validateWholeScreenMessage(current.menuOptions, menu.id, 'text2')">
<td class="label"><div class="stringId">{{menu.id}}</div></td>
<td class="value">
<div v-bind:class="{hidden : false}">
<div class="label">Menu Name (Double-Line)</div>
<div class="constraint">{{constraintString(menu)}}</div>
<div class="label">Menu Name</div>
<div class="constraint">{{constraintWholeScreenMessage(current.menuOptions, menu.id, 'text2')}}</div>
<div class="ref">{{referent.menuOptions[menu.id].text2}}</div>
<div class="tran" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' || current.menuOptions[menu.id].text2[1] == ''}"><input type="text" v-model="current.menuOptions[menu.id].text2[0]"><input type="text" v-model="current.menuOptions[menu.id].text2[1]"></div>
<div class="tran" v-if="isSmall(current.menuOptions[menu.id].text2)">
<input type="text" v-model="current.menuOptions[menu.id].text2[0]" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' && current.menuOptions[menu.id].text2[1] == ''}">
<input type="text" v-model="current.menuOptions[menu.id].text2[1]" v-bind:class="{unchanged : current.menuOptions[menu.id].text2[0] == referent.menuOptions[menu.id].text2[0] && current.menuOptions[menu.id].text2[1] == referent.menuOptions[menu.id].text2[1], empty : current.menuOptions[menu.id].text2[0] == '' && current.menuOptions[menu.id].text2[1] == ''}">
<button type="button" @click="convertToLarge(current.menuOptions, menu.id, 'text2')">Convert to large text</button>
</div>
<div class="tran" v-else>
<input type="text" v-model="current.menuOptions[menu.id].text2" v-bind:class="{unchanged : current.menuOptions[menu.id].text2 == referent.menuOptions[menu.id].text2, empty : current.menuOptions[menu.id].text2==''}">
<button type="button" @click="convertToSmall(current.menuOptions, menu.id, 'text2')">Convert to small text</button>
</div>
</div>
<div class="label">Description</div>
<div class="ref">{{referent.menuOptions[menu.id].desc}}</div>
@@ -326,4 +419,4 @@
</div>
</div>
</body>
</html>
</html>

View File

@@ -127,6 +127,15 @@ def get_letter_counts(defs: dict, lang: dict) -> List[str]:
else:
text_list.append(obj[eid])
obj = lang["messagesWarn"]
for mod in defs["messagesWarn"]:
eid = mod["id"]
if isinstance(obj[eid], list):
text_list.append(obj[eid][0])
text_list.append(obj[eid][1])
else:
text_list.append(obj[eid])
obj = lang["characters"]
for mod in defs["characters"]:
@@ -136,14 +145,20 @@ def get_letter_counts(defs: dict, lang: dict) -> List[str]:
obj = lang["menuOptions"]
for mod in defs["menuOptions"]:
eid = mod["id"]
text_list.append(obj[eid]["text2"][0])
text_list.append(obj[eid]["text2"][1])
if isinstance(obj[eid]["text2"], list):
text_list.append(obj[eid]["text2"][0])
text_list.append(obj[eid]["text2"][1])
else:
text_list.append(obj[eid]["text2"])
obj = lang["menuGroups"]
for mod in defs["menuGroups"]:
eid = mod["id"]
text_list.append(obj[eid]["text2"][0])
text_list.append(obj[eid]["text2"][1])
if isinstance(obj[eid]["text2"], list):
text_list.append(obj[eid]["text2"][0])
text_list.append(obj[eid]["text2"][1])
else:
text_list.append(obj[eid]["text2"])
obj = lang["menuGroups"]
for mod in defs["menuGroups"]:
@@ -403,6 +418,23 @@ def write_language(lang: dict, defs: dict, f: TextIO) -> None:
f.write("\n")
obj = lang["messagesWarn"]
for mod in defs["messagesWarn"]:
eid = mod["id"]
if isinstance(obj[eid], list):
if not obj[eid][1]:
source_text = obj[eid][0]
else:
source_text = obj[eid][0] + "\n" + obj[eid][1]
else:
source_text = "\n" + obj[eid]
translated_text = convert_string(symbol_conversion_table, source_text)
source_text = source_text.replace("\n", "_")
f.write(f'const char* {eid} = "{translated_text}";//{source_text} \n')
f.write("\n")
# ----- Writing Characters
obj = lang["characters"]
@@ -427,16 +459,23 @@ def write_language(lang: dict, defs: dict, f: TextIO) -> None:
# ----- Writing SettingsDescriptions
obj = lang["menuOptions"]
f.write("const char* SettingsShortNames[][2] = {\n")
f.write("const char* SettingsShortNames[] = {\n")
max_len = 25
index = 0
for mod in defs["menuOptions"]:
eid = mod["id"]
if isinstance(obj[eid]["text2"], list):
if not obj[eid]["text2"][1]:
source_text = obj[eid]["text2"][0]
else:
source_text = obj[eid]["text2"][0] + "\n" + obj[eid]["text2"][1]
else:
source_text = "\n" + obj[eid]["text2"]
if "feature" in mod:
f.write(f"#ifdef {mod['feature']}\n")
f.write(f" /* [{index:02d}] {eid.ljust(max_len)[:max_len]} */ ")
f.write(f'{{ "{convert_string(symbol_conversion_table, (obj[eid]["text2"][0]))}", "{convert_string(symbol_conversion_table, (obj[eid]["text2"][1]))}" }},//{obj[eid]["text2"]} \n')
f.write(f'{{ "{convert_string(symbol_conversion_table, source_text)}" }},//{obj[eid]["text2"]} \n')
if "feature" in mod:
f.write("#endif\n")
@@ -451,9 +490,15 @@ def write_language(lang: dict, defs: dict, f: TextIO) -> None:
max_len = 25
for mod in defs["menuGroups"]:
eid = mod["id"]
if isinstance(obj[eid]["text2"], list):
if not obj[eid]["text2"][1]:
source_text = obj[eid]["text2"][0]
else:
source_text = obj[eid]["text2"][0] + "\n" + obj[eid]["text2"][1]
else:
source_text = "\n" + obj[eid]["text2"]
f.write(f" /* {eid.ljust(max_len)[:max_len]} */ ")
txt = f'{obj[eid]["text2"][0]}\\n{obj[eid]["text2"][1]}'
f.write(f'"{convert_string(symbol_conversion_table, txt)}",//{obj[eid]["text2"]} \n')
f.write(f'"{convert_string(symbol_conversion_table, source_text)}",//{obj[eid]["text2"]} \n')
f.write("};\n\n")

View File

@@ -21,11 +21,25 @@
"TipDisconnectedString": "ПРЕКЪСНАТ ВРЪХ",
"SolderingAdvancedPowerPrompt": "Захранване: ",
"OffString": "Изкл.",
"ResetOKMessage": "Нулиране завършено",
"YourGainMessage": "Усилване:",
"SettingsResetMessage": "Настройките бяха\nнулирани!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"YourGainMessage": "Усилване:"
},
"messagesWarn": {
"ResetOKMessage": [
"Нулиране",
"завършено"
],
"SettingsResetMessage": [
"Настройките бяха",
"нулирани!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +51,7 @@
"SettingFastChar": "F",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "HROT NEPŘIPOJEN",
"SolderingAdvancedPowerPrompt": "Ohřev: ",
"OffString": "Vyp",
"YourGainMessage": "Zisk:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Zisk:",
"SettingsResetMessage": "Tov. nas. obnov.",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Tov. nas. obnov.",
""
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "R",
"SettingSlowChar": "P",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "TIP DISCONNECTED",
"SolderingAdvancedPowerPrompt": "Power: ",
"OffString": "Off",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "F",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "L",
"SettingStartSleepChar": "D",
"SettingStartSleepOffChar": "O",

View File

@@ -22,11 +22,22 @@
"TipDisconnectedString": "Spitze fehlt",
"SolderingAdvancedPowerPrompt": "Leistung: ",
"OffString": "Aus",
"NoAccelerometerMessage": "Kein Bewegungssensor\nerkannt!",
"NoPowerDeliveryMessage": "Kein USB-PD IC\nerkannt!",
"YourGainMessage": "Dein Faktor:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Dein Faktor:",
"SettingsResetMessage": "Einstellungen\nzurückgesetzt!",
"SettingsResetMessage": [
"Einstellungen",
"zurückgesetzt!"
],
"NoAccelerometerMessage": [
"Kein Bewegungssensor",
"erkannt!"
],
"NoPowerDeliveryMessage": [
"Kein USB-PD IC",
"erkannt!"
],
"LockingKeysString": "GESPERRT",
"UnlockingKeysString": "ENTSPERRT",
"WarningKeysLockedString": "!GESPERRT!"

View File

@@ -22,11 +22,22 @@
"TipDisconnectedString": "NO TIP",
"SolderingAdvancedPowerPrompt": "Power: ",
"OffString": "Off",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -38,7 +49,7 @@
"SettingFastChar": "F",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "S",
"SettingStartSleepChar": "Z",
"SettingStartSleepOffChar": "R",

View File

@@ -21,11 +21,23 @@
"TipDisconnectedString": "NO HAY PUNTA",
"SolderingAdvancedPowerPrompt": "Potencia: ",
"OffString": " No",
"ResetOKMessage": "Hecho. ",
"YourGainMessage": "Gananc.:",
"SettingsResetMessage": "Ajustes borrados",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": "Ajustes borrados"
},
"messagesWarn": {
"ResetOKMessage": "Hecho.",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +49,7 @@
"SettingFastChar": "R",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "S",
"SettingStartSleepChar": "R",
"SettingStartSleepOffChar": "F",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "KÄRKI ON IRTI",
"SolderingAdvancedPowerPrompt": "Teho: ",
"OffString": "OFF",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "N",
"SettingSlowChar": "H",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "PANNE DÉBRANCHÉE",
"SolderingAdvancedPowerPrompt": "Puissance : ",
"OffString": "Off",
"YourGainMessage": "Gain : "
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Gain : ",
"SettingsResetMessage": "Réglage réinit. !",
"NoAccelerometerMessage": "Accéléromètre\nnon détecté !",
"NoPowerDeliveryMessage": "Pas d'USB-PD\ndétecté !",
"SettingsResetMessage": [
"Réglage",
"réinit. !"
],
"NoAccelerometerMessage": [
"Accéléromètre",
"non détecté !"
],
"NoPowerDeliveryMessage": [
"Pas d'USB-PD",
"détecté !"
],
"LockingKeysString": "VERROUIL",
"UnlockingKeysString": "DEVERROU",
"WarningKeysLockedString": "! VERR. !"
@@ -37,7 +48,7 @@
"SettingFastChar": "R",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"D",
"SettingOffChar": "D",
"SettingStartSolderingChar": "A",
"SettingStartSleepChar": "V",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "VRH NIJE SPOJEN!",
"SolderingAdvancedPowerPrompt": "Snaga: ",
"OffString": "Off",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "B",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,25 @@
"TipDisconnectedString": "PÁKA LEVÉVE",
"SolderingAdvancedPowerPrompt": "Telj: ",
"OffString": "Ki",
"ResetOKMessage": "Törlés OK",
"YourGainMessage": "Erősítés:",
"SettingsResetMessage": "Beállítások\ntörölve!",
"NoAccelerometerMessage": "Nincs gyorsulásmérő!",
"NoPowerDeliveryMessage": "Nincs USB-PD IC!",
"YourGainMessage": "Erősítés:"
},
"messagesWarn": {
"ResetOKMessage": [
"Törlés OK",
""
],
"SettingsResetMessage": [
"Beállítások",
"törölve!"
],
"NoAccelerometerMessage": [
"Nincs",
"gyorsulásmérő!"
],
"NoPowerDeliveryMessage": [
"Nincs USB-PD IC!",
""
],
"LockingKeysString": "LEZÁRVA",
"UnlockingKeysString": "FELOLDVA",
"WarningKeysLockedString": "!LEZÁRVA!"
@@ -37,7 +51,7 @@
"SettingFastChar": "G",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"0",
"SettingOffChar": "0",
"SettingStartSolderingChar": "F",
"SettingStartSleepChar": "Z",
"SettingStartSleepOffChar": "S",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "PUNTA ASSENTE",
"SolderingAdvancedPowerPrompt": "Potenz:",
"OffString": "OFF",
"YourGainMessage": "Guad.: "
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Guad.: ",
"SettingsResetMessage": "Reset effettuato",
"NoAccelerometerMessage": "Accelerometro\nnon rilevato",
"NoPowerDeliveryMessage": "USB-PD non\ndisponibile",
"SettingsResetMessage": [
"Reset effettuato",
""
],
"NoAccelerometerMessage": [
"Accelerometro",
"non rilevato"
],
"NoPowerDeliveryMessage": [
"USB-PD non",
"disponibile"
],
"LockingKeysString": "Blocc.",
"UnlockingKeysString": "Sblocc.",
"WarningKeysLockedString": "BLOCCATO"
@@ -37,7 +48,7 @@
"SettingFastChar": "V",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "S",
"SettingStartSleepChar": "R",
"SettingStartSleepOffChar": "A",

View File

@@ -21,11 +21,25 @@
"TipDisconnectedString": "NĖRA ANTGALIO",
"SolderingAdvancedPowerPrompt": "Galia: ",
"OffString": "Išj",
"ResetOKMessage": "Atstatytas OK",
"YourGainMessage": "Greitis:",
"SettingsResetMessage": "Nust. atstatyti!",
"NoAccelerometerMessage": "Nerastas\nakselerometras!",
"NoPowerDeliveryMessage": "Nerastas\nUSB-PD IC !",
"YourGainMessage": "Greitis:"
},
"messagesWarn": {
"ResetOKMessage": [
"Atstatytas OK",
""
],
"SettingsResetMessage": [
"Nust. atstatyti!",
""
],
"NoAccelerometerMessage": [
"Nerastas",
"akselerometras!"
],
"NoPowerDeliveryMessage": [
"Nerastas",
"USB-PD IC !"
],
"LockingKeysString": " UŽRAKIN",
"UnlockingKeysString": "ATRAKIN",
"WarningKeysLockedString": "!UŽRAK!"
@@ -37,7 +51,7 @@
"SettingFastChar": "G",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"I",
"SettingOffChar": "I",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "M",
"SettingStartSleepOffChar": "K",

View File

@@ -21,14 +21,34 @@
"TipDisconnectedString": "PUNT LOSGEKOPPELT",
"SolderingAdvancedPowerPrompt": "Vermogen: ",
"OffString": "Uit",
"YourGainMessage": "Niveau:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Niveau:",
"SettingsResetMessage": "Instellingen zijn\ngereset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"LockingKeysString": " GEBLOKKEERD",
"UnlockingKeysString": "GEDEBLOKKEERD",
"WarningKeysLockedString": "!GEBLOKKEERD!"
"SettingsResetMessage": [
"Instellingen",
"zijn gereset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": [
" GEBLOKKEERD",
""
],
"UnlockingKeysString": [
"GEDEBLOKKEERD",
""
],
"WarningKeysLockedString": [
"!GEBLOKKEERD!",
""
]
},
"characters": {
"SettingRightChar": "R",
@@ -37,7 +57,7 @@
"SettingFastChar": "F",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "Punt ONTKOPPELD",
"SolderingAdvancedPowerPrompt": "Vermogen: ",
"OffString": "Uit",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "S",
"SettingSlowChar": "T",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "SPISS FRAKOBLET",
"SolderingAdvancedPowerPrompt": "Effekt: ",
"OffString": "Av",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "H",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "L",
"SettingStartSleepChar": "D",
"SettingStartSleepOffChar": "O",
@@ -105,7 +116,7 @@
},
"SleepTimeout": {
"text2": [
"",
"DTid",
""
],
"desc": "Tid før dvale <Minutter/Sekunder"

View File

@@ -22,11 +22,22 @@
"TipDisconnectedString": "GROT ODŁĄCZONY",
"SolderingAdvancedPowerPrompt": "Moc: ",
"OffString": "Wył",
"YourGainMessage": "Us.zysk:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Us.zysk:",
"SettingsResetMessage": "Ust. zresetowane",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Ust. zresetowane",
""
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " ZABLOK.",
"UnlockingKeysString": "ODBLOK.",
"WarningKeysLockedString": "!ZABLOK!"
@@ -38,7 +49,7 @@
"SettingFastChar": "S",
"SettingSlowChar": "W",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "Z",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "SEM PONTA",
"SolderingAdvancedPowerPrompt": "Power: ",
"OffString": "Off",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "R",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "ЖАЛО ОТСОЕДИНЕНО",
"SolderingAdvancedPowerPrompt": "Питание: ",
"OffString": "Выкл.",
"YourGainMessage": "Прирост:"
},
"messagesWarn": {
"ResetOKMessage": "Сброс OK",
"YourGainMessage": "Прирост:",
"SettingsResetMessage": "Настройки\nсброшены!",
"NoAccelerometerMessage": "Не определен\nакселерометр!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Настройки",
"сброшены!"
],
"NoAccelerometerMessage": [
"Не определен",
"акселерометр!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "Б",
"SettingSlowChar": "М",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "П",
"SettingStartSleepChar": "О",
"SettingStartSleepOffChar": "К",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "HROT ODPOJENÝ",
"SolderingAdvancedPowerPrompt": "Výkon: ",
"OffString": "Vyp",
"YourGainMessage": "Zisk:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Zisk:",
"SettingsResetMessage": "Tov. nas. obnov.",
"NoAccelerometerMessage": "Bez pohyb. senz.",
"NoPowerDeliveryMessage": "Chýba čip USB-PD",
"SettingsResetMessage": [
"Tov. nas. obnov.",
""
],
"NoAccelerometerMessage": [
"Bez pohyb. senz.",
""
],
"NoPowerDeliveryMessage": [
"Chýba čip USB-PD",
""
],
"LockingKeysString": " ZABLOK.",
"UnlockingKeysString": "ODBLOK.",
"WarningKeysLockedString": "!ZABLOK!"
@@ -37,7 +48,7 @@
"SettingFastChar": "R",
"SettingSlowChar": "P",
"SettingMediumChar": "M",
"SettingOffChar":"Z",
"SettingOffChar": "Z",
"SettingStartSolderingChar": "S",
"SettingStartSleepChar": "K",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "NI KONICE",
"SolderingAdvancedPowerPrompt": "Moč: ",
"OffString": "Off",
"YourGainMessage": "Ojačenje"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Ojačenje",
"SettingsResetMessage": "Nastavitve OK!",
"NoAccelerometerMessage": "Ni pospeševalnik",
"NoPowerDeliveryMessage": "Ni USB-PD čipa!",
"SettingsResetMessage": [
"Nastavitve OK!",
""
],
"NoAccelerometerMessage": [
"Ni pospeševalnik",
""
],
"NoPowerDeliveryMessage": [
"Ni USB-PD čipa!",
""
],
"LockingKeysString": "ZAKLENJ.",
"UnlockingKeysString": "ODKLENJ.",
"WarningKeysLockedString": "ZAKLENJ."
@@ -37,7 +48,7 @@
"SettingFastChar": "H",
"SettingSlowChar": "P",
"SettingMediumChar": "M",
"SettingOffChar":"U",
"SettingOffChar": "U",
"SettingStartSolderingChar": "S",
"SettingStartSleepChar": "Z",
"SettingStartSleepOffChar": "V",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "ВРХ НИЈЕ СПОЈЕН",
"SolderingAdvancedPowerPrompt": "Снага: ",
"OffString": "Иск",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "Б",
"SettingSlowChar": "С",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "VRH NIJE SPOJEN",
"SolderingAdvancedPowerPrompt": "Snaga: ",
"OffString": "Isk",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "B",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "SPETS URTAGEN",
"SolderingAdvancedPowerPrompt": "Ström: ",
"OffString": "Av",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "Reset OK",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "Settings were\nreset!",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": [
"Settings were",
"reset!"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": " LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
@@ -37,7 +48,7 @@
"SettingFastChar": "S",
"SettingSlowChar": "L",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,28 @@
"TipDisconnectedString": "UÇ ÇIKARILDI",
"SolderingAdvancedPowerPrompt": "Güç: ",
"OffString": "Kapalı",
"ResetOKMessage": "Sıfırlama Tamam",
"YourGainMessage": "Kazancınız:",
"SettingsResetMessage": "Ayarlar Sıfırlandı",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!"
"YourGainMessage": "Kazancınız:"
},
"messagesWarn": {
"ResetOKMessage": [
"Sıfırlama Tamam",
""
],
"SettingsResetMessage": [
"Ayarlar",
"Sıfırlandı"
],
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": "LOCKED",
"UnlockingKeysString": "UNLOCKED",
"WarningKeysLockedString": "!LOCKED!"
},
"characters": {
"SettingRightChar": "R",
@@ -34,7 +51,7 @@
"SettingFastChar": "F",
"SettingSlowChar": "S",
"SettingMediumChar": "M",
"SettingOffChar":"O",
"SettingOffChar": "O",
"SettingStartSolderingChar": "T",
"SettingStartSleepChar": "S",
"SettingStartSleepOffChar": "O",

View File

@@ -21,11 +21,22 @@
"TipDisconnectedString": "Жало вимкнено!",
"SolderingAdvancedPowerPrompt": "Живлення: ",
"OffString": "Вимк",
"YourGainMessage": "Приріст:"
},
"messagesWarn": {
"ResetOKMessage": "Скид. OK",
"YourGainMessage": "Приріст:",
"SettingsResetMessage": "Налаштування\nскинуті!",
"NoAccelerometerMessage": "Акселерометр\nне виявлено!",
"NoPowerDeliveryMessage": "USB-PD IC\nне виявлено!",
"SettingsResetMessage": [
"Налаштування",
"скинуті!"
],
"NoAccelerometerMessage": [
"Акселерометр",
"не виявлено!"
],
"NoPowerDeliveryMessage": [
"USB-PD IC",
"не виявлено!"
],
"LockingKeysString": " ЗАБЛОК.",
"UnlockingKeysString": "РОЗБЛОК.",
"WarningKeysLockedString": "!ЗАБЛОК!"
@@ -37,7 +48,7 @@
"SettingFastChar": "Ш",
"SettingSlowChar": "П",
"SettingMediumChar": "M",
"SettingOffChar":"B",
"SettingOffChar": "B",
"SettingStartSolderingChar": "П",
"SettingStartSleepChar": "О",
"SettingStartSleepOffChar": "К",

View File

@@ -22,11 +22,19 @@
"TipDisconnectedString": "NO TIP",
"SolderingAdvancedPowerPrompt": "Power: ",
"OffString": "關",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "已重設!",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "\n設定已被重設",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": "設定已被重設!",
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": "已鎖定",
"UnlockingKeysString": "已解除鎖定",
"WarningKeysLockedString": "!撳掣鎖定!"
@@ -38,7 +46,7 @@
"SettingFastChar": "快",
"SettingSlowChar": "慢",
"SettingMediumChar": "中",
"SettingOffChar":"關",
"SettingOffChar": "關",
"SettingStartSolderingChar": "焊",
"SettingStartSleepChar": "待",
"SettingStartSleepOffChar": "室",
@@ -54,243 +62,141 @@
},
"menuGroups": {
"PowerMenu": {
"text2": [
"",
"電源設定"
],
"text2": "電源設定",
"desc": "電源設定"
},
"SolderingMenu": {
"text2": [
"",
"焊接設定"
],
"text2": "焊接設定",
"desc": "焊接設定"
},
"PowerSavingMenu": {
"text2": [
"",
"待機設定"
],
"text2": "待機設定",
"desc": "自動待機慳電設定"
},
"UIMenu": {
"text2": [
"",
"使用者介面"
],
"text2": "使用者介面",
"desc": "使用者介面設定"
},
"AdvancedMenu": {
"text2": [
"",
"進階設定"
],
"text2": "進階設定",
"desc": "進階設定"
}
},
"menuOptions": {
"DCInCutoff": {
"text2": [
"",
"電源"
],
"text2": "電源",
"desc": "輸入電源;設定自動停機電壓 <DC 10V> <S 鋰電池以每粒3.3V計算;依個設定會停用功率限制>"
},
"SleepTemperature": {
"text2": [
"",
"待機温度"
],
"text2": "待機温度",
"desc": "喺待機模式時嘅辣雞咀温度"
},
"SleepTimeout": {
"text2": [
"",
"待機延時"
],
"text2": "待機延時",
"desc": "自動進入待機模式前嘅閒置等候時間 <S=秒 | M=分鐘>"
},
"ShutdownTimeout": {
"text2": [
"",
"自動熄機"
],
"text2": "自動熄機",
"desc": "自動熄機前嘅閒置等候時間 <M=分鐘>"
},
"MotionSensitivity": {
"text2": [
"",
"動作敏感度"
],
"text2": "動作敏感度",
"desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
},
"TemperatureUnit": {
"text2": [
"",
"温度單位"
],
"text2": "温度單位",
"desc": "C=攝氏 | F=華氏"
},
"AdvancedIdle": {
"text2": [
"",
"詳細閒置畫面"
],
"text2": "詳細閒置畫面",
"desc": "喺閒置畫面以英文細字顯示詳細嘅資料"
},
"DisplayRotation": {
"text2": [
"",
"畫面方向"
],
"text2": "畫面方向",
"desc": "A=自動 | L=使用左手 | R=使用右手"
},
"BoostTemperature": {
"text2": [
"",
"增熱温度"
],
"text2": "增熱温度",
"desc": "喺增熱模式時使用嘅温度"
},
"AutoStart": {
"text2": [
"",
"自動啓用"
],
"text2": "自動啓用",
"desc": "開機時自動啓用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室温待機>"
},
"CooldownBlink": {
"text2": [
"",
"降温時閃爍"
],
"text2": "降温時閃爍",
"desc": "停止加熱之後,當辣雞咀仲係熱嗰陣閃爍畫面"
},
"TemperatureCalibration": {
"text2": [
"",
"温度校正?"
],
"text2": "温度校正?",
"desc": "開始校正辣雞咀温度位移"
},
"SettingsReset": {
"text2": [
"",
"全部重設?"
],
"text2": "全部重設?",
"desc": "將所有設定重設到預設值"
},
"VoltageCalibration": {
"text2": [
"",
"輸入電壓校正?"
],
"text2": "輸入電壓校正?",
"desc": "開始校正VIN輸入電壓 <長撳以退出>"
},
"AdvancedSoldering": {
"text2": [
"",
"詳細焊接畫面"
],
"text2": "詳細焊接畫面",
"desc": "喺焊接模式畫面以英文細字顯示詳細嘅資料"
},
"ScrollingSpeed": {
"text2": [
"",
"捲動速度"
],
"text2": "捲動速度",
"desc": "解說文字嘅捲動速度"
},
"QCMaxVoltage": {
"text2": [
"",
"QC電壓"
],
"text2": "QC電壓",
"desc": "使用QC電源時請求嘅最高目標電壓"
},
"PowerLimit": {
"text2": [
"",
"功率限制"
],
"text2": "功率限制",
"desc": "限制辣雞可用嘅最大功率 <W=watt>"
},
"ReverseButtonTempChange": {
"text2": [
"",
"反轉加減掣"
],
"text2": "反轉加減掣",
"desc": "反轉調校温度時加減掣嘅方向"
},
"TempChangeShortStep": {
"text2": [
"",
"温度調整 短"
],
"text2": "温度調整 短",
"desc": "調校温度時短撳一下嘅温度變幅"
},
"TempChangeLongStep": {
"text2": [
"",
"温度調整 長"
],
"text2": "温度調整 長",
"desc": "調校温度時長撳嘅温度變幅"
},
"PowerPulsePower": {
"text2": [
"",
"電源脈衝"
],
"text2": "電源脈衝",
"desc": "為保持電源喚醒而通電所用嘅功率 <watt>"
},
"HallEffSensitivity": {
"text2": [
"",
"磁場敏感度"
],
"text2": "磁場敏感度",
"desc": "磁場感應器用嚟啓動待機模式嘅敏感度 <關=停用 | 低=最低敏感度 | 中=中等敏感度 | 高=最高敏感度>"
},
"LockingMode": {
"text2": [
"",
"撳掣鎖定"
],
"text2": "撳掣鎖定",
"desc": "喺焊接模式時,同時長撳兩粒掣啓用撳掣鎖定 <無=停用 | 增=鎖定增熱模式 | 全=鎖定全部>"
},
"MinVolCell": {
"text2": [
"",
"最低電壓"
],
"text2": "最低電壓",
"desc": "每粒電池嘅最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
},
"AnimLoop": {
"text2": [
"",
"動畫循環"
],
"text2": "動畫循環",
"desc": "循環顯示功能表圖示動畫"
},
"AnimSpeed": {
"text2": [
"",
"動畫速度"
],
"text2": "動畫速度",
"desc": "功能表圖示動畫嘅速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
},
"PowerPulseWait": {
"text2": [
"",
"電源脈衝間隔"
],
"text2": "電源脈衝間隔",
"desc": "為保持電源喚醒,每次通電之間嘅間隔時間 <x2.5s(秒)>"
},
"PowerPulseDuration": {
"text2": [
"",
"電源脈衝時長"
],
"text2": "電源脈衝時長",
"desc": "為保持電源喚醒,每次通電脈衝嘅時間長度 <x250ms亳秒>"
}
}

View File

@@ -22,11 +22,19 @@
"TipDisconnectedString": "NO TIP",
"SolderingAdvancedPowerPrompt": "Power: ",
"OffString": "關",
"YourGainMessage": "Your gain:"
},
"messagesWarn": {
"ResetOKMessage": "已重設!",
"YourGainMessage": "Your gain:",
"SettingsResetMessage": "\n設定已被重設",
"NoAccelerometerMessage": "No accelerometer\ndetected!",
"NoPowerDeliveryMessage": "No USB-PD IC\ndetected!",
"SettingsResetMessage": "設定已被重設!",
"NoAccelerometerMessage": [
"No accelerometer",
"detected!"
],
"NoPowerDeliveryMessage": [
"No USB-PD IC",
"detected!"
],
"LockingKeysString": "已鎖定",
"UnlockingKeysString": "已解除鎖定",
"WarningKeysLockedString": "!按鍵鎖定!"
@@ -38,7 +46,7 @@
"SettingFastChar": "快",
"SettingSlowChar": "慢",
"SettingMediumChar": "中",
"SettingOffChar":"關",
"SettingOffChar": "關",
"SettingStartSolderingChar": "焊",
"SettingStartSleepChar": "待",
"SettingStartSleepOffChar": "室",
@@ -54,243 +62,141 @@
},
"menuGroups": {
"PowerMenu": {
"text2": [
"",
"電源設定"
],
"text2": "電源設定",
"desc": "電源設定"
},
"SolderingMenu": {
"text2": [
"",
"焊接設定"
],
"text2": "焊接設定",
"desc": "焊接設定"
},
"PowerSavingMenu": {
"text2": [
"",
"待機設定"
],
"text2": "待機設定",
"desc": "自動待機省電設定"
},
"UIMenu": {
"text2": [
"",
"使用者介面"
],
"text2": "使用者介面",
"desc": "使用者介面設定"
},
"AdvancedMenu": {
"text2": [
"",
"進階設定"
],
"text2": "進階設定",
"desc": "進階設定"
}
},
"menuOptions": {
"DCInCutoff": {
"text2": [
"",
"電源"
],
"text2": "電源",
"desc": "輸入電源;設定自動停機電壓 <DC 10V> <S 鋰電池以每顆3.3V計算;此設定會停用功率限制>"
},
"SleepTemperature": {
"text2": [
"",
"待機溫度"
],
"text2": "待機溫度",
"desc": "於待機模式時的鉻鐵頭溫度"
},
"SleepTimeout": {
"text2": [
"",
"待機延時"
],
"text2": "待機延時",
"desc": "自動進入待機模式前的閒置等候時間 <S=秒 | M=分鐘>"
},
"ShutdownTimeout": {
"text2": [
"",
"自動關機"
],
"text2": "自動關機",
"desc": "自動關機前的閒置等候時間 <M=分鐘>"
},
"MotionSensitivity": {
"text2": [
"",
"動作敏感度"
],
"text2": "動作敏感度",
"desc": "0=停用 | 1=最低敏感度 | ... | 9=最高敏感度"
},
"TemperatureUnit": {
"text2": [
"",
"溫標"
],
"text2": "溫標",
"desc": "C=攝氏 | F=華氏"
},
"AdvancedIdle": {
"text2": [
"",
"詳細閒置畫面"
],
"text2": "詳細閒置畫面",
"desc": "於閒置畫面以英文小字型顯示詳細資料"
},
"DisplayRotation": {
"text2": [
"",
"畫面方向"
],
"text2": "畫面方向",
"desc": "A=自動 | L=使用左手 | R=使用右手"
},
"BoostTemperature": {
"text2": [
"",
"增熱溫度"
],
"text2": "增熱溫度",
"desc": "於增熱模式時使用的溫度"
},
"AutoStart": {
"text2": [
"",
"自動啟用"
],
"text2": "自動啟用",
"desc": "開機時自動啟用 <無=停用 | 焊=焊接模式 | 待=待機模式 | 室=室溫待機>"
},
"CooldownBlink": {
"text2": [
"",
"降溫時閃爍"
],
"text2": "降溫時閃爍",
"desc": "停止加熱之後,當鉻鐵頭仍處於高溫時閃爍畫面"
},
"TemperatureCalibration": {
"text2": [
"",
"溫度校正?"
],
"text2": "溫度校正?",
"desc": "開始校正鉻鐵頭溫度位移"
},
"SettingsReset": {
"text2": [
"",
"全部重設?"
],
"text2": "全部重設?",
"desc": "將所有設定重設到預設值"
},
"VoltageCalibration": {
"text2": [
"",
"輸入電壓校正?"
],
"text2": "輸入電壓校正?",
"desc": "開始校正VIN輸入電壓 <長按以退出>"
},
"AdvancedSoldering": {
"text2": [
"",
"詳細焊接畫面"
],
"text2": "詳細焊接畫面",
"desc": "於焊接模式畫面以英文小字型顯示詳細資料"
},
"ScrollingSpeed": {
"text2": [
"",
"捲動速度"
],
"text2": "捲動速度",
"desc": "解說文字的捲動速度"
},
"QCMaxVoltage": {
"text2": [
"",
"QC電壓"
],
"text2": "QC電壓",
"desc": "使用QC電源時請求的最高目標電壓"
},
"PowerLimit": {
"text2": [
"",
"功率限制"
],
"text2": "功率限制",
"desc": "限制鉻鐵可用的最大功率 <W=watt瓦特>"
},
"ReverseButtonTempChange": {
"text2": [
"",
"調換加減鍵"
],
"text2": "調換加減鍵",
"desc": "調校溫度時調換加減鍵的方向"
},
"TempChangeShortStep": {
"text2": [
"",
"溫度調整 短"
],
"text2": "溫度調整 短",
"desc": "調校溫度時短按一下的溫度變幅"
},
"TempChangeLongStep": {
"text2": [
"",
"溫度調整 長"
],
"text2": "溫度調整 長",
"desc": "調校溫度時長按按鍵的溫度變幅"
},
"PowerPulsePower": {
"text2": [
"",
"電源脈衝"
],
"text2": "電源脈衝",
"desc": "為保持電源喚醒而通電所用的功率 <watt瓦特>"
},
"HallEffSensitivity": {
"text2": [
"",
"磁場敏感度"
],
"text2": "磁場敏感度",
"desc": "磁場感應器用作啟動待機模式的敏感度 <關=停用 | 低=最低敏感度 | 中=中等敏感度 | 高=最高敏感度>"
},
"LockingMode": {
"text2": [
"",
"按鍵鎖定"
],
"text2": "按鍵鎖定",
"desc": "於焊接模式時,同時長按兩個按鍵啟用按鍵鎖定 <無=停用 | 增=鎖定增熱模式 | 全=鎖定全部>"
},
"MinVolCell": {
"text2": [
"",
"最低電壓"
],
"text2": "最低電壓",
"desc": "每顆電池的最低可用電壓 <伏特> <3S: 3.0V - 3.7V, 4/5/6S: 2.4V - 3.7V>"
},
"AnimLoop": {
"text2": [
"",
"動畫循環"
],
"text2": "動畫循環",
"desc": "循環顯示功能表圖示動畫"
},
"AnimSpeed": {
"text2": [
"",
"動畫速度"
],
"text2": "動畫速度",
"desc": "功能表圖示動畫的速度 <關=不顯示動畫 | 慢=慢速 | 中=中速 | 快=快速>"
},
"PowerPulseWait": {
"text2": [
"",
"電源脈衝間隔"
],
"text2": "電源脈衝間隔",
"desc": "為保持電源喚醒,每次通電之間的間隔時間 <x2.5s(秒)>"
},
"PowerPulseDuration": {
"text2": [
"",
"電源脈衝時長"
],
"text2": "電源脈衝時長",
"desc": "為保持電源喚醒,每次通電脈衝的時間長度 <x250ms亳秒>"
}
}

View File

@@ -81,44 +81,33 @@ var def =
"id": "OffString",
"maxLen": 3
},
{
"id": "ResetOKMessage",
"maxLen": 8
},
{
"id": "YourGainMessage",
"maxLen": 8,
"default": "Your Gain"
}
],
"messagesWarn": [
{
"id": "ResetOKMessage"
},
{
"id": "SettingsResetMessage",
"maxLen": 16,
"default": "Settings were\nreset!"
"id": "SettingsResetMessage"
},
{
"id": "NoAccelerometerMessage",
"maxLen": 16,
"default": "No accelerometer\ndetected!"
"id": "NoAccelerometerMessage"
},
{
"id": "NoPowerDeliveryMessage",
"maxLen": 16,
"default": "No USB-PD IC\ndetected!"
"id": "NoPowerDeliveryMessage"
},
{
"id": "LockingKeysString",
"maxLen": 8,
"default": "LOCKING"
"id": "LockingKeysString"
},
{
"id": "UnlockingKeysString",
"maxLen": 8,
"default": "UNLOCK"
"id": "UnlockingKeysString"
},
{
"id": "WarningKeysLockedString",
"maxLen": 8,
"default": "LOCKED!"
"id": "WarningKeysLockedString"
}
],
"characters": [
@@ -206,23 +195,28 @@ var def =
"menuGroups": [
{
"id": "PowerMenu",
"maxLen": 11
"maxLen": 5,
"maxLen2": 11
},
{
"id": "SolderingMenu",
"maxLen": 11
"maxLen": 5,
"maxLen2": 11
},
{
"id": "PowerSavingMenu",
"maxLen": 11
"maxLen": 5,
"maxLen2": 11
},
{
"id": "UIMenu",
"maxLen": 11
"maxLen": 5,
"maxLen2": 11
},
{
"id": "AdvancedMenu",
"maxLen": 11
"maxLen": 5,
"maxLen2": 11
}
],
"menuOptions": [

View File

@@ -267,6 +267,26 @@ void OLED::print(const char *const str, FontStyle fontStyle) {
}
}
/**
* Prints a static string message designed to use the whole screen, starting
* from the top-left corner.
*
* If the message starts with a newline (`\\x01`), the string starting from
* after the newline is printed in the large font. Otherwise, the message
* is printed in the small font.
*
* @param string The string message to be printed
*/
void OLED::printWholeScreen(const char *string) {
setCursor(0, 0);
if (string[0] == '\x01') {
// Empty first line means that this uses large font (for CJK).
OLED::print(string + 1, FontStyle::LARGE);
} else {
OLED::print(string, FontStyle::SMALL);
}
}
inline void stripLeaderZeros(char *buffer, uint8_t places) {
// Removing the leading zero's by swapping them to SymbolSpace
// Stop 1 short so that we dont blank entire number if its zero

View File

@@ -55,6 +55,7 @@ public:
static bool getRotation() { return inLeftHandedMode; }
static int16_t getCursorX() { return cursor_x; }
static void print(const char *string, FontStyle fontStyle); // Draw a string to the current location, with selected font
static void printWholeScreen(const char *string);
// Set the cursor location by pixels
static void setCursor(int16_t x, int16_t y) {
cursor_x = x;

View File

@@ -12,9 +12,9 @@ extern const uint8_t USER_FONT_12[];
extern const uint8_t USER_FONT_6x8[];
extern const bool HasFahrenheit;
extern const char *SettingsShortNames[33][2];
extern const char *SettingsDescriptions[33];
extern const char *SettingsMenuEntries[5];
extern const char *SettingsShortNames[];
extern const char *SettingsDescriptions[];
extern const char *SettingsMenuEntries[];
extern const char *SettingsCalibrationDone;
extern const char *SettingsCalibrationWarning;
@@ -35,8 +35,9 @@ extern const char *IdleSetString;
extern const char *TipDisconnectedString;
extern const char *SolderingAdvancedPowerPrompt;
extern const char *OffString;
extern const char *ResetOKMessage;
extern const char *YourGainMessage;
extern const char *ResetOKMessage;
extern const char *SettingsResetMessage;
extern const char *NoAccelerometerMessage;
extern const char *NoPowerDeliveryMessage;

View File

@@ -29,6 +29,7 @@ typedef struct {
void enterSettingsMenu();
void GUIDelay();
void warnUser(const char *warning, const int timeout);
extern const menuitem rootSettingsMenu[];
#endif /* GUI_HPP_ */

View File

@@ -237,20 +237,6 @@ const menuitem advancedMenu[] = {
{nullptr, nullptr, nullptr} // end of menu marker. DO NOT REMOVE
};
static void printShortDescriptionDoubleLine(SettingsItemIndex settingsItemIndex) {
uint8_t shortDescIndex = static_cast<uint8_t>(settingsItemIndex);
if (SettingsShortNames[shortDescIndex][0][0] == '\x00') {
// Empty first line means that this uses large font (for CJK).
OLED::setCursor(0, 0);
OLED::print(SettingsShortNames[shortDescIndex][1], FontStyle::LARGE);
} else {
OLED::setCursor(0, 0);
OLED::print(SettingsShortNames[shortDescIndex][0], FontStyle::SMALL);
OLED::setCursor(0, 8);
OLED::print(SettingsShortNames[shortDescIndex][1], FontStyle::SMALL);
}
}
/**
* Prints two small lines (or one line for CJK) of short description for
* setting items and prepares cursor after it.
@@ -260,7 +246,8 @@ static void printShortDescriptionDoubleLine(SettingsItemIndex settingsItemIndex)
*/
static void printShortDescription(SettingsItemIndex settingsItemIndex, uint16_t cursorCharPosition) {
// print short description (default single line, explicit double line)
printShortDescriptionDoubleLine(settingsItemIndex);
uint8_t shortDescIndex = static_cast<uint8_t>(settingsItemIndex);
OLED::printWholeScreen(SettingsShortNames[shortDescIndex]);
// prepare cursor for value
// make room for scroll indicator
@@ -724,13 +711,7 @@ static bool settings_displayCoolingBlinkEnabled(void) {
static bool settings_setResetSettings(void) {
if (userConfirmation(SettingsResetWarning)) {
resetSettings();
OLED::clearScreen();
OLED::setCursor(0, 0);
OLED::print(ResetOKMessage, FontStyle::LARGE);
OLED::refresh();
waitForButtonPressOrTimeout(2000); // 2 second timeout
warnUser(ResetOKMessage, 2 * TICKS_SECOND);
}
return false;
}
@@ -814,7 +795,7 @@ static bool settings_setCalibrateVIN(void) {
OLED::setCursor(0, 0);
OLED::printNumber(systemSettings.voltageDiv, 3, FontStyle::LARGE);
OLED::refresh();
waitForButtonPressOrTimeout(1000);
waitForButtonPressOrTimeout(1 * TICKS_SECOND);
return false;
case BUTTON_NONE:
default:
@@ -1014,18 +995,8 @@ static bool animOpenState = false;
static void displayMenu(size_t index) {
// Call into the menu
const char *textPtr = SettingsMenuEntries[index];
FontStyle font;
if (textPtr[0] == '\x01') { // `\x01` is used as newline.
// Empty first line means that this uses large font (for CJK).
font = FontStyle::LARGE;
textPtr++;
} else {
font = FontStyle::SMALL;
}
OLED::setCursor(0, 0);
// Draw title
OLED::print(textPtr, font);
OLED::printWholeScreen(SettingsMenuEntries[index]);
// Draw symbol
// 16 pixel wide image
// 2 pixel wide scrolling indicator

View File

@@ -43,10 +43,10 @@ static uint16_t min(uint16_t a, uint16_t b) {
else
return a;
}
void warnUser(const char *warning, const FontStyle font, const int timeout) {
void warnUser(const char *warning, const int timeout) {
OLED::clearScreen();
OLED::setCursor(0, 0);
OLED::print(warning, font);
OLED::printWholeScreen(warning);
OLED::refresh();
waitForButtonPressOrTimeout(timeout);
}
@@ -462,7 +462,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
case BUTTON_BOTH_LONG:
// Unlock buttons
buttonsLocked = false;
warnUser(UnlockingKeysString, FontStyle::LARGE, TICKS_SECOND);
warnUser(UnlockingKeysString, TICKS_SECOND);
break;
case BUTTON_F_LONG:
// if boost mode is enabled turn it on
@@ -476,7 +476,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
case BUTTON_F_SHORT:
case BUTTON_B_SHORT:
// Do nothing and display a lock warming
warnUser(WarningKeysLockedString, FontStyle::LARGE, TICKS_SECOND / 2);
warnUser(WarningKeysLockedString, TICKS_SECOND / 2);
break;
default:
break;
@@ -511,7 +511,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
if (systemSettings.lockingMode != 0) {
// Lock buttons
buttonsLocked = true;
warnUser(LockingKeysString, FontStyle::LARGE, TICKS_SECOND);
warnUser(LockingKeysString, TICKS_SECOND);
}
break;
default:
@@ -713,12 +713,7 @@ void showDebugMenu(void) {
void showWarnings() {
// Display alert if settings were reset
if (settingsWereReset) {
if (SettingsResetMessage[0] == '\x01') { // `\x01` is used as newline.
// Empty first line means that this uses large font (for CJK).
warnUser(SettingsResetMessage + 1, FontStyle::LARGE, 10 * TICKS_SECOND);
} else {
warnUser(SettingsResetMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
}
warnUser(SettingsResetMessage, 10 * TICKS_SECOND);
}
#ifndef NO_WARN_MISSING
// We also want to alert if accel or pd is not detected / not responding
@@ -732,7 +727,7 @@ void showWarnings() {
if (systemSettings.accelMissingWarningCounter < 2) {
systemSettings.accelMissingWarningCounter++;
saveSettings();
warnUser(NoAccelerometerMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
warnUser(NoAccelerometerMessage, 10 * TICKS_SECOND);
}
}
#ifdef POW_PD
@@ -741,7 +736,7 @@ void showWarnings() {
if (systemSettings.pdMissingWarningCounter < 2) {
systemSettings.pdMissingWarningCounter++;
saveSettings();
warnUser(NoPowerDeliveryMessage, FontStyle::SMALL, 10 * TICKS_SECOND);
warnUser(NoPowerDeliveryMessage, 10 * TICKS_SECOND);
}
}
#endif

View File

@@ -316,7 +316,7 @@ $(OUT_OBJS_S): $(OUTPUT_DIR)/%.o: %.S Makefile
@echo 'Building file: $<'
@$(AS) -c $(AFLAGS) $< -o $@
Core/Gen/Translation.%.cpp: ../Translations/translation_%.json Makefile ../Translations/make_translation.py ../Translations/translations_commons.js ../Translations/font_tables.py ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf
Core/Gen/Translation.%.cpp: ../Translations/translation_%.json Makefile ../Translations/make_translation.py ../Translations/translations_def.js ../Translations/font_tables.py ../Translations/wqy-bitmapsong/wenquanyi_9pt.bdf
@test -d $(@D) || mkdir -p $(@D)
@echo 'Generating translations for language $*'
@python3 ../Translations/make_translation.py -o $(PWD)/$@ $*