Phalcon написан на C как расширение для PHP. Существует расширение PECL, которое предлагает функции интернационализации для PHP-приложений, называемых intl. Начиная с PHP 5.4 / 5.5 это расширение связано с PHP. Его документацию можно найти на страницах официального руководства PHP.

Phalcon не предлагает эту функциональность, так как создание такого компонента будет реплицировать существующий код.

В приведенных ниже примерах мы покажем вам, как реализовать функциональность расширения intl в приложениях, работающих на Phalcon.

Узнать лучший доступный Locale

Существует несколько способов узнать наилучший доступный язык с помощью intl. Один из них - проверить заголовок HTTP-Accept-Language:

<?php

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);

// Язык может быть чем-то вроде 'en_GB' или 'en'
echo $locale;

Ниже метод возвращает локаль. Он используется для получения языка, культуры или регионального поведения из API Locale.

Примеры идентификаторов включают:

  • en-US (Английский, Соединенные Штаты)
  • ru-RU (Россия, Россия)
  • zh-Hant-TW (Китайский, традиционный, Тайвань)
  • fr-CA, fr-FR (Французский для Канады и Франции соответственно)

Форматирование сообщений на основе языка

Часть создания локализованного приложения - это создание конкатенированных сообщений, нейтральных для языка. MessageFormatter позволяет создавать эти сообщения.

Печать номеров, отформатированных на основе некоторых локалей:

<?php

// Prints € 4 560
$formatter = new MessageFormatter('fr_FR', '€ {0, number, integer}');
echo $formatter->format([4560]);

// Prints USD$ 4,560.5
$formatter = new MessageFormatter('en_US', 'USD$ {0, number}');
echo $formatter->format([4560.50]);

// Prints ARS$ 1.250,25
$formatter = new MessageFormatter('es_AR', 'ARS$ {0, number}');
echo $formatter->format([1250.25]);

Форматирование сообщений с использованием шаблонов времени и даты:

<?php

// Настройка параметров
$time   = time();
$values = [7, $time, $time];

// Prints 'At 3:50:31 PM on Apr 19, 2015, there was a disturbance on planet 7.'
$pattern   = 'At {1, time} on {1, date}, there was a disturbance on planet {0, number}.';
$formatter = new MessageFormatter('en_US', $pattern);
echo $formatter->format($values);

// Prints 'À 15:53:01 le 19 avr. 2015, il y avait une perturbation sur la planète 7.'
$pattern   = 'À {1, time} le {1, date}, il y avait une perturbation sur la planète {0, number}.';
$formatter = new MessageFormatter('fr_FR', $pattern);
echo $formatter->format($values);

Локально-чувствительное сравнение

Класс Collator предоставляет возможность сравнения строк с поддержкой соответствующих пользовательских настроек сортировки. Проверьте приведенные ниже примеры использования этого класса:

<?php

// Создание коллаборатора с использованием испанского языка
$collator = new Collator('es');

// Возвращает, что строки равны, несмотря на акцент на 'o'
$collator->setStrength(Collator::PRIMARY);
var_dump($collator->compare('una canción', 'una cancion'));

// Возвращает, что строки не равны
$collator->setStrength(Collator::DEFAULT_VALUE);
var_dump($collator->compare('una canción', 'una cancion'));

Транслитерация

Transliterator обеспечивает транслитерацию строк:

<?php

$id = 'Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();';
$transliterator = Transliterator::create($id);

$string = "garçon-étudiant-où-L'école";
echo $transliterator->transliterate($string); // garconetudiantoulecole