Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Локализация php

#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), );

Комментариев нет:

Отправить комментарий