Skip to content

Instantly share code, notes, and snippets.

@morealaz
Last active March 12, 2024 21:21
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save morealaz/73508b951bb7588447a67c4ad88dc2dd to your computer and use it in GitHub Desktop.
Save morealaz/73508b951bb7588447a67c4ad88dc2dd to your computer and use it in GitHub Desktop.
تنظیمات فونت لینوکس

تنظیمات فونت لینوکس

مقدمه

تنظیمات فونت در لینوکس بر عهده برنامه fontconfig میباشد. این برنامه فونتهای سیستم را بر اساس الویت بندیهایی که قابل تنظیم میباشد مرتب میکند و در اختیار سایر برنامه ها قرار می دهد. مشکل اصلی که اکثر کاربران فارسی زبان لینوکس در ارتباط با fontconfig دارند عدم نمایش صحیح حروف فارسی می باشد که معمولا به دو دلیل زیر اتفاق می‌افتد:

  • نصب نبودن فونت مناسب بر روی سیستم که حروف فارسی را ساپورت کند
  • عدم وجود فایل تنظیمات fontconfig برای انتخاب فونت مناسب برای نمایش حروف فارسی

نصب فونت

نصب فونت در لینوکس به دو روش انجام میگیرد:

  1. از طریق مدیر بسته توزیع
  2. به صورت دستی توسط کاربر

نصب از طریق مدیر بسته توزیع لینوکس

در این روش همانند نصب سایر برنامه ها در لینوکس با استفاده از مدیر بسته، از بسته های فونت موجود در مخازن توزیع استفاده میکنیم. مزیت این روش استفاده از مدیر بسته برای مدیریت نصب فونتها می باشد و فونتهای نصب شده برای کل کاربران سیستم قابل استفاده می باشند. البته ممکن است فونت مورد نظر ما به صورت بسته در مخازن موجود نباشد که در این صورت از روش دستی برای نصب استفاده میکنیم.

نصب به صورت دستی توسط کاربر

در این روش کافی است فایل مربوط به فونت با پسوند ttf یا otf را در مسیرهای خاصی در سیستم کپی نماییم که قابل استفاده توسط fontconfig باشند. این روش به دو صورت قابل انجام است:

نصب برای کاربر

در این روش فایلها در دایرکتوری home کاربر در مسیر
~/.local/share/fonts/

کپی می شوند. با این روش فونتها فقط توسط کاربر فعلی قابل استفاده می باشند و کاربران دیگر سیستم به آنها دسترسی ندارند. بعد از نصب فونتها برای تازه سازی cache دستور زیر را باید اجرا نمایید:

$ fc-cache 

نصب برای کل سیستم

در این روش فایلها در مسیر
/usr/local/share/fonts/

کپی می شوند. با این روش فونتها توسط تمام کاربران سیستم قابل دسترسی و استفاده می باشند. بعد از نصب فونتها برای تازه سازی cache دستور زیر را باید اجرا نمایید:

$ sudo fc-cache -s

بعد از نصب فونتهای لازم کاربر میتواند در تنظیمات برنامه های مختلف در صورت امکان فونت مورد نظر خود را انتخاب کرده و از آن استفاده نماید ولی عیب این روش این است که اولا ممکن هست تمام برنامه ها امکان تنظیم فونت را نداشته باشند و از فونتهای پیش فرض سیستم استفاده کنند و ثانیه چون با انتخاب یک فونت از آن برای نمایش تمام کاراکترها استفاده می شود ممکن است کاراکترهای لازم برای زبانهای دیگر و عناصر دیگر مثل اموجی در فونت شما وجود نداشته باشد ویا اینکه از آنها خوشتان نیاد که در این صورت امکان انتخاب وجود ندارد.

با استفاده از fontconfig این امکان برای ما بوجود می آید که تنظیمات یکدستی برای کل سیستم داشته باشیم و سلسله مراتبی برای فونتهای پیش فرض سیستم مشخص کنیم که بر اساس آن از فونتهای مختلف برای نمایش کارکترهای مختلف استفاده شود.

روشی که برای تنظیمات بکار می بریم به این صورت است که برای ۳ خانواده کلی فونت یعنی خانواده های:

  • sans-serif
  • serif
  • monospace

فونتهای مورد نظر خود را به ترتیب اولویت مشخص میکنیم. به این ترتیب هر زمان برنامه ای نیاز به استفاده از یکی از این خانواده فونتها مثلا sans-serif داشت، به ترتیب اولویت از فونتهای مشخص شده استفاده می شود و هرگاه کاراکتری مورد نیاز بود که در آن فونت موجود نبود از فونت بعدی در لیست اولویت فونتهای آن خانواده استفاده می شود. در نتیجه با انتخاب یکی از این خانواده های فونت کلی به عنوان فونت پیش فرض برنامه های مختلف، می توانیم در تمام برنامه ها تنظیمات فونت یکدستی داشته باشیم.

انجام تنظیمات

انجام تنظیمات هم به صورت لوکال و هم به صورت گلوبال قابل اعمال است. در روش لوکال فایل تنظیمات در مسیر

~/.config/fontconfig/fonts.conf

کاربر قرار میگیرد و فقط برای کاربر اعمال می شود ولی در روش گلوبال فایل تنظیمات در مسیر

/etc/fonts/local.conf

قرار میگیرد و به کل سیستم اعمال می شود.

فرمت فایل تنظیمات از نوع XML می باشد که المانهای خاص خود را برای تنظیمات مختلف دارد. فایل تنظیمات مورد نظر ما به صورت زیر می باشد:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <!-- Default font for the Persian language (no fc-match pattern) -->
  <match>
    <test compare="contains" name="lang">
      <string>fa</string>
    </test>
    <edit mode="prepend" name="family">
      <string>Vazirmatn NL</string>
    </edit>
  </match>
  <!-- preferred fonts (first match will be used) -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Source Sans Pro</family>
      <family>Source Han Sans</family>
      <family>Vazirmatn NL</family>
      <family>Noto Sans</family>
      <family>DejaVu Sans</family>
      <family>JoyPixels</family>
    </prefer>
  </alias>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Source Serif Pro</family>
      <family>Source Han Serif</family>
      <family>Noto Serif</family>
      <family>DejaVu Serif</family>
      <family>JoyPixels</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>Source Code Pro</family>
      <family>Source Han Mono</family>
      <family>Noto Sans Mono</family>
      <family>DejaVu Sans Mono</family>
      <family>JoyPixels</family>
    </prefer>
  </alias>
  <!-- hinting/antialiasing settings -->
  <match target="font">
    <edit mode="assign" name="antialias">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="hinting">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="hintstyle">
      <const>hintslight</const>
    </edit>
    <edit mode="assign" name="lcdfilter">
      <const>lcddefault</const>
    </edit>
    <edit mode="assign" name="rgba">
      <const>rgb</const>
    </edit>
  </match>
</fontconfig>
همانطور که مشاهده میکنید در زیر خانواده های sans-serif و serif و monospace فونتهای مورد نظر برای آن خانواده را به ترتیب اولویت از بالا به پایین مشخص میکنیم.
به عنوان نمونه خانواده sans-serif به این صورت در تنظیمات من مشخص شده است:
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Source Sans Pro</family>
      <family>Source Han Sans</family>
      <family>Vazirmatn NL</family>
      <family>Noto Sans</family>
      <family>DejaVu Sans</family>
      <family>JoyPixels</family>
    </prefer>
  </alias>
به این ترتیب فونت Source Sans Pro به عنوان فونت اصلی خانواده sans-serif مورد استفاده قرار میگیرد و بعد از آن فونت Source Han Sans قرار دارد که برای نمایش کاراکترهای زبانهای آسیای شرقی شامل چینی و ژاپنی و کره ای مورد استفاده قرار میگیرد که در فونت Source Sans Pro موجود نمی باشند. بعد از آن فونت Vazir WOL قرار گرفته که نسخه بدون کاراکترهای لاتین فونت وزیر می باشد و چون در دو فونت قبلی کاراکترهای فارسی وجود ندارد از این فونت برای کاراکترهای فارسی استفاده می شود. در انتها هم فونتهای Noto Sans و DejaVu Sans را قرار داده ام که در صورتیکه کاراکتری در یکی از فونتهای قبلی موجود نبود به احتمال زیاد در این فونتها وجود دارد و از آنها استفاده شود.
ولی اما فونت آخر که فونت JoyPixels می باشد را در انتهای فونتهای هر سه خانواده قرار داده ام. این فونت یک فونت اموجی است که اموجی های رنگی زیادی دارد و کاراکترهای اموجی را برای برنامه ها فراهم میکند.فونتهای اموجی دیگری هم وجود دارد که میتوانید از آنها استفاده کنید مثل فونت Noto Color Emoji و Twemoji.
بدین ترتیب برای خانواده های دیگر فونت هم فونتهای مورد نظر را مشخص میکنیم

نکات مهم!!

  1. در انتخاب فونتها دقت کنید که حتما فونت مورد استفاده از نوع خانواده مورد نظر باشد.مثلا از فونت serif در خانواده monospace استفاده نکنید چون خانواده monospace برای محیطهایی استفاده می شود که نیاز به فونتهای هم عرض دارد مثل محیط ترمینال یا ویرایشگر کد.
  2. بعد از انجام این تنظیمات بایستی در تنظیمات برنامه ها و سیستم خود فونت مورد استفاده را از یکی از این خانواده های کلی فونت قرار دهید تا بتوانید از این تنظیمات استفاده کنید.
@amirhossein-ka
Copy link

دمت گرم (: 👍

@mh-firouzjah
Copy link

mh-firouzjah commented Jul 18, 2023

سلام. من این مشکل رو داشتم که روی توزیع جدیدم فونتها درست نبودن و همین راه حلی که گفتین براش استفاده کردم تا درست شد. فقط چندتا فونت خوب که استفاده کردم رو میخوام معرفی کنم

<family>Vazirmatn UI NL</family>=
<family>Open Sans</family>=
<family>Noto Sans CJK</family>=
<family>Noto Color Emoji</family>

monospaced
<family>Vazir Code WOL</family>
<family>Caskaydiacove Nerd Font Propo</family>=
<family>Hack Nerd Font Mono</family>=
<family>Noto Color Emoji</family>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment