From d878496a2fb9e3c7f48261f866cb285dfa987298 Mon Sep 17 00:00:00 2001 From: Wu Xiaotian Date: Mon, 31 Jul 2023 15:39:06 +0800 Subject: Improve the Chinese, Japanese and Korean text menu layout (#1945) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this patch, menus in Korean language would not be aligned: ``` Archinstall 언어 Korean (71%) > Mirrors Locales Defined Disk configuration 부트로더 Systemd-boot 스왑 True ``` After apply this patch, menus in Korean language are aligned: ``` Archinstall 언어 Korean (71%) > Mirrors Locales Defined Disk configuration 부트로더 Systemd-boot 스왑 True ``` --- archinstall/lib/menu/abstract_menu.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py index eee99747..f12d2b73 100644 --- a/archinstall/lib/menu/abstract_menu.py +++ b/archinstall/lib/menu/abstract_menu.py @@ -1,4 +1,5 @@ from __future__ import annotations +import unicodedata from typing import Callable, Any, List, Iterator, Tuple, Optional, Dict, TYPE_CHECKING @@ -9,6 +10,22 @@ from ..translationhandler import TranslationHandler, Language if TYPE_CHECKING: _: Any +def count_cjk_chars(string): + "Count the total number of CJK characters contained in a string" + return sum(unicodedata.east_asian_width(c) in 'FW' for c in string) + +def cjkljust(string, width, fillbyte=' '): + """Support left alignment of Chinese, Japanese, Korean text + >>> cjkljust('Hello', 15, '*') + 'Hello**********' + >>> cjkljust('你好', 15, '*') + '你好***********' + >>> cjkljust('안녕하세요', 15, '*') + '안녕하세요*****' + >>> cjkljust('こんにちは', 15, '*') + 'こんにちは*****' + """ + return string.ljust(width - count_cjk_chars(string), fillbyte) class Selector: def __init__( @@ -128,7 +145,7 @@ class Selector: if current: padding += 5 - description = str(self._description).ljust(padding, ' ') + description = cjkljust(str(self._description), padding, ' ') current = current else: description = self._description -- cgit v1.2.3-54-g00ecf