Internationalisation and Unicode

Removed setlocale() String Category Support

A so-called locale defines language and regional settings, for example date formats, or how monetary values are displayed.

Locales are somewhat system-dependent, so there are several intricacies when dealing with locales. The naming scheme, for example, is not consistent across systems, plus you can never really rely on a given locale to be available on a system.

Nevertheless, locale support helps us overcome many internationalization issues. Using the function setlocale(), you cannot only set a locale, but also query the system for the currently active locale by passing 0 as the second parameter:

var_dump(setlocale(LC_CTYPE, 0));

Depending on the locale active on your system, the output might look something like this:

string(11) "en_US.UTF-8"

When setting locale information, you need to pass two parameters to setlocale(), a category and a locale. In older versions of PHP, you could pass a string as the category, since PHP 7 you must pass an integer. There are several constants that you can use to make your code more readable, namely LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME, and LC_MESSAGES which is only available when libintl was compiled into PHP.

Deprecated Aliases Removed from intl Extension

When using the intl extension, before PHP 7, you could use the method IntlDateFormatter::setTimeZoneId and its procedural sibling datefmt_set_timezone_id() to set a timezone in a formatter by passing a string as identifier.

Those methods, already deprecated in PHP 5.5, have been removed in PHP 7. Instead of setting a timezone using an identifier, you must now use a different method and pass a timezone object:

$formatter->setTimeZone(new DateTimeZone('Europe/Berlin'));

recode Extension Unbundled

The recode extension allows character set conversions, just like mbstring and iconv do. Since recode is based on a library that has been unmaintained for almost 20 years, this extension has now been unbundled from PHP.

Usually, unbundling an extension from PHP means that the source code is still available on PECL, and the extension can still be downloaded, compiled and installed separately. However, at the time of writing of this chapter, no recode extension source code was available at https://pecl.php.net/package/recode.

If your application still uses the recode extension, you should switch to iconv.