Zaloguj się
Zarejestruj się na tej witrynie
Subskrypcja
Losowy termin z STP
Tłumacz tekstów informatycznych, zwłaszcza dotyczących programowania komputerowego, ma bardzo często do czynienia z kodem źródłowym programów. Ponieważ istnieją różne opinie na temat tego, jak należy się z takim tekstem obchodzić, w artykule tym przedstawię moje własne zdanie na ten temat.
W tłumaczeniu kodu źródłowego programów należy przyjąć dwie nadrzędne zasady ? tłumaczy się wszystko to, co widać na ekranie po uruchomieniu programu oraz wszystkie znajdujące się w kodzie źródłowym komentarze.
Objaśnieniem tych dwóch zasad zajmę się w dwóch kolejnych sekcjach. Wcześniej jednak potrzebne jest sprecyzowanie najważniejszych określeń.
Mianem kod źródłowy nazywam zarówno tekst programów napisanych w ?typowych? językach programowania, takich jak C++ czy Visual Basic, jak również tekst znacznikowy (HTML) stron internetowych lub kod w języku XML albo dowolnym innym języku tego rodzaju. Mimo iż języki znaczników nie są językami programowania w ścisłym tego słowa znaczeniu (np. nie mają instrukcji sterujących, nie da się przy ich użyciu utworzyć pliku wykonywalnego) ich kod również nazywa się kodem źródłowym.
Komentarz to fragment teksu źródłowego, który nie jest brany pod uwagę przez interpreter lub kompilator, a który służy wyłącznie jako pomoc dla programisty w zrozumieniu opisywanych przez niego konstrukcji.
Języki programowania stanowią bardzo zróżnicowaną i obszerną grupę. Istnieje wiele ich rodzajów (np. obiektowe, proceduralne, funkcyjne itd. ? aczkolwiek rzadko zdarzają się języki czyste, tzn. czysto obiektowe albo czysto proceduralne itd.) i każdy z nich ma własne cechy. Jednak wszystkie je łączą dwie cechy ? każdy zwraca jakieś dane, które mogą zostać wyświetlone na ekranie (monitora lub innego urządzenia) i w każdym można stosować komentarze. W tej części artykułu przedstawiam sposoby rozpoznania wymienionych struktur w celu dokonania ich lokalizacji.
Ogólnie rzecz biorąc większość tego, co należy tłumaczyć w kodzie źródłowym programów znajduje się w cudzysłowach (reszta to komentarze, o których będzie mowa dalej).
Najczęstszym zastosowaniem cudzysłowu w językach programowania jest oznaczanie łańcuchów znaków, np. w definicjach zmiennych łańcuchowych albo bezpośrednio w instrukcjach drukujących tekst na ekranie. W tej roli można spotkać dwa rodzaje cudzysłowów ? podwójne proste (") i pojedyncze ('), czyli apostrof. W niektórych językach używa się obu tych rodzajów cudzysłowów i mają one w nich podobne, ale nie identyczne, zastosowanie. Np. w języku C++ w pojedyncze cudzysłowy ujmuje się tzw. literały znakowe, a więc można w nich zapisywać tylko po jednym znaku (np. 'a'). Cudzysłowy podwójne w tym języku służą natomiast do zapisywania łańcuchów znaków, a więc np. "abc i d". Natomiast w języku PHP zarówno w pojedynczych jak i podwójnych cudzysłowach można zapisywać łańcuchy. Różnica między nimi polega na tym, że zmienne w cudzysłowach podwójnych są zamieniane na wartości, które reprezentują, a w pojedynczych ? nie. Poniżej znajduje się kilka przykładów zastosowania cudzysłowów w językach C++ (dwa pierwsze) i PHP (pozostałe dwa):
| Przykład | Komentarz |
|---|---|
string welcome = "Hello World!"; |
Definicja zmiennej łańcuchowej. Znajdujące się na początku słowo string oznacza typ tej zmiennej (łańcuchowa) i nie można go tłumaczyć. Drugie słowo to nazwa zmiennej. Nazwy zmiennych można tłumaczyć, ale nie jest to zalecane (bardziej szczegółowo na ten temat piszę w zakończeniu). Reszta kodu to sam łańcuch. Ten fragment kodu najlepiej byłoby przetłumaczyć następująco: string welcome = "Witaj, świecie!"; |
char character = 'a'; |
Zmienna typu znakowego o nazwie character przechowująca jeden znak. W zasadzie nie ma co tu tłumaczyć, chyba że zmienna ta reprezentuje pierwszą literę jakiegoś wyrazu, i w języku polskim mogłaby być inna |
$text = "Total: $sum"; |
Jest to definicja zmiennej o nazwie $text (w języku PHP nie trzeba określać typów zmiennych, ponieważ interpreter automatycznie je określa na podstawie ich wartości, natomiast znak $ oznacza, że jest to właśnie nazwa zmiennej). W tym łańcuchu znajduje się inna zmienna, która zostanie przez interpreter zastąpiona odpowiednią zdefiniowaną wcześniej wartością. Ten fragment najlepiej przetłumaczyć następująco: $text = "Suma: $sum";. Gdyby ten fragment kodu został wykonany przez interpreter, przy założeniu, że zmienna $sum ma wartość 1000, na ekranie zostałby wyświetlony następujący wynik: Suma: 1000 |
$text = 'Total: $sum'; |
W tym przypadku interpreter nie rozpozna zmiennej $sum i wyświetli ją jako zwykły tekst. Wynik po przetłumaczeniu byłby następujący: Suma: $sum |
Jak widać rozpoznanie łańcucha znaków do przetłumaczenia w kodzie źródłowym programu nie jest trudne. Trudności mogą się jednak pojawić podczas samego tłumaczenia i są związane z różnicami między językiem źródłowym i docelowym.
Jeśli np. do przetłumaczenia jest poniższy fragment kodu (język PHP):
$x = "You have $numberOfCoins gold coins";
Najprościej byłoby napisać:
$x = "Masz $numberOfCoins złotych monet";
Niestety takie tłumaczenie nie jest najlepsze. Jeśli zmienna $numberOfCoins będzie miała np. wartość 22, to powstanie niepoprawne gramatycznie zdanie: Masz 22 złotych monet. Dlatego powyższe tłumaczenie należy zmodyfikować w następujący sposób:
$x = "Liczba złotych monet: $numberOfCoins";
Teraz niezależnie od wartości zmiennej $numberOfCoins zdanie będzie zawsze poprawne.
Kolejną rzeczą, o której należy pamiętać to tzw. znaki specjalne. Są to specjalne sekwencje znaków, które kompilator lub interpreter traktuje w specjalny sposób. Służą one przede wszystkim do wstawiania do łańcuchów takich znaków, których nie ma na klawiaturze lub których nie można wpisać bezpośrednio do treści łańcucha. Przykładem takiego znaku może być cudzysłów prosty. Nie można go wpisać bezpośrednio w łańcuch, ponieważ wówczas zostanie potraktowany jako zakończenie tego łańcucha, np.:
string x = "Jakiś tekst "w cudzysłowie"";
Ta definicja zmiennej jest niepoprawna i spowodowałaby błąd kompilacji. Poniżej znajduje się jej poprawiona wersja z użyciem znaków specjalnych:
string x = "Jakiś tekst \"w cudzysłowie\"";
Gdyby zawartość powyższej zmiennej x wydrukować na ekranie, wynik byłby następujący: Jakiś tekst "w cudzysłowie".
Znaki specjalne zawsze zaczynają się od znaku ukośnika (\), po którym znajduje się jeszcze jeden znak lub kilka znaków. Na przykład bardzo często spotykanym znakiem specjalnym jest tzw. znak nowego wiersza oznaczający, jak sama nazwa wskazuje, przejście do nowego wiersza. Weźmy jako przykład poniższy fragment kodu w języku C++:
cout << "Witaj, \n świecie";
Po jego wykonaniu na ekranie zostałby wyświetlony następujący wynik:
Witaj, świecie
Tłumacz pracujący z kodem źródłowym musi wiedzieć o znakach specjalnych i znać ich zastosowanie, aby je odpowiednio uwzględnić w swoim tłumaczeniu. Np. znak specjalny cudzysłowu prostego (\") w tłumaczeniu polskim najprawdopodobniej zostałby zastąpiony bezpośrednio wpisaną parą znaków ? i ?.
Istnieją również języki programowania, w których do oznaczania łańcuchów znaków używa się innych znaków, np. w języku dBase można do tego celu używać nawiasów kwadratowych ? [ ].
Warto również pamiętać, że cudzysłowy mogą być wykorzystywane także do innych celów niż oznaczanie łańcuchów znaków, np. do oznaczania wartości tekstowych składających się z więcej niż jednego wyrazu, takich jak np. nazwa fontu.
Jeśli chodzi o tłumaczenie nazw elementów graficznego interfejsu użytkownika, tłumacz najczęściej w takich przypadkach nie ma do czynienia z kodem źródłowym programu (chyba że tłumaczy książkę lub inny tekst z dziedziny programowania). Najczęściej dostaje listę słów i wyrażeń, które musi przełożyć na język docelowy.
W listach takich często spotyka się znak &, którego zastosowanie dla wielu tłumaczy nie jest jasne. Otóż znak ten to programistyczny sposób na oznaczanie tzw. akceleratorów, czyli inaczej mówiąc klawiszy skrótu do danego elementu interfejsu.
W zależności od tego, przed jaką literą znajdzie się znak &, w gotowym programie litera ta zostanie podkreślona, co będzie oznaczało, że dany element interfejsu można aktywować naciskając taki właśnie klawisz. Np. na pasku narzędzi przeglądarki internetowej Firefox w nazwie menu Plik podkreślona jest litera P, a więc jeśli aktywujemy pasek narzędzi i naciśniemy klawisz P, zostanie wyświetlona zawartość menu Plik, w którym znajdują się różne opcje z własnymi akceleratorami.
Warto pamiętać o tym, do czego służy znak & w tego rodzaju kontekstach i stosować go zgodnie z logiką lub wytycznymi zleceniodawcy.
Równie ważne, jak tłumaczenie tego, co pojawia się na ekranie jest tłumaczenie komentarzy znajdujących się w kodzie źródłowym. Komentarze można sklasyfikować przede wszystkim na dwa sposoby. Wyróżnia się komentarze jednowierszowe i wielowierszowe (blokowe) oraz komentarze ?zwykłe? i dokumentacyjne.
Komentarze jednowierszowe to takie, które w całości mieszczą się w jednym wierszu, a wielowierszowe mogą zajmować dowolną liczbę wierszy.
Natomiast komentarze dokumentacyjne to specjalnie oznaczone bloki tekstu, które są po napisaniu programu pobierane przez specjalny algorytm i zapisywane w postaci dokumentu (np. HTML), który pełni rolę dokumentacji danego programu.
Sposobów oznaczania komentarzy jest wiele, wszystkie one odznaczają się tym, że wymagają zastosowania specjalnego znaku lub specjalnej sekwencji znaków oznaczającej początek komentarza i w przypadku komentarzy wielowierszowych, także jego koniec.
Najczęściej chyba spotykanym rodzajem komentarzy są tzw. komentarze w stylu języka C. W języku tym (a także m.in. w językach C++, PHP, C# i Java) do oznaczania komentarzy jednowierszowych stosuje się sekwencję znaków //. Poniżej znajduje się przykładowy kod z komentarzem, który mógłby zostać napisany w tym języku:
// Integer variable named x containing the value 10. int x = 10;
Przykładowe tłumaczenie:
// Zmienna całkowitoliczbowa o nazwie x, przechowująca wartość 10. int x = 10;
Komentarz blokowy w języku C (a także m.in. w językach C++, PHP, C# i Java) oznacza się za pomocą sekwencji znaków /* (początek) i */ (koniec):
/* Integer variable
named x containing
the value 10 */
int x = 10;
Przykładowe tłumaczenie:
/* Zmienna całkowitoliczbowa
o nazwie x
przechowująca wartość 10. */
int x = 10;
W innych językach programowania można spotkać inne oznaczenia komentarzy. Np. w języku PHP oprócz wymienionych dwóch rodzajów komentarzy istnieje jeszcze możliwość oznaczania komentarzy jednowierszowych za pomocą znaku #. Podobnie jest w języku Ruby i np. w pliku konfiguracyjnym serwera Apache httpd.conf. Natomiast np. w języku Visual Basic komentarz jednowierszowy oznacza się za pomocą znaku apostrofu (‘).
Komentarze dokumentacyjne różnią się od zwykłych komentarzy przede wszystkim tym, że są pobierane z kodu źródłowego przez specjalny program i przetwarzane na postać dokumentu pełniącego rolę dokumentacji danego programu. Dlatego są one często bardziej rozbudowane i oznaczane w specjalny sposób, aby dało się je odróżnić od zwykłych komentarzy.
Na przykład w języku Java komentarze dokumentacyjne oznacza się za pomocą sekwencji znaków /** (początek) i */ (koniec), w języku Visual Basic służą do tego trzy apostrofy ('''), a koniec komentarza następuje wraz z końcem wiersza. Natomiast w języku C# używa się trzech ukośników (///) z podobnym zakończeniem jak w Visual Basic.
Pod pojęciem języki znaczników najczęściej rozumiemy języki HTML/XHTML i XML. I w rzeczywistości przytłaczająca większość wszystkich tłumaczeń tego rodzaju dotyczy właśnie dokumentów w tych językach. Warto jednak pamiętać, że języków znaczników jest więcej. Wiele z nich powstało ?na bazie? języka XML. Tzn. mają własną ściśle określoną składnię, ale rządzą się zasadami z XML-a. Z tym też związana jest najważniejsza różnica między językami XHTML i HTML. Pierwszy wywodzi się bezpośrednio od języka XML, natomiast drugi od języka SGML, ale w rzeczywistości oba są do siebie bardzo podobne, ponieważ mówiąc skrótowo XML to uproszczona wersja języka SGML opracowana w celu umożliwienia łatwej wymiany danych między różnymi programami działającymi na różnych platformach.
Pod nazwą języki znaczników najczęściej rozumiemy różne wersje języków HTML/XHTML i XML. Rozpoznanie tego, co należy przetłumaczyć w tego rodzaju dokumentach jest bardzo proste, a jeśli dysponujemy oprogramowaniem wspomagającym tłumaczenie typu Trados, to w ogóle nie trzeba się nad tym zastanawiać. Programy te automatycznie wybierają do tłumaczenia tylko to, co trzeba.
Każdy język znaczników, jak sama nazwa wskazuje, składa się z określonego (HTML/XHTML) lub nieokreślonego (XML), tzn. dowolnego, zbioru elementów. Większość elementów składa się z dwóch znaczników ? otwierającego i zamykającego (elementy składające się z jednego znacznika nie mają treści w tym sensie, co elementy dwuznacznikowe, ale mogą mieć atrybuty). Mają one następującą postać: <nazwa-elementu atrybuty>treść elementu</nazwa-elementu>.
Do tłumaczenia jest przede wszystkim to, co znajduje się między znacznikiem otwierającym a zamykającym, a więc w przytoczonym schemacie byłyby to słowa ?treść znacznika?.
Czasami jednak może być konieczne przetłumaczenie treści niektórych atrybutów. Dotyczy to głównie, ale nie tylko, języków HTML/XHTML. Na przykład poniżej znajduje się znacznik wstawiający na stronę internetową obrazek o nazwie holidays.jpg:
<img src="holidays.jpg" alt="Photo of me and my cousin at the countryside" />
Mimo iż powyższy element nie ma treści właściwej, zawiera atrybut alt. Służy on do określania teksu, który ma zostać wyświetlony zamiast obrazka, jeśli ten będzie z jakiegoś powodu niedostępny (np. przez nieuwagę właściciel strony go usunie). Ten tekst trzeba przetłumaczyć:
<img src="holidays.jpg" alt="Ja i mój kuzyn na wsi" />
Kolejnym miejscem, w którym może znajdować się tekst do przetłumaczenia jest zawartość niektórych tzw. znaczników meta, mówiąc konkretnie ? znaczników <meta name=”keywords” /> i <meta name=”description” />. Pierwszy z nich służy do określania słów kluczowych, wg których wyszukiwarki internetowe kiedyś segregowały strony (obecnie ze względu na nieuczciwe wykorzystanie tego znacznika przez twórców stron internetowych stracił on praktycznie znaczenie, ale nadal jest stosowany). Drugi natomiast zawiera opis strony internetowej, który jest np. wyświetlany przez wyszukiwarkę Google na stronie wyników wyszukiwania.
Znaczniki te mają następującą postać:
<meta name="keywords" content="list of comma-separated keywords" /> <meta name="description" content="description of the page" />
Powyższe znaczniki można by było przetłumaczyć następująco:
<meta name="keywords" content="lista słów kluczowych oddzielanych przecinkami" /> <meta name="description" content="opis strony" />
Przedstawione dotychczas przykłady dotyczą tylko języków HTML/XHTML. W przypadku języka XML sprawa jest nieco bardziej skomplikowana, ponieważ w języku tym nie ma stałego zestawu elementów. Osoba tworząca dokument w tym formacie sama definiuje zestaw elementów i ich przeznaczenie. Dlatego nie zawsze jest oczywiste, zawartość których atrybutów należy tłumaczyć, a których nie. Warto jednak podkreślić, że zasady dotyczące budowy elementów i tłumaczenia ich treści są takie same, jak w przypadku języków HTML/XHTML.
Jeśli chodzi o komentarze w językach znacznikowych, sprawa jest mało skomplikowana. Do ich oznaczania stosuje się sekwencje znaków <!-- (początek) i --> (koniec), np.:
<!-- A paragraph --> <p>A paragraph of text</p>
Przykładowe tłumaczenie:
<!-- Akapit --> <p>Akapit zawierający tekst</p>
Na zakończenie warto jeszcze wspomnieć o komentarzach w języku CSS, który nie jest językiem znaczników, ale jest nierozerwalnie z tymi językami związany. Służy on do określania stylu i układu elementów na stronach internetowych. W języku tym stosuje się opisane wcześniej komentarze w stylu języka C ? /*...*/:
/* Rule that turns the text color of all paragraphs red */
p {color: red}
Przykładowe tłumaczenie:
/* Reguła ustawiająca kolor tekstu wszystkich akapitów na czerwony */
p {color: red}
Dodatkowo w CSS może znajdować się tzw. treść generowana, a więc wstawiana automatycznie przez przeglądarkę na stronę internetową. Aby na przykład na początku każdego akapitu wstawić tekst Once upon a time, można napisać następującą regułę CSS (z zastosowaniem tzw. pseudoelementu :before):
p:before {content: "Once upon a time"}
Jego tłumaczenie może być następujące:
p:before {content: "Pewnego razu"}
Podobne zastosowanie jak :before ma pseudoelement :after, który wstawia treść na końcu elementu, do którego zostanie zastosowany.
Warto pamiętać o tych dwóch pseudoelementach, ponieważ kod CSS jest prawie zawsze zapisany w innym pliku niż sama strona internetowa i tylko do niej dołączany za pomocą specjalnej instrukcji. Jeśli tak będzie i w kodzie tym użyte zostaną opisane pseudoelementy, trzeba będzie je znaleźć w tym dodatkowym pliku i odpowiednio przetłumaczyć.
Podstawową zasadą w tłumaczeniu kodu źródłowego jest nie ruszać słów kluczowych. Słowa kluczowe są rozpoznawane przez kompilator lub interpreter i muszą pozostać w dokładnie takiej postaci, w jakiej napisał je programista.
Również nazwy zmiennych, funkcji itp. konstrukcji zdefiniowanych w programie należy pozostawiać bez zmian. Po pierwsze dlatego, że są one zawsze pisane w języku angielskim i jest to swego rodzaju przyjęty nieformalnie standard. Nazwy w jakimkolwiek innym języku w kodzie programu wyglądają po prostu dziwnie. Z drugiej strony, jeśli zmienimy nazwę zmiennej lub funkcji w jednym miejscu, musimy znaleźć jej wszystkie wystąpienia w innych częściach programu, co powoduje niepotrzebne komplikacje i bardzo łatwo przy tym o pomyłkę.
Istnieją jednak sytuacje, w których warto przetłumaczyć lub w pewien sposób zmodyfikować takie nazwy. Dotyczy to przede wszystkim tekstów edukacyjnych, np. książek o programowaniu, w których przedstawiane są krótkie przykłady kodu. Jeśli więc w tekście znajduje się fragment kodu podobny do poniższego (przykład w języku PHP):
$NoOfItems = 10; echo "Liczba elementów: $NoOfItems";
Można go przetłumaczyć następująco:
$LiczbaElementów = 10; echo "Liczba elementów: $LiczbaElementów";
W powyższym kodzie echo to słowo kluczowe języka PHP (instrukcja wysyłająca dane na wyjście), a więc musi pozostać bez zmian.
Podobnie ma się sprawa w przypadku przeliczania jednostek. Jeśli w tekście oryginalnym zastosowano cale, w polskim tekście należy je zamienić na centymetry. Wówczas można zmienić także nazwę zmiennej. Oto przykład:
$NumberOfInches = 40;
Powyższy fragment można przetłumaczyć na język polski lub pozostawić po angielsku, ale wprowadzając zmianę w nazwie jednostki:
$LiczbaCentymetrów = 100;
albo
$NumberOfCentimeters = 100