[Drupal/i18n] Pełna zautomatyzowana konfiguracja zależna od wersji językowej

Data dodania wpisu: 06-05-2011

Dokładnie dzisiaj stanąłem przed wyzwaniem instalacji Drupala w wersji wielojęzycznej, z wykorzystaniem modułu i18n. Też mi wyzwanie, prawda?:) No dobra, gdzie jest haczyk zapytacie?

 

Otóż: wymaganiem było, aby każda wersja językowa miała swoją niezależną konfigurację. Profity płynące z tego rozwiązania mogą być na przykład takie:

  • indywidualne nazwy i opisy witryn dla każdej wersji językowej,
  • indywidualne formaty dat dla każdego języka
  • osobne klucze MollomAPI, jeśli mamy wersje językowe na różnych domenach
  • i wiele innych... :)

Ulitujcie się nad sobą, poświęćcie trochę czasu i zanim ściagniecie moduł z końca tego postu, przeczytajcie go w całości :)

 

Przecież istnieje rozwiązanie

Ci co znają temat, powiedzą - co w tym trudnego: Multilingual Variables. I tu jest drugi haczyk.

 

Otóż: w tej sytuacji, aby utworzyć konfigurację, koniecznym jest wpisanie tablicy z tymi zmiennymi ($conf['i18n_variables']), które mają być języko-konfigurowalne, do pliku sites/default/settings.php. W przypadku, gdy mamy mały site - może i nie sprawia to problemu, ale w sytuacji, gdy mamy dużą stronę, która wymaga naprawdę absolutnie niezależnych konfiguracji na całym polu bitwy - to rozwiązanie się absolutnie nie nadaje, bo trzeba w tą tablicę wpisać dosłownie wszystko, co nam do głowy przyjdzie. A to jest czas:) Dużo czasu:D Dodatkowo - na niektórych serwerach potrafi zdarzyć się nieprzyjemna sytuacja, w której prawa do pliku przejmuje Apache i nawet zmiana chmoda nie zezwoli nam na modyfikację tego pliku, przez co trzeba jej dokonywać za pomocą klienta FTP webowego w panelu zarządzania hostingiem, zamiast bezpośrednio na serwerze FTP poprzez klienta programowego.

 

Gorzej, jeśli z kolei mamy na Drupalu postawiony własny system, który ma extra swoje konfiguratory w PA i swoje zmienne. Przykład:

DisCart - moje autorskie oprogramowanie sklepu internetowego - które dzisiaj zyskało status sklepu wielojęzycznego (teraz pora na Multi-Store z użyciem DomainAccess:)) - a którego zmienne konfiguracyjne są liczone w setkach. I co, miałbym do settings.php wpisywać wszystkie swoje zmienne, a jak dodam kolejną we własnych modułach, których jest juz przeszło 20, to i dodawać ją do settings.php? Wykluczone! :D

Co w związku z powyższym? Mój moduł to wybór zmiennych wielojęzycznych z panelu admina Drupala - a nie poprzez dłubanie w plikach:)

 

Kawałek kodu

Temat 2 linijek kodu jest już nieaktualny (:D), ale możecie poczytać na temat pierwszej wersji pomysłu;)

I wreszcie, po wielu linijkach ględzenia dochodzimy do meritum całego posta: całą operację tworzenia konfiguracji 'per active language' można załatwić automatycznie, za pomocą 2 (słownie: dwóch!) linijek kodu :) Tak, tak! Takowe linijki trzeba by umieścić we własnym małym module, w funkcji hook_init(), która zostanie wywołana na poziomie inicjalizacji ustawień Drupala.

 

function MYMODULE_init(){
    global $conf; // tablica ze zmiennymi konfiguracji
    $conf['i18n_variables'] = array_keys($conf); // przerzucamy konfigurację zmiennych do obsługi przez i18n
    // THAT'S ALL FOLKS :)
}

 

I nie obchodzi nas już nic, bo każda zmienna z tabeli variable zostanie automatycznie dodana jako i18n_variable i zapisana w tejże tabeli dla aktualnej wersji językowej, na jakiej ją konfigurujemy w PA Drupala ! :) Aby stwierdzić, które opcje konfiguracji w PA zostały przepisane do systemu i18n, wystarczy przyjrzeć się opisom opcji w PA - każda (obecnie już) zmienna typu i18n, w swoim description dostanie dołączony wytłuszczony fragment tekstu: This is a multilingual variable. Jeżeli danej zmiennej nie skonfigurujemy 'per language', to jej wartość na każdej wersji językowej będzie domyślna, taka, jaka była do tej pory.

 

Dodatkowo: po zainstalowaniu modułu, możemy sprawdzić jakie zmienne są języko-konfigurowalne, na podstronie konfiguracji i18n - admin/settings/language/i18n/variables (Konfiguracja witryny -> Języki -> Multilingual system -> Variables). Jeżeli w pierwsze kolumnie przy zmiennej jest zielona fajka, oznacza to, że dana zmienna została zapisana w tabeli i18n_variables - formularz konfiguracji z tą zmienną został już raz wysłany - jednak nie zwalnia to z obowiązku, aby w tym formularzu skonfigurować dane zależnie od wersji językowych, jeżeli tak potrzeba; w innym wypadku zmienne pozostaną domyślne, takie same, dla każdej wersji językowej;)

 

Wydajność

To byłby grzech, gdyby te liczby powodowały u was narzekanie:) W moim przypadku, przy ilości zmiennych konfiguracyjnych przekraczającej 500 sztuk, wzrost zużycia pamięci wyniósł ok. 250kB przy załadowaniu zmiennych do pamięci podręcznej (po odświeżeniu cache) i ok. 50kB przy każdym kolejnym wywołaniu, czas wykonywania ładowania Drupala wzrósł o średnio 10-20ms;) Znikome liczby :) Dla porównania - DEMO mojego sklepu, do którego link jest nieco poniżej, w całości pochłania ok. 16MB pamięci i ładuje się średnio 150-300ms, przy wyłączonych wszystkich mechanizmach cache.

 

I tym miłym akcentem:

- podaję link do moduliku kilkuset-bajtowego, który załatwia tą sprawę: i18n_localized_variables

- podaję link do zerknięcia na DEMO sklepu DisCart, gdzie w wersji polskiej i angielskiej mamy dla przykładu podstawowo skonfigurowane waluty i nazwę witryny - www.dis-cart.designend.net,

- no i życzę stosunkowo udanego weekendu :)

 

i18n Localized Variables na drupal.org

Z racji, że to pierwszy moduł wrzucony przeze mnie na drupal.org, nadal leży on w sandboxie: http://drupal.org/sandbox/designend.net/1149868.

Miejmy nadzieję, że po ostatnich pogadankach z Gáborem Hojtsy'm moduł przejdzie w FullProject i sam dostanę prawo wrzucana modułów od razu jako pełnych projektów, bez czekania w sandboxie:)

 

Edit, 07.05.2011

Moduł został zaktualizowany, jego funkcjonalność co prawda już nie zawiera się w dwóch linijkach kodu, lecz kilkudziesięciu, ale obecnie posiada - myślę, że dość ważną - możliwość wykluczenia wybranych modułów ze zmiennych wielojęzycznych (np. moduł Pathauto posiada konfigurację, która jest raczej stała niezależnie od języka, więc można jego zmienne wykluczyć, zeby nie było konieczności konfigurowania tych samych parametrów na każdej wersji językowej). Konfiguracja jest dostępna w zakładce Konfiguracja Witryny -> Języki -> Obsługa wielojęzyczności, jako dodatkowe pole w istniejącym już formularzu konfiguracji i18n.

Edit, 08.05.2011

Stwierdziłem, że poprzednie rozwiązanie było do bani i zmieniłem funkcjonalność zapisu zmiennych wybieranych do zmiennych wielojęzycznych. Możliwość wykluczenia wybranych modułów została zastąpiona "dołączeniem" wybranych modułów - duzo mniej opcji do wybierania, bo przecież ile zmiennych może być lokalizowanych;) Dodatkowo, jest jeszcze druga lista typu select, która zawiera wszystkie dostępne zmienne zapisane w bazie Drupala. Dzięki tej drugiej opcji można dokonać szczegółowego wyboru opcji wielojęzycznych. I tego rozwiązania się trzymamy :)

Co więcej, moduł sam w sobie posiada kilkanaście predefiniowanych zmiennych, które domyślnie mogą być najcześciej używane po zainstalowaniu tego modułu. Aby je załadować, wystarczy po zainstalowaniu modułu wybrać opcję "Przywróć domyślne wartości".

Również konfiguracja zostałą przeniesiona do Konfiguracja Witryny -> Języki -> Obsługa wielojęzyczności -> Zmienne wielojęzyczne.

Komentarze

Ten wpis nie posiada jeszcze komentarzy

Comments closed...