Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] HTTP_ACCEPT_LANGUAGE + gettext
Forum PHP.pl > Forum > Przedszkole
log
W jaki sposób mogę użyć HTTP_ACCEPT_LANGUAGE by załadować odpowiedni język za pomocą GETTEXT?

HTTP_ACCEPT_LANGUAGE -> zwraca array w postaci: es,en-us;q=0.7,ar-lb;q=0.3

GETTEXT -> przyjmuje tylko pl_PL, en_EN

Czy jest jakies proste rozwiazanie by otrzymac cos w tym stylu?

  1. <?php
  2. $kod_jezyka = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
  3. setlocale(LC_MESSAGES, $kod_jezyka);
  4. ?>



M
siemakuba
Ja robię to w taki sposób:

  1. <?php
  2. $lng = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  3. $accept = array('pl','en','de'); // tablica z obslugiwanymi jezykami
  4.  
  5. preg_match_all('/('.implode('|', $accept).')/i', $lng, $matches);
  6. array_shift($matches);
  7. ?>


Teraz, w $matches znajduje się tablica języków znalezionych w $_SERVER['HTTP_ACCEPT_LANGUAGE'] ale tylko tych, które są zgodne z założonymi językami jakie akceptujemy ($accept).

Nie wiem jak dokładnie musi wyglądać oznaczenie języka dla gettext, ale jeżeli zawsze jest tak jak podałeś to wystarczy:

  1. <?php
  2. $gettextLang = $matches[0].'_'.strtoupper($matches[0]);
  3. ?>


pozdr.
log
  1. <?php
  2. Notice: Array to string conversion in /home/gettext.php on line 28
  3. Array_ARRAY
  4. ?>


Poza tym jak wykryć np. en-us, en-au?

M
siemakuba
Po pierwsze, pokaż co wsadziłeś do gettext.
Po drugie, możesz dodać sobie do $accept np. 'en-us' albo 'en-au'. Ale, czy potrzebujesz rozróżniać angielski-amerykański od angielskiego-australijskiego? To co pokazałem zarówno en-au i en-us wykryje jako en, więc możesz śmiało to do gettext zapakować jako ogólny angielski - en_EN.

pozdr.
log
Tak, potrzebuję rozróżniać wszystkie języki czyli angielski-amerykański, angielskiego-australijski itd

  1. <?php
  2. $lng = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  3. $accept = array('pl','en','de');
  4.  
  5. preg_match_all('/('.implode('|', $accept).')/i', $lng, $matches);
  6. array_shift($matches);
  7. $lang_code = $matches[0].'_'.strtoupper($convert);
  8.  
  9. setlocale(LC_MESSAGES, $lang_code);
  10. bindtextdomain('website', './locale');
  11. textdomain('website');
  12. bind_textdomain_codeset('website', 'UTF-8');
  13. ?>
siemakuba
Skoro tak, to taka zmiana chyba będzie OK:

  1. <?php
  2. $lng = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  3. $accept = array('pl','en','de'); // tablica z obslugiwanymi jezykami
  4.  
  5. preg_match_all('/('.implode('(?:-[a-z]{1,2})?|', $accept).')/i', $lng, $matches);
  6.  
  7. $matches = array_shift($matches);
  8. $locales = array();
  9. foreach($matches as $m)
  10. {
  11. $lc = explode('-',$m);
  12. if(!isset($lc[1]))
  13. { $lc[1] = $lc[0];
  14. }
  15.  
  16. $locales[] = strtolower($lc[0]).'_'.strtoupper($lc[1]);
  17. }
  18. print_r($locales);
  19. ?>


wynik (dla $_SERVER['HTTP_ACCEPT_LANGUAGE'] == pl,en-us;q=0.7,en;q=0.3)
Kod
Array
(
    [0] => pl_PL
    [1] => en_US
    [2] => en_EN
)


pozdr.
log
Działa. Ale nawet nie bedąc programistą uważam,ze jest to rozwiazanie zbyt skomplikowane niż potrzeba i troche odstaje od idei działania skryptu. Jeśli nie mam racji to prosze o wybaczenie smile.gif

Po pierwsze po co tworzyć array obsługiwanych języków skoro interesuje nas (mnie) tylko i wyłacznie domyślny język przeglądarki?

Po drugie po co zwracać array skoro szukamy domyślnego = pierwszego języka przeglądarki?

Nie bedąc programistą myślę tak:
  1. Zaleść domyślny język np. en-us, pl, de
  2. Jeśli język jest dwuczłonowy np. en-us zamień na en_US jesli język jest jednoczłonowy zamień pl na pl_PL
  3. Jesli jezyk nie jest obsługiwany (przetłumaczony) GETTEXT wyświetli język domyślny - w innym przypadku wyświetli właściwe tłumaczenie.
Koniec


Mam nadzieję,że moj pomysł jest wykonalny.

M
siemakuba
Cytat
Mam nadzieję,że moj pomysł jest wykonalny.
Mam nadzieję, że nie rozumiesz przez to "Oczekuję teraz na wykonanie tego co napisałem, mam nadzieję że dacie rade"?

Mając taki kawał kodu przepisanie go zgodnie z tym co podałeś to żaden problem. Ja podałem rozwiązanie, które wykorzystuję - a mam języki akceptowalne, bo używam tego do obsługi wielu języków a nie tylko do locale. Stąd, jeżeli ktoś mi wejdzie na stronę z Azerbejdżanu, zobaczy stronę po angielsku (u mnie jest to drugi domyślny język) a nie będę próbował ładować strony po azersku.

pozdr.
log
Nie oczekuję na gotowe rozwiązanie. Dzięki za próbe rozwiązania mojego problemu.

M
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.