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

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

Глобализация проявляется во многих аспектах, в том числе в единой системе мер: время, размеры и расстояния, температуры, даты и многое другое.

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

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

Эти особенности необязательно привязаны к целой стране. Внутри одной страны может быть множество дополнительных разделений. Каждый такой набор особенностей называют локалью, а процесс адаптации к особенностям конкретной локали — локализацией.

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

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

setlocale(int $category, string $locales, string ...$rest): string|false

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

  • 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
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе