Elementor Header #8

69. Локализация

1. Введение

Локализация (или i18n) — это процесс адаптации программного обеспечения для использования в различных языках и регионах. В PHP локализация позволяет адаптировать веб-приложения к требованиям различных культур и языков, изменяя формат даты, времени, чисел и текста в соответствии с настройками пользователя или региона.

2. Основные понятия локализации

  • Локаль: Набор параметров, которые определяют формат даты, времени, чисел и текста, специфичный для определённого региона или языка.
  • Переводы: Тексты интерфейса, переведённые на разные языки.
  • Форматирование: Способ представления чисел, дат и времени в зависимости от культуры.

3. Настройка локали в PHP

Для работы с локализацией в PHP используются функции из библиотеки intl, которая предоставляет возможности для работы с датами, числами, валютами и переводами.

3.1 Установка локали

Для установки локали используйте функцию setlocale(). Эта функция задаёт локаль для форматирования данных.

				
					<?php
setlocale(LC_TIME, 'fr_FR.UTF-8'); // Устанавливает локаль для времени на французский
echo strftime('%A %d %B %Y'); // Выводит дату в формате локали
?>

				
			

Объяснение:

  • LC_TIME: Константа для локали времени.
  • 'fr_FR.UTF-8': Локаль для французского языка во Франции.

3.2 Форматирование чисел и валют

Используйте функцию number_format() для форматирования чисел и валют с учётом локали.

				
					<?php
$number = 1234567.89;

// Форматирование числа
echo number_format($number, 2, ',', ' '); // Выводит 1 234 567,89

// Форматирование валюты
$locale = 'de_DE.UTF-8';
$currency = new NumberFormatter($locale, NumberFormatter::CURRENCY);
echo $currency->formatCurrency($number, 'EUR'); // Выводит 1.234.567,89 €
?>

				
			

Объяснение:

  • number_format(): Форматирует число с указанным количеством десятичных знаков.
  • NumberFormatter: Класс для форматирования чисел и валют в зависимости от локали.

3.3 Форматирование даты и времени

Для форматирования даты и времени используйте strftime() и DateTime.

				
					<?php
// Форматирование даты и времени с использованием strftime
setlocale(LC_TIME, 'es_ES.UTF-8'); // Испанская локаль
echo strftime('%A %d %B %Y'); // Выводит дату на испанском языке

// Форматирование с DateTime
$date = new DateTime();
$date->setLocale('it_IT'); // Итальянская локаль
echo $date->format('l d F Y'); // Выводит дату на итальянском языке
?>

				
			

Объяснение:

  • strftime(): Форматирует дату и время в соответствии с установленной локалью.
  • DateTime: Класс для работы с датой и временем.

4. Переводы и текстовые ресурсы

Для управления переводами и текстовыми ресурсами в PHP часто используется система gettext.

4.1 Использование gettext

4.1.1 Подключение и установка
				
					<?php
// Установка локали
putenv('LC_ALL=es_ES.UTF-8');
setlocale(LC_ALL, 'es_ES.UTF-8');
bindtextdomain('messages', './locale');
textdomain('messages');

// Использование перевода
echo _('Hello, world!');
?>

				
			

Объяснение:

  • putenv(): Устанавливает переменную окружения для локали.
  • bindtextdomain(): Указывает путь к каталогу с переводами.
  • textdomain(): Устанавливает домен для поиска переводов.
  • _(): Функция для получения перевода строки.
4.1.2 Создание файлов перевода

Для создания переводов необходимо создать .po и .mo файлы. Например, для испанского языка файл перевода будет находиться в locale/es_ES/LC_MESSAGES/messages.po.

Пример .po файла:

				
					msgid "Hello, world!"
msgstr "¡Hola, mundo!"

				
			

Пример .mo файла:

Файл .mo компилируется из .po и используется PHP для загрузки переводов.

5. Пограничные случаи

5.1 Несоответствие локали

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

Пример:

				
					<?php
setlocale(LC_TIME, 'ru_RU.UTF-8'); // Убедитесь, что локаль 'ru_RU.UTF-8' доступна
echo strftime('%A %d %B %Y'); // Если локаль не доступна, будет использоваться стандартная
?>

				
			

5.2 Перевод строки не найден

Если строка не имеет перевода в текущем домене, будет возвращён оригинальный текст. Проверьте наличие и корректность всех переводов.

Заключение

Локализация в PHP позволяет адаптировать ваше приложение к различным языкам и регионам, обеспечивая корректное форматирование данных и поддержку многоязычных текстов. Использование функций для работы с локалями, форматирования чисел и дат, а также система gettext помогут вам создать универсальное и удобное приложение для пользователей по всему миру.

6. Тестовое задание

Для закрепления материала выполните следующее задание:

  1. Напишите код, который устанавливает локаль на немецкий язык и форматирует число и дату в соответствии с этой локалью.

  2. Используйте gettext для перевода строки «Welcome» на французский язык. Создайте .po и .mo файлы для перевода и протестируйте вывод переведённой строки.

  3. Напишите код, который выводит текущее время в формате локали для японского языка.

Пример выполнения задания:

				
					<?php
// 1. Локаль на немецкий язык
setlocale(LC_ALL, 'de_DE.UTF-8');
$number = 1234567.89;
$currency = new NumberFormatter('de_DE.UTF-8', NumberFormatter::CURRENCY);
$date = new DateTime();
echo "Число: " . number_format($number, 2, ',', '.') . "\n";
echo "Валюта: " . $currency->formatCurrency($number, 'EUR') . "\n";
echo "Дата: " . strftime('%A %d %B %Y') . "\n";

// 2. Перевод строки "Welcome" на французский язык
putenv('LC_ALL=fr_FR.UTF-8');
setlocale(LC_ALL, 'fr_FR.UTF-8');
bindtextdomain('messages', './locale');
textdomain('messages');
echo _('Welcome') . "\n"; // Убедитесь, что в файле messages.po есть перевод

// 3. Текущее время в формате локали для японского языка
putenv('LC_TIME=ja_JP.UTF-8');
setlocale(LC_TIME, 'ja_JP.UTF-8');
echo strftime('%Y年%m月%d日 %H:%M:%S') . "\n";
?>

				
			

Удачи в выполнении задания и дальнейшем изучении PHP!

logo