Бесплатный курс по PHP. Зарегистрируйтесь для отслеживания прогресса →

PHP: Локализация

Глобализация проявляется во многих аспектах, например, единой системе мер: время, размеры и расстояния, температуры, даты и многое другое. Конечно, есть страны которые выпадают из общего потока, например, США, чуть ли не единственная страна, в которой сохраняется и превалирует английская система мер. Она использует мили вместо километров, фунты вместо килограммов. Во многих восточных странах по-другому устроены календари, и где-то сейчас идет четырёхтысячный год. Но в целом всё унифицировано.

Несмотря на эту унификацию, в каждой стране есть свои особенности по способу записи, сравнению и другим аспектам. Например, в США принято в датах первым ставить месяц, а затем уже день. В некоторых странах для вывода вещественных чисел используют точку, а в некоторых — запятую: 1,234. Эти особенности не обязательно привязаны к целой стране. Внутри одной страны может быть множество дополнительных разделений. Каждый такой набор особенностей называют локалью, а процесс адаптации к особенностям конкретной локали — локализацией.

Локализация важна в программном обеспечении. Пользователь всегда ожидает, что любой софт (в том числе сайт) будет работать предсказуемо. В это понятие включается и локализация. Понятно, что самостоятельное решение этой задачи слишком затратно. К счастью, этого делать не нужно. Локализация обычно встроена либо в сам язык, либо в специальные библиотеки.

В PHP для управления локалью используется функция setlocale(). Эта функция настраивает локаль глобально. То есть её вызов влияет на все последующие функции, опирающиеся на локализацию.

string setlocale ( int $category , string $locale [, string $... ] )

Первым параметром эта функция принимает название категории (как константу), к которой нужно применить локаль, передающуюся в параметрах дальше.

  • LC_ALL — всё нижеперечисленное
  • LC_COLLATE — функции сравнения строк (см. strcoll())
  • LC_CTYPE — функции преобразования и классификации строк, например strtoupper()
  • LC_MONETARY — для функции localeconv()
  • LC_NUMERIC — задаёт символ десятичного разделения (см. также localeconv())
  • LC_TIME — форматирование даты/времени функцией strftime()

Пример того, как влияет установленная локаль на отображение данных:

<?php

print_r(1.234); // => 1.234
setlocale(LC_NUMERIC, 'ru_RU');
print_r(1.234); // => 1,234

Если вторым аргументом передать 0 вместо локали: setlocale(LC_ALL, 0), то функция будет возвращать текущую установленную локаль для категории.

Задание

Выведите на экран текущую локаль для категории LC_CTYPE.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе