Arkusze Google oferują szeroką gamę funkcji, tutaj skupię się na jednej z nich - na funkcji GOOGLETRANSLATE. Funkcja ta pozwala automatycznie tłumaczyć słowa i frazy pomiędzy dwoma językami, tak jak zwykłe Google Translate, ale obecność jej w arkuszu może oszczędzić nam naprawdę dużo czasu. W tym konkretnym przypadku zademonstruję tłumaczenie potencjalnego firmware automatyki do domu, ale myślę, że ma to znacznie więcej zastosowań i każdy znajdzie coś dla siebie.
Podstawy GOOGLETRANSLATE
Otwieramy nasz arkusz Google i wpisujemy w A1 jakieś przykładowe słowo - "Przekaźnik":
W B1 wpisujemy znak równości a potem zaczynamy pisać GOOGLE, podpowiedź powinna się już pojawić:
Zatwierdzamy, teraz trzeba wpisać trzy argumenty:
Argumenty to:
- tekst do przetłumaczenia (bądź komórka z nim)
- język źródłowy
- język docelowy
Gotowe:
Wszystko działa:
Rozwijamy arkusz
Wiemy już jak GOOGLETRANSLATE działa, ale pora zacząć go lepiej używać. Na początku mała zmiana - u mnie w firmware wszystko jest po angielsku, więc bazowym językiem będzie angielski. Oprócz tego wyrzucę kody języków zapisane "na sztywno" w komórkach tak, aby były w pierwszej komórce. A więc zaglądamy do kodów języków:
https://developers.google.com/admin-sdk/directory/v1/languages?hl=pl
Tworzymy kolumny dla każdego z nich:
Wpisujemy magiczną formułę. Cała idea tu polega na tym, by użyć znaku $ by włączyć adresowanie bezwzględne dla kolumny A (słowo źródłowe), dla języka źródłowego oraz dla wiersza języka docelowego:
Zaznaczamy komórkę i rozciągamy w dół:
A potem w prawo:
Powiązana funkcja
Jak już jesteśmy przy temacie tłumaczeń, to warto wspomnieć o powiązanej funkcji, a mianowicie o DetectLanguage - zwraca ona kod języka dla danego słowa:
W ten sposób otrzymujemy:
Może się przydać jak nie rozpoznajemy danego języka.
Potencjalna pułapka
Czy teraz wszystko jest już idealnie przetłumaczone? Niestety nie, raczej ktoś znający język powinien to przejrzeć. Google Translate nie jest idealne i nie zna kontekstu, więc dziwne tłumaczenia i tak się trafiają. To co wykonaliśmy powinno stanowić raczej tylko bazę do dalszych tłumaczeń.
Eksport rezultatów
Teraz kwestia dalszej obróbki danych. Z Google Sheets można pobrać plik CSV, czyli comma separated values (wartości oddzielone przecinkiem).
Tak prezentuje się ten plik po pobraniu:
Struktura pliku jest naprawdę bardzo prosta. Można ją bardzo łatwo wczytać we własnym programie, wystarczą dwa etapy:
- czytamy linia po linii
- dzielimy linię na frazy wedle przecinków
Przykładowy kod w C#:
Kod: C#
Kod ten po prostu wczytuje taki plik i wypisuje z niego osobne wartości. Wczytywanie jest realizowane wiersz po wierszu.
Jak jest realizowane tłumaczenie dla programów napisanych w C/C++?
Pora iść o krok dalej i zastanowić się jak możemy zrobić wersje językowe dla naszego softu. Spójrzmy tu na jakiś praktyczny przykład, jak to np. zrobione w Tasmota?
https://tasmota.github.io/docs/
Zacząć trzeba od tego, że mogą być dwa sposoby tłumaczeń:
- wersja językowa osadzona w czasie kompilacji w firmware (tylko jedna, wybrana) - wymaga to zmiany wsadu by zmienić język, ale oszczędza pamięć
- można również we wsadzie trzymać różne wersje językowe (bądź wczytywać je z plików, itd) - to z kolei zajmuje więcej pamięci
Tasmota ma osobne pliki binarne dla języków:
Tłumaczenie zrealizowane jest w oparciu o preprocesor:
Mamy osobne nagłówki które definiują napisy, np:
Kod: C / C++
Oto część z nich:
Dla niemieckiego:
A potem w kodzie aplikacji używany jest po prostu wykonany #define, w ten sposób:
Kod: C / C++
Ważne by pamiętać, że w czasie kompilacji załączany jest tylko jeden z tych nagłówków. Potem kompilacja jest wykonywana osobno dla każdego z takich nagłówków i rezultatem są osobne pliki binarne, po pliku na każdy język.
Automatyczna generacja nagłówków
Skoro już wiemy jak tłumaczenia realizuje Tasmota, to spróbujmy odwzorować to samo u nas w kodzie. Dopiszmy do naszego arkusza nazwy definicji preprocesora:
Następnie zmodyfikujmy nasz kod, tak aby automatycznie czytał CSV i tworzył nagłówki tłumaczeń:
Kod: C#
Warto pamiętać, że pętle zaczynam tu od 1 a nie od 0, by pominąć pierwszą kolumnę z nazwą dla preprocesora. Kolejno tworzę osobne pliki dla każdego języka:
Pliki jak na razie są bardzo proste:
Tu by jeszcze przydało się zrobić jakiś standard, zamiast samego NO, może lepiej S_NO, itd. Tak jak zresztą w Tasmocie, oni tam mają prefix D_.
A więc zmieniamy:
Kod: C#
na:
Kod: C#
Oczywiście to tylko zalążek i jest z tym jeszcze kilka potencjalnych rzeczy do poprawki, ale na cele demonstracyjne to wystarczy.
Podsumowanie
Niewątpliwie Google Sheets mogą pomóc z automatyzacją tłumaczeń, również w przypadku tłumaczenia programu na mikrokontroler, chociaż i tak uważam, że trzeba zachować przy tym pewną ostrożność i przepuścić każde tłumaczenie przez kogoś, kto dany język zna. Pozwoli to uniknąć absurdów w stylu "droga ciociu" jako "road aunt" bądź "drogi wujku" jako "expensive uncle". Dodatkowo warto pamiętać, że przygoda nie kończy się na samych Arkuszach, bo zawsze można pobrać jeszcze CSV i dalej go obrabiać chociażby w prostych samodzielnie napisanych programach, co tutaj również pokazałem.
A jakie Wy macie zastosowania dla Google Sheets? Zapraszam do dyskusji.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.
