Skip to content

Instantly share code, notes, and snippets.

@hunzo
Last active October 14, 2025 03:25
Show Gist options
  • Save hunzo/4a032a17297d3e487bfd7fd1bd845931 to your computer and use it in GitHub Desktop.
Save hunzo/4a032a17297d3e487bfd7fd1bd845931 to your computer and use it in GitHub Desktop.
create file /etc/fonts/conf.d/99-segoe-ui-alias.conf
#!/bin/bash
CONF_FILE_1="/etc/fonts/conf.d/99-fix-all-thai.conf"
sudo tee "$CONF_FILE_1" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<alias>
<family>Arial</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Helvetica</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Verdana</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Tahoma</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
</fontconfig>
EOF
# Rebuild font cache
sudo fc-cache -vf
echo "✅ Thai font fix applied. Now sans-serif (lang=th) will use Noto Sans Thai."
#!/bin/bash
# Fix Thai font rendering on Linux Mint/Noto
# Force sans-serif (Thai) to use Noto Sans Thai
CONF_FILE_1="/etc/fonts/conf.d/99-fix-thai.conf"
sudo tee "$CONF_FILE_1" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Webfont</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans</string>
</edit>
</match>
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans</string>
</edit>
</match>
<match target="pattern">
<test name="lang" compare="contains"><string>th</string></test>
<test name="family" qual="any"><string>sans-serif</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans Thai</string>
</edit>
</match>
</fontconfig>
EOF
CONF_FILE_2="/etc/fonts/conf.d/99-fix-segoe-ui-alias.conf"
sudo tee "$CONF_FILE_2" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Regular -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>regular</const>
</edit>
</match>
<!-- Light -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Light</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>light</const>
</edit>
</match>
<!-- Semibold -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Semibold</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>semibold</const>
</edit>
</match>
<!-- Bold -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Bold</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>bold</const>
</edit>
</match>
<!-- Black -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Black</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>black</const>
</edit>
</match>
<!-- Italic -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Italic</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Noto Sans</string>
</edit>
<edit name="slant" mode="assign" binding="strong">
<const>italic</const>
</edit>
</match>
<!-- Aliases -->
<alias>
<family>Segoe UI</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Light</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Semibold</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Bold</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Black</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Italic</family>
<prefer>
<family>Noto Sans</family>
</prefer>
</alias>
</fontconfig>
EOF
# Rebuild font cache
sudo fc-cache -vf
echo "✅ Thai font fix applied. Now sans-serif (lang=th) will use Noto Sans Thai."
#!/bin/bash
# Fix Thai font rendering on Linux Mint/Ubuntu
# Force sans-serif (Thai) to use Noto Sans Thai
CONF_FILE_1="/etc/fonts/conf.d/99-fix-thai.conf"
sudo tee "$CONF_FILE_1" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Webfont</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Ubuntu Sans</string>
</edit>
</match>
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Ubuntu Sans</string>
</edit>
</match>
<match target="pattern">
<test name="lang" compare="contains"><string>th</string></test>
<test name="family" qual="any"><string>sans-serif</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans Thai</string>
</edit>
</match>
</fontconfig>
EOF
CONF_FILE_2="/etc/fonts/conf.d/99-fix-segoe-ui-alias.conf"
sudo tee "$CONF_FILE_2" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Regular -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>regular</const>
</edit>
</match>
<!-- Light -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Light</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>light</const>
</edit>
</match>
<!-- Semibold -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Semibold</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>semibold</const>
</edit>
</match>
<!-- Bold -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Bold</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>bold</const>
</edit>
</match>
<!-- Black -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Black</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="weight" mode="assign" binding="strong">
<const>black</const>
</edit>
</match>
<!-- Italic -->
<match target="pattern">
<test name="family" qual="any">
<string>Segoe UI Italic</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>Ubuntu Sans</string>
</edit>
<edit name="slant" mode="assign" binding="strong">
<const>italic</const>
</edit>
</match>
<!-- Aliases -->
<alias>
<family>Segoe UI</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Light</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Semibold</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Bold</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Black</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
<alias>
<family>Segoe UI Italic</family>
<prefer>
<family>Ubuntu Sans</family>
</prefer>
</alias>
</fontconfig>
EOF
# Rebuild font cache
sudo fc-cache -vf
echo "✅ Thai font fix applied. Now sans-serif (lang=th) will use Noto Sans Thai."
#!/usr/bin/env bash
# Map Segoe UI* + Arial/Helvetica/Verdana/Tahoma/sans-serif -> Noto Sans Thai (fontconfig)
# Usage:
# sudo bash install-thai-font-mapping.sh
# sudo bash install-thai-font-mapping.sh --uninstall
set -euo pipefail
CONF_DIR="/etc/fonts/conf.d"
CONF_FILE="$CONF_DIR/99-thai-all-to-noto-sans-thai.conf"
ensure_fonts() {
# Best-effort install Noto Sans Thai
if command -v apt >/dev/null 2>&1; then
DEBIAN_FRONTEND=noninteractive apt-get update -y || true
DEBIAN_FRONTEND=noninteractive apt-get install -y fonts-noto-core || true
elif command -v dnf >/dev/null 2>&1; then
dnf install -y google-noto-sans-thai-fonts || true
elif command -v yum >/dev/null 2>&1; then
yum install -y google-noto-sans-thai-fonts || true
elif command -v pacman >/dev/null 2>&1; then
pacman -Sy --noconfirm noto-fonts || true
elif command -v zypper >/dev/null 2>&1; then
zypper -n install noto-sans-thai-fonts || true
fi
}
uninstall() {
echo "Removing $CONF_FILE ..."
rm -f "$CONF_FILE" || true
echo "Rebuilding font cache..."
fc-cache -vf
echo "✅ Uninstalled mapping."
exit 0
}
if [[ "${1:-}" == "--uninstall" ]]; then
uninstall
fi
ensure_fonts
install -d "$CONF_DIR"
tee "$CONF_FILE" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- A) Force common families to Noto Sans Thai -->
<alias>
<family>Arial</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Helvetica</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Verdana</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>Tahoma</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer><family>Noto Sans Thai</family></prefer>
</alias>
<!-- B) Strong override: if lang contains Thai and family requests sans-serif, use Noto Sans Thai -->
<match target="pattern">
<test name="lang" compare="contains"><string>th</string></test>
<test name="family" qual="any"><string>sans-serif</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans Thai</string>
</edit>
</match>
<!-- C) Normalize Segoe UI* -> Noto Sans Thai (cover variants) -->
<!-- Regular -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="weight" mode="assign" binding="strong"><const>regular</const></edit>
</match>
<!-- Light -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Light</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="weight" mode="assign" binding="strong"><const>light</const></edit>
</match>
<!-- Semibold -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Semibold</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="weight" mode="assign" binding="strong"><const>semibold</const></edit>
</match>
<!-- Bold -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Bold</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="weight" mode="assign" binding="strong"><const>bold</const></edit>
</match>
<!-- Black -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Black</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="weight" mode="assign" binding="strong"><const>black</const></edit>
</match>
<!-- Italic -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Italic</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
<edit name="slant" mode="assign" binding="strong"><const>italic</const></edit>
</match>
<!-- Webfont alias -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Webfont</string></test>
<edit name="family" mode="assign_replace" binding="strong"><string>Noto Sans Thai</string></edit>
</match>
<!-- D) (Optional) Explicit aliases to aid apps that read only alias blocks -->
<alias><family>Segoe UI</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Segoe UI Light</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Segoe UI Semibold</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Segoe UI Bold</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Segoe UI Black</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Segoe UI Italic</family><prefer><family>Noto Sans Thai</family></prefer></alias>
</fontconfig>
EOF
echo "Rebuilding font cache..."
fc-cache -vf
echo "✅ Applied mapping: Segoe UI*, Arial/Helvetica/Verdana/Tahoma/sans-serif → Noto Sans Thai"
echo "Quick checks:"
echo " fc-match 'sans-serif:lang=th' # expect NotoSansThai*.ttf"
echo " fc-match 'Arial:lang=th' # expect NotoSansThai*.ttf"
echo " fc-match 'Segoe UI' # expect NotoSansThai*.ttf"
echo " fc-match 'Segoe UI:style=Bold' # expect NotoSansThai-Bold*.ttf"
#!/usr/bin/env bash
set -euo pipefail
echo "[*] Installing fonts (if available)..."
if command -v apt >/dev/null 2>&1; then
sudo apt update
sudo apt install -y fonts-noto-core fonts-noto-color-emoji fonts-noto-mono || true
# ลองติดตั้งแพ็กเกจ TLWG ไทย (metapackage ชื่อ fonts-thai-tlwg) ถ้ามี
sudo apt install -y fonts-thai-tlwg || true
fi
CONF_FILE="/etc/fonts/conf.d/99-thai-emoji-mono.conf"
echo "[*] Writing config to $CONF_FILE ..."
sudo tee "$CONF_FILE" >/dev/null <<'EOF'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Map Windows sans-like fonts ไป Noto Sans Thai/Thai first -->
<alias><family>Arial</family> <prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Helvetica</family> <prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Verdana</family> <prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>Tahoma</family> <prefer><family>Noto Sans Thai</family></prefer></alias>
<alias><family>sans-serif</family><prefer><family>Noto Sans Thai</family></prefer></alias>
<!-- Segoe UI → Noto Sans -->
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI Webfont</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans</string>
</edit>
</match>
<match target="pattern">
<test name="family" qual="any"><string>Segoe UI</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans</string>
</edit>
</match>
<alias><family>Segoe UI</family> <prefer><family>Noto Sans</family></prefer></alias>
<alias><family>Segoe UI Light</family> <prefer><family>Noto Sans</family></prefer></alias>
<alias><family>Segoe UI Semibold</family> <prefer><family>Noto Sans</family></prefer></alias>
<alias><family>Segoe UI Bold</family> <prefer><family>Noto Sans</family></prefer></alias>
<alias><family>Segoe UI Black</family> <prefer><family>Noto Sans</family></prefer></alias>
<alias><family>Segoe UI Italic</family> <prefer><family>Noto Sans</family></prefer></alias>
<!-- ถ้า lang=th และ family = sans-serif ให้ใช้ Noto Sans Thai -->
<match target="pattern">
<test name="lang" compare="contains"><string>th</string></test>
<test name="family" qual="any"><string>sans-serif</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>Noto Sans Thai</string>
</edit>
</match>
<!-- Monospace settings -->
<!-- Map Windows monospace ไป Noto Sans Mono -->
<alias><family>Consolas</family> <prefer><family>Noto Sans Mono</family></prefer></alias>
<alias><family>Courier New</family> <prefer><family>Noto Sans Mono</family></prefer></alias>
<alias><family>Lucida Console</family><prefer><family>Noto Sans Mono</family></prefer></alias>
<!-- General monospace alias -->
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono</family>
<family>TlwgMono</family>
</prefer>
</alias>
<!-- ถ้าเป็นภาษาไทย ใน monospace → ใช้ TlwgMono -->
<match target="pattern">
<test name="lang" compare="contains"><string>th</string></test>
<test name="family" qual="any"><string>monospace</string></test>
<edit name="family" mode="assign_replace" binding="strong">
<string>TlwgMono</string>
</edit>
</match>
<!-- Emoji fallback (append) -->
<match target="pattern">
<test name="family" qual="any"><string>sans-serif</string></test>
<edit name="family" mode="append" binding="strong">
<string>Noto Color Emoji</string>
</edit>
</match>
<match target="pattern">
<test name="family" qual="any"><string>monospace</string></test>
<edit name="family" mode="append" binding="strong">
<string>Noto Color Emoji</string>
</edit>
</match>
<alias><family>Segoe UI Emoji</family> <prefer><family>Noto Color Emoji</family></prefer></alias>
<alias><family>Segoe UI Symbol</family> <prefer><family>Noto Color Emoji</family></prefer></alias>
<alias><family>Apple Color Emoji</family><prefer><family>Noto Color Emoji</family></prefer></alias>
<alias><family>Twitter Color Emoji</family><prefer><family>Noto Color Emoji</family></prefer></alias>
<alias><family>EmojiOne Color</family> <prefer><family>Noto Color Emoji</family></prefer></alias>
</fontconfig>
EOF
echo "[*] Updating font cache..."
sudo fc-cache -fv
echo "[✓] Configuration updated."
echo "Test sans: echo 'สวัสดี 😀🔥🎉'"
echo "Test mono: printf '|%s|\\n' 'ภาษาไทย' 'ABC123'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment