Локализация (перевод) драйверов PPD

Производители печатного оборудования офисного уровня (принтеров, МФУ и т.п.), к сожалению, далеко не всегда радуют пользователей операционных систем отличных от Windows. Иногда, даже если есть драйвер PPD для CUPS для нужной модели принтера, он не доступен на родном языке пользователя. Я использую русскую локаль (ru_RU) и в данной заметке покажу, как можно к родному английскому языку драйвера добавить перевод на русский язык. Информации по этой теме в интернете крайне мало. Я нашёл только статью "PPD Extensions" и раздел "Globalized PPD Support" в документации CUPS.

Реальный пример

Уважающий себя производитель Konika Minolta выкладывает драйвера для своего оборудования в том числе и для Linux. Но вот для модели Bizhub C452 доступны драйвера только для нескольких европейских языков, среди которых нет русского. Я скачал архив BHC652PPDLinux_200000002MU.zip, в котором в отдельных каталогах для каждого языка располагались драйвера в виде файлов KOC652opn.ppd и KOC652UX.ppd. Последний я скопировал под своим именем - my_KOC652UX.ppd. Вся работа по переводу будет производиться по нему.
Заголовочную часть я оставил практически без изменений. Лишь добавил строку:
*cupsLanguages: "ru_RU"
Я пропустил разделы опциональных устройств принтера, которых у меня нет и приступил к добавлению переводов по интересующим строкам.
Есть опции, описания которых заключены между объявлениями *OpenUI и *CloseUI. Эти опции описывают элементы управления на форме параметров принтера. Например, мне попадались описания выпадающих списков и переключателей.
Для перевода названия самого параметра нужно добавлять "*ru_RU.Translation", а для перевода опций этого параметра - "*ru_RU.". Проще это всё показать на примере. Вот пример перевода переключателя. Было:

*OpenUI *Collate/Collate: Boolean
*OrderDependency: 1 AnySetup *Collate
*DefaultCollate: True
*Collate False/Off:  "<< /Collate false >> setpagedevice"
*Collate True/On:  "<< /Collate true >> setpagedevice"
*CloseUI: *Collate
Стало:

*OpenUI *Collate/Collate: Boolean
*OrderDependency: 1 AnySetup *Collate
*DefaultCollate: True
*ru_RU.Translation Collate/Разбор по копиям: ""
*Collate False/Off:  "<< /Collate false >> setpagedevice"
*ru_RU.Collate False/Отключено:  "<< /Collate false >> setpagedevice"
*Collate True/On:  "<< /Collate true >> setpagedevice"
*ru_RU.Collate True/Включено:  "<< /Collate true >> setpagedevice"
*CloseUI: *Collate
Вот пример перевода выпадающего списка. Было:

*OpenUI *InputSlot/Paper Tray: PickOne
*OrderDependency: 50 AnySetup *InputSlot
*DefaultInputSlot: AutoSelect
*InputSlot AutoSelect/Auto Select:  ""
*InputSlot Tray1/Tray1:  "<< /ManualFeed false /MediaPosition 0 /TraySwitch false >> setpagedevice"
*InputSlot Tray2/Tray2:  "<< /ManualFeed false /MediaPosition 1 /TraySwitch false >> setpagedevice"
*InputSlot Tray3/Tray3:  "<< /ManualFeed false /MediaPosition 2 /TraySwitch false >> setpagedevice"
*InputSlot Tray4/Tray4:  "<< /ManualFeed false /MediaPosition 3 /TraySwitch false >> setpagedevice"
*InputSlot LCT_Donau/LCT:  "<< /ManualFeed false /MediaPosition 4 /TraySwitch false >> setpagedevice"
*InputSlot ManualFeed/Bypass Tray:  "<< /ManualFeed true /TraySwitch false >> setpagedevice"
*CloseUI: *InputSlot
Стало:

*OpenUI *InputSlot/Paper Tray: PickOne
*OrderDependency: 50 AnySetup *InputSlot
*DefaultInputSlot: AutoSelect
*ru_RU.Translation InputSlot/Лоток загрузки бумаги: ""
*InputSlot AutoSelect/Auto Select:  ""
*ru_RU.InputSlot AutoSelect/Автовыбор:  ""
*InputSlot Tray1/Tray1:  "<< /ManualFeed false /MediaPosition 0 /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot Tray1/Лоток 1:  "<< /ManualFeed false /MediaPosition 0 /TraySwitch false >> setpagedevice"
*InputSlot Tray2/Tray2:  "<< /ManualFeed false /MediaPosition 1 /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot Tray2/Лоток 2:  "<< /ManualFeed false /MediaPosition 1 /TraySwitch false >> setpagedevice"
*InputSlot Tray3/Tray3:  "<< /ManualFeed false /MediaPosition 2 /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot Tray3/Лоток 3:  "<< /ManualFeed false /MediaPosition 2 /TraySwitch false >> setpagedevice"
*InputSlot Tray4/Tray4:  "<< /ManualFeed false /MediaPosition 3 /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot Tray4/Лоток 4:  "<< /ManualFeed false /MediaPosition 3 /TraySwitch false >> setpagedevice"
*InputSlot LCT_Donau/LCT:  "<< /ManualFeed false /MediaPosition 4 /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot LCT_Donau/Лоток большой ёмкости:  "<< /ManualFeed false /MediaPosition 4 /TraySwitch false >> setpagedevice"
*InputSlot ManualFeed/Bypass Tray:  "<< /ManualFeed true /TraySwitch false >> setpagedevice"
*ru_RU.InputSlot ManualFeed/Лоток ручной подачи:  "<< /ManualFeed true /TraySwitch false >> setpagedevice"
*CloseUI: *InputSlot
На картинке визуально легче определить изменения:
Описания некоторых опций занимают несколько строк. Например:

*MediaType Plain/Plain Paper:  "<< /KMMediaType (Plain) /KMMediaColor (None) /KMMediaWeight (Normal) /MediaTabType (None) /MediaPreprinted false /MediaPrepunched false >> 
 /KMOptions /ProcSet findresource /setKMoptions get exec"
*End
Для перевода такой опции надо так же копировать всё целиком от "*MediaType" до "*End":

*ru_RU.MediaType Plain/Обычная бумага:  "<< /KMMediaType (Plain) /KMMediaColor (None) /KMMediaWeight (Normal) /MediaTabType (None) /MediaPreprinted false /MediaPrepunched false >> 
 /KMOptions /ProcSet findresource /setKMoptions get exec"
*End
В конце файла дополнил раздел "Change Log":

*% === Change Log =============================
*% 25.08.2015 Add russian translations
Вот как выглядит результат перевода с точки зрения пользователя. Было:
Стало:
За перевод некоторых надписей отвечает система (на снимках видно, что даже в родном английском варианте есть русские слова). Но в результате работы по переводу практически все строки стали на русском языке. Вот ссылка на получившийся переведённый файл.

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа