Ciągi znaków
Dokumentacja programistyczna OpenTTD
Linki zewnętrzne

OpenTTD GitHub
Wkład w OpenTTD - wytyczne
OpenTTD Doxygen

Informacje Ogólne

Styl kodowania
Kompilowanie OpenTTD
Debugowanie
Dodanie ustawienia
Dodanie funkcji squirrel
Zrozumienie obsługi SaveGame
Wyznaczenie wersji gry zapisanej
Wykonanie wydania OpenTTD

Języki i Ciągi znaków

Podręcznik stylu
Format plików lang
Użycie ciągów OpenTTD
Lista ciągów specjalnych

System Okna

Użycie systemu okna
Kody kolorów istniejących w OpenTTD
Dodawanie pola tekstowego
Zrozumienie widget focus system
Przewodnik stylu GUI

Tryb wieloosobowy

OpenTTD TCP protokół
OpenTTD UDP protokół
Debugowanie desynchronizacji
Rozwój Portu Administratora Serwera

Konsola (w grze)

Okno konsoli
Komendy konsoli
Zmienne konsoli
Używanie skryptu konsoli
Dodanie funkcji/komend do konsoli
Dodanie zmiennych do konsoli
Historia rozwoju Konsoli

Interfejsy API (ramy modowania)

Grafika i podobne (NewGRFy)
Środowisko AI (NoAI)
Framework GS (NoGO)

Inne odniesienia

Tablica map (siatka pozioma)
Pojazdy
Wyszukiwanie trasy
Przyspieszenie pociągu

/File/en/Notice.png
Informacja
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
/File/en/Content.png
Uwaga!
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: