From d6f2fb0973e5b669245616eaacb5aebeedc0e9a9 Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Tue, 19 May 2026 20:37:36 +0800
Subject: [PATCH 1/6] Optimize width of characters for Chinese
---
updater/update_char_images.py | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/updater/update_char_images.py b/updater/update_char_images.py
index 76b7745e..388415e3 100644
--- a/updater/update_char_images.py
+++ b/updater/update_char_images.py
@@ -9,7 +9,7 @@
import update_hash
font_size_lang = {'ja':12, 'ru':12, 'zh':12} # max 12
-canvas_size_lang = {'ja':(12,12), 'ru':(12,12), 'zh':(12,12)} # canvas size in order of width, height.
+canvas_size_lang = {'ja':(12,12), 'ru':(12,12), 'zh':(11,12)} # canvas size in order of width, height.
text_pad_lang = {'ja':(0,0), 'ru':(0,-1), 'zh':(0,0)} # pixels to shift the text, in order of left padding and top padding
bg_text_pad_lang = {'ja':(1,1), 'ru':(1,1), 'zh':(1,1)} # pixels to shift the 'shadow text', in order of left padding and top padding
# add more languages as needed
@@ -70,22 +70,26 @@ def setGoodParam(char, lang): # setting width for a specific character. add more
return setJaFontSize(char)
elif lang == 'ru':
return setRuFontSize(char)
- else:
- return CANV_WIDTH, CANV_HEIGHT, TEXTPAD
-
-def setGoodCharWidth(char, lang): # setting width for a specific character. add more languages as needed
- if lang == 'zh-CN':
+ elif lang == 'zh':
return setZhFontSize(char)
else:
- return CANV_WIDTH
+ return CANV_WIDTH, CANV_HEIGHT, TEXTPAD
def setZhFontSize(char):
width = CANV_WIDTH
- if char in ('1', '2', '3', '4', '5', '6', '7', '8', '7', '0', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '&', '#'): # these characters wider than normal, so set their width to be wider
- width = math.ceil(CANV_WIDTH*0.5)
- elif char in (',', '。', '、', '(', '(', ')', ')', '+', '-', '.', '$', '/', '*', ':'):
- width = math.ceil(CANV_WIDTH*0.33)
- return width
+ height = CANV_HEIGHT
+ new_text_pad = TEXTPAD
+ if char in ('O'):
+ width = math.ceil(CANV_WIDTH*0.82)
+ elif char in ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'): # these characters wider than normal, so set their width to be wider
+ width = math.ceil(CANV_WIDTH*0.72)
+ elif char in ('I', '》', '?', '%', '&', 'p'):
+ width = math.ceil(CANV_WIDTH*0.62)
+ elif char in ('$', '/', '…', '[', ']', '{', '}', '^', '<', '>', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '#', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '%', '&'):
+ width = math.ceil(CANV_WIDTH*0.52)
+ elif char in (',', '。', '、', '(', '(', ')', ')', '+', '-', '.', '*', ':', '!', '`', '|', ';', 'l'):
+ width = math.ceil(CANV_WIDTH*0.42)
+ return width, height, new_text_pad
def setRuFontSize(char):
width, _, _ = setJaFontSize(char)
From e21f26d9ad116ab931736604ff20dd22e298507d Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Tue, 19 May 2026 21:05:15 +0800
Subject: [PATCH 2/6] Fix incorrect information to optimize width of each
characters in updater/Readme.md
---
updater/README.md | 232 +++++++++++++++++++++++-----------------------
1 file changed, 118 insertions(+), 114 deletions(-)
diff --git a/updater/README.md b/updater/README.md
index 6b42bc34..6fd014ee 100644
--- a/updater/README.md
+++ b/updater/README.md
@@ -1,114 +1,118 @@
-# RuneLingual Transcript Updater
-
-Welcome to the updater directory of the RuneLingual Transcript Sources. This directory contains scripts and utilities to update and maintain the transcripts used by the RuneLingual plugin.
-
-## Overview of Updater Programs
-
-The `Updater` directory contains five distinct programs, each designed to perform specific tasks for maintaining and updating transcripts. Below is a detailed description of each program's functionality:
-
-1. [`main_generate_English_transcript.py`](update_english_transcript/main_generate_English_transcript.py): This program is responsible for updating the English transcript from the source. Read the [explanation](update_english_transcript/readme.md) for more detail.
-
-2. [`update_nonEn_transcripts.py`](./update_nonEn_transcripts.py): This program reads data from the [English transcript database](transcript.db), and updates all other language's translation file (either excel or xliff) transcript to include records that are not included in those files. If a translation file doesn't exist, it will create a copy of the English transcript, and add a column for translation. The output files will be found in [draft folder](../draft/). These files should be downloaded and translated.
-
-3. [`update_char_images.py`](./update_char_images.py): This program creates character images for insertion like emojis in the RuneLite client. This is used for languages whose alphabets is not supported by OSRS client such as Japanese, and not necessary for many European langauges.
-
-4. [`generate_tsv.py`](./generate_tsv.py): This program processes the translated transcripts (generated by [update_nonEn_transcripts.py](./update_nonEn_transcripts.py) then translated by a translator), and convert them into TSV (Tab-Separated Values) format. These TSV files will also be found in [draft folder](../draft/), and should be reviewed and then moved to the [public](../public/) directory for use by the plugin.
-
-
-For a deeper understanding of why these scripts are essential, please refer to the [README](./RuneLingual/transcript/README.md) in the top directory.
-
-## Create a Transcript for New Language
-
-You can ask someone in the [Discord](#lets-chat) below to do it for you, but if you want to do it yourself:
-1. Add the language's code to necessary files, such as [LANG and LANG_CODE_STANDARD in common_func.py](./common_func.py)
-2. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
-3. Run programs 1 and 2 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section.
-4. For non-Latin languages, run program 3 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section. But it is likely that program 3 only supports few languages. Contact a developer from the [Discord](#lets-chat) link below for help.
-
-For languages such as Japanese, Russian, Program 3 [update_char_images.py](./update_char_images.py) must be configured and ran. If you're unsure, ask one of our developers and we'll be able to test it for you.
-
-Program 3 [update_char_images.py](./update_char_images.py) is unnecessary if the language uses the English alphabet, including characters with accents (like those in Spanish, Portuguese, Norwegian).
-
-## How to Update Foriegn Transcripts After an OSRS Update
-1. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
-2. Run program [1](update_english_transcript/main_generate_English_transcript.py) and [2](./update_nonEn_transcripts.py).
-
-If the English transcript is already up to date, program 1 does not need to be ran.
-
-## What to Do after Obtaining a Transcript
-After cloning this repository and executing some codes, there should be a transcript inside the [draft folder](../draft/).
-
-The transcript file will be in either Excel or ".xliff" format.
-
-For Excel, You can simply start adding translations in the translation column.
-
-The .xliff file is supported by many CAT softwares, including the free OmegaT.
-
-After you've made progress with translation and want to update the plugin, you can either send the file to one of the developers in our [Discord server](https://discord.gg/ehwKcVdBGS), or make sure the language's folder in [draft folder](../draft/) and make a pull request to the GitHub repository.
-
-## Developers: after receiving translated transcript
-1. Clone the whole repository to your local machine
-2. Run ['generate_tsv.py'](./generate_tsv.py). It will turn the Excel or .xliff transcript to TSV, and also automatically update the hash file value.
-3. Check inside the target language in [draft folder](../draft/) that there is a TSV version of the newly obtained translation.
-4. Copy the TSV version to the language's folder in [public folder](../public/). If it already exists, replace it.
-5. Check that no files have been deleted in other languages' folder.
-6. After you are sure correct files are in each folder of [public folder](../public/), make a pull request, and have someone accept it.
-
-## Adding/Updating Character images
-1. Prepare a file that contains all texts to be displayed in-game, save it as `all_char_??.txt`, where `??` is [the language code](https://developers.deepl.com/docs/resources/supported-languages#target-languages) for your language.
-2. Download a font (.ttf format) that is Copy right free, free to use for commercial use, as free from restrictions as possible.
-3. Add the file from Step 1 to [char_lists folder](char_lists/), and the font file from Step 2 (.ttf) to the [fonts folder](fonts/), which are both found in the updater folder.
-4. If the new language's code isn't added to [common_func](common_func.py)'s `LANG` and `LANG_CODE_STANDARD`, add the [same code](https://developers.deepl.com/docs/resources/supported-languages#target-languages) as in Step 1.
-5. In [updatecharimages.py](./update_char_images.py),
- - Add default variables for your language to the end of
- ``` python
- font_size_lang = {'ja':12, 'ru':9} # max 12
- canvas_size_lang = {'ja':(12,12), 'ru':(11,11)} # canvas size in order of width, height.
- text_pad_lang = {'ja':(0,0), 'ru':(0,0)} # pixels to shift the text, in order of left padding and top padding
- bg_text_pad_lang = {'ja':(1,1), 'ru':(1,1)} # pixels to shift the 'shadow text', in order of left padding and top padding
- # add more languages as needed
- ```
- You can change the size to be more recognizable later, just set the values to something similart to ones that exist already for now.
-6. Create the fonts, by running the `update_char_images.py` while in `Runelingual-Transcripts` directory.
-
It will prompt you so enter numbers for your desired language and font style.
-
The process will take a while, but after it creates hashes,
-
-7. Check the output folder. The output will be found under [the draft folder](../draft/)/(language_code)/char foler.
-
You are likely to find that some letters don't fit in the canvas, and some have too much room.
- - Change the vairables you have set in Step 5. Probably the font_size_lang and canvas_size_lang would change, and the latter 2 not.
- - Optimize width of each characters by adding a function to `setGoodFontSize()` like
- ```python
- def setGoodCharWidth(char, lang): # setting width for a specific character. add more languages as needed
- if lang == 'ja':
- return setJaFontSize(char)
- elif lang == 'ru':
- return setRuFontSize(char)
- else:
- return CANV_WIDTH
-
- def setJaFontSize(char):
- width = CANV_WIDTH
- if char in ('M', 'W'): # these characters wider than normal, so set their width to be wider
- width = math.ceil(CANV_WIDTH*1.02)
- elif char in ('%', '@', 'm', '#'):
- width = CANV_WIDTH
- ...
- return width
- ```
- Here you can set width for each individual characters.
-
This is necessary because some characters such as `W` and `M` can be wide, while `i`, `l`, `.` are much narrower.
-8. Repeat Step 6 and 7 to get a natural looking set of characters.
-9. Delete the unzipped `char_??` file, as the plugin only downloads the `char_??.zip` to aquire the character images.
-10. Add, commit, push, and make a PR for one of the devs to accept.
-11. Once the language is added to the plugin, you'll be able to see the result in-game.
-## Contributing
-
-We welcome contributions to improve our updater scripts. If you'd like to contribute, please refer to the main [README.md](../README.md) file for more information.
-
-## Let's Chat!
-
-Need a hand or have a question? Join us on our [Discord server](https://discord.gg/ehwKcVdBGS). We're here to help and love hearing from you!
-
-## License
-
-This project is licensed under the [MIT License](../LICENSE).
+# RuneLingual Transcript Updater
+
+Welcome to the updater directory of the RuneLingual Transcript Sources. This directory contains scripts and utilities to update and maintain the transcripts used by the RuneLingual plugin.
+
+## Overview of Updater Programs
+
+The `Updater` directory contains five distinct programs, each designed to perform specific tasks for maintaining and updating transcripts. Below is a detailed description of each program's functionality:
+
+1. [`main_generate_English_transcript.py`](update_english_transcript/main_generate_English_transcript.py): This program is responsible for updating the English transcript from the source. Read the [explanation](update_english_transcript/readme.md) for more detail.
+
+2. [`update_nonEn_transcripts.py`](./update_nonEn_transcripts.py): This program reads data from the [English transcript database](transcript.db), and updates all other language's translation file (either excel or xliff) transcript to include records that are not included in those files. If a translation file doesn't exist, it will create a copy of the English transcript, and add a column for translation. The output files will be found in [draft folder](../draft/). These files should be downloaded and translated.
+
+3. [`update_char_images.py`](./update_char_images.py): This program creates character images for insertion like emojis in the RuneLite client. This is used for languages whose alphabets is not supported by OSRS client such as Japanese, and not necessary for many European langauges.
+
+4. [`generate_tsv.py`](./generate_tsv.py): This program processes the translated transcripts (generated by [update_nonEn_transcripts.py](./update_nonEn_transcripts.py) then translated by a translator), and convert them into TSV (Tab-Separated Values) format. These TSV files will also be found in [draft folder](../draft/), and should be reviewed and then moved to the [public](../public/) directory for use by the plugin.
+
+
+For a deeper understanding of why these scripts are essential, please refer to the [README](./RuneLingual/transcript/README.md) in the top directory.
+
+## Create a Transcript for New Language
+
+You can ask someone in the [Discord](#lets-chat) below to do it for you, but if you want to do it yourself:
+1. Add the language's code to necessary files, such as [LANG and LANG_CODE_STANDARD in common_func.py](./common_func.py)
+2. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
+3. Run programs 1 and 2 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section.
+4. For non-Latin languages, run program 3 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section. But it is likely that program 3 only supports few languages. Contact a developer from the [Discord](#lets-chat) link below for help.
+
+For languages such as Japanese, Russian, Program 3 [update_char_images.py](./update_char_images.py) must be configured and ran. If you're unsure, ask one of our developers and we'll be able to test it for you.
+
+Program 3 [update_char_images.py](./update_char_images.py) is unnecessary if the language uses the English alphabet, including characters with accents (like those in Spanish, Portuguese, Norwegian).
+
+## How to Update Foriegn Transcripts After an OSRS Update
+1. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
+2. Run program [1](update_english_transcript/main_generate_English_transcript.py) and [2](./update_nonEn_transcripts.py).
+
+If the English transcript is already up to date, program 1 does not need to be ran.
+
+## What to Do after Obtaining a Transcript
+After cloning this repository and executing some codes, there should be a transcript inside the [draft folder](../draft/).
+
+The transcript file will be in either Excel or ".xliff" format.
+
+For Excel, You can simply start adding translations in the translation column.
+
+The .xliff file is supported by many CAT softwares, including the free OmegaT.
+
+After you've made progress with translation and want to update the plugin, you can either send the file to one of the developers in our [Discord server](https://discord.gg/ehwKcVdBGS), or make sure the language's folder in [draft folder](../draft/) and make a pull request to the GitHub repository.
+
+## Developers: after receiving translated transcript
+1. Clone the whole repository to your local machine
+2. Run ['generate_tsv.py'](./generate_tsv.py). It will turn the Excel or .xliff transcript to TSV, and also automatically update the hash file value.
+3. Check inside the target language in [draft folder](../draft/) that there is a TSV version of the newly obtained translation.
+4. Copy the TSV version to the language's folder in [public folder](../public/). If it already exists, replace it.
+5. Check that no files have been deleted in other languages' folder.
+6. After you are sure correct files are in each folder of [public folder](../public/), make a pull request, and have someone accept it.
+
+## Adding/Updating Character images
+1. Prepare a file that contains all texts to be displayed in-game, save it as `all_char_??.txt`, where `??` is [the language code](https://developers.deepl.com/docs/resources/supported-languages#target-languages) for your language.
+2. Download a font (.ttf format) that is Copy right free, free to use for commercial use, as free from restrictions as possible.
+3. Add the file from Step 1 to [char_lists folder](char_lists/), and the font file from Step 2 (.ttf) to the [fonts folder](fonts/), which are both found in the updater folder.
+4. If the new language's code isn't added to [common_func](common_func.py)'s `LANG` and `LANG_CODE_STANDARD`, add the [same code](https://developers.deepl.com/docs/resources/supported-languages#target-languages) as in Step 1.
+5. In [updatecharimages.py](./update_char_images.py),
+ - Add default variables for your language to the end of
+ ``` python
+ font_size_lang = {'ja':12, 'ru':9} # max 12
+ canvas_size_lang = {'ja':(12,12), 'ru':(11,11)} # canvas size in order of width, height.
+ text_pad_lang = {'ja':(0,0), 'ru':(0,0)} # pixels to shift the text, in order of left padding and top padding
+ bg_text_pad_lang = {'ja':(1,1), 'ru':(1,1)} # pixels to shift the 'shadow text', in order of left padding and top padding
+ # add more languages as needed
+ ```
+ You can change the size to be more recognizable later, just set the values to something similart to ones that exist already for now.
+6. Create the fonts, by running the `update_char_images.py` while in `Runelingual-Transcripts` directory.
+
It will prompt you so enter numbers for your desired language and font style.
+
The process will take a while, but after it creates hashes,
+
+7. Check the output folder. The output will be found under [the draft folder](../draft/)/(language_code)/char foler.
+
You are likely to find that some letters don't fit in the canvas, and some have too much room.
+ - Change the vairables you have set in Step 5. Probably the font_size_lang and canvas_size_lang would change, and the latter 2 not.
+ - Optimize width of each characters by adding a new language branch to `setGoodParam()` like:
+ ```python
+ def setGoodParam(char, lang): # setting width for a specific character. add more languages as needed
+ if lang == 'ja':
+ return setJaFontSize(char)
+ elif lang == 'ru':
+ return setRuFontSize(char)
+ elif lang == '(TargetLang)':
+ return set(TargetLang)FontSize(char)
+ else:
+ return CANV_WIDTH, CANV_HEIGHT, TEXTPAD
+
+ def set(TargetLang)FontSize(char):
+ width = CANV_WIDTH
+ height = CANV_HEIGHT
+ new_text_pad = TEXTPAD
+ if char in ('O'):
+ width = math.ceil(CANV_WIDTH*0.82)
+ elif char in ('?', '?', '?', '?', '(', '?', ')', '+', '-', '.', '*', ':', '!', '`', '|', ';', 'l'):
+ width = math.ceil(CANV_WIDTH*0.42)
+ return width, height, new_text_pad
+ ```
+ Here you can set width for each individual characters. The function must return three values: `(width, height, text_padding)`.
This is necessary because some characters such as `W` and `M` can be wide, while `i`, `l`, `.` are much narrower.
+8. Repeat Step 6 and 7 to get a natural looking set of characters.
+9. Delete the unzipped `char_??` file, as the plugin only downloads the `char_??.zip` to aquire the character images.
+10. Add, commit, push, and make a PR for one of the devs to accept.
+11. Once the language is added to the plugin, you'll be able to see the result in-game.
+## Contributing
+
+We welcome contributions to improve our updater scripts. If you'd like to contribute, please refer to the main [README.md](../README.md) file for more information.
+
+## Let's Chat!
+
+Need a hand or have a question? Join us on our [Discord server](https://discord.gg/ehwKcVdBGS). We're here to help and love hearing from you!
+
+## License
+
+This project is licensed under the [MIT License](../LICENSE).
+
+
From 1bc6cdc764c5ffff06037010aed4e0665f797c81 Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Tue, 19 May 2026 23:36:57 +0800
Subject: [PATCH 3/6] Update all_char_zh.txt
---
updater/char_lists/all_char_zh.txt | 201 +++++++++++++++--------------
1 file changed, 101 insertions(+), 100 deletions(-)
diff --git a/updater/char_lists/all_char_zh.txt b/updater/char_lists/all_char_zh.txt
index 00a12f66..83134443 100644
--- a/updater/char_lists/all_char_zh.txt
+++ b/updater/char_lists/all_char_zh.txt
@@ -1,6 +1,6 @@
。、ー-―
;:(){}「」~^!”#$%&’=<>?_・*
-;:(){}[]\-^$%&'"@「」*+<>?_!#`~=.,/|~^`…
+;:(){}[]\-^$%&'"@+<>?_!#`~=.,/|…
1234567890
@@ -34,7 +34,7 @@
幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸
击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭
剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰
-奸缄茧检柬碱碱拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲
+奸缄茧检柬碱拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲
匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节
桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢
茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎
@@ -68,7 +68,7 @@
牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝
势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯
暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔
-烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉
+烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟塑溯宿诉
肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰
酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄
桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴
@@ -98,102 +98,103 @@
昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装
妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕
踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座
-繁体
-啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱襖傲奧懊澳芭捌扒叭
-吧笆八疤巴拔跋靶把耙壩霸罷爸白柏百擺佰敗拜稗斑班搬扳般頒板版扮拌伴瓣半辦絆邦幫梆
-榜膀綁棒磅蚌鎊傍謗苞胞包褒剝薄雹保堡飽寶抱報暴豹鮑爆杯碑悲卑北輩背貝鋇倍狽備憊焙
-被奔苯本笨崩繃甭泵蹦迸逼鼻比鄙筆彼碧蓖蔽畢斃毖幣庇痹閉敝弊必辟壁臂避陛鞭邊編貶扁
-便變卞辨辯辮遍標彪膘表鱉憋別癟彬斌瀕濱賓擯兵冰柄丙秉餅炳病並玻菠播撥缽波博勃搏鉑
-箔伯帛舶脖膊渤泊駁捕蔔哺補埠不布步簿部怖擦猜裁材才財睬踩采彩菜蔡餐參蠶殘慚慘燦蒼
-艙倉滄藏操糙槽曹草廁策側冊測層蹭插叉茬茶查碴搽察岔差詫拆柴豺攙摻蟬饞讒纏鏟產闡顫
-昌猖場嘗常長償腸廠敞暢唱倡超抄鈔朝嘲潮巢吵炒車扯撤掣徹澈郴臣辰塵晨忱沉陳趁襯撐稱
-城橙成呈乘程懲澄誠承逞騁秤吃癡持匙池遲弛馳恥齒侈尺赤翅斥熾充沖蟲崇寵抽酬疇躊稠愁
-籌仇綢瞅醜臭初出櫥廚躇鋤雛滁除楚礎儲矗搐觸處揣川穿椽傳船喘串瘡窗幢床闖創吹炊捶錘
-垂春椿醇唇淳純蠢戳綽疵茨磁雌辭慈瓷詞此刺賜次聰蔥囪匆從叢湊粗醋簇促躥篡竄摧崔催脆
-瘁粹淬翠村存寸磋撮搓措挫錯搭達答瘩打大呆歹傣戴帶殆代貸袋待逮怠耽擔丹單鄲撣膽旦氮
-但憚淡誕彈蛋當擋黨蕩檔刀搗蹈倒島禱導到稻悼道盜德得的蹬燈登等瞪凳鄧堤低滴迪敵笛狄
-滌翟嫡抵底地蒂第帝弟遞締顛掂滇碘點典靛墊電佃甸店惦奠澱殿碉叼雕凋刁掉吊釣調跌爹碟
-蝶迭諜疊丁盯叮釘頂鼎錠定訂丟東冬董懂動棟侗恫凍洞兜抖鬥陡豆逗痘都督毒犢獨讀堵睹賭
-杜鍍肚度渡妒端短鍛段斷緞堆兌隊對墩噸蹲敦頓囤鈍盾遁掇哆多奪垛躲朵跺舵剁惰墮蛾峨鵝
-俄額訛娥惡厄扼遏鄂餓恩而兒耳爾餌洱二貳發罰筏伐乏閥法琺藩帆番翻樊礬釩繁凡煩反返範
-販犯飯泛坊芳方肪房防妨仿訪紡放菲非啡飛肥匪誹吠肺廢沸費芬酚吩氛分紛墳焚汾粉奮份忿
-憤糞豐封楓蜂峰鋒風瘋烽逢馮縫諷奉鳳佛否夫敷膚孵扶拂輻幅氟符伏俘服浮涪福袱弗甫撫輔
-俯釜斧脯腑府腐赴副覆賦複傅付阜父腹負富訃附婦縛咐噶嘎該改概鈣蓋溉幹甘杆柑竿肝趕感
-稈敢贛岡剛鋼缸肛綱崗港杠篙皋高膏羔糕搞鎬稿告哥歌擱戈鴿胳疙割革葛格蛤閣隔鉻個各給
-根跟耕更庚羹埂耿梗工攻功恭龔供躬公宮弓鞏汞拱貢共鉤勾溝苟狗垢構購夠辜菇咕箍估沽孤
-姑鼓古蠱骨谷股故顧固雇刮瓜剮寡掛褂乖拐怪棺關官冠觀管館罐慣灌貫光廣逛瑰規圭矽歸龜
-閨軌鬼詭癸桂櫃跪貴劊輥滾棍鍋郭國果裹過哈骸孩海氦亥害駭酣憨邯韓含涵寒函喊罕翰撼捍
-旱憾悍焊汗漢夯杭航壕嚎豪毫郝好耗號浩呵喝荷菏核禾和何合盒貉閡河涸赫褐鶴賀嘿黑痕很
-狠恨哼亨橫衡恒轟哄烘虹鴻洪宏弘紅喉侯猴吼厚候後呼乎忽瑚壺葫胡蝴狐糊湖弧虎唬護互滬
-戶花嘩華猾滑畫劃化話槐徊懷淮壞歡環桓還緩換患喚瘓豢煥渙宦幻荒慌黃磺蝗簧皇凰惶煌晃
-幌恍謊灰揮輝徽恢蛔回毀悔慧卉惠晦賄穢會燴匯諱誨繪葷昏婚魂渾混豁活夥火獲或惑霍貨禍
-擊圾基機畸稽積箕肌饑跡激譏雞姬績緝吉極棘輯籍集及急疾汲即嫉級擠幾脊己薊技冀季伎祭
-劑悸濟寄寂計記既忌際妓繼紀嘉枷夾佳家加莢頰賈甲鉀假稼價架駕嫁殲監堅尖箋間煎兼肩艱
-奸緘繭檢柬堿堿揀撿簡儉剪減薦檻鑒踐賤見鍵箭件健艦劍餞漸濺澗建僵姜將漿江疆蔣槳獎講
-匠醬降蕉椒礁焦膠交郊澆驕嬌嚼攪鉸矯僥腳狡角餃繳絞剿教酵轎較叫窖揭接皆秸街階截劫節
-桔傑捷睫竭潔結解姐戒藉芥界借介疥誡屆巾筋斤金今津襟緊錦僅謹進靳晉禁近燼浸盡勁荊兢
-莖睛晶鯨京驚精粳經井警景頸靜境敬鏡徑痙靖竟競淨炯窘揪究糾玖韭久灸九酒廄救舊臼舅咎
-就疚鞠拘狙疽居駒菊局咀矩舉沮聚拒據巨具距踞鋸俱句懼炬劇捐鵑娟倦眷卷絹撅攫抉掘倔爵
-覺決訣絕均菌鈞軍君峻俊竣浚郡駿喀咖卡咯開揩楷凱慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤
-靠坷苛柯棵磕顆科殼咳可渴克刻客課肯啃墾懇坑吭空恐孔控摳口扣寇枯哭窟苦酷庫褲誇垮挎
-跨胯塊筷儈快寬款匡筐狂框礦眶曠況虧盔巋窺葵奎魁傀饋愧潰坤昆捆困括擴廓闊垃拉喇蠟臘
-辣啦萊來賴藍婪欄攔籃闌蘭瀾讕攬覽懶纜爛濫琅榔狼廊郎朗浪撈勞牢老佬姥酪烙澇勒樂雷鐳
-蕾磊累儡壘擂肋類淚棱楞冷厘梨犁黎籬狸離漓理李裡鯉禮莉荔吏栗麗厲勵礫曆利僳例俐痢立
-粒瀝隸力璃哩倆聯蓮連鐮廉憐漣簾斂臉鏈戀煉練糧涼梁粱良兩輛量晾亮諒撩聊僚療燎寥遼潦
-了撂鐐廖料列裂烈劣獵琳林磷霖臨鄰鱗淋凜賃吝拎玲菱零齡鈴伶羚淩靈陵嶺領另令溜琉榴硫
-餾留劉瘤流柳六龍聾嚨籠窿隆壟攏隴樓婁摟簍漏陋蘆盧顱廬爐擄鹵虜魯麓碌露路賂鹿潞祿錄
-陸戮驢呂鋁侶旅履屢縷慮氯律率濾綠巒攣孿灤卵亂掠略掄輪倫侖淪綸論蘿螺羅邏鑼籮騾裸落
-洛駱絡媽麻瑪碼螞馬罵嘛嗎埋買麥賣邁脈瞞饅蠻滿蔓曼慢漫謾芒茫盲氓忙莽貓茅錨毛矛鉚卯
-茂冒帽貌貿麼玫枚梅酶黴煤沒眉媒鎂每美昧寐妹媚門悶們萌蒙檬盟錳猛夢孟眯醚靡糜迷謎彌
-米秘覓泌蜜密冪棉眠綿冕免勉娩緬面苗描瞄藐秒渺廟妙蔑滅民抿皿敏憫閩明螟鳴銘名命謬摸
-摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌謀牟某拇牡畝姆母墓暮幕募慕木目睦牧穆拿哪呐鈉那娜
-納氖乃奶耐奈南男難囊撓腦惱鬧淖呢餒內嫩能妮霓倪泥尼擬你匿膩逆溺蔫拈年碾攆撚念娘釀
-鳥尿捏聶孽齧鑷鎳涅您檸獰凝甯擰濘牛扭鈕紐膿濃農弄奴努怒女暖虐瘧挪懦糯諾哦歐鷗毆藕
-嘔偶漚啪趴爬帕怕琶拍排牌徘湃派攀潘盤磐盼畔判叛乓龐旁耪胖拋咆刨炮袍跑泡呸胚培裴賠
-陪配佩沛噴盆砰抨烹澎彭蓬棚硼篷膨朋鵬捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片
-騙飄漂瓢票撇瞥拼頻貧品聘乒坪蘋萍平憑瓶評屏坡潑頗婆破魄迫粕剖撲鋪僕莆葡菩蒲埔樸圃
-普浦譜曝瀑期欺棲戚妻七淒漆柒沏其棋奇歧畦崎臍齊旗祈祁騎起豈乞企啟契砌器氣迄棄汽泣
-訖掐洽牽扡釺鉛千遷簽仟謙乾黔錢鉗前潛遣淺譴塹嵌欠歉槍嗆腔羌牆薔強搶橇鍬敲悄橋瞧喬
-僑巧鞘撬翹峭俏竅切茄且怯竊欽侵親秦琴勤芹擒禽寢沁青輕氫傾卿清擎晴氰情頃請慶瓊窮秋
-丘邱球求囚酋泅趨區蛆曲軀屈驅渠取娶齲趣去圈顴權醛泉全痊拳犬券勸缺炔瘸卻鵲榷確雀裙
-群然燃冉染瓤壤攘嚷讓饒擾繞惹熱壬仁人忍韌任認刃妊紉扔仍日戎茸蓉榮融熔溶容絨冗揉柔
-肉茹蠕儒孺如辱乳汝入褥軟阮蕊瑞銳閏潤若弱撒灑薩腮鰓塞賽三三傘散桑嗓喪搔騷掃嫂瑟色
-澀森僧莎砂殺刹沙紗傻啥煞篩曬珊苫杉山刪煽衫閃陝擅贍膳善汕扇繕墒傷商賞晌上尚裳梢捎
-稍燒芍勺韶少哨邵紹奢賒蛇舌舍赦攝射懾涉社設砷申呻伸身深娠紳神沈審嬸甚腎慎滲聲生甥
-牲升繩省盛剩勝聖師失獅施濕詩屍虱十石拾時什食蝕實識史矢使屎駛始式示士世柿事拭誓逝
-勢是嗜噬適仕侍釋飾氏市恃室視試收手首守壽授售受瘦獸蔬樞梳殊抒輸叔舒淑疏書贖孰熟薯
-暑曙署蜀黍鼠屬術述樹束戍豎墅庶數漱恕刷耍摔衰甩帥栓拴霜雙爽誰水睡稅吮瞬順舜說碩朔
-爍斯撕嘶思私司絲死肆寺嗣四伺似飼巳松聳慫頌送宋訟誦搜艘擻嗽蘇酥俗素速粟僳塑溯宿訴
-肅酸蒜算雖隋隨綏髓碎歲穗遂隧祟孫損筍蓑梭唆縮瑣索鎖所塌他它她塔獺撻蹋踏胎苔抬台泰
-酞太態汰坍攤貪癱灘壇檀痰潭譚談坦毯袒碳探歎炭湯塘搪堂棠膛唐糖倘躺淌趟燙掏濤滔絛萄
-桃逃淘陶討套特藤騰疼謄梯剔踢銻提題蹄啼體替嚏惕涕剃屜天添填田甜恬舔腆挑條迢眺跳貼
-鐵帖廳聽烴汀廷停亭庭艇通桐酮瞳同銅彤童桶捅筒統痛偷投頭透凸禿突圖徒途塗屠土吐兔湍
-團推頹腿蛻褪退吞屯臀拖托脫鴕陀馱駝橢妥拓唾挖哇蛙窪娃瓦襪歪外豌彎灣玩頑丸烷完碗挽
-晚皖惋宛婉萬腕汪王亡枉網往旺望忘妄威巍微危韋違桅圍唯惟為濰維葦萎委偉偽尾緯未蔚味
-畏胃喂魏位渭謂尉慰衛瘟溫蚊文聞紋吻穩紊問嗡翁甕撾蝸渦窩我斡臥握沃巫嗚鎢烏汙誣屋無
-蕪梧吾吳毋武五捂午舞伍侮塢戊霧晤物勿務悟誤昔熙析西硒矽晰嘻吸錫犧稀息希悉膝夕惜熄
-烯溪汐犀檄襲席習媳喜銑洗系隙戲細瞎蝦匣霞轄暇峽俠狹下廈夏嚇掀鍁先仙鮮纖鹹賢銜舷閑
-涎弦嫌顯險現獻縣腺餡羨憲陷限線相廂鑲香箱襄湘鄉翔祥詳想響享項巷橡像向象蕭硝霄削哮
-囂銷消宵淆曉小孝校肖嘯笑效楔些歇蠍鞋協挾攜邪斜脅諧寫械卸蟹懈泄瀉謝屑薪芯鋅欣辛新
-忻心信釁星腥猩惺興刑型形邢行醒幸杏性姓兄凶胸匈洶雄熊休修羞朽嗅鏽秀袖繡墟戌需虛噓
-須徐許蓄酗敘旭序畜恤絮婿緒續軒喧宣懸旋玄選癬眩絢靴薛學穴雪血勳熏循旬詢尋馴巡殉汛
-訓訊遜迅壓押鴉鴨呀丫芽牙蚜崖衙涯雅啞亞訝焉咽閹煙淹鹽嚴研蜒岩延言顏閻炎沿奄掩眼衍
-演豔堰燕厭硯雁唁彥焰宴諺驗殃央鴦秧楊揚佯瘍羊洋陽氧仰癢養樣漾邀腰妖瑤搖堯遙窯謠姚
-咬舀藥要耀椰噎耶爺野冶也頁掖業葉曳腋夜液一壹醫揖銥依伊衣頤夷遺移儀胰疑沂宜姨彝椅
-蟻倚已乙矣以藝抑易邑屹億役臆逸肄疫亦裔意毅憶義益溢詣議誼譯異翼翌繹茵蔭因殷音陰姻
-吟銀淫寅飲尹引隱印英櫻嬰鷹應纓瑩螢營熒蠅迎贏盈影穎硬映喲擁傭臃癰庸雍踴蛹詠泳湧永
-恿勇用幽優悠憂尤由郵鈾猶油游酉有友右佑釉誘又幼迂淤于盂榆虞愚輿余俞逾魚愉渝漁隅予
-娛雨與嶼禹宇語羽玉域芋郁籲遇喻峪禦愈欲獄育譽浴寓裕預豫馭鴛淵冤元垣袁原援轅園員圓
-猿源緣遠苑願怨院曰約越躍鑰嶽粵月悅閱耘雲鄖勻隕允運蘊醞暈韻孕匝砸雜栽哉災宰載再在
-咱攢暫贊贓髒葬遭糟鑿藻棗早澡蚤躁噪造皂灶燥責擇則澤賊怎增憎曾贈紮喳渣劄軋鍘閘眨柵
-榨咋乍炸詐摘齋宅窄債寨瞻氈詹粘沾盞斬輾嶄展蘸棧占戰站湛綻樟章彰漳張掌漲杖丈帳賬仗
-脹瘴障招昭找沼趙照罩兆肇召遮折哲蟄轍者鍺蔗這浙珍斟真甄砧臻貞針偵枕疹診震振鎮陣蒸
-掙睜征猙爭怔整拯正政幀症鄭證芝枝支吱蜘知肢脂汁之織職直植殖執值侄址指止趾只旨紙志
-摯擲至致置幟峙制智秩稚質炙痔滯治窒中盅忠鐘衷終種腫重仲眾舟周州洲謅粥軸肘帚咒皺宙
-晝驟珠株蛛朱豬諸誅逐竹燭煮拄矚囑主著柱助蛀貯鑄築住注祝駐抓爪拽專磚轉撰賺篆樁莊裝
-妝撞壯狀椎錐追贅墜綴諄准捉拙卓桌琢茁酌啄著灼濁茲諮資姿滋淄孜紫仔籽滓子自漬字鬃棕
-蹤宗綜總縱鄒走奏揍租足卒族祖詛阻組鑽纂嘴醉最罪尊遵昨左佐柞做作坐座
+
+皚藹礙愛襖奧
+壩罷擺敗頒辦絆幫
+綁鎊謗剝飽寶報鮑輩貝鋇狽備憊
+繃筆畢斃幣閉邊編貶
+變辯辮標鱉別癟瀕濱賓擯餅並撥缽鉑
+駁蔔補財參蠶殘慚慘燦蒼
+艙倉滄廁側冊測層詫攙摻蟬饞讒纏鏟產闡顫
+場嘗長償腸廠暢鈔車徹塵陳襯撐稱
+懲誠騁癡遲馳恥齒熾沖蟲寵疇躊
+籌綢醜櫥廚鋤雛礎儲觸處傳瘡闖創錘
+純綽辭詞賜聰蔥囪從叢湊躥竄
+錯達帶貸擔單鄲撣膽
+憚誕彈當擋黨蕩檔搗島禱導盜燈鄧敵
+滌遞締顛點墊電澱釣調
+諜疊釘頂錠訂丟東動棟凍鬥犢獨讀賭
+鍍鍛斷緞兌隊對噸頓鈍奪墮鵝
+額訛惡餓兒爾餌貳發罰閥琺礬釩煩範
+販飯訪紡飛誹廢費紛墳奮
+憤糞豐楓鋒風瘋馮縫諷鳳膚輻撫輔
+賦複負訃婦縛該鈣蓋幹趕
+稈贛岡剛鋼綱崗鎬擱鴿閣鉻個給
+龔宮鞏貢鉤溝構購夠
+蠱顧剮掛關觀館慣貫廣規歸龜
+閨軌詭櫃貴劊輥滾鍋國過駭韓
+漢號閡鶴賀
+橫轟鴻紅後壺護滬
+戶嘩華畫劃話懷壞歡環還緩換喚瘓煥渙黃
+謊揮輝毀賄穢會燴匯諱誨繪葷渾夥獲貨禍
+擊機積饑跡譏雞績緝極輯級擠幾薊
+劑濟計記際繼紀夾莢頰賈鉀價駕殲監堅箋間艱
+緘繭檢堿揀撿簡儉減薦檻鑒踐賤見鍵艦劍餞漸濺澗將漿蔣槳獎講
+醬膠澆驕嬌攪鉸矯僥腳餃繳絞轎較階節
+傑潔結誡屆緊錦僅謹進晉燼盡勁荊
+莖鯨驚經頸靜鏡徑痙競淨糾廄舊
+駒舉據鋸懼劇鵑絹
+覺決訣絕鈞軍駿開凱
+顆殼課墾懇摳庫褲誇
+塊儈寬礦曠況虧巋窺饋潰擴闊蠟臘
+萊來賴藍欄攔籃闌蘭瀾讕攬覽懶纜爛濫撈勞澇樂鐳
+壘類淚籬離裡鯉禮麗厲勵礫曆
+瀝隸倆聯蓮連鐮憐漣簾斂臉鏈戀煉練糧涼兩輛諒療遼
+鐐獵臨鄰鱗凜賃齡鈴淩靈嶺領
+餾劉龍聾嚨籠壟攏隴樓婁摟簍蘆盧顱廬爐擄鹵虜魯賂祿錄
+陸驢呂鋁侶屢縷慮濾綠巒攣孿灤亂掄輪倫侖淪綸論蘿羅邏鑼籮騾
+駱絡媽瑪碼螞馬罵嗎買麥賣邁脈瞞饅蠻滿謾貓錨鉚
+貿麼黴沒鎂門悶們錳夢謎彌
+覓冪綿緬廟滅憫閩鳴銘謬
+謀畝鈉
+納難撓腦惱鬧餒內擬膩攆撚釀
+鳥聶齧鑷鎳檸獰甯擰濘鈕紐膿濃農瘧諾歐鷗毆
+嘔漚盤龐拋賠
+噴鵬
+騙飄頻貧蘋憑評潑頗撲鋪僕樸
+譜棲淒臍齊騎豈啟氣棄
+訖牽扡釺鉛遷簽謙錢鉗潛淺譴塹槍嗆牆薔強搶鍬橋喬
+僑翹竅竊欽親寢輕氫傾頃請慶瓊窮
+趨區軀驅齲顴權勸卻鵲確
+讓饒擾繞熱韌認紉榮絨
+軟銳閏潤灑薩鰓賽傘喪騷掃
+澀殺紗篩曬刪閃陝贍繕傷賞
+燒紹賒攝懾設紳審嬸腎滲聲
+繩勝聖師獅濕詩屍時蝕實識駛
+勢適釋飾視試壽獸樞輸書贖
+屬術樹豎數帥雙誰稅順說碩
+爍絲飼聳慫頌訟誦擻蘇訴
+肅雖隨綏歲孫損筍縮瑣鎖獺撻
+態攤貪癱灘壇譚談歎湯燙濤絛
+討騰謄銻題體屜條貼
+鐵廳聽烴銅統頭禿圖塗
+團頹蛻脫鴕馱駝橢窪襪彎灣頑
+萬網韋違圍為濰維葦偉偽緯
+謂衛溫聞紋穩問甕撾蝸渦窩臥嗚鎢烏汙誣無
+蕪吳塢霧務誤錫犧
+襲習銑戲細蝦轄峽俠狹廈嚇鍁鮮纖鹹賢銜閑
+顯險現獻縣餡羨憲線廂鑲鄉詳響項蕭
+囂銷曉嘯蠍協挾攜脅諧寫瀉謝鋅
+釁興洶鏽繡虛噓
+須許敘緒續軒懸選癬絢學勳詢尋馴
+訓訊遜壓鴉鴨啞亞訝閹煙鹽嚴顏閻
+豔厭硯彥諺驗鴦楊揚瘍陽癢養樣瑤搖堯遙窯謠
+藥爺頁業葉醫銥頤遺儀
+蟻藝億憶義詣議誼譯異繹蔭陰
+銀飲隱櫻嬰鷹應纓瑩螢營熒蠅贏穎喲擁傭癰踴詠湧
+優憂郵鈾猶誘輿魚漁
+娛與嶼語籲禦獄譽預馭鴛淵轅園員圓
+緣遠願約躍鑰嶽粵悅閱雲鄖勻隕運蘊醞暈韻雜災載
+攢暫贊贓髒鑿棗責擇則澤賊贈紮劄軋鍘閘柵
+詐齋債氈盞斬輾嶄棧戰綻張漲帳賬
+脹趙蟄轍鍺這貞針偵診鎮陣
+掙睜猙爭幀鄭證織職執紙
+摯擲幟質滯鐘終種腫眾謅軸皺
+晝驟豬諸誅燭矚囑貯鑄築駐專磚轉賺樁莊裝
+妝壯狀錐贅墜綴諄濁茲諮資漬
+蹤綜總縱鄒詛組鑽
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
-蜃鬱徊晰徘囁炸咆礫蜘蛛哮擲
-弩饪鲱鳟鲑莓曜骷髅藓陲沌匕镖鸢忏牦蝾螈蟾蜍狩崛曦弑蛞蝓虔鞣雉翡柚阱蜥蜴喱榈菘《》瞭瑙鲭黏鳗鳕鲈鲨鮟鱇鳍岬…魇芙犸蛭蛎鲷鱿鲷炖荨樵腱禅鼬戟鲟皈螃鲶亵渎貂滕鹫伽鸬鹚帷匍匐邃獠湮噩鼹颚冥岖踮玷渲嗯阈髦嘟缤‧鵟镯篝浣褶
\ No newline at end of file
+蜃鬱囁
+弩饪鲱鳟鲑莓曜骷髅藓陲沌匕镖鸢忏牦蝾螈蟾蜍狩崛曦弑蛞蝓虔鞣雉翡柚阱蜥蜴喱榈菘《》瞭瑙鲭黏鳗鳕鲈鲨鮟鱇鳍岬魇芙犸蛭蛎鲷鱿炖荨樵腱禅鼬戟鲟皈螃鲶亵渎貂滕鹫伽鸬鹚帷匍匐邃獠湮噩鼹颚冥岖踮玷渲嗯阈髦嘟缤‧鵟镯篝浣褶噼
+僮憧鹦玆蒹衲琨憩竽杳阙梖姒雯萱賏嬿怅忪辄婊鲲槁呦榕蓁矜甡喈癞跩鹉逍卍栱惚唠亘轶羁贔珑媛咫驽骥啐猷楠雱癈戾蝨诟淂匮楹寰菅迋璋拮谯悴骖忐祠焜骅憬彧纰欸罈葆郢茱聒骐剷跚恙犛琦眸陞驷榻姣葔谪卅艸哞堐夭忑麽簷饷慵薇鎚跎倭揆胭遽邋炜峘恻笈町宸馊萃潢妤蟆锂厥嚥猬嶙徨娑琬醺屐啵祂嘈廿邂庵逖瞑涘嫖硷爿俨澹檯杵鮀飙铎鸠劭荪忡殡璿嫦恣佗臧侬昀峋蕙泠坻徬迩暾衿鬩噫饕鈃馀妞皎俎氾荼娓鳄镉暨叩褉侃垠叡侪潺缈俾於沚咛庠綵濂袓窦逑轫笠蛢踝捺魉莘傜耆叱缇潁枭懵喟筱贻棣徉猥嗷觞熨瑕咁挓墉邰傌悚鑞蕤巅冇呒侏铿澍蕃摒莠徕糸疋栾嗦悌裘烜胏痲萼枰偎瘖伝碇蟀镳饴彗驿幡樽耨迥铄彷孚茍瑾岌塾悖姝橘沱搥诳钛醃瞠晡唢诙膫噗羯唰抴崚榛翩拚淅跆砥纣埸枋佶嬉葩怆渥佫黝憔殇诿兮羲爻甬籁芩笙蹛阪玑咧蹉迦痣豊骧倜恸蹴尬鎗镂愕腓洄邸馨茜昊嗈踼霎菀妍珂牯喽逵挹泯龌錡蠹銮黯镛谄馄蓓猝暧麾谀郤胤馥俦钗雎眛璨菫禀炘谘鼐鹄呗逅讦桀怡牒狒芷缪剌扉剽薮锵嵩蔻沬朕锾鑑蟋辇苳咚糗夤璞妲璐盥恚钍莞沝阖粽佢遢纭圳雩猕呣瞌踅垓矬蜻菈齁绫鐽鲢琮芮谒倩噤罣躄蹼兀棹菁焢莅汨鮭臾啜疝啧惬捀岫烊竺绁倏衹葳邈踽骰杞尻歛淙祺濑荃銂呷嘹卦霏麴夆聆旳肓绯颳佮庖懋煦颦煇炤楣娴荀悱愍囝鸾啷婵讴闵佼龊壑睿玟仞辘徵跤愫胛寮绛癖栩匾瞋浬臊淇咄靦壅莒睇嗖忉吋蓊冽刈偌蹙岱儸巿蒨珣孃橄籐劾裱蠋叽恰吆咻毘兀榄晏朦钏殁唷漪伕暱蹒麒蔺嗙佚龈妾嘤喵喙琇娼趺蜓脕贀麟袅徛脩倌娣唏臬汶罄诃诏艋盃瞰邬梓膺蓦渚槌譁缭咪钿伫悻袂螫锺璀唧矕颉觑脍羿窠粼尴薏孑踱氐豚浯嗄俪暸烸坜妃玺谧芊槟舫昝蹑厮遑萦埵罹齣娉噱钊鲛狷谟躂瘀謢閤趐洹哽詘谕蜿逄拺姗靼獗愔溼帑捩蹶硐蟑迳桧稹踹鼾冢顸稣桎箇刎榭谲蝌雳攸勦砺迺蛟迵筠桢罡桦颢祉褔圜弋偬墬谏纔遐弭噢吽俸筊鹭烨彊霭弼筌蜢轼葄炫蹊瑜螂璁壼閒韬荏欉吒谖跛崁胫翎泱宕谑珪旻嗳椆揶霆敕蓼绮呎踵赀琪鞦屄俟酯觎鹧尪嗨掴颺恺葯賸鑫煚萏扈玮铠滢妳喃蝠玠贲詗钜鹬蝣岚苓钲綑跻潸仝嬷瘐瀛蚪玎惘璇鳅辍燊赈呃愣镕捱鸲靓嘀漩骼昃掬婬囿淼荻祀坳琛滮梵篑蔘茗箝饨菡浒隹畀桠邝咦珀掔摺痠缱綩箫诒胝飨搾莺擘軂蚱愠觊釆崽祯璧璟稔沓潇哔偈槭褛摃衮亟昶傩谛黉虌喔铮洸嗲黛嗤柰翊芎鏖屌埤崴俑濠呓鶩啾暐缥忒嵘骛揄峥笃偃缰昕闾锉筵禧厝徙瞿鸪遴蟒鸶濯淦礴瀚堉亳斐幔洩沐琥宓泓丕瓒槙鹂忝牠崧誏诠鬓忾竑飒鳌掰铐喋窈涓阕鬟仄燿栲懿瑛矶胥哒岐蚓旌噜嗔幄鲫嬴濡翳奕棻迴荞浏韆遨偕夙琍铛徜睐唅蚯樕轭丞璜佞褟昱诘湄叟恁霈沅犷垚啬洵窕茉眈煜讷肴髻豨齰晖胼酹裆桹昙蕨砝铨旄胱涔愎仃熹嵋薰婷珈稷婀葾忖荟梏隍妩鞑偆隽箴绻堀丐堇蚣倬躏爰晟颔紘乩痧锒篠戕琱玹嗝凊褓寤瘾媲鲔瑄晞囥锢珞唔钰拗豋筝嗟搵魅罔泷倨螳诤皕暝戡睽帼迤姊挺牴埼琏膑蚵扪昴儆芸惆搧诩擤蹂纨撷媄纾蠔睨熇晔囍隼毐囡瓯睭祚诋蜉奚骈菸睾怼咿婢褊傥蒐霾霁呱蝙叨俚胧恪皓啻觔鎯骁踫咩暄弁葭岑躅啣毓聿锟噹靥宥丌铳埕蕁癫擢怦盹蜈傧讪钣鲥旸穹褚滂跷砗痍嫣刍踯忸谙簑轾臺準遊復係歷隻週製註囉衝餘誌唸採佔佈髮寧託昇鬆闆麵儘砲証捨恆嘆蹟鍾壢穌靂捲嵐傢兇慾禪讚祕噁桿繫飆儂併籤盪彿樑佇鍊瑋瀟緻詮剎颱癮箏錶絃珮穫餵臟姦嚐嘸嚮闢祇嘍鵰釵鏘鰱吶彙剋荳燄頡尷檳祐癒逕樺鬍綺闇槓鶯禎嗶諦嚕瀏詰暉槃鈺瀰蹺懺闕悵輒飢瓏鐸稜儕崙魎繽曖崑甦蒞瀨滷閔倖嘰濛欖釐裊訶驀巖矇廝塚朮鷺韜鎧鉅睏簫饗錚嶸篤鷥銬磯悽鯽骯曇銓艷雋擷弔朧靨訕硨鸚舖鵡羈汎詬髏騏鬚糢煒鹼儼鳩鱷鏢嚀竇薑梟觴巔欒驛殭愴蠣慟諂稟訐繆侷釷褻綾嘖訢飪勛嫻嬋瞇藺癥詔儷璽縈慄釗諭鯊譎貍靄軾噯愷鎔靚簣滸椏穀揹崢鸝鬢闋睞鰻訥痺韃躪僱捫紓曄瀆驍銃癲鈑芻諳亙驥彆匱譙驂餿嶇姪邇鎘鯰緹貽鬨徠鑣鈦嗩詼鱈魷殤籟驤齷鑾鏞唄輦闔燉紜愜緋顰鸞齪鰭釧齦魘鈿覷謐謨姍檜獃礪楨傯諫燁謔瀅鷸鉦躋嬤鰍鄺繾詒慍黌鼴囈縹騖閭颯噠鯛糰嗇餚襠薈嫵綣頷錮瀧諍幗璉詡詆睪儻霽瑯燻喫儐鰣躑鯤癩嘮軼駑驊紕駟謫銲餉惻鱸鋰蝟蓀殯緲軔鏗飴鑠誑紂諉璣鷲鏤坵燬餛諛儔鵠藪摀鍰顎獼謁紲鳶謳轆絳歿蹣嚶鄔繚蹧譟膾躡鮫頇顥諼脛貲覦鷓彫摑賁輟賑鴝飩覬褸袞儺韁銼鴣礡瓚愾鰲蕎鐺軛獷卬鋃鮪臏紈甌駢懟錕暘輊
From 4e7a2e3a5ad9c91ba5194eaa11c568d1ff536f20 Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Wed, 20 May 2026 00:55:47 +0800
Subject: [PATCH 4/6] Disable anti-aliasing and raise opacity threshold in char
image generation in order to reduce blurry edges on small canvases.
---
updater/update_char_images.py | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/updater/update_char_images.py b/updater/update_char_images.py
index 388415e3..7b67f958 100644
--- a/updater/update_char_images.py
+++ b/updater/update_char_images.py
@@ -174,9 +174,13 @@ def create_images(chars_list, font_path, output_dir, colors, lang):
draw = ImageDraw.Draw(image)
#draw shade of character for yellow only, because overhead texts look strange without it
+ temp_img = Image.new('L', (new_width, new_height), 0)
+ temp_draw = ImageDraw.Draw(temp_img)
+ temp_draw.text((new_text_padding[0], new_text_padding[1]), char, font=font, fill=255)
+ mask_img = temp_img.point(lambda x: 255 if x > 128 else 0, mode='1')
if colorName == 'yellow':
- draw.text((new_text_padding[0] + BGTXTPAD[0], new_text_padding[1]+BGTXTPAD[1]), char, font=font, fill=BGTEXTCOLOR[i])
- draw.text((new_text_padding[0], new_text_padding[1]), char, font=font, fill=color) # Draw the character
+ draw.bitmap((new_text_padding[0] + BGTXTPAD[0], new_text_padding[1]+BGTXTPAD[1]), mask_img, fill=BGTEXTCOLOR[i])
+ draw.bitmap((new_text_padding[0], new_text_padding[1]), mask_img, fill=color)
image_file_name = f'{charName}.png'
image.save(os.path.join(output_dir, image_file_name)) # Save the image
@@ -230,7 +234,7 @@ def make_image_opaque(image_path):
else item for item in data]
# Create a new data array where all non-transparent pixels are made opaque
- threshold = 25 #transparency out of 255
+ threshold = 50 #transparency out of 255
data = [(item[0], item[1], item[2], 255) if item[3] > threshold else item for item in data]
new_data = [(item[0], item[1], item[2], 0) if item[3] <= threshold else item for item in data]
@@ -239,7 +243,7 @@ def make_image_opaque(image_path):
# Save the modified image
img.save(image_path)
else:
- threshold = 25 #transparency out of 255
+ threshold = 50 #transparency out of 255
data = [(item[0], item[1], item[2], 255) if item[3] > threshold else item for item in data]
new_data = [(item[0], item[1], item[2], 0) if item[3] <= threshold else item for item in data]
From dcca19eb5d255fc7854153bd69727b9edd0f91c3 Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Fri, 22 May 2026 19:00:44 +0800
Subject: [PATCH 5/6] 1. Add a script to remove duplicate English entries from
'dialogue' sheet in transcript_{lang}.xlsx. 2. Add quick guide and modify UI
in updater/README.md
---
updater/README.md | 103 +++++++++++++++++++++++----
updater/remove_duplicate_dialogue.py | 70 ++++++++++++++++++
2 files changed, 160 insertions(+), 13 deletions(-)
create mode 100644 updater/remove_duplicate_dialogue.py
diff --git a/updater/README.md b/updater/README.md
index 6fd014ee..b884ac69 100644
--- a/updater/README.md
+++ b/updater/README.md
@@ -14,47 +14,122 @@ The `Updater` directory contains five distinct programs, each designed to perfor
4. [`generate_tsv.py`](./generate_tsv.py): This program processes the translated transcripts (generated by [update_nonEn_transcripts.py](./update_nonEn_transcripts.py) then translated by a translator), and convert them into TSV (Tab-Separated Values) format. These TSV files will also be found in [draft folder](../draft/), and should be reviewed and then moved to the [public](../public/) directory for use by the plugin.
+5. [`remove_duplicate_dialogue.py`](./remove_duplicate_dialogue.py): After running programs 1 and 2, the `dialogue` sheet in `transcript_{lang}.xlsx` contains a large number of duplicate English entries. The program removes them and only the first occurrence of each English entry is kept; subsequent duplicates are deleted entirely. A backup is created automatically before making changes. (Only support Excel file)
For a deeper understanding of why these scripts are essential, please refer to the [README](./RuneLingual/transcript/README.md) in the top directory.
-## Create a Transcript for New Language
+## Quick Guide
+```mermaid
+flowchart TD
+ classDef setup fill:#bbdefb,stroke:#1565c0,color:#212121
+ classDef process fill:#e1bee7,stroke:#6a1b9a,color:#212121
+ classDef decision fill:#ffe0b2,stroke:#e65100,color:#212121
+ classDef translate fill:#c8e6c9,stroke:#2e7d32,color:#212121
+ classDef final fill:#fff9c4,stroke:#f9a825,color:#212121
+ classDef wait fill:#f5f5f5,stroke:#9e9e9e,color:#212121
+
+ START(["Quick Guide"]):::setup
+
+ START --> CHOOSE{What are you
doing?}:::decision
+
+ CHOOSE -->|Create a
New Translation| NEW
+ CHOOSE -->|After an
OSRS Update| UPDATE
+
+ subgraph NEW[" "]
+ direction TB
+ N1["Add language code to
common_func.py"]:::setup
+ N2["Run main_generate_
English_transcript.py
--updateAll"]:::process
+ N3{"Non-Latin
alphabet?"}:::decision
+ N4["Run update_char_images.py
(Only supports few languages)"]:::process
+ N5["Run update_nonEn_
transcripts.py
create translation template
(xlsx or xliff)"]:::process
+ N1 --> N2 --> N3
+ N3 -->|Yes| N4 --> N5
+ N3 -->|No| N5
+ N5 --> COMMON_OUT
+ end
+
+ subgraph UPDATE["Update Translated Transcripts"]
+ direction TB
+ U1{"English DB
already up
to date?"}:::decision
+ U2["Run main_generate_
English_transcript.py
--updateAll"]:::process
+ U3["(Skip)"]:::process
+ U4["Run update_nonEn_
transcripts.py
merge new entries into
existing translation template"]:::process
+ U1 -->|No| U2 --> U4
+ U1 -->|Yes| U3 --> U4
+ U4 --> COMMON_OUT
+ end
+
+ subgraph POST["Post-processing"]
+ direction LR
+ P1["(Optional) Run
remove_duplicate_dialogue.py
clean duplicate entries
in dialogue sheet (Only for Excel file)"]:::process
+ P2["Translator fills in
translations"]:::translate
+ P3{"Continue by
yourself?"}:::decision
+ P1 --> P2 --> P3
+ P3 -->|Yes| P4["Run generate_tsv.py
→ TSV + hash
→ Test translation
→ Copy to public/"]:::final
+ P3 -->|No| P5["Contact developer
for help"]:::wait --> P6(["Waiting"]):::wait
+ P4 --> P7["Pull Request"]:::final
+ end
+
+ COMMON_OUT --> POST
+```
+
+
+Complete Guide - Create a Transcript for New Language
+
You can ask someone in the [Discord](#lets-chat) below to do it for you, but if you want to do it yourself:
1. Add the language's code to necessary files, such as [LANG and LANG_CODE_STANDARD in common_func.py](./common_func.py)
2. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
3. Run programs 1 and 2 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section.
4. For non-Latin languages, run program 3 above in [`Overview of Updater Programs`](#overview-of-updater-programs) section. But it is likely that program 3 only supports few languages. Contact a developer from the [Discord](#lets-chat) link below for help.
+5. Run programs 5 above in Overview of Updater Programs section. (Not necessary, but run it if you want to remove duplicate English entries in dialogue sheet in transcript_{lang}.xlsx)
-For languages such as Japanese, Russian, Program 3 [update_char_images.py](./update_char_images.py) must be configured and ran. If you're unsure, ask one of our developers and we'll be able to test it for you.
+For languages such as Japanese, Russian and Chinese, Program 3 [update_char_images.py](./update_char_images.py) must be configured and ran. If you're unsure, ask one of our developers and we'll be able to test it for you.
Program 3 [update_char_images.py](./update_char_images.py) is unnecessary if the language uses the English alphabet, including characters with accents (like those in Spanish, Portuguese, Norwegian).
+
+
+
+
+Complete Guide - How to Update Foriegn Transcripts After an OSRS Update
+
-## How to Update Foriegn Transcripts After an OSRS Update
1. Clone this repository, and install python to your system. (ask Chat-GPT for mor info, it's very informative!)
2. Run program [1](update_english_transcript/main_generate_English_transcript.py) and [2](./update_nonEn_transcripts.py).
If the English transcript is already up to date, program 1 does not need to be ran.
+
-## What to Do after Obtaining a Transcript
-After cloning this repository and executing some codes, there should be a transcript inside the [draft folder](../draft/).
-
-The transcript file will be in either Excel or ".xliff" format.
-
-For Excel, You can simply start adding translations in the translation column.
-
-The .xliff file is supported by many CAT softwares, including the free OmegaT.
+
+
+Complete Guide - What to Do after Obtaining a Transcript
+
+After cloning this repository and executing some codes, there should be a transcript inside the [draft folder](../draft/).
+The transcript file will be in either Excel or ".xliff" format.
+For Excel, You can simply start adding translations in the translation column.
+The .xliff file is supported by many CAT softwares, including the free OmegaT.
After you've made progress with translation and want to update the plugin, you can either send the file to one of the developers in our [Discord server](https://discord.gg/ehwKcVdBGS), or make sure the language's folder in [draft folder](../draft/) and make a pull request to the GitHub repository.
+
+
+
+
+Complete Guide - Developers: after receiving translated transcript
+
-## Developers: after receiving translated transcript
1. Clone the whole repository to your local machine
2. Run ['generate_tsv.py'](./generate_tsv.py). It will turn the Excel or .xliff transcript to TSV, and also automatically update the hash file value.
3. Check inside the target language in [draft folder](../draft/) that there is a TSV version of the newly obtained translation.
4. Copy the TSV version to the language's folder in [public folder](../public/). If it already exists, replace it.
5. Check that no files have been deleted in other languages' folder.
6. After you are sure correct files are in each folder of [public folder](../public/), make a pull request, and have someone accept it.
+
+
+
+
+Complete Guide - Adding/Updating Character images
+
-## Adding/Updating Character images
1. Prepare a file that contains all texts to be displayed in-game, save it as `all_char_??.txt`, where `??` is [the language code](https://developers.deepl.com/docs/resources/supported-languages#target-languages) for your language.
2. Download a font (.ttf format) that is Copy right free, free to use for commercial use, as free from restrictions as possible.
3. Add the file from Step 1 to [char_lists folder](char_lists/), and the font file from Step 2 (.ttf) to the [fonts folder](fonts/), which are both found in the updater folder.
@@ -103,6 +178,8 @@ After you've made progress with translation and want to update the plugin, you c
9. Delete the unzipped `char_??` file, as the plugin only downloads the `char_??.zip` to aquire the character images.
10. Add, commit, push, and make a PR for one of the devs to accept.
11. Once the language is added to the plugin, you'll be able to see the result in-game.
+
+
## Contributing
We welcome contributions to improve our updater scripts. If you'd like to contribute, please refer to the main [README.md](../README.md) file for more information.
diff --git a/updater/remove_duplicate_dialogue.py b/updater/remove_duplicate_dialogue.py
new file mode 100644
index 00000000..a374e03a
--- /dev/null
+++ b/updater/remove_duplicate_dialogue.py
@@ -0,0 +1,70 @@
+import os
+import common_func
+import pandas as pd
+import shutil
+from datetime import datetime
+
+def create_backup(file_path):
+ directory, filename = os.path.split(file_path)
+ file_name_no_ext, file_extension = os.path.splitext(filename)
+ backup_dir = os.path.join(directory, 'backup')
+ if not os.path.exists(backup_dir):
+ os.makedirs(backup_dir)
+ datetime_str = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
+ backup_filename = f"{file_name_no_ext}_{datetime_str}{file_extension}"
+ backup_file_path = os.path.join(backup_dir, backup_filename)
+ shutil.copy(file_path, backup_file_path)
+ print(f"Backup created: {backup_file_path}")
+
+def remove_duplicate_dialogue(target_lang_code):
+ draft_dir = common_func.DRAFT_DIR
+ draft_lang_dir = os.path.join(draft_dir, target_lang_code)
+ file_path = os.path.join(draft_lang_dir, f"transcript_{target_lang_code}.xlsx")
+
+ if not os.path.exists(file_path):
+ print(f"File not found: {file_path}")
+ return
+
+ print(f"Processing: {file_path}")
+ create_backup(file_path)
+
+ # Read all sheets into memory first
+ xls = pd.ExcelFile(file_path)
+ sheet_names = xls.sheet_names
+
+ if 'dialogue' not in sheet_names:
+ print("No 'dialogue' sheet found in the file.")
+ return
+
+ all_sheets_data = {}
+ for sheet in sheet_names:
+ df = pd.read_excel(file_path, sheet_name=sheet)
+ if sheet == 'dialogue':
+ original_count = len(df)
+ df = df.drop_duplicates(subset=['english'], keep='first')
+ removed_count = original_count - len(df)
+ print(f"dialogue sheet: removed {removed_count} duplicate rows")
+ all_sheets_data[sheet] = df
+
+ # Close the reader before writing
+ del xls
+
+ with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
+ for sheet in sheet_names:
+ all_sheets_data[sheet].to_excel(writer, sheet_name=sheet, index=False)
+
+ print("Done!")
+
+def main():
+ print('tip: use ctr-c to force exit')
+ print('This script removes duplicate English entries from the dialogue sheet\nof the transcript_{lang}.xlsx file.')
+
+ target_lang_code = common_func.get_target_language()
+ if target_lang_code == 0:
+ print("Cannot process all languages at once")
+ return
+
+ remove_duplicate_dialogue(target_lang_code)
+
+if __name__ == "__main__":
+ main()
From 379f0183463f109c44c62db23aa40c5af6c56a42 Mon Sep 17 00:00:00 2001
From: lck3141592654 <30349312+lck3141592654@users.noreply.github.com>
Date: Sun, 24 May 2026 16:00:11 +0800
Subject: [PATCH 6/6] Resume anti-aliasing
---
updater/update_char_images.py | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/updater/update_char_images.py b/updater/update_char_images.py
index 7b67f958..a6d08e6b 100644
--- a/updater/update_char_images.py
+++ b/updater/update_char_images.py
@@ -174,13 +174,9 @@ def create_images(chars_list, font_path, output_dir, colors, lang):
draw = ImageDraw.Draw(image)
#draw shade of character for yellow only, because overhead texts look strange without it
- temp_img = Image.new('L', (new_width, new_height), 0)
- temp_draw = ImageDraw.Draw(temp_img)
- temp_draw.text((new_text_padding[0], new_text_padding[1]), char, font=font, fill=255)
- mask_img = temp_img.point(lambda x: 255 if x > 128 else 0, mode='1')
if colorName == 'yellow':
- draw.bitmap((new_text_padding[0] + BGTXTPAD[0], new_text_padding[1]+BGTXTPAD[1]), mask_img, fill=BGTEXTCOLOR[i])
- draw.bitmap((new_text_padding[0], new_text_padding[1]), mask_img, fill=color)
+ draw.text((new_text_padding[0] + BGTXTPAD[0], new_text_padding[1]+BGTXTPAD[1]), char, font=font, fill=BGTEXTCOLOR[i])
+ draw.text((new_text_padding[0], new_text_padding[1]), char, font=font, fill=color) # Draw the character
image_file_name = f'{charName}.png'
image.save(os.path.join(output_dir, image_file_name)) # Save the image