۱۳۹۰/۱۱/۲۶

تعيين 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 جهت نمايش آن‌ها از فونت دوم معرفي شده كمك مي‌گيرد. توضيحات بيشتر در اينجا: (^)