lang.class.php, czyli wielojęzyczne strony internetowe
Tworząc stronę internetową musimy zadać sobie pytanie, czy naszą witrynę będą odwiedzać tylko osoby znające język polski czy też obcokrajowcy, chcący skorzystać z usług firmy, dla której przykładowo tworzymy witrynę internetową. Na stronach wielu znanych firm mamy możliwość wyboru języka w jakim ma zostać wyświetlona strona. Takie rozwiązanie znacznie ułatwia nawigację po stronie internetowej osobom zainteresowanym produktami lub usługami danej firmy lub instytucji.
W przypadku rozbudowanych stron internetowych, które zostały stworzone przy użyciu frameworków takich jak: Zend Framework czy też Symfony
tworzenie wielojęzycznych serwisów jest znacznie utrudnione poprzez narzucony sposób budowania aplikacji webowej. Jednak dzięki niezwykle dużej społeczności programistów korzystających z tych frameworków mamy możliwość szybkiego znalezienia odpowiedniego modułu i dostosowania go do swoich potrzeb.
Inaczej sprawa ma się gdy tworzymy stronę bez użycia frameworków. Wtedy znacznie lepiej skorzystać z klasy, która została stworzona aby w prosty sposób umożliwić tworzenie wielojęzycznych stron. Skrypt taki idealnie nadaje się do statycznych stron, nie mniej jednak znajdzie również zastosowanie przy budowaniu dynamicznych witryn.
Struktura plików:
- index.php
- lang.class.php
- langs/
- en.lang.php
- pl.lang.php
- template/
- index.php
- style.css
Kod klasy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | <?php /** * * @author Dominik Ryńko * @contact: http://www.rynko.pl/kontakt * @version 1.0.0 * @license http://creativecommons.org/licenses/by-sa/3.0/pl/ */ /** * Class lang */ class Lang { /** * @var */ public static $lang; /** * @var array */ public $config = [ 'defaultLang' => 'pl', 'cookieName' => 'lang', 'defaultLocation' => 'index.php', 'langsPath' => './langs/', 'fileExtension' => '.lang.php' ]; /** * @Description: call method include_lang() and getDefaultLang() */ public function __construct() { $this->includeLang(); $this->getDefaultLang(); } /** * @param $lang * @throws Exception */ public function setLang($lang) { $lang = $this->clear($lang); if ($_COOKIE['lang']) { unset($_COOKIE['lang']); } $short = []; foreach ($this->scanAvailableLangs() as $key => $value) { $data[] = explode('.', $value); $short[] = $data[$key][0]; } if (in_array($lang, $short)) { setcookie($this -> config['cookieName'], $lang); header('Location:' . $this->config['defaultLocation']); } else { throw new Exception('There is no language in langs/ dir like ' . $lang . ')'); } } /** * @return null */ private function getDefaultLang() { if (is_null($this->config['defaultLang']) || empty($this->config['defaultLang'])) { $this->config['defaultLang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } return null; } /** * @throws Exception */ private function includeLang() { if (empty($_COOKIE['lang'])) { setcookie($this -> config['cookieName'], $this->config['defaultLang']); header('Location:'. $this -> config['defaultLocation']); } else { $clear = $this->clear($_COOKIE[$this -> config['cookieName']]); $lang = ''; if (preg_match('/[A-za-z0-9]/', $clear)) { include $this -> config['langsPath'].$clear.$this -> config['fileExtension']; self::$lang = $lang; } else { throw new Exception('Regex does not match to the name of lang in cookie'); } } } /** * @return array * @throws Exception */ private function scanAvailableLangs() { $files = glob($this -> config['langsPath'].'*{'.$this -> config['fileExtension'].'}', GLOB_BRACE); foreach ($files as $key => $value) { $langs[] = explode('/', $value); $short[] = end($langs[$key]); } if (empty($short)) { throw new Exception('There are no available languages'); } else { return $short; } } /** * @param $data * @return string */ private function clear($data) { return trim(htmlspecialchars($data)); } } |
Jak widać w powyższym kodzie klasa zawiera 5 metod w tym 3 prywatne.
Kod index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php // Flush the output buffer ob_start(); // Set Charset and content type header('Content-Type: text/html; charset=UTF-8'); // Turn on showing errors ini_set('display_errors', 1); /* 0 -> Do not show any errors E_ALL -> Show all errors E_ALL ^ E_NOTICE -> Show errors without notices */ error_reporting(E_ALL); // Check PHP version if(phpversion() < '5.2.0') { die('It is highly advisable to update your PHP Version. Currently you have version '.PHP_VERSION); } $files = ['lang.class.php', 'template/index.php']; // Include lang class if (file_exists($files[0])) { require_once $files[0]; } // Create new instance of lang class $lang = new Lang(); $cookieName = $lang -> config['cookieName']; // If exists $_GET, set new languages if(isset($_GET[$cookieName])) { $lang -> setLang($_GET[$cookieName]); } // Include main file with HTML code if (file_exists($files[1])) { require_once $files[1]; } // Finish buffering ob_end_flush(); |
Plik główny index.php zawiera kilka ustawień typu: jakie błędy mają być wyświetlane, sprawdzenie wersji PHP czy też ustawienie typu kodowania znaków(UTF-8).
Główną częścią jest załadowanie pliku z klasą, utworzenie nowego obiektu klasy oraz sprawdzenie czy istnieje zmienna $_GET[‚lang’]. Jeśli zmienna ta istnieje zostaje ustawiony nowy język.
Plik template/index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!DOCTYPE html> <html lang="pl"> <head> <meta charset="UTF-8"> <title><?php echo Lang::$lang[0]; ?></title> <meta name="description" content="<?php echo Lang::$lang[1]; ?>"> <link rel="stylesheet" href="template/style.css"> </head> <body> <h1><?php echo Lang::$lang[2]; ?></h1> <nav> <h2><?php echo lang::$lang[3]; ?></h2> <ul> <?php foreach(lang::$lang[4] as $key => $value) { echo '<li><a href="'.$key.'" title="'.$value.'">'.$value.'</a></li>'; } ?> </ul> </nav> <?php echo isset($result) ? '<p>'.$result.'</p>' : null; ?> <p><?php echo lang::$lang[5]; ?></p> <ul class="lang"> <li><a href="index.php?lang=pl" title="Polski"><?php echo lang::$lang[6]; ?></a></li> <li><a href="index.php?lang=en" title="Angielski"><?php echo lang::$lang[7]; ?></a></li> </ul> </body> </html> |
Przykładowy dokument HTML. Aby móc używać naszej klasy w folderze langs/ musi istnieć chociaż jeden plik z językiem. Dane z pliku z językiem wyświetlamy za pomocą lang::$lang[index], gdzie index to numer danego elementu tablicy. W tym pliku widzimy również zmienną $result. Nie jest ona wymaga. Wyświetla ona błędy, np. Brak podanego języka czy też błąd podczas parsowania pliku z rozszerzeniem *.lang.php.
Plik langs/pl.lang.php
1 2 3 4 5 6 7 8 9 10 | <?php $lang[0] = 'Tytuł strony'; $lang[1] = 'Opis strony'; $lang[2] = 'Główny nagłówek strony'; $lang[3] = 'Nawigacja'; $lang[4] = array('home.html' => 'Strona główna', 'about.html' => 'O nas', 'portfolio.html' => 'Portfolio', 'contact.html' => 'Kontakt'); $lang[5] = 'Przykładowy tekst, który jest osadzony na stronie głównej.'; $lang[6] = 'pl'; $lang[7] = 'en'; ?> |
Plik zawiera tablicę z danymi, które mają wyświetlić się na stronie www. Ponadto nic nie stoi na przeszkodzie aby używać tablic, np. do wyświetlania menu w różnych językach.
Dodatkowe informacje:
– Domyślnym językiem jest język polski. Ustawienie to można zmienić w pliku lang.class.php, odpowiada za to właściwość private $defaultLang. Podczas zmiany domyślnego języka MUSI istnieć plik z danym językiem w folderze langs/,
– Klasa korzysta z ciastek(cookies) do obsługi danego języka,
– Aby dodać nowy język trzeba dodać: nowy plik w folderze langs/ oraz link do nowego języka w pliku tempate/index.php
- Comandeer