stron z użyciem ez publish Łukasz Serwatka Stopień trudności: Tworzenie stron webowych z zawartością w wielu językach może być zajęciem trudnym i czasochłonnym. Wraz z wprowadzeniem technologii skryptowych po stronie serwera, jak PHP i systemów opartych na PHP, takich jak ez publish Content Management System, czas potrzebny na stworzenie i utrzymywanie wielojęzycznych stron można skrócić. Ten artykuł opisuje, jak konfigurować wielojęzyczne strony z użyciem ez publish, udostępniając stronę webową międzynarodowej grupie użytkowników. ez publish w wersji 3.8 zawiera wiele ulepszeń do swojego modelu wielojęzycznej zawartości strony. Te ulepszenia są opisane w specyfikacji wielojęzycznej (http://ez.no/community/ developer/specs/improved_multi_language_in_ez_publish_rev_2). Ten samouczek przedstawi, jak tworzyć wielojęzyczne strony webowe z użyciem ez publish, dodawać nowe języki do istniejących instalacji i tłumaczyć zawartość strony na różne języki. Wymagania ez publish pracuje na serwerze webowym Apache. Zaleca się używać ostatniej wersji z gałęzi 1.3. Upewnij się, że używasz wersji 4.4 PHP. Zalecamy również używać ostatniej wersji z gałęzi 4.4 zainstalowanej jako moduł Apache'a (mod_php). (Zwracamy uwagę, że ez publish nie działa z PHP w wersji 5). PHP musi mieć wbudowaną obsługę albo MySQL 4.1 lub nowszego, albo PostgreSQL 7.3 lub nowszego. Co obiecujemy: Po przeczytaniu tego artykułu czytelnik będzie umiał zainstalować ez publish z obsługą kilku języków, zmieniać ustawienia i konfigurację systemu pod kątem obsługi wielu języków. Tworzyć własne rozszerzenia językowe dla ez publish. Dodawać nowe języki do istniejącej już instalacji. Tłumaczyć i tworzyć treść w dostępnych w ez publish językach. Co powinieneś wiedzieć: Artykuł jest adresowany do osób, które mają niewielkie doświadczenie lub dopiero zaczynają swoją przygodę z ez publish, potrzebna jednak będzie podstawowa wiedza z zakresu tworzenia witryn internetowych. 52
Narzędzia Rysunek 1. Tworzenie bazy Instalacja Ten rozdział opisuje aspekty procesu instalacji ez publish, które wpływają na wielojęzyczną konfigurację. (Kompletny proces instalacji jest opisany szczegółowo w dokumentacji online na http://ez.no/ doc/ez_publish/technical_manual/3_8/ installation.) Baza danych Aby udostępnić obsługę wszystkich zestawów znaków, skonfigurujemy kodowanie UTF-8 (unikod). Aby używać UTF-8, baza danych musi mieć obsługę unikodu. PostgreSQL i MySQL (wersja 4.1 lub nowsza) w pełni obsługują unikod. (Rysunek 1). Skonfigurujemy zatem stronę, aby pokazywała zawartość w trzech językach: angielskim, francuskim i niemieckim. Ponieważ jednak używamy kodowania UTF- 8, możemy też używać języków, które używają nie łacińskich liter (chiński, japoński itd.). Następujące przykłady pokazują, jak tworzyć nazwę danych z obsługą unikodu. Dla MySQL należy wykonać: Kreator ustawień W wersji 3.8 ez publish, można włączyć unikod podczas instalacji. Kreator ustawień ez publish włączy unikod (UTF-8) dla wewnętrznego kodowania i konwersji strony kodowej. To ustawienie jest zapisane w pliku: settings/override/i18n.ini.append.php. #?ini charset="iso-8859-1"? [CharacterSettings] Charset=utf-8 Poniższy zrzut ekranu pokazuje opcje wyszczególnione w kreatorze ustawień: Wybierz English (United Kingdom) jako język podstawowy oraz French (France) i German jako języki dodatkowe. Po zapytaniu o site type, wybierz new site. Konfiguracja po instalacyjna Po zainstalowaniu ez publish i uzyskaniu dostępu do interfejsów publicznych i administracyjnych, należy zmienić konfigurację, by udostępnić stronę w wielu językach. Domyślnie kreator ustawień tworzy dwa siteaccess-y (zestawy plików konfiguracyjnych, które przesłaniają ustawienia domyślne): Listing 1. Struktura katalogów i umiejscowienie plików konfiguracyjnych settings/override/ globalne ustawienia dla wszystkich siteaccesses settings/siteaccess/gb pliki konfiguracyjne dla angielskich siteaccess settings/siteaccess/de pliki konfiguracyjne dla niemieckich siteaccess settings/siteaccess/fr pliki konfiguracyjne dla francuskich siteaccess settings/siteaccess/site_admin pliki konfiguracyjne dla siteaccess administratorskich CREATE DATABASE `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8 _ general _ ci; W miejsce mydb należy wstawić nazwę swojej bazy. Dla PostgreSQL należy wykonać następującą komendę z poziomu powłoki: $ createdb -E Unicode mydb W miejsce mydb należy wstawić nazwę swojej bazy. Można też użyć narzędzi graficznych, jak phpmyadmin (MySQL) [link] lub phppgadmin (PostgreSQL) [link] do utworzenia bazy danych. Na przykład, by utworzyć bazę o nazwie mydb używając phpmyadmin, należy wybrać utf8_general_ci z listy rozwijanej collation, jak pokazano poniżej (Rysunek 2). Rysunek 2. Opcje wyszczególnione w kreatorze ustawień 53
jeden do użytku publicznego ( news_site ) i jeden do administracji ( news_site_ admin ). Użyjemy tych plików konfiguracyjnych utworzonych przez kreator ustawień jako wzór dla innych konfiguracji dostępu do stron (siteaccess). Zmień nazwę katalogu news_site na gb. Utwórz nowe katalogi de i fr pod settings/ siteaccesses, a potem zmień nazwę katalogu news_site_admin na site_ admin. Skopiuj pliki konfiguracyjne INI z folderu settings/siteaccesses/gb do settings/siteaccesses/de i settintgs/ siteaccesses/fr. Nie zmieniaj plików konfiguracyjnych w site_admin. Teraz mamy mniej więcej taką strukturę (Listing 1). Stworzyliśmy zatem po jednym siteaccess dla języka. ez publish będzie przeglądać pliki konfiguracyjne zapisane w tych ostatnich katalogach, gdy użytkownik zażąda URL-a z końcówką języka: www.example.com/gb > settings/siteaccess/gb www.example.com/de > settings/siteaccess/de Globalny plik konfiguracyjny settings/ override/site.ini.append.php zawiera informacje o dostępnych siteaccess-ach (Listing 2). Te ustawienia informują ez publish, że nasz domyślny siteaccess (Default- Access) jest gb (angielski). Gdy użytkownik łączy się z naszą stroną nie specyfikując siteaccess-u (np. przez www.example.com albo www.example.com/site), otrzyma domyślną angielską stronę. Następnie określamy listę naszych publicznych siteaccess-ów (SiteList) i informujemy ez publish o wszystkich dostępnych siteaccess-ach (AvailableSiteAccessList), w tym administracyjne. RelatedSiteAccess- List jest używane przez mechanizm buforujący. Bufor widoku będzie opróżniony dla skonfigurowanego siteaccessa, gdy na tej stronie zostanie opublikowany nowy artykuł. Konfiguracja dla naszych publicznych siteaccess-ów jest związana z ustawieniami regionalnymi. Główny plik konfiguracyjny (settings/siteaccess/ gb/site.ini.append.php) będzie zawierał (Listing 3). Tłumaczenia etykietę GUI w ez publish są zapisane w plikach XML (zlokalizowanych w share/translations) dla każdego języka. Gdy TranslationCache zostanie ustawione na enabled, system sparsuje plik XML z tłumaczeniem (trans- Listing 2. Globalny plik konfiguracyjny settings/override/site.ini. append.php [SiteSettings] DefaultAccess=gb SiteList[] SiteList[]=gb SiteList[]=de SiteList[]=fr [SiteAccessSettings] CheckValidity=false AvailableSiteAccessList[] AvailableSiteAccessList[]=gb AvailableSiteAccessList[]=de AvailableSiteAccessList[]=fr AvailableSiteAccessList[]= site_admin RelatedSiteAccessList[] RelatedSiteAccessList[]=gb RelatedSiteAccessList[]=de RelatedSiteAccessList[]=fr RelatedSiteAccessList[]= site_admin Listing 3. Główny plik konfiguracyjny Locale=eng-GB ContentObjectLocale=eng-GB SiteLanguageList[]=eng-GB SiteLanguageList[]=fre-FR SiteLanguageList[]=ger-DE TextTranslation=disabled VarDir=var/news_site Rysunek 3. Domyślne siteaccess-y kreatora ustawień 54
Narzędzia Listing 4. Części plików konfiguracji niemieckiej i francuskiej settings/siteaccess/de/ site.ini.append.php Locale=ger-DE ContentObjectLocale=ger-DE SiteLanguageList[]=ger-DE SiteLanguageList[]=eng-GB SiteLanguageList[]=fre-FR TextTranslation=enabled VarDir=var/news_site settings/siteaccess/fr /site.ini.append.php Locale=fre-FR ContentObjectLocale=fre-FR SiteLanguageList[]=fre-FR SiteLanguageList[]=eng-GB SiteLanguageList[]=ger-DE TextTranslation=enabled VarDir=var/news_site Listing 5. Ustawienia Path Prefix settings/siteaccess/de/site. ini.append.php: PathPrefix=german settings/siteaccess/gb/site. ini.append.php: PathPrefix=english settings/siteaccess/fr/site. ini.append.php: PathPrefix=french lation.ts) i skompiluje do natywnych plików PHP dla szybszego uruchamiania. To znacznie zmniejszy czas ładowania i powinno być zawsze używane. Bufor translacji jest zapisany w systemie pliku pod katalogiem var w katalogu tłumaczeń (var/(site)/cache/translation). Dla angielskich stron (eng-gb) TextTranslation i TranslationCache są domyślnie wyłączone, gdyż domyślne Listing 6. Konfiguracja dla rozszerzenia tłumaczeń TranslationExtensions[]= mytranslationext Listing 7. Źródło: extension/mytranslationext/ translations/untranslated /translation.ts <!DOCTYPE TS><TS> <context> <name>extension/ mytranslationext</name> <message> <source>example label </source> <comment>example comment</comment> <translation type= "unfinished"></translation> </message> <message> <source>more examples </source> <translation type= "unfinished"></translation> </message> </context> </TS> etykiety są po angielsku, więc nie ma potrzeby dokonywać tłumaczenia. Z przyczyn wydajnościowych, ważne jest, by włączyć TranslationCache razem z TextTranslation dla stron wielojęzycznych. Ponieważ w naszej wielojęzycznej konfiguracji użyjemy jednego z administracyjnych siteaccess-ów dla zarządzania zawartością wszystkich stron, ważne Rysunek 4. Wybór kilku opcji jednocześnie przy użyciu Contral Rysunek 5. Ustawienia polityki po wybraniu siteaccess-ów 55
jest, by zarówno publiczny siteaccess, jak i siteaccess Interfejsu Administracyjnego używały tego samego katalogu (umieszczonego poniżej katalogu var). W przeciwnym razie niektóre składniki strony (jak pliki) przerzucone przez interfejs administracyjny będą niedostępne publicznie, bo nie będą mieć dostępu do katalogu 'var' siteaccess-u administracyjnego. Należy się też upewnić, że Apache ma wystarczające prawa do utworzonych katalogów: Listing 8. Łącza tekstowe {def $locales=fetch( 'content', 'translation_list' )} {foreach $locales as $locale} <a href={concat( "index.php/", $locale.country_code downcase(), "/", $DesignKeys:used.url_alias ) ezroot}> {$locale.country_code } </a> {delimiter} {/delimiter} {/foreach} Listing 9. Łącza z obrazkiem flagi {def $locales=fetch( 'content', 'translation_list' )} {foreach $locales as $locale} <a href={concat ( "index.php/", $locale.country_code downcase(), "/", $DesignKeys:used. url_alias ) ezroot}> <img src={concat ( "share/icons/flags/", $locale.locale_code, ". gif" ) ezroot()} alt= "" border="0" /> </a> {/foreach} VarDir=var/news _ site Katalog 'var' zawiera pliki buforowe (cache files) i logi. Zawiera również części, które nie będą przechowywane w bazie (obrazki i pliki) (Listing4). I konfiguracja jest gotowa. Następny krok to ustawienie odpowiednich praw dla użytkownika anonimowego do określonych publicznych siteaccess-ów (gb, fr, de). W ez publish możemy ograniczyć prawa użytkowników tylko do wybranych siteaccess-ów. To oznacza, że użytkownicy mogą się zalogować tylko na strony, na których mają gwarantowane prawa dostępu przez administratora. Ponieważ zmieniliśmy istniejącą konfigurację, musimy przekazać ez publish, które siteaccess-y są teraz dostępne publicznie. Zaloguj się jako administrator do Interfejsu Administracyjnego za pomocą użytkownika i hasła skonfigurowanego przez kreator ustawień. Nowy URL do Interfejsu Administracyjnego będzie podobny do www.example.com/site_admin lub www.example.com/index.php/site_ admin, zależnie od nowych ustawień konfiguracyjnych i od tego, czy używasz metody Virtual Host dla URL-a. Po zalogowaniu się, przejdź do zakładki Setup i kliknij Roles and policies. W liście ról, kliknij rolę Anonymous i przycisk Edit. W liście bieżących polityk znajdź następujący wiersz: Module: user, Function: login, Limitations: SiteAccess() Kliknij ikonę Edit (symbol pióra po prawej) i wybierz siteaccess-y gb, de i fr. Możesz wybrać wiele opcji jednocześnie, przytrzymując klawisz Control. (Rysunek4) Po wybraniu siteaccess-ów, kliknij OK. ez publish zapisze ustawienia polityki (Rysunek 5). Module: user, Function: login, Limitations: SiteAccess( gb, fr, de ). Wyjdź z trybu edycji ról klikając OK. Zakończyliśmy zatem aktualizację praw ez publish, a teraz należy sprawdzić, czy nasze siteaccess-y są dostępne publicznie dla użytkowników Rysunek 6. Logowanie do interfejsu Administracyjnego Rysunek 7. Wybór języka z listy 56
Narzędzia anonimowych. Możesz to sprawdzić, wklejając poniższe URL-e do przeglądarki: www.example.com/gb (or www.example.com/index.php/gb); www.example.com/fr (or www.example.com/index.php/fr); www.example.com/de (or www.example.com/index.php/de). Rysunek 8. Definiowanie języków dodatkowych podczas instalacji Rysunek 9. Widok edycji dla nowego tłumaczenia Rysunek 10. Lista dostępnych tłumaczeń dla bieżącego obiektu Tłumaczenia Proces konfiguracji jest zakończony. Teraz możemy zająć się tłumaczeniem naszej zawartości z użyciem Interfejsu Administracyjnego ez publish. Aby przetłumaczyć zawartość na jeden z dostępnych języków. Zaloguj się do Interfejsu Administracyjnego. Pamiętaj, że nowy URL do Interfejsu Administracyjnego będzie podobny do www.example.com/site_admin lub www.example.com/index.php/site_ admin. (Rysunek 6). W widoku Content structure wybierz obiekt, który chcesz przetłumaczyć. Następnie, z listy rozwijanej wybierz Another language i kliknij przycisk Edit. (Rysunek 7). W następnym widoku, ez publish zapyta o nowy język do tłumaczenia i o język, z którego będzie tekst tłumaczony. Wybierz French dla tłumaczenia i English (United Kingdom) jako język bazowy i kliknij przycisk Edit. Zauważ, że ten krok zostanie pominięty, jeśli tylko jeden język dodatkowy zoastał zdefiniowany podczas instalacji. (Rysunek 8). W następnym kroku, ez publish pokaże widok edycji dla nowego tłumaczenia. Na szczycie każdego pola edycji będzie pokazany tekst w oryginalnym, bazowym języku. Po zakończeniu tłumaczenia kliknij Send for publishing. (Rysunek 9). Lista dostępnych tłumaczeń dla bieżącego obiektu jest pokazana, gdy aktywna jest zakładka Translations. To również daje dostęp do dodatkowych opcji. (Rysunek 10). Jeden Interfejs Administracyjny, trzy niezależne strony wielojęzyczne Nowa wielojęzyczna funkcjonalność w ez publish w wersji 3.8 daje możliwość tworzenia obiektów niezależnie w wielu językach i używania aliasów URL do 57
dostępu do zawartości w różnych językach. Powiedzmy, że chcemy mieć niezależne tłumaczenia, zatem zawartość dla czytelnika angielskojęzycznego będzie inna, niż zawartość dla czytelnika francuskojęzycznego. W naszej konfiguracji mamy trzy języki, więc powinniśmy stworzyć trzy foldery (po jednym dla każdego języka) w drzewie zawartości. Te foldery będą przechowywały zawartości stron specyficzne dla języka. Zaloguj się do Interfejsu Administracyjnego i stwórz trzy foldery w głównym drzewie katalogów, po jednym dla każdego języka: English, French i German. (Rysunek 11). To wszystko. Teraz mamy zdefiniowane katalogi główne dla zawartości wielojezycznej. Zawartość angielska będzie przechowywana w folderze English, francuska w French itd. To pozwala na segregację zawartości w różnych językach i dostarczania zawartości w określonym języku podanym w aliasie URL-a. Następnym krokiem jest dodanie ustawień konfiguracyjnych do każdego site. Rysunek 11. Drzewo zawartości Rysunek 12. Struktura katalogów rozszerzenia tłumaczeń ini.append.php dla publicznego siteaccess-u (gb, fr, de), które odetnie nazwę folderu języka z każdego URL-a. W przeciwnym razie ez publish będzie używał ścieżek np.: http://localhost/ ezpublish/index.php/gb/english, gdzie gb jest nazwą siteaccess-u, a english nazwą katalogu języka pod drzewem głównym ez publish. Używając ustawienia PathPrefix możemy nakazać ez publish używanie domyślnie katalogu English, ale nie używać go w URL-u. W ten sposób nasza ścieżka będzie wyglądać jak http:// localhost/ezpublish/index.php/gb. Dodaj następujące ustawienia do publicznych siteaccess-ów (gb, de, fr) w bloku [SiteAccessSettings]: Tak samo, jeśli użytkownik wybierze angielski siteaccess, ez publish będzie używał folderu English jako folder główny angielskiej zawartości. Własne tłumaczenia Podczas tworzenia wielojęzycznych stron, czasem potrzebujemy przetłumaczyć jakieś własne etykiety, które nie są dostępne w domyślnym pliku tłumaczeń ez publish. Możemy zaimplementować tłumaczenie tych własnych etykiet jako rozszerzenie ez publish (Rysunek 12). W pliku extension/mytranslationext/ settings/site.ini.append.php, potrzebujemy przekazać ez publish, że jest dostępne rozszerzenie tłumaczeń. Ten plik domyślnie nie jest zakładany należy go stworzyć. ez publish zapisuje tłumaczenia jako XML w plikach o nazwie translation.ts. Poniższy zrzut ekranu pokazuje program QT Linguist użyty do tłumaczenia zawartości w pliku XML. To jest plik źródłowy dla innych tłumaczeń użytych jako rozszerzenie. Plik translation.ts to zwykły plik tekstowy w formacie XML We wzorcach, operator wzorca i18n oznacza napis do przetłumaczenia: {'Example' i18n( 'extension mytranslationext' )} Operator pobiera trzy opcjonalne parametry: context, comment i argiments. Parametr context może być użyty do określenia grupy, do której powinien być zaliczony parametr wejściowy. W naszym przykładzie jest to extension/ mytranslationext Więcej informacji na temat i18n we wzorcach znajdziesz na stronie dokumentacji: http://ez.no/doc/ez_publish/technical _ manual / 3 _ 8 /reference /template_ operators/formatting _and_internationalization/i18n Przełącznik języków Mechanizm przełączania języków zależy od liczby języków skonfigurowanych dla strony. Mając tylko trzy języki, możemy wyświetlać łącza tekstowe, które pozwalają użytkownikowi na zmianę języka. Jednak jeśli mamy dużo języków, za dużo miejsca byłoby potrzebne na pokazanie wszystkich łączy, zatem zamiast łączy pokażemy wybór języka poprzez listę rozwijalną. Przedstawione przykłady kodu mogą zostać użyte albo w pagelayout.tpl (główny wzorzec ez publish), albo we wzorcach węzłów. Oto przykład przełącznika języków, który wyświetla tekst lub łącza obrazkowe dla każdego języka: Jeśli używasz ustawień Virtual Host na swojej stronie, usuń index.php z URL-a w przykładowym kodzie. Ten przykład będzie działał z metodą dostępu URI. Dla metody dostępu HOST kod będzie podobny. Załóżmy, że mamy skonfigurowane hosty jak następuje: Podsumowanie W tym artykule objaśniliśmy, jak skonfigurować wielojęzyczną stronę za pomocą ez publish, używając cech dostępnych w wersji 3.8. Przedstawiliśmy praktyczny przykład, który objaśnił ustawienia konfiguracyjne strony i pokazał jak tworzyć nowe tłumaczenia dla obiektów strony. Strona wynikowa posiada trzy niezależne językowe siteaccessy, wszystkie uruchamiane z jednego Interfejsu Administracyjnego. Z nowymi cechami ez publish 3.8 można dotrzeć do międzynarodowej publiczności przez dodanie języków do twojej strony. O autorze Łukasz Serwatka jest developerem systemu w EzSystems. W swojej pracy skupia się głównie na rozwoju kontaktów zewnętrznych. Jest autorem wielu aplikacji i suplementów. Współtwórca największej strony o PHP w Polsce www.php.pl. Kontakt z autorem: ls@ez.no 58