Загальні зауваження

Ці файли уже більше десяти років є стандартними файлами перекладу ВПЗ (і не лише ВПЗ). Що принесло їм популярність? Надзвичайна простота: скрипти, додані до програми, створюють шаблон перекладу (файл .pot), який шляхом нескладних маніпуляцій перетворюється на файл перекладу (файл .po). Приклад:

ШаблонПереклад
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.

# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"

"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
"POT-Creation-Date: 2009-07-30 06:55+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: kfortunoid.cpp:105
msgid "Cannot find "
msgstr ""

#: kfortunoid.cpp:224
msgid "Fortunoid Settings"
msgstr ""

#. i18n: file: form/fortunoidsettings.ui:26
#. i18n: ectx: property (text), widget (QLabel, label_3)
#: rc.cpp:3
msgid "arguments"
msgstr ""

#. i18n: file: form/fortunoidsettings.ui:40
#. i18n: ectx: property (text), widget (QLabel, label)
#: rc.cpp:6
msgid "delay quote (sec)"
msgstr ""
    
# translation of plasma_applet_fortunoid.po to Ukrainian
# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
#
# Yuri Chornoivan <yurchor@ukr.net>, 2009.
msgid ""
msgstr ""
"Project-Id-Version: plasma_applet_fortunoid\n"

"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
"POT-Creation-Date: 2009-07-30 06:55+0200\n"
"PO-Revision-Date: 2009-04-29 18:16+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Lokalize 0.3\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: kfortunoid.cpp:105
msgid "Cannot find "
msgstr "Не вдалося знайти "

#: kfortunoid.cpp:224
msgid "Fortunoid Settings"
msgstr "Параметри фортуноїда"

#. i18n: file: form/fortunoidsettings.ui:26
#. i18n: ectx: property (text), widget (QLabel, label_3)
#: rc.cpp:3
msgid "arguments"
msgstr "аргументи"

#. i18n: file: form/fortunoidsettings.ui:40
#. i18n: ectx: property (text), widget (QLabel, label)
#: rc.cpp:6
msgid "delay quote (sec)"
msgstr "затримка цитати (у сек.)"

#~ msgid "no quote"
#~ msgstr "немає цитати"

#~ msgid "fortune not found"
#~ msgstr "fortune не знайдено"

#~ msgid "show background"
#~ msgstr "показувати тло"
    

Декілька коментарів: перші декілька рядків (до #: kfortunoid.cpp:105) визначають заголовок файла перекладу. У заголовку визначаються важливі параметри перекладу (ім’я перекладача, права поширення перекладу, дата створення шаблону перекладу та дата самого перекладу, адреса, куди користувачі мають надсилати повідомлення про вади у перекладі, і ще дві абсолютно важливі речі: кодування (charset) перекладу і форми множини мови (Plural-Forms). Хоча Unicode повсюдно переміг, залишається ще повно файлів у інших кодуваннях. Приклади: файл перекладу Freeciv мають кодування KOI8-U. Врегульовується це питання за допомогою команди:

iconv -f koi8u -t utf8 файл_перекладу.po>новий_файл.po

Але, увага, не забудьте відповідним чином змінити рядок

Content-Type: text/plain; charset=UTF-8

Якщо ви вирішите не довіряти долю свого перекладу ніяким хитромудрим програмкам, які писала зовсім незнайома вам людина і надасте перевагу теплому ламповому Vim, вам доведеться повписувати все це руками. Програми-помічники самі вписують потрібні дані (найкраща з цих програм зробила це у цьому випадку так: X-Generator: Lokalize 0.3).

Після завершення перекладу програми з файла po командою (в загальному випадку)

msgfmt -o назва_програми.mo файл_перекладу.po

створюється файл (файл .mo), зрозумілий системі перекладу Linux (gettext), який і буде прочитано програмою під час завантаження. Такі файли зберігаються у /usr/share/locale/uk/LC_MESSAGES Для запису до цієї теки потрібні права доступу адміністратора. ?Докладніше про те, як набути цих прав.

Lokalize 1.0 здатен владнати справу (тимчасово) простіше. Програма записує файли до локальної теки користувача. Для перевірки перекладу вам не потрібні будуть права адміністратора.

Але корисність файлів PO виходить за межі простого перекладу інтерфейсу програм. За допомогою цих файлів (звичайно ж, без перетворення на MO-файл) можна перекладати документацію, сайти, корисні системні файли тощо.

Простота файлів PO сполучається з граничною гнучкістю. Як ви можете помітити, рядки, що починаються з символу # є коментарями (окрім одного особливого випадку, про який поговоримо пізніше), отже у них можна записувати корисні для перекладача і програми обробки дані. Крім того, за належної обробки зберігаються навіть застарілі рядки, які вже було перекладено (хто знає, а раптом ще згодяться). Ці рядки записано наприкінці файла перекладу.

Загалом кажучи, сучасні файли PO поділяються за належністю до стільничних середовищ, тому доцільно розглянути два випадки окремо.

Gtk/GNOME

Структура

Файли перекладу сучасних Gtk-програм містять все (записи у SVG-вікнах вітання програми, записи з desktop-файлів, з яких формується локалізоване меню і підписи до піктограмок на стільниці, записи у скриптах). Через цю складність часто шаблони цих файлів можна зібрати, лише зібравши саму програму (наприклад, Inkscape). Через зосередженість програмістів на користувачах часто вони просто забувають про додавання коментарів. Тому вам доведеться зібрати програму і дивитися, де і що випливе у результаті перекладу.

Змінні

Крім того, ви можете зустріти у перекладах Gtk-програм ось такі конструкції:

msgid ""
"<b>Ellipse</b>: %s - %s (constrained to ratio %d:%d); with <b>Shift</b> "
"to draw around the starting point"

Позначки %s під час роботи програми буде замінено текстовими рядками, %d — на цілі числа, %f — на дійсні. Отже, ніколи, ніколи їх не змінюйте!

Крім того, зверніть увагу на конструкцію %s × %s Якщо вам потрібно змінити порядок рядків у цій конструкції, скористайтеся синтаксисом

%2$s × %1$s

Теґи у кутових дужках теж не потрібно перекладати: це позначки розмітки XML (у нашому прикладі вони позначають напівжирний стиль).

Ще однією специфічною рисою є використання позначень клавіатурної прив’язки. У Gtk-програмах традиційно клавіатурні скорочення позначаються підкресленням

msgid "_Symmetry"

Будь ласка, не вилучайте такі підкреслювання. Підкресліть якусь з літер у слові перекладу, ось так:

msgstr "Си_метрія"

Але робіть це обережно: у одному меню чи діалоговому вікні не повинно бути двох однакових прив’язок!

Коментарі

Донедавна у основному інструменті перекладу GNOME (GTranslator) не було передбачено показу коментарів. Тому доводилося певним чином викручуватися. Насправді, перекладати PO-файли з програм GTK/GNOME можна будь-яким редактором для PO-файлів, а не лише GTranslator. У стандарті PO-файлів передбачено деякі можливості з додавання у змінні (власне, формати змінних) додаткових позначень, це стандартна практика у програмах, написаних мовою Python

Приклад 1:

Change "%(amount)s" %(unit)s to "%(text)s" %(unit)s only _where the ingredient key is %(key)s

Як бачите, тут пояснення призначення рядків вкладено до самих рядків. У таких випадках обов’язково зберігайте пояснення незмінними у перекладі! Якщо ви цього не зробите, програма може аварійно завершити роботу під час показу відповідного повідомлення. Це стосується всіх програм з подібним типом повідомлень (не лише у GNOME, а й у Python, KDE 3 тощо).

Приклад 2:

#: common/player.c:760
msgid "?diplomatic_state:War"

Тут у першій частині повідомлення міститься опис призначення повідомлення. Цей опис перекладати не потрібно. Загалом кажучи, програми з великими файлами перекладу (тут FreeCiv) використовують власні правила щодо коментарів. Вам завжди варто ознайомитися з цими правилами (їх часто розміщено у Вікі проектів), перш ніж братися за переклад.

Контекст повідомлень

З PO-файлами пов'язана одна особливість: оригінали рядків (msgid) не повинні повторюватися у межах файлу. Тобто, якщо у програмі є кнопка "Update" та діалогове вікно з назвою "Update", виникає проблема, англійський оригінал однаковий — контекст різний, і переклад теж може бути різним, наприклад, у першому випадку "Оновити", у другому — "Оновлення". Тож треба якось розрізняти ці два випадки. Раніше у GNOME викручувалися, наприклад, таким синтаксисом:

msgid "button|Update"
msgstr "Оновити"

msgid "dialog|Update"
msgstr "Оновлення"

І бібліотека glib перш ніж показати переклад, відсікала все, що стояло до символу "|". Таким чином, якщо рядок не було перекладено, програма просто показувала англійський оригінал після символу "|"

Сучасним стилем позначення контексту, а заодно й коментування, є:

msgctxt "button"
msgid "Update"
msgstr "Оновити"

msgctxt "dialog"
msgid "Update"
msgstr "Оновлення"

Форми множини

Ми вже торкалися цього питання: в українській мові існує три форми сполучення іменників з числівниками. У Gtk/GNOME використовується стандартна форма:

msgid "You conquer %s; your lootings accumulate to %d gold!"
msgid_plural "You conquer %s; your lootings accumulate to %d gold!"
msgstr[0] "Ви захопили %s, здобич склала %d гривню!"
msgstr[1] "Ви захопили %s, здобич склала %d гривні!"
msgstr[2] "Ви захопили %s, здобич склала %d гривень!"

Першій з форм відповідають числа 1, 21, 31 тощо, другій — 2, 3, 4, 22, 23 тощо, третій — 5, 6, 7 тощо.

KDE

Структура

Файли перекладів KDE поділено на дві частини: файл з префіксом desktop (у ньому містяться повідомлення з назви програми, коментарів та пунктів меню файла .desktop) та власне самого файла перекладу програми. Саме тому **переклад desktop файлів за допомогою Rosetta (LaunchPad) у деякому сенсі абсолютно позбавлений сенсу, якщо ви не маєте наміру потім передати переклад до сховища KDE. Розробники Ubuntu намагалися обійти спосіб, у який працює переклад KDE. На програми kdelibs у KUbuntu накладено латки, які призводять до завантаження виготовлених за допомогою LaunchPad/Rosetta перекладів, але, увага, завантаження відбувається, лише** якщо перекладу немає у файлі .desktop. Тому, навіть якщо ваш переклад кращий за переклад основної гілки, його не буде завантажено. Крім того, завантаження додаткових каталогів сповільнює KUbuntu.

Кожного ранку основний скрипт KDE (scripty) обробляє всі .desktop-файли середовища і видобуває з них рядки повідомлень. Одночасно цей скрипт додає у файли вже перекладені повідомлення з файлів desktop_ всіх мов, якими було зроблено переклад. Після цього файл набуває вигляду:

[Desktop Entry]
Type=Application
Exec=konversation -caption "%c" %i
Icon=konversation
X-DocPath=konversation/index.html
GenericName=IRC Client
GenericName[be]=Кліент IRC
GenericName[bg]=IRC клиент
GenericName[cs]=IRC klient
GenericName[da]=IRC-klient
GenericName[de]=IRC-Programm
GenericName[el]=Πελάτης IRC
GenericName[es]=Cliente de IRC
GenericName[et]=IRC klient
GenericName[eu]=IRC bezeroa
GenericName[fr]=Client IRC
GenericName[ga]=Cliant IRC
GenericName[gl]=Cliente de IRC
GenericName[hne]=आईआरसी क्लायंट
GenericName[it]=Client IRC
GenericName[lt]=IRC klientas
GenericName[nb]=IRC-klient
GenericName[nds]=IRC-Client
GenericName[nl]=IRC-client
GenericName[pa]=IRC ਕਲਾਇਟ
GenericName[pt]=Cliente de IRC
GenericName[pt_BR]=Cliente IRC
GenericName[ro]=Client IRC
GenericName[ru]=Клиент IRC
GenericName[sv]=IRC-klient
GenericName[tr]=IRC İstemcisi
GenericName[uk]=Клієнт IRC

Змінні

Змінні у KDE, починаючи з версії 4, не позначаються, а нумеруються:

<span style='color: %1;'>[Who:%2] <b><u>Username</u></b>: %3, <b><u>Address</u>
</b>: %4, <b><u>Server</u></b>: %5, <b><u>Nick</u></b>: %6, <b><u>Flags</
u></b>: %7, <b><u>Hops</u></b>: %8, <b><u>Real Name</u></b>: %9</span>

Таким чином, переплутати два рядки чи два числа просто неможливо.

Коментарі

З введенням нумерації виникає проблема призначення змінних. Цю проблему вирішують коментарі:

#: statusbar/StatusBar.cpp:339
#, kde-format
msgctxt "%1 is number of tracks, %2 is time"
msgid "%1 track (%2)"
msgid_plural "%1 tracks (%2)"

Як бачимо, коментар описує все що потрібно. На щастя, сучасні програми для перекладу (автономні: Lokalize, Gtranslator, Virtaal, PoEdit та серверні: Pootle, Rosetta, Narro) підтримують показ коментарів, тому можна спокійно перекладати повідомлення, не зазираючи повсякчас до коду програми.

Форми множини

У KDE 3 була жахливо неочевидна форма запису форм множини:

#: kilestdtools.cpp:171
#, c-format
msgid ""
"_n: %n error\n"
"%n errors"
msgstr ""
"%n помилка\n"
"%n помилки\n"
"%n помилок"

Зараз від цієї форми позбулися. Тепер форма запису повністю збігається зі стандартною:

#: kilestdtools.cpp:204
#, kde-format
msgid "1 error"
msgid_plural "%1 errors"
msgstr[0] "%1 помилка"
msgstr[1] "%1 помилки"
msgstr[2] "%1 помилок"

Знову ж таки, першій з форм відповідають числа 1, 21, 31 тощо, другій — 2, 3, 4, 22, 23 тощо, третій — 5, 6, 7 тощо.

Подяки авторам перекладу

Досить довгий час подібні питання залишалися неврегульованими (у деяких програмах цей стан зберігся і до сьогодні). Автори програм записували перекладачів до файлів CREDITS, створювали спеціальні файли, які програма обробляла під час запуску чи показу допоміжного вікна «Про програму».

З часом у двох основних середовищах з’явилися власні стандарти щодо записів подяк перекладачам. Розглянемо їх один за одним.

GNOME

  • Інтерфейс програм:

      #. Translators should localize the following string
      #. * which will be displayed at the bottom of the about
      #. * box to give credit to the translator(s).
      #.
      #: ../src/nautilus-window-menus.c:546
      msgid "translator-credits"
      msgstr ""
      "Іван Іваненко <ivan@goodhost.org>\n"
      "Петро Петренко <petro@nicehost.org>"
    

    Як бачимо, імена перекладачів слід вказувати поруч з адресами електронної пошти у кутових дужках. Записи відокремлюються один від одного стандартним замінником нового рядка у C (\n).

  • Документація:

      #. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2
      #: C/gnome-search-tool.xml:0(None)
      msgid "translator-credits"
      msgstr ""
      "Іван Іваненко <ivan@goodhost.org>, 2009\n"
      "Петро Петренко <petro@nicehost.org>, 2010"
    

    Тут додається ще рік перекладу.

KDE

  • У інтерфейсі програм:

      #: rc.cpp:46
      msgctxt "NAME OF TRANSLATORS"
      msgid "Your names"
      msgstr "Іван Іваненко,Петро Петренко"
    
      #: rc.cpp:47
      msgctxt "EMAIL OF TRANSLATORS"
      msgid "Your emails"
      msgstr "ivan@goodhost.org,petro@nicehost.org"
    

    Як бачимо, у KDE записи імен та адрес електронної пошти поділено між двома записами. Кожен з записів відокремлюється від інших комою.

    Будь ласка, не перекладайте буквально: «ІМЕНА ПЕРЕКЛАДАЧІВ» або «АДРЕСИ ЕЛЕКТРОННОЇ ПОШТИ ПЕРЕКЛАДАЧІВ»!

  • У документації до програм:

      #. Tag: trans_comment
      #: index.docbook:57
      #, no-c-format
      msgid "ROLES_OF_TRANSLATORS"
      msgstr ""
      "<othercredit role=\"translator\"><firstname>о. Іван</"
      "firstname><surname>Петрущак</surname><affiliation><address><email>fr."
      "ivan@somewhere.org</email></address></affiliation><contrib>Переклад "
      "українською</contrib></othercredit><othercredit role=\"translator"
       "\"><firstname>Юрій</firstname><surname>Чорноіван</"
      "surname><affiliation><address><email>yurchor@nevermind.net</email></address></"
      "affiliation><contrib>Доповнення перекладу українською</contrib></othercredit>"
    

    Тут маємо XML-код, який можна просто скопіювати з пам’яті перекладів Lokalize і заповнити власними даними. Крім того, передбачено ще один запис наприкінці файла:

      #. Tag: trans_comment
      #: index.docbook:1917
      #, no-c-format
      msgid "CREDIT_FOR_TRANSLATORS"
      msgstr ""
      "<para>Переклад українською: о. Іван Петрущак<email>fr.ivan@ukrainian-"
      "somewhere.org</email></para><para>Доповнення перекладу українською: Юрій "
      "Чорноіван<email>yurchor@nevermind.net</email></para>"
    

    Зауваження тут ті самі: не перекладайте буквально!