#php
Делал локализацию, получилось все очень громоздко. Как это исправить? if(isset($_GET['lang'])) { if ($_GET['lang'] === "ru") $lang = "ru"; elseif ($_GET['lang'] === "ua") $lang = "ua"; else $lang = "en"; setcookie("lang", $lang, time()+30758400, "/"); } else { if (empty($_COOKIE['lang'])) { $b_lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2); if ($b_lang == "ru") $lang = "ru"; elseif ($b_lang == "uk") $lang = "ua"; else $lang = "en"; } else { if ($_COOKIE['lang'] === "ru") $lang = "ru"; elseif ($_COOKIE['lang'] === "ua") $lang = "ua"; else $lang = "en"; } } if ($lang === "ru") include("lang/ru.php"); elseif ($lang === "ua") include("lang/ua.php"); else include("lang/en.php");
Ответы
Ответ 1
$allowedLang=array("ru","ua","en"); $needCookie=false; if(isset($_GET['lang'])) { $lang=$_GET['lang']; $needCookie=true; } elseif(empty($_COOKIE['lang'])) $lang=substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2); else $lang=$_COOKIE['lang']; if(in_array($lang,$allowedLang)) $lang='en'; if($needCookie) setcookie("lang", $lang, time()+30758400, "/"); include("lang/$lang.php"); Ну и совсем хардкорный:Ответ 2
Больше вариантов :) function resolveLanguage() { // эти значения стоит хранить где-то в конфиге // чтобы потом не надо было менять код $allowedLanguages = array('ru', 'ua', 'en'); $defaultLanguage = 'en'; // порядок имеет значение // можно добавить еще какой-то источник для определения языка $preferredLanguages = array( isset($_GET['lang']) ? $_GET['lang'] : null, isset($_COOKIE['lang']) ? $_COOKIE['lang']: null, substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2), ); // убираем лишние, хотя смысла в этом нет - можно убрать (см. ниже) $preferredLanguages = array_filter($preferredLanguages); // выбираем первый разрешенный язык foreach ($preferredLanguages as $language) { if (in_array($language, $allowedLanguages)) { return $language; } } // если ничего не нашли.. return $defaultLanguage; } function saveLanguage($language) { setcookie("lang", $language, time()+30758400, "/"); } Использование: $language = resolveLanguage(); include("lang/{$language}.php"); saveLanguage($language); // ну не знаю, почему после, вдруг на include всё сдохло :) Делать код коротким неправильно (в данном случае). Он должен быть понятным и легко обновляемым/настраиваемым. upd. В php 7.0 можно написать так: $preferredLanguages = array( $_GET['lang'] ?? null, $_COOKIE['lang'] ?? null, substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2), );
Комментариев нет:
Отправить комментарий