1
0
forked from me/IronOS

Change translation defs to specify fonts to use

This commit is contained in:
Alvin Wong
2021-04-15 14:32:09 +08:00
parent 9f179f2371
commit cf154114d7
31 changed files with 248 additions and 100 deletions

View File

@@ -1,5 +1,4 @@
import functools
from typing import Dict
from typing import Dict, Final, Tuple
def get_font_map_ascii_basic() -> Dict[str, bytes]:
@@ -856,19 +855,20 @@ def get_small_font_map_cyrillic() -> Dict[str, bytes]:
return font
@functools.lru_cache(maxsize=None)
def get_font_map() -> Dict[str, bytes]:
return {
**get_font_map_ascii_basic(),
**get_font_map_latin_extended(),
**get_font_map_cyrillic(),
}
NAME_ASCII_BASIC: Final = "ascii_basic"
NAME_LATIN_EXTENDED: Final = "latin_extended"
NAME_CYRILLIC: Final = "cyrillic"
NAME_CJK: Final = "cjk"
@functools.lru_cache(maxsize=None)
def get_small_font_map() -> Dict[str, bytes]:
return {
**get_small_font_map_ascii_basic(),
**get_small_font_map_latin_extended(),
**get_small_font_map_cyrillic(),
}
def get_font_maps_for_name(
font_name: str,
) -> Tuple[Dict[str, bytes], Dict[str, bytes]]:
if font_name == NAME_ASCII_BASIC:
return get_font_map_ascii_basic(), get_small_font_map_ascii_basic()
elif font_name == NAME_LATIN_EXTENDED:
return get_font_map_latin_extended(), get_small_font_map_latin_extended()
elif font_name == NAME_CYRILLIC:
return get_font_map_cyrillic(), get_small_font_map_cyrillic()
else:
raise ValueError("Invalid font name")

View File

@@ -301,8 +301,89 @@ class FontMap:
font06: Dict[str, Optional[bytes]]
@dataclass
class FontMapsPerFont:
font12_maps: Dict[str, Dict[str, bytes]]
font06_maps: Dict[str, Dict[str, Optional[bytes]]]
sym_lists: Dict[str, List[str]]
def get_font_map_per_font(text_list: List[str], fonts: List[str]) -> FontMapsPerFont:
pending_sym_set = set(text_list)
if len(pending_sym_set) != len(text_list):
raise ValueError("`text_list` contains duplicated symbols")
if fonts[0] != font_tables.NAME_ASCII_BASIC:
raise ValueError(
f'First item in `fonts` must be "{font_tables.NAME_ASCII_BASIC}"'
)
total_symbol_count = len(text_list)
# \x00 is for NULL termination and \x01 is for newline, so the maximum
# number of symbols allowed is as follow (see also the comments in
# `get_bytes_from_font_index`):
if total_symbol_count > (0x10 * 0xFF - 15) - 2: # 4063
raise ValueError(
f"Error, too many used symbols for this version (total {total_symbol_count})"
)
logging.info(f"Generating fonts for {total_symbol_count} symbols")
# Collect font bitmaps by the defined font order:
font12_maps: Dict[str, Dict[str, bytes]] = {}
font06_maps: Dict[str, Dict[str, Optional[bytes]]] = {}
sym_lists: Dict[str, List[str]] = {}
for font in fonts:
font12_maps[font] = {}
font12_map = font12_maps[font]
font06_maps[font] = {}
font06_map = font06_maps[font]
sym_lists[font] = []
sym_list = sym_lists[font]
if len(pending_sym_set) == 0:
logging.warning(
f"Font {font} not used because all symbols already have font bitmaps"
)
continue
if font == font_tables.NAME_CJK:
is_cjk = True
else:
is_cjk = False
font12: Dict[str, bytes]
font06: Dict[str, bytes]
font12, font06 = font_tables.get_font_maps_for_name(font)
for sym in text_list:
if sym not in pending_sym_set:
continue
if is_cjk:
font12_line = get_cjk_glyph(sym)
if font12_line is None:
continue
font06_line = None
else:
try:
font12_line = font12[sym]
font06_line = font06[sym]
except KeyError:
continue
font12_map[sym] = font12_line
font06_map[sym] = font06_line
sym_list.append(sym)
pending_sym_set.remove(sym)
if len(sym_list) == 0:
logging.warning(f"Font {font} not used by any symbols on the list")
if len(pending_sym_set) > 0:
raise KeyError(f"Symbols not found in specified fonts: {pending_sym_set}")
return FontMapsPerFont(font12_maps, font06_maps, sym_lists)
def get_font_map_and_table(
text_list: List[str],
text_list: List[str], fonts: List[str]
) -> Tuple[List[str], FontMap, Dict[str, bytes]]:
# the text list is sorted
# allocate out these in their order as number codes
@@ -310,62 +391,38 @@ def get_font_map_and_table(
index = 2 # start at 2, as 0= null terminator,1 = new line
forced_first_symbols = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
# Get the font table, which does not include CJK chars
font_table: Dict[str, bytes] = font_tables.get_font_map()
font_small_table: Dict[str, bytes] = font_tables.get_small_font_map()
# We want to put all CJK chars after non-CJK ones so that the CJK chars
# do not need to be in the small font table to save space.
# We assume all symbols not in the font table to be a CJK char.
# We also enforce that numbers are first.
ordered_normal_sym_list: List[str] = forced_first_symbols + [
x for x in text_list if x not in forced_first_symbols and x in font_table
]
ordered_cjk_sym_list: List[str] = [
x for x in text_list if x not in forced_first_symbols and x not in font_table
# We enforce that numbers come first.
text_list = forced_first_symbols + [
x for x in text_list if x not in forced_first_symbols
]
total_symbol_count = len(ordered_normal_sym_list) + len(ordered_cjk_sym_list)
# \x00 is for NULL termination and \x01 is for newline, so the maximum
# number of symbols allowed is as follow (see also the comments in
# `get_bytes_from_font_index`):
if total_symbol_count > (0x10 * 0xFF - 15) - 2: # 4063
logging.error(
f"Error, too many used symbols for this version (total {total_symbol_count})"
)
sys.exit(1)
font_maps = get_font_map_per_font(text_list, fonts)
font12_maps = font_maps.font12_maps
font06_maps = font_maps.font06_maps
logging.info(f"Generating fonts for {total_symbol_count} symbols")
# Build the full font maps
font12_map = {}
font06_map = {}
for font in fonts:
font12_map.update(font12_maps[font])
font06_map.update(font06_maps[font])
sym_list = ordered_normal_sym_list + ordered_cjk_sym_list
for sym in sym_list:
if sym in symbol_map:
raise ValueError("Symbol not found in symbol map")
# Collect all symbols by the original symbol order, but also making sure
# all symbols with only large font must be placed after all symbols with
# both small and large fonts
sym_list_both_fonts = []
sym_list_large_only = []
for sym in text_list:
if font06_map[sym] is None:
sym_list_large_only.append(sym)
else:
sym_list_both_fonts.append(sym)
sym_list = sym_list_both_fonts + sym_list_large_only
# Assign symbol bytes by font index
for index, sym in enumerate(sym_list, index):
assert sym not in symbol_map
symbol_map[sym] = get_bytes_from_font_index(index)
index += 1
font12_map: Dict[str, bytes] = {}
font06_map: Dict[str, Optional[bytes]] = {}
for sym in ordered_normal_sym_list:
if sym not in font_table:
logging.error(f"Missing Large font element for {sym}")
sys.exit(1)
font12_map[sym] = font_table[sym]
if sym not in font_small_table:
logging.error(f"Missing Small font element for {sym}")
sys.exit(1)
font06_map[sym] = font_small_table[sym]
for sym in ordered_cjk_sym_list:
if sym in font_table:
raise ValueError("Symbol already exists in font_table")
font_line = get_cjk_glyph(sym)
if font_line is None:
logging.error(f"Missing Large font element for {sym}")
sys.exit(1)
font12_map[sym] = font_line
# No data to add to the small font table
font06_map[sym] = None
return sym_list, FontMap(font12_map, font06_map), symbol_map
@@ -438,7 +495,10 @@ def prepare_language(lang: dict, defs: dict, build_version: str) -> LanguageData
# Iterate over all of the text to build up the symbols & counts
text_list = get_letter_counts(defs, lang, build_version)
# From the letter counts, need to make a symbol translator & write out the font
sym_list, font_map, symbol_conversion_table = get_font_map_and_table(text_list)
fonts = lang["fonts"]
sym_list, font_map, symbol_conversion_table = get_font_map_and_table(
text_list, fonts
)
return LanguageData(
lang, defs, build_version, sym_list, font_map, symbol_conversion_table
)

View File

@@ -1,7 +1,10 @@
{
"languageCode": "BG",
"languageLocalName": "Български",
"cyrillicGlyphs": true,
"fonts": [
"ascii_basic",
"cyrillic"
],
"messages": {
"SettingsCalibrationDone": "Калибрацията завършена!",
"SettingsCalibrationWarning": "Уверете се, че върха на поялника е със стайна температура преди да продължите!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "CS",
"languageLocalName": "Český",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibrace dokončena!",
"SettingsCalibrationWarning": "Ujistěte se, že hrot má pokojovou teplotu!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "DA",
"languageLocalName": "Dansk",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibration done!",
"SettingsCalibrationWarning": "Sørg for at loddespidsen er ved stuetemperatur, inden du fortsætter!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "DE",
"languageLocalName": "Deutsch",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"tempUnitFahrenheit": false,
"messages": {
"SettingsCalibrationDone": "Kalibrierung abgeschlossen!",

View File

@@ -1,7 +1,9 @@
{
"languageCode": "EN",
"languageLocalName": "English",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic"
],
"tempUnitFahrenheit": true,
"messages": {
"SettingsCalibrationDone": "Calibration done!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "ES",
"languageLocalName": "Castellano",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "¡Calibrada!",
"SettingsCalibrationWarning": "¡Asegúrate que la punta esté a temperatura ambiente antes de empezar!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "FI",
"languageLocalName": "Suomi",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationWarning": "Varmista että kärki on huoneenlämpöinen ennen jatkamista!",
"SettingsResetWarning": "Haluatko varmasti palauttaa oletusarvot?",
@@ -301,4 +304,4 @@
"desc": "Herätyspulssin kesto (x 250ms)"
}
}
}
}

View File

@@ -1,7 +1,10 @@
{
"languageCode": "FR",
"languageLocalName": "Français",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibration effectuée !",
"SettingsCalibrationWarning": "Assurez-vous que la panne soit à température ambiante avant de continuer !",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "HR",
"languageLocalName": "Hrvatski",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibracija gotova!",
"SettingsCalibrationWarning": "Provjerite da je vršak ohlađen na sobnu temperaturu prije nego što nastavite!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "HU",
"languageLocalName": "Magyar",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibráció befejezve!",
"SettingsCalibrationWarning": "Folytatás előtt győződjön meg róla, hogy a páka szobahőmérsékletű!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "IT",
"languageLocalName": "Italiano",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibrazione effettuata",
"SettingsCalibrationWarning": "Assicurati che la punta si trovi a temperatura ambiente prima di continuare!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "JA_JP",
"languageLocalName": "日本語",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"cjk"
],
"tempUnitFahrenheit": true,
"messages": {
"SettingsCalibrationDone": "校正完了",
@@ -200,4 +203,4 @@
"desc": "電源供給元をオンに保つために使用される、電力パルスの時間長 <x250msミリ秒>"
}
}
}
}

View File

@@ -1,7 +1,10 @@
{
"languageCode": "LT",
"languageLocalName": "Lietuvių",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibravimas atliktas!",
"SettingsCalibrationWarning": "Prieš tęsdami įsitikinkite, kad antgalis yra kambario temperatūros!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "NL",
"languageLocalName": "Nederlands",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibratie klaar!",
"SettingsCalibrationWarning": "Zorg ervoor dat te punt op kamertemperatuur is voor je verder gaat!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "NL_BE",
"languageLocalName": "Vlaams",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Gecalibreerd!",
"SettingsCalibrationWarning": "Zorg vooraf dat de punt op kamertemperatuur is!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "NO",
"languageLocalName": "Norsk",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibration done!",
"SettingsCalibrationWarning": "Sørg for at loddespissen har romtemperatur før du fortsetter!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "PL",
"languageLocalName": "Polski",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"tempUnitFahrenheit": false,
"messages": {
"SettingsCalibrationDone": "Kalibracja udana!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "PT",
"languageLocalName": "Português",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibração terminada!",
"SettingsCalibrationWarning": "A ponta deve estar à temperatura ambiente antes de continuar!",

View File

@@ -1,7 +1,11 @@
{
"languageCode": "RU",
"languageLocalName": "Русский",
"cyrillicGlyphs": true,
"fonts": [
"ascii_basic",
"latin_extended",
"cyrillic"
],
"messages": {
"SettingsCalibrationDone": "Калибровка завершена!",
"SettingsCalibrationWarning": "Прежде чем продолжить, пожалуйста, убедитесь, что жало имеет комнатную температуру!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "SK",
"languageLocalName": "Slovenčina",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibrácia hotová!",
"SettingsCalibrationWarning": "Najprv sa prosím uistite, že hrot má izbovú teplotu!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "SL",
"languageLocalName": "Slovenščina",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibracija opravljena!",
"SettingsCalibrationWarning": "Pred nadaljevanjem mora biti konica segreta na sobno temperaturo!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "SR_CYRL",
"languageLocalName": "Српски",
"cyrillicGlyphs": true,
"fonts": [
"ascii_basic",
"cyrillic"
],
"messages": {
"SettingsCalibrationDone": "Калибрација готова",
"SettingsCalibrationWarning": "Проверите да ли је врх охлађен на собну температуру пре него што наставите",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "SR_LATN",
"languageLocalName": "Srpski",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibracija gotova",
"SettingsCalibrationWarning": "Proverite da li je vrh ohlađen na sobnu temperaturu pre nego što nastavite",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "SV",
"languageLocalName": "Svenska",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Calibration done!",
"SettingsCalibrationWarning": "Please ensure the tip is at room temperature before continuing!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "TR",
"languageLocalName": "Türkçe",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"latin_extended"
],
"messages": {
"SettingsCalibrationDone": "Kalibrasyon tamamlandı!",
"SettingsCalibrationWarning": "Lütfen devam etmeden önce ucun oda sıcaklığında olduğunu garantiye alın!",

View File

@@ -1,7 +1,11 @@
{
"languageCode": "UK",
"languageLocalName": "Українська",
"cyrillicGlyphs": true,
"fonts": [
"ascii_basic",
"latin_extended",
"cyrillic"
],
"messages": {
"SettingsCalibrationDone": "Калібрування виконане!",
"SettingsCalibrationWarning": "Переконайтеся, що жало охололо до кімнатної температури, перш ніж продовжувати!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "YUE_HK",
"languageLocalName": "廣東話 (香港)",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"cjk"
],
"tempUnitFahrenheit": true,
"messages": {
"SettingsCalibrationDone": "校正完成!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "ZH_CN",
"languageLocalName": "简体中文",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"cjk"
],
"tempUnitFahrenheit": true,
"messages": {
"SettingsCalibrationDone": "校正完成!",

View File

@@ -1,7 +1,10 @@
{
"languageCode": "ZH_TW",
"languageLocalName": "正體中文",
"cyrillicGlyphs": false,
"fonts": [
"ascii_basic",
"cjk"
],
"tempUnitFahrenheit": true,
"messages": {
"SettingsCalibrationDone": "校正完成!",