Dużo rozmyślaliśmy nad optymalnym rozwiązaniem. Celem na początku serwisu jest rozreklamowanie tego na innych rynkach, a niestety google szybciej indeksuje url w domenach krajowych. Dlatego to było priorytetem w trakcie tworzenia aplikacji. Kolejnym ważnym aspektem jest prosta struktura. Jako, że serwis pozwala na tworzenie kont użytkowników, żeby to wszystko scalić wydelegowaliśmy jedną domenę, która będzie temu służyć tzn. jest to główna domena (np. example.com) do której użytkownik zostaje przekierowany i później jako już zalogowany wyświetla treść serwisu w swoim języku (oczywiście jeśli dostępny) i tak właśnie się to robi dla serwisów z wieloma domenami!
Problem ścieżek został rozwiązany następująco otóż dzięki application/config/routes.php budujemy tablicę ścieżek w następujący sposób:// en-US Routes
$route['en-US']['default_controller'] = "welcome";
$route['en-US']['404_override'] = '';
Stąd po odczytaniu języka ładowany jest odpowiedni kod i dla konkretnej domeny ma konkretne ścieżki dostępne więc nie będzie już problemu z duplikacją treści dla dwóch tych samych ścieżek: example.pl/logowanie example.de/logowanie tylko example.pl/logowanie i example.de/einloggen
By zachować pewną przejrzystość ścieżki na głównej domenie czyli example.com są w języku angielskim ale tutaj treść oczywiście może być wyświetlana w różnych językach!
ImplementacjaSkoro korzystamy z różnych domen więc $_SESSION odpadają propozycja "adbacz" na temat przechowywania danych o użytkowniku w bazie danych ("W tedy pobierasz tylko dane użytkownika: przeglądarka, IP") dla dużych serwisów a taki docelowo ma być ten serwis mija się z celem bo zajedziemy bazę. Do tego celu użyto jeden warunek, który jest dodany w application/core/MY_Router.php (nadpisujemy główny router i metodę _set_routing()):
// Lang detection : cookie, domain
if($this->lang_default_domain == self::_get_host())
{ // check cookie or web browser if default domains is visited
$this->detect_language_pure();
}
else
{ // detect domains
$this->detect_language();
}
Idea tego zastosowania polega na tych trzech wariantach:
Przykład 1
Użytkownik wchodzi na stronę example.pl wykrywana jest domena pl na podstawie pliku konfiguracyjnego mapowana jest domena wraz z kodem języka czyli dla pl jest to pl-PL. Następnie mapowany jest kod języka z nazwą katalogu w application/languages (czyli dla pl-PL -> polish) i nadpisywane jest pole languages w głównym pliku konfiguracyjnym config/config.php
$config['languages'] = 'polish';
Przykład 2
Użytkownik wchodzi na stronę example.pl wykrywana jest domena pl na podstawie pliku konfiguracyjnego mapowana jest domena wraz z kodem języka czyli dla pl jest to pl-PL. Następnie wybiera okno logowania i klika zaloguj się, zostaje przekierowany na domyślną stronę dla zalogowanych użytkowników example.com. Tutaj schemat działania jest nieco inny gdyż na początku wykrywana jest domena jeśli example.com to sprawdzamy czy istnieje cookie (cookie jest tworzone na stronie example.com podczas zmiany języka na inny, tutaj nie ma przekierowań na domeny!), jeśli nie wykryjemy cookie sprawdzamy język i na podstawie tych informacji ładujemy język strony!
Ten schemat działa tylko jeśli użytkownik nie jest zalogowany!
Przykład 3
Jeśli użytkownik zalogowany to w konstruktorze biblioteki Autryzacji jest pobierany język z ustawień (z bazy danych) użytkownika i nadpisywany jest główny domyślny język! Jest to pierwsza biblioteka jaka jest ładowana w całej aplikacji.
Przepływ treści w aplikacji:
DEBUG - 2013-03-09 19:43:40 --> Config Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Hooks Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Utf8 Class Initialized
DEBUG - 2013-03-09 19:43:40 --> UTF-8 Support Enabled
DEBUG - 2013-03-09 19:43:40 --> URI Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Router Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Routes Config Initialized
DEBUG - 2013-03-09 19:43:40 --> No URI present. Default controller set.
DEBUG - 2013-03-09 19:43:40 --> Output Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Security Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Input Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Global POST and COOKIE data sanitized
DEBUG - 2013-03-09 19:43:40 --> Language Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Loader Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Database Driver Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Session Class Initialized
DEBUG - 2013-03-09 19:43:40 --> Helper loaded: string_helper
DEBUG - 2013-03-09 19:43:40 --> Session routines successfully run
DEBUG - 2013-03-09 19:43:40 --> Auth Class Initialized (ładowanie w konstruktorze języka)
DEBUG - 2013-03-09 19:43:40 --> Language file loaded: language/polish/auth_lang.php
Podsumowując wszystkoPodobne zachowanie możemy zaobserwować dla serwisu facebook.com, pl-PL.facebook.com (schematy działania)