Журнал LinuxFormat - перейти на главную

LXF136:Gettext

Материал из Linuxformat
Перейти к: навигация, поиск
Пе­ре­вод Сде­ла­ем от­кры­тое ПО дос­туп­ным не­анг­ло­го­во­ря­щим

Содержание

Gettext: Ска­жи свое сло­во

Ес­ли анг­лий­ский для вас – ино­стран­ный язык, по­че­му бы не по­мочь пе­ре­вес­ти про­грам­мы на род­ную речь? Коэн Верв­лое­сем по­ка­зы­ва­ет, как.

LXF136 72 1.jpg Не уве­рен на­счет высказывания гномьего воина, но ду­маю, что су­мею пе­ре­вес­ти ‘Giant Rat’!

Хо­ти­те по­мочь лю­би­мой от­кры­той про­грам­ме, но не знае­те как, по­то­му что про­грам­мист вы неопыт­ный? Ес­ли анг­лий­ский для вас – ино­стран­ный язык, пе­ре­ве­ди­те про­грам­му на ваш соб­ствен­ный! Но за­чем этим занимать­ся? Как чи­та­тель Linux Format, вы, на­вер­ное, непло­хо знае­те анг­лий­ский, а то и во­об­ще пред­по­чи­тае­те анг­лий­скую вер­сию про­грам­мы, так как это ори­ги­нал, и, сле­до­ва­тель­но, бли­же к идее. Но есть ведь и дру­гие лю­ди, ко­то­рые го­во­рят на ва­шем род­ном язы­ке, а анг­лий­ский зна­ют ху­же, и от­сут­ствие хо­ро­ше­го пе­ре­во­да за­трудня­ет им ра­бо­ту с про­грам­мой. Так по­че­му бы не по­мочь им, сде­лав этот пе­ре­вод?

Спер­ва на­до бы уз­нать, как про­грам­ма «под­це­п­ля­ет» пе­ре­вод. Мно­гие по­пу­ляр­ные про­грам­мы с от­кры­тым ис­ход­ным ко­дом при­ме­ня­ют под­ход GNU Gettext, оп­ре­де­ляю­щий, как долж­на быть напи­са­на про­грам­ма, что­бы она под­дер­жи­ва­ла пе­ре­ве­ден­ные со­об­щения. Про­ект так­же со­дер­жит биб­лио­те­ку вре­мени вы­полнения, ко­то­рой долж­ны поль­зо­вать­ся про­грам­ми­сты, что­бы их со­об­щения пе­ре­во­ди­лись, и ряд ути­лит в по­мощь пе­ре­во­дчи­ку.

Пе­ре­во­дчи­ки обыч­но не ра­бо­та­ют с Gettext на­пря­мую, но по­лез­но знать, как он ра­бо­та­ет в це­лом. Ес­ли про­грам­ма на C вы­во­дит сле­дую­щее со­об­щение:

printf(“Unknown command: %s.\n”, command);

про­грам­мист мо­жет сде­лать его пе­ре­во­ди­мым, при­ме­нив функ­цию gettext ко всем стро­кам та­ким об­ра­зом:

printf(gettext(“Unknown command: %s.\n”), command);

Пра­виль­но на­стро­ен­ная функ­ция gettext ищет пе­ре­дан­ную ей стро­ку в фай­лах пе­ре­во­да, и ес­ли пе­ре­вод есть, воз­вра­ща­ет стро­ку на язы­ке поль­зо­ва­те­ля. В про­тив­ном слу­чае воз­вра­ща­ет­ся ис­ход­ная стро­ка. Язык поль­зо­ва­те­ля обыч­но задается в ок­ру­жении ра­бо­че­го сто­ла или вруч­ную в скрип­те X-сес­сии в пе­ре­мен­ной ок­ру­жения LC_MESSAGES.

Так как gettext() во­круг ка­ж­дой стро­ки за­гро­мо­ж­да­ет код, в боль­шин­стве про­грамм оп­ре­де­ля­ет­ся псев­доним _ (на C: #define _(string) gettext (string)), де­лаю­щий код на C по­ко­ро­че:

printf(_(“Unknown command: %s.\n”), command);

Реа­ли­за­ция Gettext су­ще­ству­ет не толь­ко для C, но и для мно­же­ства дру­гих язы­ков и про­грамм­ных обо­ло­чек. Она бы­ст­ро ста­ла стан­дар­том для пе­ре­во­да от­кры­тых про­грамм, хо­тя неко­то­рые про­ек­ты, на­при­мер, OpenOffice.org и Mozilla, име­ют соб­ствен­ный фор­мат.

Фай­лы и функ­ции

LXF136 73 1.jpg Пе­ре­вод иг­ры в фан­та­сти­че­ском ми­ре — пре­крас­ный спо­соб вы­учить но­вые сло­ва!

Но от­ку­да бе­рут­ся фай­лы с пе­ре­во­да­ми? Для это­го в Gettext есть коман­да xgettext. Ес­ли пе­ре­дать ей файл про­грам­мы на C, в ко­то­рой вы­зы­ва­ет­ся функ­ция gettext, она соз­даст файл .pot (ма­шин­но-неза­ви­си­мый шаб­лон объ­ек­та) со спи­ском всех пе­ре­во­ди­мых строк фай­ла. В на­шем при­ме­ре файл .pot бу­дет со­дер­жать сле­дую­щие стро­ки:

#: src/command.c:14
msgid “Unknown command: %s.\n”
msgstr “”

Об­ра­ти­те внимание, что файл .pot ссыла­ет­ся на точ­ную по­зи­цию стро­ки в ис­ход­ном фай­ле про­грам­мы. Бла­го­да­ря это­му пе­ре­во­дчик мо­жет об­ра­тить­ся к кон­тек­сту, ес­ли не уве­рен в пра­виль­но­сти пе­ре­во­да.

Од­на­ко пе­ре­во­дчи­ки никогда не ра­бо­та­ют с фай­ла­ми .pot на­пря­мую – в кон­це кон­цов, это шаб­ло­ны. На осно­ве фай­ла .pot дру­гая ути­ли­та Gettext, Msginit, соз­да­ет файл .po (ма­шин­но-неза­ви­си­мый объ­ект). На­при­мер, ес­ли для про­ек­та нет пе­ре­во­да на русский, а вы ре­ши­ли его соз­дать, за­пусти­те коман­ду:

msginit --locale=ru --input=command.pot

Соз­да­ст­ся файл ru.po, ко­то­рый вы смо­же­те от­ре­дак­ти­ро­вать.

Пре­ды­ду­щую стро­ку мож­но пе­ре­вес­ти та­ким об­ра­зом:

#: src/command.c:14
msgid “Unknown command: %s.\n”
msgstr “Не­из­вест­ная ко­ман­да: %s.\n”

И, на­конец, все фай­лы .po про­грам­мы ком­пи­ли­ру­ют­ся в дво­ич­ный фор­мат еще од­ной ути­ли­той Gettext – Msgfmt. Ре­зуль­ти­рую­щие фай­лы име­ют рас­ши­рение .mo (ма­шин­ный объ­ект) и рас­про­стра­ня­ют­ся вме­сте с дво­ич­ны­ми фай­ла­ми про­грам­мы. При уста­нов­ке они ко­пи­ру­ют­ся в /usr/local/share/locale/код_язы­ка/LC_MESSAGES/program.mo, где код_язы­ка за­ме­ня­ет­ся ко­дом язы­ка для всех су­ще­ствую­щих пе­ре­во­дов.

Все это обыч­но осу­ще­ств­ля­ет­ся ав­то­ма­ти­че­ски в фай­лах Makefile или дру­гих скрип­тах сбор­ки. Кро­ме то­го, боль­шин­ство ша­гов пре­об­ра­зо­ваний и дру­гих команд об­ра­ба­ты­ва­ют­ся ку­ра­то­ром пе­ре­во­дов или про­грам­ми­ста­ми. По­это­му не бой­тесь на­ших объ­яснений – вам нуж­но лишь от­ре­дак­ти­ро­вать фай­лы .po! Так как для пе­ре­во­дчи­ка эти фай­лы – то же, что ис­ход­ный код для про­грам­ми­ста, рас­смот­рим неко­то­рые де­та­ли: ком­мен­та­рии и фор­мы мно­же­ствен­но­го чис­ла.

Ком­мен­та­рии и плю­ра­лиз­мы

Пе­ред стро­кой msgid в фай­ле .po мо­гут быть ком­мен­та­рии раз­лич­ных ти­пов, и боль­шин­ство из них ав­то­ма­ти­че­ски генери­ру­ет­ся ути­ли­та­ми Gettext. Мы уже ви­де­ли стро­ку ком­мен­та­рия, на­чи­наю­щую­ся с сим­во­лов #: и со­дер­жа­щую ссыл­ку на стро­ку ис­ход­но­го ко­да про­грам­мы. Ком­мен­та­рии дру­го­го ти­па на­чи­на­ют­ся с #. — их пи­шут про­грам­ми­сты для пе­ре­во­дчи­ка, что­бы пе­ре­дать кон­текст или пре­ду­пре­дить о часто со­вер­шае­мой ошиб­ке.

Ком­мен­та­рии третье­го ти­па на­чи­на­ют­ся с #, и со­дер­жат флаж­ки. В про­ти­во­по­лож­ность #: и #., пред­на­зна­чен­ным толь­ко для ин­фор­ма­ции, ком­мен­та­рии ти­па #, ин­тер­пре­ти­ру­ют­ся ре­дак­то­ром .po. Один из са­мых по­пу­ляр­ных фла­гов – fuzzy:

#, fuzzy

Ути­ли­та Gettext Msgmerge обыч­но припи­сы­ва­ет этот фла­жок к со­об­щению, ко­то­рое бы­ло из­менено в ис­ход­ном ко­де, но не об­нов­ле­но в пе­ре­во­де. Для пе­ре­во­дчи­ка это знак по­смот­реть на пе­ре­вод и при­нять во внимание со­об­щение ори­ги­на­ла. Пе­ре­во­дчик мо­жет вруч­ную по­ме­тить пе­ре­вод фла­гом fuzzy, ес­ли со­мнева­ет­ся, что он ве­рен, что­бы не за­быть за­нять­ся им еще раз поз­же.

Хо­тя все ком­мен­та­рии соз­да­ют­ся ав­то­ма­ти­че­ски, пе­ре­во­дчик мо­жет до­бав­лять их и вруч­ную – тогда им дол­жен пред­ше­ство­вать сим­вол #.

Фор­мы мно­же­ствен­но­го чис­ла в анг­лий­ском, воз­мож­но, неслож­ные, но в неко­то­рых язы­ках это не так, и в Gettext есть слож­ная систе­ма их под­держ­ки. Не все­гда доста­точ­но про­сто до­ба­вить s в кон­це сло­ва. В за­го­лов­ке фай­ла .po есть стро­ка, опи­сы­ваю­щая фор­мы мно­же­ствен­но­го чис­ла язы­ка. Для гер­ман­ских и ро­ман­ских язы­ков она вы­гля­дит так:

“Plural-Forms: nplurals=2; plural=(n != 1);\n”

Это оз­на­ча­ет, что в язы­ке есть две фор­мы: един­ст­вен­ная и мно­же­ст­вен­ная, и фор­ма мно­же­ст­вен­но­го чис­ла упот­реб­ля­ет­ся то­гда, ко­гда чис­ло пред­ме­тов, о ко­то­рых мы го­во­рим, не рав­но еди­ни­це. По­смот­рим те­перь на од­ну из строк для мно­же­ст­вен­но­го чис­ла:

#: src/game.cpp:1566
msgid “The following add-on had errors and could not be loaded:”
msgid_plural “The following add-ons had errors and could not be loaded:”
msgstr[0] “De volgende add-on bevat fouten en kon niet worden geladen:”
msgstr[1] “De volgende add-ons bevatten fouten en konden niet worden geladen:”

Это фраг­мент фай­ла .po с пе­ре­во­дом на гол­ланд­ский для иг­ры Battle for Wesnoth, где мне по­па­лись непол­но или непра­виль­но пе­ре­ве­ден­ные со­об­щения, ко­то­рые я за­хо­тел пе­ре­вести пра­виль­но. Здесь стро­ка msgid – это фор­ма един­ствен­но­го чис­ла для анг­лий­ско­го язы­ка, а фор­ма мно­же­ствен­но­го чис­ла запи­са­на в фай­ле msgid_plural. Фор­ма един­ствен­но­го чис­ла пе­ре­ве­де­на в стро­ке msgstr[0], а мно­же­ствен­но­го – в стро­ке msgstr[1].

Для язы­ков с дру­ги­ми фор­ма­ми мно­же­ствен­но­го чис­ла эта схе­ма от­ли­ча­ет­ся. На­при­мер, ес­ли nplurals для неко­то­ро­го язы­ка рав­на 3, так­же по­яв­ля­ет­ся стро­ка msgstr[2].

Принима­ем­ся за де­ло

Ре­дак­ти­ро­вать фай­лы .po мож­но в ва­шем лю­би­мом ре­дак­то­ре: Gedit, Vim или Emacs, при­чем весь­ма эф­фек­тив­но. Vim рас­по­зна­ет фор­мат .po, и ес­ли под­свет­ка син­так­си­са ак­тив­на, кое-что бу­дет вы­де­ле­но цве­та­ми. Кро­ме то­го, ес­ли вклю­чить про­вер­ку ор­фо­гра­фии в фай­ле .po, Vim смо­жет под­све­тить ошиб­ки в стро­ках msgstr. Итак, сде­лай­те про­вер­ку ор­фо­гра­фии, вве­ди­те недостаю­щие стро­ки пе­ре­во­да, ис­правь­те непра­виль­ные и по­шли­те об­нов­лен­ный файл .po ку­ра­то­ру пе­ре­во­дов в про­ек­те. Но пре­ж­де чем от­прав­лять файл, про­верь­те син­так­сис сле­дую­щей коман­дой:

$ msgfmt --statistics --check-header <пе­ре­ведн­ный_файл.po>

Хо­тя обыч­ные ре­дак­то­ры вполне при­год­ны для пе­ре­во­да неболь­ших фай­лов .po, для боль­ших фай­лов они непрак­тич­ны. Пе­ре­вод – осо­бая за­да­ча, ко­то­рая для эф­фек­тив­ной ра­бо­ты тре­бу­ет спе­ци­аль­ный ин­тер­фейс об­зо­ра кон­тек­ста. К сча­стью, для пе­ре­во­дчи­ков су­ще­ству­ет мас­са ин­ст­ру­мен­тов Gettext. В ка­че­стве бо­ну­са они га­ран­ти­ру­ют вам пра­виль­ный син­так­сис. Мы рас­смот­рим са­мые по­пу­ляр­ные, но ес­ли вы поль­зуе­тесь Emacs, в нем есть ре­жим .po.

Скорая помощь

В боль­шин­ст­ве ре­дак­то­ров PO мож­но ско­пи­ро­вать ис­ход­ный текст в по­ле пе­ре­во­да, что осо­бен­но удоб­но для тек­стов со слож­ны­ми или длин­ны­ми име­на­ми.

Хо­ро­шая про­грам­ма пе­ре­во­да – Poedit (http://www.poedit.net). При пер­вом за­пуске вам по­тре­бу­ет­ся вве­сти свое имя и ад­рес элек­трон­ной поч­ты, ко­то­рые по­том мож­но бу­дет из­менить в на­строй­ках. Эта ин­фор­ма­ция запи­сы­ва­ет­ся в стро­ке Last-Translator при со­хранении фай­ла.

При от­кры­тии фай­ла .po про­грам­ма счи­ты­ва­ет все со­об­щения и вы­во­дит их спи­сок в глав­ном окне. Сна­ча­ла идут непе­ре­ве­ден­ные стро­ки, за­тем – стро­ки, в пе­ре­во­де ко­то­рых пе­ре­во­дчик не был уве­рен (с флаж­ком fuzzy), и, на­конец, пе­ре­ве­ден­ные стро­ки. Стро­ки ка­ж­до­го ти­па вы­де­ля­ют­ся сво­им цве­том. В ле­вом столб­це на­хо­дят­ся ис­ход­ные стро­ки, в пра­вом – пе­ре­во­ды. При вы­бо­ре стро­ки ис­ход­ная стро­ка и пе­ре­вод по­ка­зы­ва­ют­ся в нижней части ок­на, там, где ре­дак­ти­ру­ет­ся пе­ре­вод.

Знать кон­текст

Пер­вым де­лом нуж­но вклю­чить ок­на Comments [Ком­мен­та­рии] и Automatic Comments [Ав­то­ма­ти­че­ские ком­мен­та­рии] (в ме­ню View [Вид]). Это даст вам неко­то­рый кон­текст, ко­то­рый был за­дан про­грам­ми­стом в фай­ле .po с по­мо­щью ин­ст­ру­мен­тов Gettext. В стро­ке со­стояния в нижней части ок­на вы так­же уви­ди­те неко­то­рую ста­ти­сти­ку: на­при­мер, про­цент пе­ре­ве­ден­ных со­об­щений.

Итак, щелкните по стро­ке в спи­ске и при­сту­пай­те к пе­ре­во­ду. Ес­ли вы не уве­ре­ны в пе­ре­во­де, по­меть­те стро­ку флаж­ком fuzzy, на­жав кноп­ку с об­ла­ком. Щелк­нув по икон­ке блок­но­та, к пе­ре­во­ду мож­но до­ба­вить ком­мен­та­рий. За­кон­чив пе­ре­во­дить, со­храните полученный ре­зуль­тат и от­правь­те его ку­ра­то­ру.

Очень при­ят­ная воз­мож­ность спря­та­на в пунк­те ме­ню Catalog > Settings [Ка­та­лог > На­строй­ки]. Ес­ли клик­нуть по вклад­ке Paths [Пу­ти], вы смо­же­те вве­сти основ­ной путь к ка­та­ло­гу про­ек­та. Это удоб­но, ес­ли вы за­гру­жае­те пол­ный ис­ход­ный код про­ек­та, а не толь­ко файл .po. Когда этот путь за­дан пра­виль­но, мож­но пра­вой кноп­кой щелк­нуть по стро­ке, и в от­дель­ном окне от­кро­ет­ся со­от­вет­ствую­щая стро­ка в ис­ход­ном ко­де.

Офи­ци­аль­ный ре­дак­тор фай­лов .po для Gnome на­зы­ва­ет­ся Gtranslator. При пер­вом за­пуске по­яв­ля­ет­ся окош­ко масте­ра для соз­дания про­фи­ля. Вве­ди­те на­звание про­ек­та, свое имя, ад­рес элек­трон­ной поч­ты, язык, ад­рес элек­трон­ной поч­ты коман­ды и т. д. Все это мож­но из­менить поз­же в на­строй­ках и да­же до­ба­вить про­фи­ли; та­ким об­ра­зом Gtranslator по­зво­ля­ет пе­ре­клю­чать­ся ме­ж­ду раз­лич­ны­ми про­фи­ля­ми для раз­лич­ных про­ек­тов пе­ре­во­да.

Ве­се­лье на­чи­на­ет­ся, конеч­но, с от­кры­ти­ем фай­ла .po в Gtranslator. Рас­по­ло­жение окон на­по­ми­на­ет Poedit, но по умол­чанию в Gtranslator стро­ки по­ка­зы­ва­ют­ся в том по­ряд­ке, в ко­то­ром они идут в фай­ле .po, а ста­тус непе­ре­ве­ден­ных или от­ме­чен­ных флаж­ком fuzzy ука­зы­ва­ет­ся со­от­вет­ствую­щим сим­во­лом в от­дель­ном столб­це. Что­бы про­смот­реть непе­ре­ве­ден­ные или по­ме­чен­ные флаж­ком fuzzy стро­ки, про­сто щелкните на столб­це Status [Ста­тус] для сор­ти­ров­ки со­об­щений.

В Gtranslator есть мас­са го­ря­чих кла­виш для пе­ре­хо­да к пре­ды­ду­ще­му или сле­дую­ще­му со­об­щению, со­об­щению с флаж­ком fuzzy, непе­ре­ве­ден­но­му со­об­щению и т. д. Пе­рей­ди­те в ме­ню Go [Пе­ре­хо­ды] и взгляните на эти ком­би­на­ции кла­виш. Чем луч­ше вы их знае­те, тем бы­ст­рее смо­же­те пе­ре­вести фай­лы .po в Gtranslator.

Про­грам­ма так­же под­дер­жи­ва­ет систе­му мо­ду­лей рас­ши­рения – доступ­ны мо­ду­ли кар­ты сим­во­лов для встав­ки спе­ци­аль­ных сим­во­лов про­стым щелч­ком на них, сло­ва­ря, где мож­но ис­кать сло­ва, и ок­на для про­смот­ра ис­ход­но­го ко­да.

Для KDE

LXF136 74 1.jpg Ин­тер­фейс Lokalize не­мно­го сби­ва­ет с тол­ку, но в ней есть мно­же­ст­во го­ря­чих кла­виш.

В KDE4 роль Gtranslator вы­пол­ня­ет Lokalize. У обо­их ре­дак­то­ров при­мер­но оди­на­ко­вой на­бор воз­мож­но­стей, вклю­чая го­ря­чие кла­ви­ши. Но уч­ти­те, что в Lokalize стро­ки, в понимании ко­то­рых пе­ре­вод­­чик не уве­рен, обо­зна­ча­ют­ся как него­то­вые (‘Not ready’) в ме­ню и как под­ле­жа­щие пе­ре­смот­ру (‘Needs review’) в спи­ске пе­ре­во­дов, что немно­го нело­гич­но. Оба тер­ми­на бо­лее ин­фор­ма­тив­ны, чем ‘fuzzy’ (неяс­ный), но мо­гут сбить вас с тол­ку, ес­ли вы при­вык­ли к обо­зна­чениям Gettext.

Рас­по­ло­жение окон в Lokalize немно­го от­ли­ча­ет­ся от дру­гих про­грамм. Спи­сок ис­ход­ных строк и пе­ре­во­дов по­ка­зы­ва­ет­ся в ле­вом верхнем уг­лу ок­на, в ко­то­ром есть и удоб­ная стро­ка по­иска, а вы­бран­ные стро­ка и пе­ре­вод по­ка­зы­ва­ют­ся спра­ва. Ком­мен­та­рии по­ка­зы­ва­ют­ся в ле­вом нижнем уг­лу эк­ра­на со ссыл­кой на фай­лы ис­ход­но­го ко­да. Lokalize – мощ­ный ре­дак­тор, но его ин­тер­фейс – не са­мый по­нят­ный или удач­ный с точ­ки зрения ис­поль­зуе­мо­го эк­ран­но­го про­стран­ства.

Про­сто­та — это пре­крас­но

Virtaal под­дер­жи­ва­ет не толь­ко фай­лы .po, но и дру­гие фор­ма­ты лока­ли­за­ции, но здесь мы бу­дем го­во­рить толь­ко о фай­лах .po. При от­кры­тии фай­ла .po сра­зу ста­но­вит­ся по­нят­но, что ин­тер­фейс Virtaal го­раз­до беднее по сравнению с дру­ги­ми про­грам­ма­ми. Пе­ред ва­ми спи­сок с дву­мя столб­ца­ми: ис­ход­ны­ми стро­ка­ми и их пе­ре­во­да­ми. Вы­бран­ная стро­ка пре­вра­ща­ет­ся в по­ле вво­да, где мож­но из­менить пе­ре­вод, и со­дер­жит до­полнитель­ную га­лоч­ку, с по­мо­щью ко­то­рой мож­но обозвать пе­ре­вод «неяс­ным». Так­же по­ка­зы­ва­ют­ся ком­мен­та­рии. На пер­вый взгляд это ка­жет­ся бед­но­ва­тым, но с за­да­чей справ­ля­ет­ся бле­стя­ще. Так­же мож­но вы­брать на­ви­га­цию толь­ко по непе­ре­ве­ден­ным стро­кам – Virtaal не со­всем кор­рект­но на­зы­ва­ет их «Неза­вер­шен­ны­ми» (‘Incom­plete’) – или на­хо­дить нуж­ные стро­ки с по­мо­щью по­иска.

Хо­тя минима­ли­стич­ный ин­тер­фейс прост, про­грам­ме не хва­та­ет мас­сы воз­мож­но­стей, имею­щих­ся в дру­гих при­ло­жениях. На­при­мер, в ней нет го­ря­чих кла­виш, что за­мед­ля­ет ра­бо­ту. В стро­ке со­стояния не по­ка­зы­ва­ет­ся ста­ти­сти­ка – вме­сто нее там по­ка­зы­ва­ют­ся язы­ки ори­ги­на­ла и пе­ре­во­да, ко­то­рые вы и так знае­те. На­строй­ки Virtaal так­же до­воль­но спар­тан­ские.

По­ка мы го­во­ри­ли толь­ко о техниче­ских де­та­лях, и здесь лег­ко за­быть, что ин­тер­на­цио­на­ли­за­ция про­грам­мы по боль­шей части ка­са­ет­ся язы­ка. Ес­ли у вас нела­ды с пра­вопи­санием и вас не за­де­ва­ет непра­виль­но напи­сан­ное сло­во, не бе­ри­тесь за пе­ре­вод. От про­грам­ми­стов мы все ждем про­грамм без оши­бок, и вам то­же нуж­но дер­жать план­ку и пре­достав­лять безу­преч­ный про­дукт. Конеч­но, ошиб­ки де­ла­ют все, но стре­ми­тесь к луч­ше­му, и вот вам несколь­ко со­ве­тов.

Это все о кон­тек­сте

Скорая помощь

В боль­шин­ст­ве ре­дак­то­ров PO есть воз­мож­ность «пе­ре­вес­ти стро­ки ав­то­ма­ти­че­ски». Не поль­зуй­тесь ею: вер­ный пе­ре­вод по­лу­ча­ет­ся не­час­то, и на ис­прав­ле­ние ав­то­ма­ти­че­ско­го пе­ре­во­да ухо­дит боль­ше вре­ме­ни, чем на пе­ре­вод с ну­ля.

Пра­виль­ный пе­ре­вод фра­зы часто за­ви­сит от кон­тек­ста. На­при­мер, в про­грам­ме есть непе­ре­ве­ден­ное со­об­щение ‘No match’ («Нет со­от­вет­ствия»), и его зна­чение труд­но по­нять без кон­тек­ста. Про­грам­ма жа­лу­ет­ся, что не мо­жет что-то за­пустить? Или некий объ­ект не со­от­вет­ству­ет шаб­ло­ну? Конеч­но, со­об­щение слиш­ком рас­плыв­ча­тое, и про­грам­ми­сту нуж­но бы­ло опи­сать си­туа­цию бо­лее под­роб­но.

Но есть и та­кие си­туа­ции, когда у со­вер­шен­но яс­ных со­об­щений мо­жет быть раз­лич­ный смысл, и, сле­до­ва­тель­но, пе­ре­во­дить их нуж­но по-раз­но­му. И по­нять, что оз­на­ча­ет со­об­щение в кон­тек­сте про­грам­мы – за­да­ча пе­ре­во­дчи­ка. По­это­му в фай­ле .po и ука­зы­ва­ет­ся по­ло­жение со­об­щения в фай­ле ис­ход­но­го ко­да: не стес­няй­тесь за­гля­нуть ту­да! А еще луч­ше за­пустить про­грам­му и соз­дать си­туа­цию, в ко­то­рой по­яв­ля­ет­ся со­об­щение. Де­лать это луч­ше до пе­ре­во­да: это по­зво­лит вам правильнее по­нять кон­текст, в ко­то­ром по­яв­ля­ет­ся со­об­щение.

Пре­ж­де чем брать­ся за пе­ре­вод но­вой про­грам­мы или да­же ме­нять пе­ре­вод су­ще­ствую­щей, хо­ро­шо бы всту­пить в кон­такт с коман­дой пе­ре­во­дчи­ков про­ек­та. Не толь­ко для то­го, что­бы из­бе­жать двой­ной ра­бо­ты, но и для то­го, что­бы ра­зуз­нать о ра­бо­чем ок­ру­жении коман­ды. Обыч­но спи­сок от­вет­ствен­ных за пе­ре­вод ви­сит на до­машней странице про­ек­та, но кон­такт­ные дан­ные груп­пы пе­ре­во­дчи­ков для то­го или ино­го язы­ка мож­но так­же най­ти в за­го­лов­ке фай­ла .po в по­ле Language-Team.

И не ра­бо­тай­те в оди­ноч­ку: это источник множества про­блем. Будь­те мак­си­маль­но от­вет­ствен­ным пе­ред коман­дой и не ста­рай­тесь ре­шить все про­бле­мы са­ми. Ес­ли вы не уве­ре­ны в пе­ре­во­де, по­го­во­ри­те с партнера­ми по коман­де в рас­сыл­ке. И не счи­тай­те пе­ре­вод сво­ей соб­ствен­но­стью: ес­ли кто-то его улуч­шил, не сер­ди­тесь. Ес­ли вы не одоб­ряе­те из­менения, по­го­во­ри­те с их ав­то­ром, но де­лай­те это ци­ви­ли­зо­ван­но и поль­зуй­тесь толь­ко те­ми ар­гу­мен­та­ми, ко­то­рые обосно­ва­ны лин­гвисти­че­ски­ми или сти­ли­сти­че­ски­ми при­чи­на­ми. Пе­ре­вод от­кры­то­го ПО – как и про­грам­ми­ро­ва­ние – ко­манд­ная ра­бо­та.

Ре­сур­сы

Ес­ли вам не­ко­гда, за­да­вай­те при­ори­те­ты

Ес­ли ва­ше вре­мя ог­ра­ни­че­но, вы все рав­но мо­же­те по­мочь. Не пу­гай­тесь ко­ли­че­ст­ва пе­ре­во­ди­мых со­об­ще­ний в не­ко­то­рых про­грам­мах – про­сто за­да­вай­те при­ори­те­ты: в пер­вую оче­редь пе­ре­во­ди­те со­об­ще­ния, ко­то­рые поль­зо­ва­тель ви­дит боль­шую часть вре­ме­ни или ко­то­рые по­яв­ля­ют­ся ча­ще все­го. Ко­неч­но, эти соб­ще­ния мож­но най­ти, за­пус­тив про­грам­му и ос­мот­рев важ­ные со­об­ще­ния, ко­то­рые по­ка не пе­ре­ве­де­ны, но в Gettext есть удоб­ная ути­ли­та, по­мо­гаю­щая ре­шить эту за­да­чу. Для на­ча­ла от­крой­те тер­ми­нал и вве­ди­те сле­дую­щие ко­ман­ды:

$ export LD_PRELOAD=/usr/lib/preloadable_libintl.so
$ export GETTEXT_LOG_UNTRANSLATED=$HOME/gettextloguntranslated

За­тем за­пус­ти­те из это­го тер­ми­на­ла про­грам­му, со­об­ще­ния в ко­то­рой хо­ти­те пе­ре­вес­ти – на­при­мер, та­ким об­ра­зом (для иг­ры Battle for Wesnoth):

$ wesnoth

Не­мно­го по­ра­бо­тай­те с ней обыч­ным об­ра­зом, и по­сле ее за­кры­тия в фай­ле gettextloguntranslated до­маш­не­го ка­та­ло­га поя­вит­ся спи­сок со­об­ще­ний, ко­то­рые про­грам­ма пы­та­лась пе­ре­вес­ти, но не обна­ружила пе­ре­вод для ва­ше­го язы­ка. Это PO-файл, но до от­прав­ки в PO-ре­дак­тор его необходимо пред­ва­ри­тель­но об­ра­бо­тать. Этот про­цесс под­роб­но опи­сан в раз­де­ле 12.7 ру­ко­во­д­ства по Gettext.

Персональные инструменты
купить
подписаться
Яндекс.Метрика