Eksportowanie tłumaczenia z Alchemy Catalyst Translator/Lite Edition

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.
Alchemy-01.png

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.
Alchemy-03.png
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:

Alchemy-02.png

9. Modyfikacja segmentu oryginału w celu zapewnienia poprawności formatu wynikowego. Niezbędne jest zastąpienie znaków &, < oraz >.

    Clipboard := StrReplace(Clipboard, "&", "&amp;", 0, -1)
    Clipboard := StrReplace(Clipboard, "<", "&lt;", 0, -1)
    Clipboard := StrReplace(Clipboard, ">", "&gt;", 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, "&", "&amp;", 0, -1)
    Clipboard := StrReplace(Clipboard, "<", "&lt;", 0, -1)
    Clipboard := StrReplace(Clipboard, ">", "&gt;", 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
Alchemy-00.png
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.

<< Wróć do poprzedniej strony