Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP OOP i strona wielojęzyczna, pytanie początkującego
szczypior
post
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 5.02.2007

Ostrzeżenie: (0%)
-----



index.php
  1. include 'classes/lang.class.php';
  2.  
  3.  
  4. $lang = new lang_set($_GET['lang']);
  5.  
  6. include_once 'lang/'.$lang;


plik lang.class.php
  1. <?php
  2. class lang_set{
  3.  
  4. private $lang;
  5.  
  6. public function __construct($lang_in){
  7.  
  8. // gdy mamy zmienną, to znaczy że użytkownik chce zmienić obecny język
  9. If(!empty($lang_in))
  10. {
  11.  
  12. switch ($lang_in) {
  13. case 'en':
  14. $this->lang = 'en';
  15. break;
  16.  
  17. case 'pl':
  18. $this->lang = 'pl';
  19. break;
  20.  
  21. default:
  22. $this->lang = 'pl';
  23. }
  24. $_SESSION['lang'] = $lang;
  25. setcookie('lang', $lang, time() + (3600 * 24 * 30));
  26. }
  27. else if(isSet($_SESSION['lang']))
  28. {
  29. //gdy mamy zmienną sesyjną, to ją odczytujemy
  30. $this->lang = $_SESSION['lang'];
  31. }
  32. else if(isSet($_COOKIE['lang']))
  33. {
  34. // gdy użytkownik ma ciasteczko to odczytujemy zapisany w nim język i zapisujemy dodatkowo do zmiennej sesyjnej
  35. $this->lang = $_COOKIE['lang'];
  36. $_SESSION['lang'] = $_COOKIE['lang'];
  37. }
  38. else
  39. {
  40. //domyślny język
  41. $this->lang = 'pl';
  42. }
  43. }
  44.  
  45. public function __toString()
  46. {
  47. return $this->lang.'.lang.php';
  48. }
  49. }
  50. ?>


Ten post edytował szczypior 12.08.2016, 13:00:46
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kpt_lucek
post
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. class Lang
  2. {
  3. /** @var LangResolverInterface */
  4. protected $langResolver;
  5.  
  6. /** @var string */
  7. protected $lang;
  8.  
  9. /**
  10. * Lang constructor.
  11. *
  12. * @param LangResolverInterface $langResolver
  13. */
  14. public function __construct(LangResolverInterface $langResolver)
  15. {
  16. $this->langResolver = $langResolver;
  17. $lang = $langResolver->getDefaultLang();
  18. }
  19.  
  20. /**
  21. * @param string $lang
  22. *
  23. * @return $this
  24. */
  25. public function changeLang($lang)
  26. {
  27. $resolvedLang = $this->langResolver->resolve($lang);
  28. if (null === $resolvedLang) {
  29. throw new \InvalidArgumentException(sprintf('Lang "%s" is not supported.', $lang));
  30. }
  31. $this->lang = $resolvedLang;
  32.  
  33. return $this;
  34. }
  35. }


Możesz coś podobnego przekminić, wydziel logikę odpowiedzialną za "sprawdzenie" języka gdzieś na zewnątrz, dispatchuj event na zmianę języka.

Opcji są miliony

Cytat
gdy użytkownik ma ciasteczko to odczytujemy zapisany w nim język i zapisujemy dodatkowo do zmiennej sesyjnej

Wywal to do osobnego obiektu, który w razie potrzeby odpali
  1. ->setLang($lang);
na klasie Lang, z założenia Lang nie musi wiedzieć kto, skąd i po co zmienia język, ma to tylko ogarnąć po swojej stronie i tyle (plus ewentualnie powiadomić jakimś eventem że zmiana miała miejsce)

Cytat
gdy mamy zmienną, to znaczy że użytkownik chce zmienić obecny język

Może abstrakcja, ale... co jeżeli pewna część kontentu będzie w innym języku? W teorii muszę utworzyć nową instancję klasy Lang po to, żeby w tym momencie ten język zmienić?

Cytat
  1. return $this->lang.'.lang.php';

Może potraktuj tłumaczenia (zakładam strukturę key=>value) raczej jako config? W sensie *.ini, *.yml, xml itd.
Dodatkowo, możesz napisać sobie coś w rodzaju Translatora, co za tym idzie... mówić mu aby tłumaczył klucze na uprzednio załadowanej konfiguracji języka.
Do tego musisz oczywiście pamiętać o fallback'u - w momencie gdy dane tłumaczenie (klucz) nie istnieje.


P.S. taki troche Symfony-way

Ten post edytował kpt_lucek 13.08.2016, 02:55:57
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 13:57