- Перенаправление пользователя в зависимости от языка
- setlocale
- Список параметров
- Возвращаемые значения
- Примеры
- Примечания
- User Contributed Notes 33 notes
- Русские буквы и символы в PHP скриптах и базе данных MySQL
- Обычный вывод в PHP
- Ошибки с русским текстом в базе данных MySQL
- Знаки вопроса при выводе данных из базы данных MySQL
- Если ничего не помогает
- Для вас это может быть интересно:
- Русские буквы и символы в PHP скриптах и базе данных MySQL : 2 комментария
- Добавить комментарий Отменить ответ
Перенаправление пользователя в зависимости от языка
Это перенаправит пользователя на датскую (да) версию сайта, которая является основным сайтом, если это датский веб-клиент. Это отлично.
Но, я хочу, если пользователь не является датским, но польским, немецким и т. Д., Он перенаправляет их на английскую версию сайта, которая находится в субдомене
Как реализовать это в существующем коде? Заранее спасибо! – Фредерик Андерсен
РЕДАКТИРОВАТЬ
$sites = array( "da" => "http://www.mysite.com/", "en" => "http://en.mysite.com/" );
Не работает, поскольку он создает ошибку цикла при перенаправлении – по крайней мере, в Google Chrome.
session_start(); if (isset( $_SESSION['redirect'])) < // do nothing / continue with rest of page >else < $_SESSION['redirect'] = true; // List of available localized versions as 'lang code' =>'url' map $sites = array( "da" => "http://www.mysite.com/", "en" => "http://en.mysite.com/" ); // Get 2 char lang code $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // Set default language if a `$lang` version of site is not available if (!in_array($lang, array_keys($sites))) $lang = 'en'; // Finally redirect to desired location header('Location: ' . $sites[$lang]); exit(); >
Вам нужно будет добавить параметр по умолчанию в ваш массив:
$sites = array( "da" => "http://www.mysite.com/", "en" => "http://en.mysite.com/" );
Изменить: если вы снова вызываете этот же код в «http://en.mysite.com/» , он создаст цикл. Очевидным решением было бы не называть этот код там, но альтернативным решением было бы установить переменную сеанса, чтобы указать, что выбор языка уже имеет место.
Чтобы добавить эту переменную сеанса, вы можете сделать что-то вроде:
session_start(); if (isset( $_SESSION['redirect'])) < // do nothing / continue with rest of page >else < $_SESSION['redirect'] = true; // your language selection code with header call exit(); >
$sites = array( "da" => "http://www.mysite.com/", "en" => "http://en.mysite.com/" );
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); $sub_domain = ($lang == "da") ? "www" : "en"; $link = "http://".$sub_domain.".mysite.com/"; header('Location: ' . $link);
setlocale
Альтернативная сигнатура (не поддерживается с именованными аргументами):
Устанавливает настройки локали.
Информация о локали модифицируется во всем процессе, а не по каждому потоку отдельно. Если вы используете PHP на многопоточном сервере, вы можете обнаружить неожиданные изменения в настройках локали во время выполнения скриптов, никогда и не вызывавших setlocale() . Это происходит из-за того, что другие скрипты, запущенные в параллельных потоках данного процесса, в то же самое время поменяли настройки локали для всего процесса с помощью setlocale() . В Windows информация о локали поддерживается для каждого потока, начиная с PHP 7.0.5.
Список параметров
- LC_ALL — все нижеперечисленное
- LC_COLLATE — функции сравнения строк, смотрите strcoll()
- LC_CTYPE — функции преобразования и классификации строк, например ctype_alpha()
- LC_MONETARY — для функции localeconv()
- LC_NUMERIC — задаёт символ десятичного разделения (смотрите также localeconv() )
- LC_TIME — форматирование даты/времени функцией strftime()
- LC_MESSAGES — для системных сообщений (доступна, если PHP был скомпилирован с поддержкой libintl )
Если в качестве locales передана пустая строка «» или null , имена локалей будут взяты из одноимённых переменных окружения или переменной с именем «LANG».
Если в качестве locales передан «0» , локаль изменена не будет, а будет возвращено текущее значение.
Если в качестве locales передан массив, или после этого аргумента следуют дополнительные аргументы, функция будет использовать элементы массива или аргументы по порядку в качестве имён локали до тех пор, пока установка локали не будет успешной. Это удобно, если одна и та же локаль имеет разное имя в различных системах, или для создания запасного варианта при отсутствии какой-либо локали в системе.
Необязательные аргументы в виде строк или массивов для установки настроек локали до первой успешной попытки.
Каждый элемент массива пытается установить новую локаль до первой успешной попытки. Это полезно, если локаль известна под разными именами в разных системах или для обеспечения запасного варианта для возможно недоступного языкового стандарта.
Замечание:
На Windows setlocale(LC_ALL, ») устанавливает имена локалей из системных региональных/языковых настроек (доступных через Панель Управления).
Возвращаемые значения
Возвращает имя вновь установленной локали или false , если система не поддерживает установку локали, указанная локаль не существует или передано недопустимое имя категории.
Недопустимое имя категории также вызывает предупреждение. Имена локалей и категорий описаны в » RFC 1766 и » ISO 639. Разные системы имеют различные схемы именования локалей.
Замечание:
Возвращаемое функцией setlocale() значение зависит от системы, на которой запущен PHP. Она возвращает точно то же значение, что и системная функция setlocale .
Примеры
Пример #1 Примеры использования setlocale()
/* Установка голландской локали */
setlocale ( LC_ALL , ‘nl_NL’ );
?php
/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %e %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));
/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘de’ , ‘ge’ );
echo «На этой системе немецкая локаль имеет имя ‘ $loc_de ‘» ;
?>
Пример #2 Примеры использования setlocale() в Windows
/* Установка голландской локали */
setlocale ( LC_ALL , ‘nld_nld’ );
?php
/* выводит: vrijdag 22 december 1978 */
echo strftime ( «%A %d %B %Y» , mktime ( 0 , 0 , 0 , 12 , 22 , 1978 ));
/* попытка использовать различные локали для немецкого языка */
$loc_de = setlocale ( LC_ALL , ‘de_DE@euro’ , ‘de_DE’ , ‘deu_deu’ );
echo «Предпочитаемая немецкая локаль на этой системе: ‘ $loc_de ‘» ;
?>
Примечания
Пользователи Windows найдут полезной информацию о значениях locales на сайте Microsoft MSDN . Поддерживаемые языки перечислены в » документации по языковым строкам, а значения стран/регионов в » документации по строкам стран/регионов.
User Contributed Notes 33 notes
be careful with the LC_ALL setting, as it may introduce some unwanted conversions. For example, I used
to get my weekdays in dutch on the page. From that moment on (as I found out many hours later) my floating point values from MYSQL where interpreted as integers because the Dutch locale wants a comma (,) instead of a point (.) before the decimals. I tried printf, number_format, floatval. all to no avail. 1.50 was always printed as 1.00 🙁
my weekdays are good now and my floating point values too.
I hope I can save some people the trouble of figuring this out by themselves.
If you are looking for a getlocale() function simply pass 0 (zero) as the second parameter to setlocale().
Beware though if you use the category LC_ALL and some of the locales differ as a string containing all the locales is returned:
echo setlocale ( LC_ALL , 0 );
echo setlocale ( LC_CTYPE , 0 );
setlocale ( LC_ALL , «en_US.UTF-8» );
echo setlocale ( LC_ALL , 0 );
?>
If you are looking to store and reset the locales you could do something like this:
$originalLocales = explode ( «;» , setlocale ( LC_ALL , 0 ));
setlocale ( LC_ALL , «nb_NO.utf8» );
foreach ( $originalLocales as $localeSetting ) if ( strpos ( $localeSetting , » keyword»>) !== false ) list ( $category , $locale ) = explode ( » keyword»>, $localeSetting );
>
else $category = LC_ALL ;
$locale = $localeSetting ;
>
setlocale ( $category , $locale );
>
?>
The above works here (Ubuntu Linux) but as the setlocale() function is just wrapping the equivalent system calls, your mileage may vary on the result.
Русские буквы и символы в PHP скриптах и базе данных MySQL
При использовании локального сервера на компьютере под управлением Windows, будь то Denwer или лбой другой набор, возникает проблема с отображением русских символов и букв при выводе страницы в браузер. Причины этой проблемы могут быть разными, в данной статье я расскажу о некоторых из них и постараюсь помочь с их решением.
Обычный вывод в PHP
Если не отображаются русские символы при обычном выводе через echo, появляются знаки вопроса (?) вместо букв, то проблемой может быть неверно указанная кодировка файла. Стандартная программа блокнот Windows по умолчанию сохраняет файл в кодировке ANSI, в результате чего появляется такая проблема как на картинке.
Знаки вопроса вместо букв
Решить проблему можно сохранив файл в формате UTF-8, для этого в блокноте достаточно нажать Файл->Сохранить как… и в появившемся окне выбрать тип файла «Все файлы» и выбрать кодировку UTF-8. После чего нажать кнопку сохранить и подтвердить замену файла.
Сохранение файла в кодировке UTF-8
Открываем вновь в браузере и видим, что проблема решена.
Нормальное отображение символов в PHP
Этот способ показан для программы Блокнот Windows, т.к. чаще всего проблема возникает именно с ней у начинающих программистов PHP. Для программирования лучше использовать специальный текстовый редактор (Sublme Text, Notepad++ и др.) или IDE PhpStorm, они по умолчанию работают UTF-8.
Ошибки с русским текстом в базе данных MySQL
Проблема проявляет себя во время сохранения данных в базе данных MySQL. Обычно это происходит из-за того, что пользователь, при создании новой базы данных и таблицы, не выбирает сравнение(кодировку) и она устанавливается по умолчанию как latin1_swedish_ci.
СУБД возвращает ошибку при попытке добавить русский текст в поле записи.
#1366 — Incorrect string value
Ошибка при добавлении русского текста в запись таблицы СУБД MySQL
Чтобы не сталкиваться с такой проблемой необходимо всегда выбирать сравнение utf8_general_ci при создании базы данных, таблиц и столбцов.
Знаки вопроса при выводе данных из базы данных MySQL
Иногда возникает проблема с отображением данных, полученных из базы данных MySQL. Обычно вместо русских символов выводятся знаки вопроса.
Проблема решается путем установления кодировки подключения к базе данных.
Если вы пользуетесь старыми функциями для работы с БД MySQL, то сразу после функций подключения к базе данных необходимо добавить:
и при этом советую вам почитать про PDO, так как библиотека для работы с БД MySQL, включающая функции mysql_connect(), mysql_select_db() и прочие уже устарела, а в версии PHP 7 вообще убрана.
Если вы работаете с PDO, то в DSN(способ соединения с БД у PDO) необходимо в параметре charset устанавливать кодировку utf8. Пример соединения с кодировкой:
$ms_host = "localhost"; // Хост $ms_db = ""; // Имя БД $charset = "utf8"; // Кодировка соединения $dsn = "mysql:host=$ms_host;dbname=$ms_db;charset=$charset";
Если ничего не помогает
Попробуйте после подключения к БД добавить mysql_query(«SET NAMES utf8»);
Попробуйте в начале PHP скрипта добавить header(‘Content-Type: text/html; charset=utf8’);
А так же не забывайте о meta-теге между
иБуду рад, если кому-нибудь помогли данные советы. Вы можете задать вопрос со своей проблемой в комментарии и мы попробуем вместе разобраться. Удачи в устранении ошибок и багов!
Для вас это может быть интересно:
Русские буквы и символы в PHP скриптах и базе данных MySQL : 2 комментария
- Скейли 19.10.2016 Нормально отображаться русский текст начал только после указания кодировки UTF-8(без BOM) в notepad++, хотя meta charset использовал. Почему разрабы не могут проблемы кодировкой раз и навсегда решить, указывать приходится во всех местах. 🙁
- KoT 08.01.2021 А я использовал кодировку UTF-8 с BOM и так же нажимал преобразовать в UTF-8 с BOM и русский текст отобразился
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
- Qt (4)
- SEO (5)
- Администрирование (4)
- Алгоритмы (6)
- Заработок (1)
- Операционные системы (4)
- Ответы (2)
- Программирование (23)
- Сайтостроительство (11)
- Чынгыз к записи Как найти сумму и произведение элементов массива на C++
- Чынгыз к записи Как найти сумму и произведение элементов массива на C++
- Di к записи Создание Excel документа на PHP (генерация .xls файлов)
- Илья к записи Русские символы(буквы) при вводе/выводе в консоль на C++
- LedsHack к записи Найти максимальный и минимальный элемент массива на C++