تعیین Fallback font برای قلم‌های فارسی در WPF
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه


اکثر قلم‌های فارسی، فاقد تعاریف مرتبط با حروف انگلیسی هستند. البته عموم کاربران متوجه این امر نمی‌شوند چون ویندوز دو مفهوم Font Fallback و Font Linking را جهت پوشش glyph های تعریف نشده، در پشت صحنه اعمال خواهد کرد. جزئیات بیشتر در اینجا: (^ و ^)

به صورت خلاصه کار Font Fallback در ویندوز جایگزینی خودکار قلم مورد استفاده است؛ تحت شرایط زیر:
- فونت تعریف شده در برنامه، در سیستم کاربر وجود نداشته باشد.
- تعاریف Glyphهای بکارگرفته شده در متن جاری، در قلم انتخابی وجود نداشته باشند.

در WPF این مساله کاملا قابل کنترل است. قلمی که به صورت خودکار به عنوان جایگزین مطرح می‌شود در قلمی به نام "Global User Interface" تعریف شده است. تعاریف این قلم ترکیبی هم در فایلی به نام GlobalUserInterface.CompositeFont در پوشه فونت‌های سیستم موجود است (برای مثال، مسیر c:\windows\fonts حاوی این فایل متنی است).
اگر این فایل XML را با یک ادیتور متنی باز کنید، مشاهده خواهید کرد که بازه‌های مختلف کاراکترهای یونیکد، به فونت‌های پیش فرضی نگاشت شده‌اند. بنابراین اگر این سؤال وجود دارد که در متن مخلوط فارسی و انگلیسی من، فونت پیش فرض حروف انگلیسی از کجا تامین و مشخص می‌شود، پاسخ را در این فایل می‌توانید مشاهده کنید.

روش دیگری هم برای تعیین Fallback font در WPF وجود دارد. یک مثال:

<Window x:Class="WpfFontTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBlock
Text="نمایش مخلوطی از متن فارسی و متن English با هم"
Margin="7"
FontFamily="Fonts/BNazanin.ttf#B Nazanin, Comic Sans Ms"
FontSize="25"
FlowDirection="RightToLeft"
VerticalAlignment="Top" HorizontalAlignment="Center" />
</Grid>
</Window>

در این مثال فونت B Nazanin در برنامه قرار داده شده است (embedded font). همچنین در کنار آن پس از علامت کاما، Fallback font مشخص است. به این معنا که تاجایی که میسر است لطفا از فونت B Nazanin برای نمایش متن مورد نظر استفاده شود؛ اگر نشد از قلم Comic Sans Ms استفاده گردد. قلم B Nazanin حاوی تعاریف حروف انگلیسی نیست. بنابراین WPF جهت نمایش آن‌ها از فونت دوم معرفی شده کمک می‌گیرد. توضیحات بیشتر در اینجا: (^)

  • #
    ‫۱۱ سال و ۱۱ ماه قبل، جمعه ۵ آبان ۱۳۹۱، ساعت ۱۶:۴۳
    آقای نصیری من توی Embed کردن فونت به مشکل خوردم. میخوام از فونت Iranian Sans توی برنامم استفاده کنم. فایل فونت (irsans.ttf) رو در مسیر Resources/Fonts گذاشتم. حالا وقتی از روش‌های زیر برای تعیین فونت استفاده میکنم فونت کار نمیکنه.
    <Setter Property="FontFamily" Value="./Resources/Fonts/#Irsans" />
    <Setter Property="FontFamily" Value="Resources/Fonts/irsans.ttf" />
    فونت هم همون فونتی هست که در کتابخانه PdfReport شما مورد استفاده قرار گرفته.
    ممنون میشم راهنماییم کنید.
    • #
      ‫۱۱ سال و ۱۱ ماه قبل، جمعه ۵ آبان ۱۳۹۱، ساعت ۱۷:۰۳
      به این صورت کار می‌کنه:


      <TextBlock 
                  Text="نمایش مخلوطی از متن فارسی و متن English با هم"
                  Margin="7"
                  FontFamily="Fonts/irsans.ttf#Iranian Sans, Comic Sans Ms"
                  FontSize="25"
                  FlowDirection="RightToLeft"
                  VerticalAlignment="Top" HorizontalAlignment="Center"  />

  • #
    ‫۱۱ سال و ۹ ماه قبل، پنجشنبه ۲۸ دی ۱۳۹۱، ساعت ۱۳:۳۵
    سلام. برای تعیین Fallback font میشه مثلاً چندتا فونت دیگه هم گذاشت که به همین ترتیب اگر از هر کدوم نشد استفاده کرد از بعدی استفاده کنه یا فقط یک مورد رو میشه؟
    و سوال دومم اینه که چرا باید بعد از علامت # Iranian Sans (در مورد همین مثال) رو نوشت و وقتی نمی‌نویسیم کار نمیکنه.
    ممنون.
    • #
      ‫۱۱ سال و ۹ ماه قبل، پنجشنبه ۲۸ دی ۱۳۹۱، ساعت ۱۶:۲۳
      این موارد در آخرین لینکی که در متن مقاله است مفصل توضیح داده شده.
      - بله. امکان تعریف چندین قلم وجود دارد.
      - ذکر قسمت نام فایل اختیاری است (مثلا می‌شود به یک پوشه هم ارجاع داد). اما باید font family حتما ذکر شود.