Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%)
|
Przyszło mi się po raz pierwszy zmierzyć z wielojęzykową stroną.
Jest to modyfikacja istniejącej strony, która ma ją już zaaplikowaną na zasadzie tablicy PHP: $lang['ciąg'] = 'Tłumaczenie'; Każda tablica w oddzielnym pliku i w zależności od wczytanego języka dany plik jest includowany. Na dobrą sprawę mógłbym zostawić tę metodę (chyba najpopularniejszą), ale wg mnie nie jest ona praktyczna: - w kodzie widzimy nic nie mówiące <?= $lang['ab123'] ;?> - nowe zdanie czy słowo wymaga edycji X plików, gdzie X to liczba języków - źle obsługuje brak tłumaczenie dla danego języka (np. wyrażenie, która nie wymaga tłumaczenia) Napisałem coś własnego na podstawie tablicy wielowymiarowej co pozwala na pominięcie całego tłumaczenia czy tylko danego języka. Gdy nie znajdzie tłumaczenia wyświetla tekst domyślnie wprowadzony (wzorowałem się troszkę gettext).
Działa prosto, a zarazem bardziej intuicyjnie. Zastanawia mnie tylko kwestia optymalności. Może ktoś to rozwiązał w inny sposób? Może pliki XML (bazę pomijam, to strona typu "wizytówka" bez bazy danych)? Wcześniejszy pomysł opierał się na używaniu indeksów do wyszukiwania fraz: $arr['ala_ma_kota'] = [ tablica z tłumaczeniami ] ale tutaj zastanawia mnie kwestia tego ile znaków można wpakować w indeks no i wygląda to troszkę irracjonalnie. Ten post edytował markonix 6.09.2011, 10:24:23 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%)
|
Wydaje mi się, że przekombinowałeś sprawę, przede wszystkim nie dodałeś nic nowego oprócz innego ułożenia tablicy i foreach().
1. Twój sposób już teraz wydaje się mało czytelny, a wyobraź sobie sytuację, gdzie masz 8 języków i 900 komunikatów/słówek itp. - w każdej tablicy będzie trzeba oddzielnie doklejać klucz, a edycja czegoś to już w ogóle będzie bardzo trudna bo w tym gąszczu kluczy trzeba będzie znaleźć co trzeba. 2. Ten pierwszy sposób z oddzielnym plikiem z tablicą jest naprawdę bardzo skuteczny, ale faktycznie nie w takim wydaniu jak go zastałeś. Osobiście robię to tak: - dla każdego języka oddzielny plik z tablicą np. pl.php, en.php, ru.php ładowany na podstawie języka ustawione w przeglądarce lub język ustawiony jako domyślny; - tablice wielowymiarowe z podziałem na wiadomości, oraz treść użyta na sztywno w html, czyli $_LANG['msg'] = array(), $_LANG['html'] = array(), oraz inne w zależności od potrzeb. - Każdy klucz ma w miarę logiczną nazwę(hasło) i jest w swojej sekcji, wygląda to mniej więcej tak:
- jak potrzebne jest tłumaczenie to wysyłasz plik z tablicą do tłumacza i on odsyła przetłumaczony, nie wyobrażam sobie, żeby tłumacz miał sam doklejać klucze to wielowymiarowych tablic; - jeżeli chcesz się zabezpieczyć przed ewentualnym brakiem klucza to wystarczy mieć dodatkowy plik np. default.php i ładować tłumaczenie funkcją http://php.net/manual/en/function.array-replace.php - wtedy brakujące klucze będą pochodziły z default.php |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%)
|
Przekonałeś mnie (IMG:style_emoticons/default/wink.gif)
|
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 6.09.2011 Skąd: Wrocław Ostrzeżenie: (0%)
|
Zagadnienie obsługi wielu języków to ... a ciekawy temat.
W Twojej wersji kodu użycie samego foreach jest nieoptymalne (lepiej używać for'a na podstawie już obliczonego rozmiaru tablicy). Jednak dla stron typu wizytówka, gdzie ilość tłumaczonego tekstu jest niewielka, można użyć dwóch rozwiązań. 1. Klasa odczytująca z pliku XML wartości (lepsza metoda). 2. Stworzenie trzech plików 'pl.lang', 'en.lang', 'de.lang' i zawarcie w nich stałych, np.: define('__HELLO__', 'Witaj'); I w zależności od zmiennej $lang robisz require_once pliku językowego. A wszędzie używasz tych samych stałych. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 778 Pomógł: 84 Dołączył: 29.07.2010 Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury. Ostrzeżenie: (20%)
|
Wg mnie nie wygląda to zbyt ciekawie, ponadto jest o niebo wolniejsze od zastosowania zwykłej tablicy dla zmiennej $lang.
Nie prościej by było zakomentować linie, w których wywołujesz tłumaczenie ? |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%)
|
Zamiast pętli użyłbym funkcji vsprintf na tablicy.
Ten post edytował !*! 7.09.2011, 10:25:39 |
|
|
|
![]() ![]() |
|
Aktualny czas: 25.12.2025 - 08:51 |