- en
- pl
OpenTTD GitHub
Wkład w OpenTTD - wytyczne
OpenTTD Doxygen
Styl kodowania
Kompilowanie OpenTTD
Debugowanie
Dodanie ustawienia
Dodanie funkcji squirrel
Zrozumienie obsługi SaveGame
Wyznaczenie wersji gry zapisanej
Wykonanie wydania OpenTTD
Podręcznik stylu
Format plików lang
Użycie ciągów OpenTTD
Lista ciągów specjalnych
Użycie systemu okna
Kody kolorów istniejących w OpenTTD
Dodawanie pola tekstowego
Zrozumienie widget focus system
Przewodnik stylu GUI
OpenTTD TCP protokół
OpenTTD UDP protokół
Debugowanie desynchronizacji
Rozwój Portu Administratora Serwera
Okno konsoli
Komendy konsoli
Zmienne konsoli
Używanie skryptu konsoli
Dodanie funkcji/komend do konsoli
Dodanie zmiennych do konsoli
Historia rozwoju Konsoli
Grafika i podobne (NewGRFy)
Środowisko AI (NoAI)
Framework GS (NoGO)
Tablica map (siatka pozioma)
Pojazdy
Wyszukiwanie trasy
Przyspieszenie pociągu
Ta strona dotyczy i18n ciągi z developers punkt widzenia. Jeśli interesują Cię aspekty tłumaczeń, zobacz Format plików lang po bardziej szczegółowy artykuł. Artykuł ten obejmuje również pojęcia specyficzne dla języka, takie jak odmiana z powodu płci, przyczyn i mnogości.
OpenTTD ma wbudowaną obsługę napisów w wielu językach. Te widoczne dla użytkownika teksty muszą być przetłumaczone na wiele języków obcych. Łańcuchy znaków zależne od języka są przechowywane w plikach tekstowych pod src/lang/ i mają wzór [language name].txt
. Jak każdy plik kodu źródłowego są pod kontrolą wersji przez SVN. Językiem głównym jest angielski (British English) i zapisany jest w pliku english.txt . Aby uzyskać szczegółowe wyjaśnienie tych plików, patrz Format plików lang . Podczas procesu kompilacji narzędzie „strgen” kompiluje pliki językowe w odpowiadające im pliki .lng
pliki, które z kolei są wykorzystywane podczas gry.
Contents |
Dodawanie ciągów
Dodajesz ciąg, podając mu identyfikator, a następnie pewną liczbę spacji, następnie dwukropek ":" , a następnie sam ciąg. Użyj do tego pliku english.txt . Zgodnie z konwencją identyfikatory ciągów zawsze zaczynają się od STR_ . Linia może polubić coś takiego:
STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} is getting very old
Zauważ, że lokalizacja, do której dodajesz ciąg, nie jest całkowicie dowolna (patrz Zakresy poniżej ) . Ciągi w nawiasach klamrowych ("{}") to ciągi znaków specjalnych interpretowane podczas ich renderowania. Jak można się domyślić, {WHITE}
nadaje ciągowi biały kolor. Aby zapoznać się z listą specjalnych ciągów znaków, patrz Ciągi Specjalne .
Komentarze
Każda linia rozpoczynająca się od znaku skrótu "#" jest uważana za linię komentarza. Puste linie (linia z tylko znakiem powrotu karetki) są ignorowane i mogą być używane do grupowania ciągów, które należą do siebie semantycznie.
Specjalne ciągi znaków
Ciągi mogą zawierać "Ciągi specjalne", które pozwalają modyfikować sposób renderowania ciągu lub zastępować symbole zastępcze. Lista ciągów specjalnych znajduje się w osobny artykuł .
Zakresy
Zakresy powinny być wizualnie oznaczone jako blok zarówno przez początkowe, jak i końcowe komentarze w ten sposób:
############ zakres dla startów miesięcy STR_MONTH_ABBREV_JAN :Jan STR_MONTH_ABBREV_FEB :Feb STR_MONTH_ABBREV_MAR :Mar # ... ############ zakres dla końców miesięcy
Nie przerywaj zakresów podczas dodawania ciągów, ponieważ może to mieć niepożądane skutki uboczne!
Zakresy są często używane do definiowania grupy tekstów, które nie są bezpośrednio przywoływane w kodzie źródłowym. Zamiast tego wykonywane jest obliczenie przesunięcia w stosunku do pierwszego wpisu bloku. W związku z tym do tekstów odwołuje się tylko pośrednio i w czasie wykonywania.
Wewnętrzne (Internals)
Technicznie identyfikatory ciągów są automatycznie przypisywane do liczb całkowitych. Odbywa się to podczas procesu kompilacji. Spójne odwołanie jest zapewnione przez plik nagłówkowy (patrz lang/table/strings.h ), który jest generowany automatycznie. Odpowiednim typem danych używanym dla łańcuchów w kodzie źródłowym C ++ jest StringID
. Takie podejście pozwala wykonywać arytmetykę na StringID, na przykład obliczanie przesunięcia.
Funkcje przetwarzania zmiennych
Przykład
Jak widzieliście wcześniej, musicie umieścić te specjalne modyfikatory w samym łańcuchu. Powróćmy do powyższego przykładu:
STR_01A1_IS_GETTING_VERY_OLD :{WHITE}{STRING} {COMMA} is getting very old
Zarówno "STRING", jak i "COMMA" są zmiennymi. Konfigurujesz je, wywołując odpowiednią funkcję "SetDParam(uint n, uint32 v)" . Więc dla tego zrobiłbyś:
SetDParam(0, _vehicle_type_names[v->type - 0x10]); SetDParam(1, v->unitnumber);
Dopiero potem wywołujesz odpowiednią funkcję losowania, na przykład:
DrawStringRightAligned(x, y, STR_01A1_IS_GETTING_VERY_OLD, colour);
Oba parametry "STR_01.." zostały skonfigurowane, a informacje ładnie wyświetlisz na ekranie.
Lista funkcji
Oprócz SetDParam(uint n, uint32 v) dostępne są inne funkcje SetDParamxxx :
Signatura | Opis | Przykład | Uwagi |
---|---|---|---|
SetDParam(uint n, uint32 v)
|
Ustaw wartość zmiennej w indeksie n na wartość v. | patrz wyżej | W zależności od użytej zmiennej wartość jest interpretowana w różny sposób. |
SetDParamStr(uint n, const char *str)
|
Użyj pełnego łańcucha str , aby zastosować go do zmiennej o indeksie n . |
Załóżmy, że jest to STR_XYZ: Hello World - {RAW_STRING} w english.txt i STR_XYZ: Hallo Welt - {RAW_STRING} w german.txt . Kodowanie char *hello = 'Hello World!'; SetDParamStr(0, hello); DrawStringRightAligned(x, y, STR_XYZ, colour);wytworzy Hello World - Hello World! w English i Hallo Welt - Hello World! w German.
|
Zauważ, że str jest używane dosłownie, tzn. Wartość zmiennej jest drukowana "as is" (jak jest) bez żadnego wyszukiwania pomiędzy nimi (zwykle używana do dostarczania nieprzetłumaczonych nazw zmiennych). Używaj tylko {RAW_STRING} jako zmiennej!
|
SetDParamMaxDigits(uint n, uint count)
|
available since r24801: Emuluj wartość zmiennej przy indeksie n, który jest liczbą całkowitą, tworząc liczbę, która ma count cyfry o maksymalnej szerokości. |
Załóżmy, że dla bieżącej czcionki cyfra „8” jest cyfrą o największej szerokości czcionki. Jeśli wywołasz SetDParamMaxDigits(1, 4) , będzie to równoznaczne z wywołaniem SetDParam(1, 8888) .
|
Te funkcje są zwykle używane, gdy istnieje potrzeba odgadnięcia maksymalnej szerokości określonego łańcucha, na przykład w UpdateWidgetSize. Skorzystaj z tej funkcji, jeśli znasz górną granicę zmiennej i obliczenie dokładnej wartości może być kosztowne, ale potrzebujesz tylko "dobrego odgadnięcia" (good guess) dla całkowitej szerokości końcowego łańcucha. |
SetDParamMaxValue(uint n, uint64 max_value, uint min_count = 0)
|
available since r24801: Emuluj wartość zmiennej przy indeksie n, który jest liczbą całkowitą, tworząc liczbę z tyloma cyframi o maksymalnej szerokości, ile zapewnia max_value . Jeśli podano min_count upewnij się , że utworzono co najmniej cyfry min_count . |
Załóżmy, że dla bieżącej czcionki cyfra 8 jest cyfrą o największej szerokości czcionki. Jeśli wywołasz SetDParamMaxValue(1, 1234) , this would be equivalent to calling SetDParam(1, 8888) , ponieważ 1234 składa się z czterech cyfr. Jeśli wywołasz SetDParamMaxValue(2, 123, 5) , będzie to równoznaczne z wywołaniem SetDParam(2, 88888) , ponieważ 123 ma tylko trzy cyfry, ale poprosiłeś o co najmniej pięć cyfr.
|
Rozdzielczość zagnieżdżona za pomocą poleceń {STRINGx}
Za pomocą poleceń {STRINGx}
można uruchomić zagnieżdżoną rozdzielczość ciągów. Podczas korzystania z funkcji do przetwarzania zmiennych indeksy odwołują się w kolejności od góry do dołu , podczas gdy węzły liści muszą znajdować się w kolejności od lewej do prawej .
Oto przykład: Niech ciągi zostaną zdefiniowane jako
STR_A : A STR_X : X STR_Y : Y STR_TOP : {STRING5} STR_1ST_LEVEL : {STRING1} / {STRING2} STR_2ND_LEVEL_A : {STRING} STR_2ND_LEVEL_X : {STRING} - {STRING}
Aby uzyskać wynik A / X - Y
podczas rysowania ciągu STR_TOP
, musisz ustawić zmienne w ten sposób:
SetDParam(0, STR_1ST_LEVEL); SetDParam(1, STR_2ND_LEVEL_A); SetDParam(2, STR_A); SetDParam(3, STR_2ND_LEVEL_X); SetDParam(4, STR_X); SetDParam(5, STR_Y); DrawString(x, y, STR_TOP, colour);
Ponadto zwróć uwagę, jak STR_TOP
jest zdefiniowane jako {STRING5}
: pierwsza zmienna STR_1ST_LEVEL
wymaga miejsca na dwie zmienne (StringID ciągu na pokaż plus wartość jednej zmiennej). Druga zmienna STR_1ST_LEVEL
wymaga miejsca na trzy zmienne (StringID ciągu do wyświetlenia plus dwie dodatkowe wartości zmiennych).
Cykl życia
"Źródło prawdy" dla ciągów i18n znajduje się tylko w tabelach tekstowych plików językowych (to jest na przykład "english.txt" ) . Oznacza to, że WebTranslator jest aktualizowany automatycznie na podstawie najnowszego stanu dostępnego w bagażniku (trunk) repozytorium SVN. Dlatego można bezpiecznie usunąć cały wpis z "english.txt" , jeśli wiesz, że nie jest już używany w innym miejscu (Uwaga: jeśli nie znajdziesz nazwy łańcucha w żadnym pliku kodu źródłowego, nie możesz zakończyć że nie jest już używany z powodu zasięgu]). Upewnij się, że wyczyściłeś również wpis we wszystkich innych językach, ponieważ nie dzieje się to automatycznie w bagażniku (trunk).
Co więcej, mówiąc bardziej ogólnie, jeśli chcesz zmienić oryginalny tekst angielski, musisz pomyśleć o wpływie również na inne języki. Oto kilka praktycznych zasad:
- Jeśli masz pewność, że twoje zmiany wpłyną na wszystkie języki (także te, których nie znasz) w ten sam sposób (na przykład, chcesz zmienić {RED} na {GREEN} ), a następnie sam zmień go mechanicznie we wszystkich językach. Nie czekaj, aż tłumacz dostosuje wszystkie inne języki.
-
Jeśli nie możesz ocenić, czy zmiana zmieni rzeczy w innych językach (na przykład zmieniłeś jedno słowo w zdaniu) lub jeśli wiesz, że to na pewno zmieni (na przykład zmieniłeś całą frazę), to wykonaj modyfikacja w języku angielskim i usunięcie wszystkich innych tłumaczeń tego ciągu z innych tabel tekstowych. Dla tłumaczy dużo łatwiej jest znaleźć brakujące tłumaczenie niż szukać zmienionego! Ponieważ SVN przechowuje historię, oryginalne tłumaczenie również nie jest tracone i może zostać przywrócone, jeśli jest to naprawdę konieczne.
Także w bieżącym przypadku, jeśli jesteś pewien określonego języka (na przykład jest to język ojczysty) jak należy dostosować tłumaczenie, dostosuj je sam. Wciąż pozbywaj się innych ciągów w innych językach, których nie znasz wystarczająco dobrze. W razie wątpliwości, czy to, co robisz, jest prawidłowe, nie zmieniaj wpisu, ale go usuń.