Narzędzia tłumacza
Eksportowanie tłumaczenia z Alchemy Catalyst Translator/Lite Edition
Opublikowano 23 sty 2018
Nie lubię programu Alchemy Catalyst, ale od czasu do czasu, niestety, muszę w nim coś przetłumaczyć. W wersji Translator/Lite Edition program ten nie pozwala na eksport tłumaczenia w formacie czytelnym dla xbench, a przynajmniej nigdzie nie znalazłem takiej opcji. Pliki do tłumaczenia mają rozszerzenie .ttk, ale format ten nie jest nigdzie opisany. Można zmienić rozszerzenie .ttk na .zip i rozpakować plik, ale nie na wiele się to zdaje, bo jego struktura jest, przynajmniej dla mnie, zbyt skomplikowana.
Rozwiązałem ten problem za pomocą programu AutoHotkey. Nie jest to może rozwiązanie eleganckie ani w stu procentach niezawodne, ale do celów praktycznych wystarczająco skuteczne. Wymagało napisania skryptu, który przechodzi po kolei przez poszczególne segmenty tłumaczenia, zaznacza i kopiuje do schowka treść oryginału, po czym zapisuje ją w pliku tekstowym, a następnie robi to samo z tekstem przetłumaczonym. Kod skryptu prezentuję poniżej. Uważam tę metodę za stosunkowo zaawansowaną, więc omówię dość szczegółowo poszczególne fragmenty. Przygotowałem go z myślą o edytorze tekstu Notepad++, ale wystarczą niewielkie modyfikacje, by można go było użyć z dowolnym innym. Ważne jest, aby przed wywołaniem skryptu uruchomić program Alchemy Catalyst (z pewnego powodu, o którym wspomnę dalej, musi to być wersja 12.0) oraz wybrany edytor, a następnie przejść do okna programu Catalyst i umieścić kursor w pierwszym segmencie, który ma zostać wyeksportowany.
Skrypt można wywołać na wiele różnych sposobów, na przykład kliknąć dwukrotnie zawierający go plik .ahk albo zdefiniować wywołujący go hotkey. Ja na swoje potrzeby utworzyłem dla programu Alchemy Catalyst odpowiednie menu, którego jedną z opcji jest wywołanie tego skryptu.
Początek skryptu to ustawienie zmiennych wykorzystywanych w dalszych instrukcjach oraz ustawienie sposobu działania schowka. Przeznaczenie zmiennych jest następujące:
- __Cnt__ — służy do ustawiania wartości atrybutu tuid elementu tu
- __Prolog__ — zawiera początkowe elementy wymagane przez specyfikację formatu TMX
- __Source__ — zawiera elementy poprzedzające treść segmentu oryginalnego
- __Target__ — zawiera elementy występujące między segmentem oryginalnym a przetłumaczonym
- __EndSeg__ — zawiera elementy kończące segment tłumaczenia
- __Epilog__ — zawiera elementy kończące plik w formacie TMX
- __FirstClip__ — służy do przechowywania zawartości pierwszego eksportowanego segmentu
- __Start__ — sygnalizuje początek działania skryptu
__Cnt__ = 1 __Prolog__ := "<?xml version=""1.0"" encoding=""UTF-8"" ?>{Enter}<tmx version=""1.4"">{Enter} <header creationtool=""Greg"" creationtoolversion=""1.0"" o-tmf=""Greg"" datatype=""plaintext"" segtype=""sentence"" adminlang=""en-US"" srclang=""en-US"">{Enter} </header>{Enter} <body>{Enter}" __Source__ := "<tuv xml:lang=""en-US"">{Enter}<seg>" __Target__ := "</seg>{Enter}</tuv>{Enter}<tuv xml:lang=""pl"">{Enter}<seg>" __EndSeg__ := "</seg>{Enter}</tuv>{Enter}</tu>{Enter}" __Epilog__ := "</body>{Enter}</tmx>{Enter}" __FirstClip__ := "" __Start__ = 1 AutoTrim Off ; zachowuje spacje na początku i końcu schowka
Następnie wykonywane są kolejne operacje:
1. Uruchomienie edytora Notepad++ i przejście do jego okna
Run %ProgramFiles%\Notepad++\notepad++ WinActivate, Notepad++ WinWaitActive, Notepad++
2. „Naciśnięcie” kombinacji klawiszy Ctrl+n w celu otwarcia nowej karty edytora oraz wprowadzenie początkowych elementów pliku w formacie TMX (wartość zmiennej __Prolog__)
Send ^n Send %__Prolog__%
3. Przejście do okna programu Alchemy Catalyst
WinActivate, Alchemy Catalyst WinWaitActive, Alchemy Catalyst
4. Rozpoczęcie pętli przetwarzania poszczególnych segmentów tłumaczenia
Loop {
5. Opróżnienie schowka systemowego
Clipboard =
6. Ustawienie kursora w polu zawierającym segment oryginalny
ControlFocus, RichEdit20W4 Sleep 100
Etykieta RichEdit20W4 reprezentuje klasę okna. Aby ją poznać, na przykład w celu napisania tego skryptu, należy skorzystać z narzędzia Window Spy, które jest integralną częścią instalacji programu AutoHotey. Odpowiednie informacje zaznaczyłem na poniższej ilustracji.
Wspomniałem wcześniej, że skrypt działa wyłącznie z programem Alchemy Catalyst w wersji 12.0. Wynika to stąd, że w poprzednich wersjach klasy odpowiednich okien były inne.
Instrukcja Sleep wprowadza opóźnienie, które jest niezbędne do poprawnego działania skryptu.
7. Zaznaczenie i skopiowanie do schowka treści segmentu oryginalnego
Send ^a^c Sleep 100
8. Sprawdzenie konieczności zakończenia działania skryptu
W pierwszej wersji skryptu sprawdzałem tylko, czy bieżący segment oryginału był pusty, i jeśli tak było, decyzję o zakończeniu działania pozostawiałem użytkownikowi. Obecnie algorytm sprawdzania zakończenia jest bardziej złożony. Przy pierwszym wykonaniu pętli zapamiętuje pierwszy segment oryginału, a później każdorazowo sprawdza, czy bieżący segment oryginału jest taki sam jak pierwszy, co zazwyczaj oznacza, że wszystkie zostały już sprawdzone i skrypt przeszedł ponownie do pierwszego. W drugiej kolejności sprawdzane jest, czy segment oryginału jest pusty. Wybór odpowiedzi Tak powoduje wyjście z pętli przetwarzania segmentów.
if (__Start__) { __FirstClip__ = %Clipboard% __Start__ = 0 } else { if (Clipboard = __FirstClip__) { MsgBox, 292, Zakończenie eksportu, Napotkano identyczny segment źródłowy jak pierwszy. Czy zakończyć eksport? IfMsgBox Yes Break } } if (Clipboard = "") { MsgBox, 292, Zakończenie eksportu, Napotkano pusty segment. Czy zakończyć eksport? IfMsgBox Yes Break }
Okno dialogowe zakończenia skryptu wygląda tak:
9. Modyfikacja segmentu oryginału w celu zapewnienia poprawności formatu wynikowego. Niezbędne jest zastąpienie znaków &, < oraz >.
Clipboard := StrReplace(Clipboard, "&", "&", 0, -1) Clipboard := StrReplace(Clipboard, "<", "<", 0, -1) Clipboard := StrReplace(Clipboard, ">", ">", 0, -1)
10. Przejście do edytora i wprowadzenie segmentu oryginalnego
WinActivate, Notepad++ WinWaitActive, Notepad++ Send <tu tuid=" Send %__Cnt__% __Cnt__++ Send ">{Enter} Send %__Source__% Send ^v
11. Przejście do Catalysta i umieszczenie w schowku zawartości przetłumaczonego segmentu
WinActivate, Alchemy Catalyst WinWaitActive, Alchemy Catalyst Clipboard = ControlFocus, RichEdit20W3 Sleep 100 Send ^a^c Sleep 100
12. Modyfikacja segmentu tłumaczenia w celu zapewnienia poprawności formatu wynikowego. Niezbędne jest zastąpienie znaków &, < oraz >.
Clipboard := StrReplace(Clipboard, "&", "&", 0, -1) Clipboard := StrReplace(Clipboard, "<", "<", 0, -1) Clipboard := StrReplace(Clipboard, ">", ">", 0, -1)
13. Przejście do edytora i wprowadzenie tłumaczenia
WinActivate, Notepad++ WinWaitActive, Notepad++ Send %__Target__% Send ^v Send %__EndSeg__%
14. Przejście do Catalysta i naciśnięcie kombinacji klawiszy Ctrl+Shift+n powodującej wczytanie kolejnego segmentu
WinActivate, Alchemy Catalyst WinWaitActive, Alchemy Catalyst Send ^+n Sleep 100
15. Zakończenie pętli przetwarzania segmentów tłumaczenia
}
16. Wprowadzenie końcowych elementów pliku TMX
WinActivate, Notepad++ WinWaitActive, Notepad++ Send %__Epilog__% Return
Wynikiem działania skryptu na niewielkim pliku .ttk zawierającym dwa segmenty
jest poniższy plik w formacie TMX, który można wczytać do xbench lub wykorzystać w dowolny inny sposób.
<?xml version="1.0" encoding="UTF-8" ?> <tmx version="1.4"> <header creationtool="Greg" creationtoolversion="1.0" o-tmf="Greg" datatype="plaintext" segtype="sentence" adminlang="en-US" srclang="en-US"> </header> <body> <tu tuid="1"> <tuv xml:lang="en-US"> <seg>BridgeIT Server:</seg> </tuv> <tuv xml:lang="pl"> <seg>Serwer BridgeIT:</seg> </tuv> </tu> <tu tuid="2"> <tuv xml:lang="en-US"> <seg>Email or Domain ID:</seg> </tuv> <tuv xml:lang="pl"> <seg>Adres e-mail lub identyfikator domeny:</seg> </tuv> </tu> </body> </tmx>
Ponieważ działanie skryptu polega na symulacji czynności wykonywanych za pomocą klawiatury, od momentu jego uruchomienia do wyświetlenia okna dialogowego z pytaniem o zakończenie nie wolno wykonywać na komputerze żadnych operacji. W zależności od wielkości eksportowanego tłumaczenia najlepiej pójść w tym czasie na kawę albo obiad.