diff --git a/Translations/font_tables.py b/Translations/font_tables.py index 4d2068d0..e2f8cff9 100755 --- a/Translations/font_tables.py +++ b/Translations/font_tables.py @@ -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") diff --git a/Translations/make_translation.py b/Translations/make_translation.py index c7e43782..4e25ee71 100755 --- a/Translations/make_translation.py +++ b/Translations/make_translation.py @@ -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 ) diff --git a/Translations/translation_BG.json b/Translations/translation_BG.json index 6b5e3a35..5c285352 100644 --- a/Translations/translation_BG.json +++ b/Translations/translation_BG.json @@ -1,7 +1,10 @@ { "languageCode": "BG", "languageLocalName": "Български", - "cyrillicGlyphs": true, + "fonts": [ + "ascii_basic", + "cyrillic" + ], "messages": { "SettingsCalibrationDone": "Калибрацията завършена!", "SettingsCalibrationWarning": "Уверете се, че върха на поялника е със стайна температура преди да продължите!", diff --git a/Translations/translation_CS.json b/Translations/translation_CS.json index 8aed567d..645994f8 100644 --- a/Translations/translation_CS.json +++ b/Translations/translation_CS.json @@ -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!", diff --git a/Translations/translation_DA.json b/Translations/translation_DA.json index ea13608b..1541e74b 100644 --- a/Translations/translation_DA.json +++ b/Translations/translation_DA.json @@ -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!", diff --git a/Translations/translation_DE.json b/Translations/translation_DE.json index 691b13a1..efd46499 100644 --- a/Translations/translation_DE.json +++ b/Translations/translation_DE.json @@ -1,7 +1,10 @@ { "languageCode": "DE", "languageLocalName": "Deutsch", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "latin_extended" + ], "tempUnitFahrenheit": false, "messages": { "SettingsCalibrationDone": "Kalibrierung abgeschlossen!", diff --git a/Translations/translation_EN.json b/Translations/translation_EN.json index 51d79ea0..351577f2 100644 --- a/Translations/translation_EN.json +++ b/Translations/translation_EN.json @@ -1,7 +1,9 @@ { "languageCode": "EN", "languageLocalName": "English", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic" + ], "tempUnitFahrenheit": true, "messages": { "SettingsCalibrationDone": "Calibration done!", diff --git a/Translations/translation_ES.json b/Translations/translation_ES.json index f4ff297e..117ed864 100644 --- a/Translations/translation_ES.json +++ b/Translations/translation_ES.json @@ -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!", diff --git a/Translations/translation_FI.json b/Translations/translation_FI.json index 8346f7ee..f4ebef8f 100644 --- a/Translations/translation_FI.json +++ b/Translations/translation_FI.json @@ -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)" } } -} \ No newline at end of file +} diff --git a/Translations/translation_FR.json b/Translations/translation_FR.json index 3d171913..ebde1196 100644 --- a/Translations/translation_FR.json +++ b/Translations/translation_FR.json @@ -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 !", diff --git a/Translations/translation_HR.json b/Translations/translation_HR.json index 28816082..a488a994 100644 --- a/Translations/translation_HR.json +++ b/Translations/translation_HR.json @@ -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!", diff --git a/Translations/translation_HU.json b/Translations/translation_HU.json index 26f2e21d..13d2e0ed 100644 --- a/Translations/translation_HU.json +++ b/Translations/translation_HU.json @@ -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ű!", diff --git a/Translations/translation_IT.json b/Translations/translation_IT.json index af7db547..dfcebc61 100644 --- a/Translations/translation_IT.json +++ b/Translations/translation_IT.json @@ -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!", diff --git a/Translations/translation_JA_JP.json b/Translations/translation_JA_JP.json index f5e95fa8..7404d2da 100644 --- a/Translations/translation_JA_JP.json +++ b/Translations/translation_JA_JP.json @@ -1,7 +1,10 @@ { "languageCode": "JA_JP", "languageLocalName": "日本語", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "cjk" + ], "tempUnitFahrenheit": true, "messages": { "SettingsCalibrationDone": "校正完了", @@ -200,4 +203,4 @@ "desc": "電源供給元をオンに保つために使用される、電力パルスの時間長 " } } -} \ No newline at end of file +} diff --git a/Translations/translation_LT.json b/Translations/translation_LT.json index ae84c9d3..aba3520d 100644 --- a/Translations/translation_LT.json +++ b/Translations/translation_LT.json @@ -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!", diff --git a/Translations/translation_NL.json b/Translations/translation_NL.json index 72f34da5..5d4d5f6a 100644 --- a/Translations/translation_NL.json +++ b/Translations/translation_NL.json @@ -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!", diff --git a/Translations/translation_NL_BE.json b/Translations/translation_NL_BE.json index e4c0c10c..00ae61bf 100644 --- a/Translations/translation_NL_BE.json +++ b/Translations/translation_NL_BE.json @@ -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!", diff --git a/Translations/translation_NO.json b/Translations/translation_NO.json index 6f5ef113..90401145 100644 --- a/Translations/translation_NO.json +++ b/Translations/translation_NO.json @@ -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!", diff --git a/Translations/translation_PL.json b/Translations/translation_PL.json index 7a0ccb1f..4159e226 100644 --- a/Translations/translation_PL.json +++ b/Translations/translation_PL.json @@ -1,7 +1,10 @@ { "languageCode": "PL", "languageLocalName": "Polski", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "latin_extended" + ], "tempUnitFahrenheit": false, "messages": { "SettingsCalibrationDone": "Kalibracja udana!", diff --git a/Translations/translation_PT.json b/Translations/translation_PT.json index 7d7c541b..06b51d37 100644 --- a/Translations/translation_PT.json +++ b/Translations/translation_PT.json @@ -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!", diff --git a/Translations/translation_RU.json b/Translations/translation_RU.json index b6746b86..b3de0c81 100644 --- a/Translations/translation_RU.json +++ b/Translations/translation_RU.json @@ -1,7 +1,11 @@ { "languageCode": "RU", "languageLocalName": "Русский", - "cyrillicGlyphs": true, + "fonts": [ + "ascii_basic", + "latin_extended", + "cyrillic" + ], "messages": { "SettingsCalibrationDone": "Калибровка завершена!", "SettingsCalibrationWarning": "Прежде чем продолжить, пожалуйста, убедитесь, что жало имеет комнатную температуру!", diff --git a/Translations/translation_SK.json b/Translations/translation_SK.json index 6423287a..56e9e19d 100644 --- a/Translations/translation_SK.json +++ b/Translations/translation_SK.json @@ -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!", diff --git a/Translations/translation_SL.json b/Translations/translation_SL.json index 52e4bf44..622fb026 100644 --- a/Translations/translation_SL.json +++ b/Translations/translation_SL.json @@ -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!", diff --git a/Translations/translation_SR_CYRL.json b/Translations/translation_SR_CYRL.json index 69620f63..4c0eb951 100644 --- a/Translations/translation_SR_CYRL.json +++ b/Translations/translation_SR_CYRL.json @@ -1,7 +1,10 @@ { "languageCode": "SR_CYRL", "languageLocalName": "Српски", - "cyrillicGlyphs": true, + "fonts": [ + "ascii_basic", + "cyrillic" + ], "messages": { "SettingsCalibrationDone": "Калибрација готова", "SettingsCalibrationWarning": "Проверите да ли је врх охлађен на собну температуру пре него што наставите", diff --git a/Translations/translation_SR_LATN.json b/Translations/translation_SR_LATN.json index 573e99fa..d5192fe7 100644 --- a/Translations/translation_SR_LATN.json +++ b/Translations/translation_SR_LATN.json @@ -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", diff --git a/Translations/translation_SV.json b/Translations/translation_SV.json index da04a036..b30449c2 100644 --- a/Translations/translation_SV.json +++ b/Translations/translation_SV.json @@ -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!", diff --git a/Translations/translation_TR.json b/Translations/translation_TR.json index 7092bc70..50c3a01f 100644 --- a/Translations/translation_TR.json +++ b/Translations/translation_TR.json @@ -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!", diff --git a/Translations/translation_UK.json b/Translations/translation_UK.json index 94959c8a..fbd44a3a 100644 --- a/Translations/translation_UK.json +++ b/Translations/translation_UK.json @@ -1,7 +1,11 @@ { "languageCode": "UK", "languageLocalName": "Українська", - "cyrillicGlyphs": true, + "fonts": [ + "ascii_basic", + "latin_extended", + "cyrillic" + ], "messages": { "SettingsCalibrationDone": "Калібрування виконане!", "SettingsCalibrationWarning": "Переконайтеся, що жало охололо до кімнатної температури, перш ніж продовжувати!", diff --git a/Translations/translation_YUE_HK.json b/Translations/translation_YUE_HK.json index 23ab1a0e..2a257742 100644 --- a/Translations/translation_YUE_HK.json +++ b/Translations/translation_YUE_HK.json @@ -1,7 +1,10 @@ { "languageCode": "YUE_HK", "languageLocalName": "廣東話 (香港)", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "cjk" + ], "tempUnitFahrenheit": true, "messages": { "SettingsCalibrationDone": "校正完成!", diff --git a/Translations/translation_ZH_CN.json b/Translations/translation_ZH_CN.json index 898e1263..fd191a6a 100644 --- a/Translations/translation_ZH_CN.json +++ b/Translations/translation_ZH_CN.json @@ -1,7 +1,10 @@ { "languageCode": "ZH_CN", "languageLocalName": "简体中文", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "cjk" + ], "tempUnitFahrenheit": true, "messages": { "SettingsCalibrationDone": "校正完成!", diff --git a/Translations/translation_ZH_TW.json b/Translations/translation_ZH_TW.json index 2dc083a6..2133d8f3 100644 --- a/Translations/translation_ZH_TW.json +++ b/Translations/translation_ZH_TW.json @@ -1,7 +1,10 @@ { "languageCode": "ZH_TW", "languageLocalName": "正體中文", - "cyrillicGlyphs": false, + "fonts": [ + "ascii_basic", + "cjk" + ], "tempUnitFahrenheit": true, "messages": { "SettingsCalibrationDone": "校正完成!",