Intl (Internationalization) Extension
[…] is a wrapper for » ICU library, enabling PHP programmers to perform » UCA-conformant collation and date/time/number/currency formatting in their scripts.
It is really useful, as, with it, you can, for example, manage currencies and money values in the simplest way possibile (examples at the end of this post).
It is also required by some advanced framework as Symfony to work with international values.
So, let’s install Intl PHP extension…
STEP 0: Before to start, verify your environment
Verify which version of PHP are you running in Terminal
Before you install ICU binaries, check that your Terminal is using the PHP binaries provided by MAMP.
Instead you have to install Intl both for the PHP used by Terminal – the one shipped with MacOSX – and for the PHP used by your browsers – the one shipped with MAMP. Yes, they are 2 separate binaries packages!
Verify you’ve Installed XCode and its Command Line Tools
Before you can install Intl binaries, you have to install xCode Command Line Tools.
Verify you’ve installed Autoconf
Install Autoconf so you can run the Intl installation (more about this later).
STEP 1: Download ICU binaries and uncompress them
Go to ICU Project download page and grab the latest version.
On the download page you’ll find binaries for the major platforms and the source code: be sure to download the source code, and NOT the binaries.
$ cd ~/Desktop $ curl -O http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-src.tgz $ tar xzvf icu4c-4_8_1_1-src.tgz
STEP 2: Compile the binaries
Now that you have the ICU binaries, you have to install them. So, move into the
icu/source folder and compile and install the binaries:
$ cd icu/source $ ./runConfigureICU MacOSX $ make && sudo make install
This process may require some minutes and during the process you will be asked to provide the Admin password.
STEP 3: Install the ICU binaries
Now install the Intl binaries in PHP:
$ sudo pecl install intl
Troubleshooting: Error “Cannot find autoconf”
If you receive an error that says something like
Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.
then you have to install Autoconf before you can run the Intl installation.
Troubleshooting: php_intl.lo […] ERROR: ‘make’ failed
STEP 4: Add
intl.so to your
Now the easy last part: activate your new Intl extension in your php.ini.
If you have configured you MacOSX Terminal to use the same PHP binaries of MAMP, then you have to go to
To know which php.ini your Terminal is using, type in Terminal itself:
$ php -i | grep "php.ini" Configuration File (php.ini) Path => /Applications/MAMP/bin/php/php5.6.6/conf Loaded Configuration File => /Applications/MAMP/bin/php/php5.6.6/conf/php.ini
So, open it with your favorite editor and find the line
At the end of the section simply add the line
Now, save the
php.ini and restart MAMP and verify that Intl extension is properly loaded:
$ php -i | grep "Internationalization support" Internationalization support => enabled
and, if you like, check also
$ php -i | grep "intl" [...] intl intl.default_locale => no value => no value intl.error_level => 0 => 0 intl.use_exceptions => 0 => 0
Done! Now you have Intl library installed and working on your MAMP installation!
Now, let’s try Intl extension on the “battle field”
Now that you have Intl installed on your system, you can make great things with internationalization.
The first you can try is to install the Money library written by Sebastian Bergman (yes, the one who wrote also PHP Unit!): it is the best library/Value Object you can use to manage Money values. With it you’ll can manage, convert, perform math operations and many more on money values: Give it a try!
Another good thing to try is the Intl Component provided by Symfony Framework: really astonishing!
Finally, there is the last really, really important thing…
Configuring defaults for Intl extension
Now that we have installed Intl, we have to configure its default values.
So, open again your
php.ini and find the line
; Module Settings ;: here there are configurations for all the modules used by PHP.
Add the following lines:
[intl] intl.default_locale = en_utf8 intl.error_level = E_ALL intl.use_exceptions = 1
Again, run the command
$ php -i | grep "intl" [...] intl intl.default_locale => en_utf8 => en_utf8 intl.error_level => 32767 => 32767 intl.use_exceptions => 1 => 1
Now we have really all done: enjoy internationalization!
On startup (activate startup errors in PHP!), following this procedure, I’m getting a Warning:
Warning: PHP Startup: Unable to load dynamic library ‘/Applications/MAMP/bin/php/php5.6.6/lib/php/extensions/no-debug-non-zts-20131226/intl.so’ – dlopen(/Applications/MAMP/bin/php/php5.6.6/lib/php/extensions/no-debug-non-zts-20131226/intl.so, 9): Symbol not found: __ZN6icu_5513BreakIterator16getRuleStatusVecEPiiR10UErrorCode
Referenced from: /Applications/MAMP/bin/php/php5.6.6/lib/php/extensions/no-debug-non-zts-20131226/intl.so
Expected in: flat namespace
in /Applications/MAMP/bin/php/php5.6.6/lib/php/extensions/no-debug-non-zts-20131226/intl.so in Unknown on line 0
To reproduce the error, type in the Terminal this command:
php i- | grep -i intl
To solve the problem you have to export the variable
DYLD_LIBRARY_PATH adding it to your
sudo vi ~/.bash_profile Password: •
If you cannot edit the file, enter the
Edit mode simply typing
Write in the file the
Then, save the file, so FIRST press
Esc on your keyboard to quit the
edit mode and fallback to
command line mode, then type:
A short hand could be to press
SHIFT and the letter
Z for two times.
.bash_profile file typing:
$ source ~/.bash_profile
php i- | grep -i intl
The error is gone away!