Изменить семейство шрифтов для символов определенного языка / сценария с помощью fontconfig?

8

Я нахожусь на Arch Linux, Deepin Desktop. Я использую Noto Serif в качестве стандартного шрифта, но мне не нравятся его арабские символы. Поэтому моя цель - использовать другой шрифт только для арабских символов.

Вот что я попробовал. Я создал новый файл конфигурации /etc/fonts/conf.d/со следующим содержанием:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match target="pattern">
        <test name="lang" compare="contains">
            <string>ar</string>
        </test>
        <test qual="any" name="family">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Naskh Arabic</string>
        </edit>
    </match>

    <match target="pattern">
        <test name="lang" compare="contains">
            <string>ar</string>
        </test>
        <test qual="any" name="family">
            <string>serif</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Naskh Arabic</string>
        </edit>
    </match>
</fontconfig>

Я тогда побежал fc-cache -r. Но это не сработало, тот же шрифт все еще используется и выполняет fc-matchвозврат так NotoSerif-Regular.ttf: "Noto Serif" "Regular"же, как и раньше.

Омар Эмара
источник
Какое имя вы дали свой файл конфигурации? Какая у вас локаль (или, точнее, LC_CTYPEкатегория локали)?
Гуннар
@GunnarHjalmarsson Я использую 99-bangla.confв ~/.config/fontconfig/conf.dкаталоге. Похоже, я получаю значение по умолчанию при запуске LANG=bn fc-match. Но Google Chrome по-прежнему выбирает другой шрифт
Anwar

Ответы:

2

Многие шрифты Noto сообщают системе, что они поддерживают арабский алфавит, что они и делают - частично. Одним из этих шрифтов является шрифт урду , и по какой-либо причине он имеет приоритет над другими шрифтами, которые поддерживают арабский скрипт.

Вы можете предпочесть определенный шрифт над другими следующим образом:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

<alias>
  <family>sans-serif</family>
  <prefer>
   <family>Noto Sans</family>
   <family>Noto Naskh Arabic</family>
  </prefer>
 </alias>

 <alias>
  <family>serif</family>
  <prefer>
   <family>Noto Serif</family>
   <family>Noto Naskh Arabic</family>
  </prefer>
 </alias>

 <alias>
  <family>monospace</family>
  <prefer>
   <family>Noto Sans Mono</family>
   <family>Noto Naskh Arabic</family>
  </prefer>
 </alias>

</fontconfig>

Чем выше позиция шрифта, тем предпочтительнее он. В этом случае мы предпочитаем Noto Naskh Arabicдругие арабские шрифты.

Конечно, вы можете сделать это с любым языком или шрифтом по вашему выбору.

По какой-то причине у меня работал только файл конфигурации пользователя, расположенный в ~/.config/fontconfig/fonts.conf. Обратите внимание, что $XDG_CONFIG_HOMEпеременная окружения должна быть установлена ​​в вашем .configкаталоге в вашем домашнем каталоге, поэтому $HOME/.config.

Затем вам нужно перестроить конфигурацию, чтобы она вступила в силу, используя fc-cache. Только новые запущенные приложения будут отображаться с новой конфигурацией. Перезапустите X-сервер или рабочий стол, чтобы изменения вступили в силу в глобальном масштабе.

Изменить: Если вы сопоставляете с arязыковым стандартом, который просто не будет работать на всех веб-сайтах, потому что некоторые веб-сайты используют enязыковой стандарт при отображении арабских символов UTF-8.

Если вы зайдете /etc/fonts/conf.dи прочитаете, READMEа затем прочитаете любой файл конфигурации, начиная с [30-40]того, что вы знаете, что это правильный ответ.

Если, скажем, веб-сайт запрашивает шрифт с засечками; fontconfig просматривает этот список, во-первых Noto Serif, когда он находит арабский символ, он прибегает ко второму шрифту в списке Noto Naskh Arabic- и обнаруживает, что шрифт поддерживает арабский скрипт, поэтому он используется.

Халед Эмара
источник
1
Спасибо! Похоже, для Deepin простое добавление <string>Noto Naskh Arabic</string>в ~/.config/fontconfig/conf.d/99-deepin.confфайл делает свою работу.
Омар Эмара
Я думаю, имя файла должно быть от 50 до 69 в Ubuntu
Anwar