Zmagam się z tym pytaniem już od kilku miesięcy, ale nie byłem w sytuacji, w której musiałbym wcześniej zbadać wszystkie możliwe opcje. W tej chwili czuję, że nadszedł czas, aby poznać możliwości i stworzyć własne preferencje do wykorzystania w nadchodzących projektach.
Pozwól mi najpierw naszkicować sytuację, której szukam
Mam zamiar zaktualizować / przeprojektować system zarządzania treścią, którego używam od dłuższego czasu. Jednak czuję, że wielojęzyczność to świetne ulepszenie tego systemu. Wcześniej nie korzystałem z żadnych frameworków, ale zamierzam używać Laraval4 w nadchodzącym projekcie. Laravel wydaje się najlepszym wyborem czystszego sposobu kodowania PHP. Sidenote: Laraval4 should be no factor in your answer
. Szukam ogólnych sposobów tłumaczenia, które są niezależne od platformy / frameworka.
Co należy przetłumaczyć
Ponieważ system, którego szukam, musi być jak najbardziej przyjazny dla użytkownika, sposób zarządzania tłumaczeniem powinien znajdować się wewnątrz CMS. Nie powinno być potrzeby nawiązywania połączenia FTP w celu modyfikacji plików tłumaczeń lub jakichkolwiek przeanalizowanych szablonów html / php.
Ponadto szukam najłatwiejszego sposobu przetłumaczenia wielu tabel bazy danych, być może bez konieczności tworzenia dodatkowych tabel.
Co ja sobie wymyśliłem
Ponieważ sam szukałem, czytałem i próbowałem rzeczy. Mam kilka opcji. Ale nadal nie czuję, że znalazłem metodę najlepszej praktyki dla tego, czego naprawdę szukam. Właśnie to wymyśliłem, ale ta metoda ma również skutki uboczne.
- Parsowane szablony PHP : system szablonów powinien być analizowany przez PHP. W ten sposób mogę wstawić przetłumaczone parametry do HTML bez konieczności otwierania szablonów i ich modyfikowania. Poza tym, przeanalizowane szablony PHP dają mi możliwość posiadania 1 szablonu dla całej witryny zamiast posiadania podfolderu dla każdego języka (który miałem wcześniej). Metodą osiągnięcia tego celu może być Smarty, TemplatePower, Laravel's Blade lub dowolny inny parser szablonów. Jak powiedziałem, powinno to być niezależne od pisemnego rozwiązania.
- Oparte na bazie danych : być może nie muszę o tym więcej wspominać. Ale rozwiązanie powinno być oparte na bazie danych. CMS ma być zorientowany obiektowo i MVC, więc musiałbym pomyśleć o logicznej strukturze danych dla łańcuchów. Jak moje szablony byłby skonstruowany: Szablony / Controller / view.php może struktura ta może sprawić, że największy sens:
Controller.View.parameter
. Tabela bazy danych miałaby te pola długie zvalue
polami. Wewnątrz szablonów moglibyśmy użyć metody sortowania, takiej jakecho __('Controller.View.welcome', array('name', 'Joshua'))
i parametr zawieraWelcome, :name
. Zatem wynik jestWelcome, Joshua
. Wydaje się, że jest to dobry sposób na zrobienie tego, ponieważ parametry takie jak: nazwa są łatwe do zrozumienia przez edytor. - Niskie obciążenie bazy danych : Oczywiście powyższy system spowodowałby duże obciążenie bazy danych, jeśli te ciągi są ładowane w ruchu. Dlatego potrzebowałbym systemu buforowania, który ponownie renderuje pliki językowe, gdy tylko zostaną edytowane / zapisane w środowisku administracyjnym. Ponieważ pliki są generowane, potrzebny jest również dobry układ systemu plików. Myślę, że możemy wybrać
languages/en_EN/Controller/View.php
lub .ini, cokolwiek Ci odpowiada. Być może .ini jest nawet analizowane szybciej. Ten plik powinien zawierać dane w formacieformat parameter=value;
. Myślę, że jest to najlepszy sposób na zrobienie tego, ponieważ każdy renderowany widok może zawierać własny plik językowy, jeśli istnieje. Parametry językowe należy następnie załadować do określonego widoku, a nie w zakresie globalnym, aby zapobiec wzajemnemu nadpisywaniu parametrów. - Tłumaczenie tabeli bazy danych : w rzeczywistości jest to rzecz, o którą najbardziej się martwię. Szukam sposobu na tworzenie tłumaczeń wiadomości / stron / itp. jak najszybciej. Posiadanie dwóch tabel dla każdego modułu (na przykład
News
iNews_translations
) jest opcją, ale uzyskanie dobrego systemu wymaga dużo pracy. Jedną z rzeczy wymyśliłem jest oparty nadata versioning
systemie pisałem: jest jedna nazwa tabeli bazy danychTranslations
, tabela ta ma unikalną kombinacjęlanguage
,tablename
aprimarykey
. Na przykład: en_En / News / 1 (odnosi się do angielskiej wersji pozycji wiadomości z ID = 1). Ale ta metoda ma dwie ogromne wady: po pierwsze ta tabela jest dość długa z dużą ilością danych w bazie danych, a po drugie użycie tej konfiguracji do przeszukiwania tabeli byłoby cholernie trudnym zadaniem. Np. Wyszukanie slug SEO elementu byłoby wyszukiwaniem pełnotekstowym, co jest dość głupie. Ale z drugiej strony: to szybki sposób na bardzo szybkie tworzenie treści do tłumaczenia w każdej tabeli, ale nie sądzę, aby ten zawodowiec przeważał nad oszustami. - Praca nad front- endem : również front-end wymagałby trochę przemyślenia. Oczywiście będziemy przechowywać dostępne języki w bazie danych i (dez) aktywować te, których potrzebujemy. W ten sposób skrypt może wygenerować listę rozwijaną umożliwiającą wybór języka, a zaplecze może automatycznie zdecydować, jakie tłumaczenia można wykonać za pomocą CMS. Wybrany język (np. En_EN) będzie następnie używany podczas pobierania pliku językowego do wyświetlenia lub do uzyskania odpowiedniego tłumaczenia elementu treści na stronie internetowej.
Więc oto one. Moje dotychczasowe pomysły. Nie zawierają jeszcze nawet opcji lokalizacji dat itp., Ale ponieważ mój serwer obsługuje PHP5.3.2 +, najlepszą opcją jest użycie rozszerzenia intl, jak wyjaśniono tutaj: http://devzone.zend.com/1500/internationalization-in -php-53 / - ale przydałoby się to na każdym późniejszym etapie rozwoju. Na razie głównym problemem jest jak najlepsze praktyki tłumaczenia treści na stronie internetowej.
Poza wszystkim, co tutaj wyjaśniłem, mam jeszcze jedną rzecz, na którą jeszcze nie zdecydowałem, wygląda na proste pytanie, ale w rzeczywistości przyprawia mnie o ból głowy:
Tłumaczenie adresu URL? Powinniśmy to zrobić czy nie? iw jaki sposób?
Więc… jeśli mam ten adres URL: http://www.domain.com/about-us
a moim domyślnym językiem jest angielski. Czy ten adres URL powinien być przetłumaczony na język http://www.domain.com/over-ons
niderlandzki jako mój język? A może powinniśmy pójść na prostszą drogę i po prostu zmienić zawartość strony widocznej pod adresem /about
. Ostatnia rzecz nie wydaje się poprawną opcją, ponieważ spowodowałoby to wygenerowanie wielu wersji tego samego adresu URL, a indeksowanie treści nie powiedzie się we właściwy sposób.
http://www.domain.com/nl/about-us
Zamiast tego jest używana inna opcja . To generuje co najmniej unikalny adres URL dla każdej treści. Byłoby to również łatwiejsze do przejścia na inny język, na przykład, http://www.domain.com/en/about-us
a podany adres URL jest łatwiejszy do zrozumienia zarówno dla użytkowników Google, jak i użytkowników. Korzystając z tej opcji, co robimy z domyślnymi językami? Czy język domyślny powinien usunąć język wybrany domyślnie? A więc przekierowanie http://www.domain.com/en/about-us
do http://www.domain.com/about-us
... Moim zdaniem jest to najlepsze rozwiązanie, ponieważ gdy CMS jest skonfigurowany tylko dla jednego języka, nie ma potrzeby posiadania tej identyfikacji języka w adresie URL.
Trzecia opcja to połączenie obu opcji: użycie -URL ( http://www.domain.com/about-us
) „bez identyfikacji języka” dla języka głównego. I użyj adresu URL z przetłumaczonym kodem SEO dla języków podrzędnych: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Mam nadzieję, że moje pytanie sprawi, że twoje głowy pękną, na pewno złamali moje! Pomogło mi to już w rozwiązaniu kwestii jako pytania tutaj. Dał mi możliwość przejrzenia metod, z których korzystałem wcześniej, oraz pomysłu na nadchodzący CMS.
Chciałbym już podziękować za poświęcenie czasu na przeczytanie tego tekstu!
// Edit #1
:
Zapomniałem wspomnieć: funkcja __ () jest aliasem do tłumaczenia podanego ciągu. W ramach tej metody oczywiście powinna istnieć metoda rezerwowa, w której domyślny tekst jest ładowany, gdy nie ma jeszcze dostępnych tłumaczeń. Jeśli brakuje tłumaczenia, należy je wstawić lub ponownie wygenerować plik tłumaczenia.