PHP: setlocale - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

sha1_file rtrim

Last updated: Sat, 27 Jan 2007

view this page in

# setlocale

(PHP 3, PHP 4, PHP 5)

setlocale -- Устанавливает локаль

## Описание

string setlocale ( mixed category, string locale [, string ...] )
string setlocale ( mixed category, array locale )

`category` - строка или константа, задающая категорию функций, на которые будет влиять установка локали:

- LC_ALL - все функции

- LC_COLLATE - функции сравнения строк, см. strcoll()

- LC_CTYPE - функции преобразования строк, например strtoupper()

- LC_MONETARY - функция localeconv()

- LC_NUMERIC - задает символ десятичной точки (см. также localeconv())

- LC_TIME - форматирование дат функцией strftime()

> Замечание: Начиная с 4.2.0, передача `category` в виде строки не поддерживается, рекомендуется использовать перечисленные константы. Передача этих констант как строк (в кавычках) вызовет вывод предупреждения.

Если в качестве `locale` передана пустая строка `""`, имена локалей будут взяты из соответствующих переменных окружения или переменной с именем "LANG".

Если в качестве `locale` передан `NULL` или `"0"`, локаль изменена не будет, а будет возвращено текущее значение.

Если в качестве `locale` передан массив, или после этого аргумента следуют дополнительные аргументы, функция будет использовать элементы массива или аргументы по порядку в качестве имен локали до тех пор, пока установка локали не будет успешной. Это удобно, если одна и та же локаль имеет разное имя в различных системах, или необходимая локаль может отсутствовать в системе.

> Замечание: Передача нескольких локалей доступна начиная с PHP 4.3.0

Setlocale возвращает имя вновь установленной локали или `FALSE` если системе не поддерживает установку локали, указанная локаль не существует или передано недопустимое имя категории. Недопустимое имя категории также вызывает предупредение. Имена локалей и категорий описаны в RFC 1766 и ISO 639.

> Замечание: Возвращаемое функцией setlocale() значение зависит от системы - это значение, возвращаемое системной функцией setlocale.

> Подсказка: Полезная информация о значениях аргумента `locale` в Windows содержится на сайте MSDN. Поддерживаемые языки перечислены здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_language_strings.asp, поддерживаемые коды стран/регионов - здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_country_strings.asp. Windows поддерживает трехбуквенные коды стран/регионов, определенные в стандарте `ISO 3166-Alpha-3`, который можно найти на этом сайте Unicode.

Пример 1. Примеры использования setlocale()

`<?php
/* Установка голландской локали */
setlocale(LC_ALL, 'nl_NL');
/* выводит: vrijdag 22 december 1978 */
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));
/* попытка использовать различные локали для немецкого языка (с PHP 4.3.0) */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
echo "На этой системе немецкая локаль имеет имя '$loc_de'";
?>`

Пример 2. Примеры использования setlocale() в Windows

`<?php
/* Установка голландской локали */
setlocale(LC_ALL, 'nl_NL');
/* выводит: vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));
/* попытка использовать различные локали для немецкого языка (с PHP 4.3.0) */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "На этой системе немецкая локаль имеет имя '$loc_de'";
?>`

add a note User Contributed Notes
setlocale
szepeshazi at gmail dot com
18-Feb-2007 07:11
`For those of you who are unfortunate enough (like me) to work in Windows environment, and try to set the locale to a language _and_ to UTF-8 charset, and were unable to do it, here is a workaround.
For example to output the date in hungarian with UTF-8 charset, this will work:
$dateString = "%B %d., %A";
setlocale(LC_ALL,'hungarian');
$res=strftime($dateString);
echo(iconv('ISO-8859-1', 'UTF-8', $res));
If anybody knows how to set the locale on Windows to the equivalent of "hu_HU.UTF-8" on unix, please do tell me.`
lifeless
20-Nov-2006 09:40
`if your server is an ubuntu (debian like)
you need to install the locales you want (default is english and your language) go to aptitude and install -language-pack-*-base it will resolve dependencies and will try to install a suggested package, remove it if you don't care and proceed.`
Clayton Smith
26-Sep-2006 11:15
`If you already have all the locales installed and "locale -a" is only showing a few languages, then edit /etc/locale.gen and add a line, e.g., es_MX ISO-8859-1. After you add the line, run the command locale-gen for it to generate the locales based on those settings.`
grmela at removethis ent cz
06-Sep-2006 02:58
`Just in case you freshly installed some new locales and they doesn't seem to work with setlocale(), don't forget to restart your webserver. It may save you some time browsing your code trying to fix it there :)`
Sven K
07-Jun-2006 03:08
`If your system doesn't show any installed locales by "locale -a", try installing them by "dpkg-reconfigure locales" (on debian).`
08-Mar-2006 12:17
`The example from bruno dot cenou at revues dot org below shows the possibility, but I want to spell it out: you can add charset info to setlocale.
Example:
Into my utf-8-encoded page I want to insert the name of the current month, which happens to be March, in German "März" - with umlaut. If you use
setlocale(LC_TIME, 'de_DE');
echo strftime("%B");
this will return "M&auml;rz", but that html-entity will look like this on a utf-8 page: "M?rz". Not what I want.
But if you use
setlocale(LC_TIME, 'de_DE.UTF8'); // note the charset info !
echo strftime("%B");
this returns "M√§rz", which, on utf-8, looks like it should: "März".`
bruno dot cenou at revues dot org
20-Feb-2006 06:31
`A little function to test available locales on a sytem :
<?php
function list_system_locales(){
ob_start();
system('locale -a');
$str = ob_get_contents();
ob_end_clean();
return split("\\n", trim($str));
}
$locale = "fr_FR.UTF8";
$locales = list_system_locales();
if(in_array($locale, $locales)){
echo "yes yes yes....";
}else{
echo "no no no.......";
}
?>`
Edwin Martin
20-Feb-2006 04:29
`Debian users: Addition to Gabor Deri's note: if setlocale doesn't work in your locale and you're on Debian, and Gabor Deri's note doesn't work, you have to install the locales package.
As root, type: "apt-get install locales" and it will be installed.`
glenn at europlan dot no
29-Nov-2005 11:55
`In most Unix/Linux system, you could use:
locale -a
This will list all available locales on the server.`
birkholz at web dot de
14-Aug-2005 08:42
`When i tried to get the current locale (e.g. after i set the lang to german with setlocale(LC_ALL, 'de_DE'); ), the following did not work on my suse linux 9.0-box:
$currentLocale = setlocale(LC_ALL, NULL);
This code did a reset to the server-setting.
$currentLocale = setlocale(LC_ALL, 0); works perfectly for me, but the manual says NULL and 0 are equal in this case, but NULL seems to act like "".`
cdblog at gmail dot com
25-May-2005 10:39
`When you use Smarty's html_select_date,
you can use setlocale(LC_TIME, string local) in your script before display the template file
then get the local month name,
also, you can copy the "plugins/function.html_select_date.php" to "plugins/function.html_select_date_local.php",
and modify the function name to smarty_function_html_select_date_local(former is smarty_function_html_select_date)
for more examples about this function, you can visit my php blog( http://php.clickz.cn/ ) to find more.
this resource's link is http://php.clickz.cn/articles/date/setlocale.html
example test:
<?php
setlocale(LC_TIME,"chs");
$smarty->display("setlocale.tpl");
?>
the setlocale.tpl's content
-------------------------
<html>
<head>My PHP Blog</head>
<body>
{ html_select_date_local prefix="" time=$smarty.get.date month_format="%B" all_extra="onChange='theFormSubmit();'" end_year=+1 }
</body>
</html>`
pigmeu at pigmeu dot net
18-Oct-2004 01:42
`!!WARNING!!
The "locale" always depend on the server configuration.
i.e.:
When trying to use "pt_BR" on some servers you will ALWAYS get false. Even with other languages.
The locale string need to be supported by the server. Sometimes there are diferents charsets for a language, like "pt_BR.utf-8" and "pt_BR.iso-8859-1", but there is no support for a _standard_ "pt_BR".
This problem occours in Windows platform too. Here you need to call "portuguese" or "spanish" or "german" or...
Maybe the only way to try to get success calling the function setlocale() is:
setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese", ...);
But NEVER trust on that when making functions like date conversions or number formating. The best way to make sure you are doing the right thing, is using the default "en_US" or "en_UK", by not calling the setlocale() function. Or, make sure that your server support the lang you want to use, with some tests.
Remember that: Using the default locale setings is the best way to "talk" with other applications, like dbs or rpc servers, too.
[]s
Pigmeu`
dv at josheli dot com
12-Aug-2004 04:04
`On Novell Netware, the language codes require hyphens, not underscores, and using anything other than LC_ALL doesn't work directly.
So... (from their support list)....
You have to set TIME, NUMERIC etc. info in two steps as given below rather than one. This is due to the limitation of setlocale function of LibC.
<?php
setlocale(LC_ALL, 'es-ES');
$loc = setlocale(LC_TIME, NULL);
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));
// jeuves 22 diciembre 1978
?>
This should work.
or of course, reset LC_ALL...
<?php
setlocale(LC_ALL, 'es-ES');
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));
setlocale(LC_ALL, '');
// jeuves 22 diciembre 1978
?>`
bogdan at iHost dot ro
02-Mar-2004 02:53
`On some systems (at least FreeBSD 4.x) the format for a `locale' is, for example, ro_RO.ISO8859-2. If you use ro_RO instead setlocale will return FALSE. Just browse in /usr/share/locale and see what is the name of the directory holding your `locale' and use that name in your scripts:
<?php
clearstatcache();
$pos = strrpos ($_SERVER["PHP_SELF"], "/");
$fisier = substr ($_SERVER["PHP_SELF"], $pos + 1);
$result = filemtime ($fisier);
$local = setlocale (LC_TIME, 'ro_RO.ISO8859-2');
if ($local == "ro_RO.ISO8859-2") {
$modtime = strftime '%e&nbsp;%B&nbsp;%Y&nbsp;%H:%M', $result);
} else {
$modtime = strftime ('%d.%m.%Y&nbsp;%H:%M', $result);
}
printf ("Ultima&nbsp;actualizare: %s\\n", $modtime);
?>`
mk at totu dot com
26-Jan-2004 04:59
`Be carefull - setting a locale which uses commas instead of dots in numbers may cause a mysql db not to understand the query:
<?php
setlocale(LC_ALL,"pl");
$price = 1234 / 100; // now the price looks like 12,34
$query = mysql_query("SELECT Id FROM table WHERE price='".$price."'");
?>
Even if there is a price 12.34 - nothing will be found`
r dot nospam dot velseboer at quicknet dot nospam dot nl
08-Sep-2002 07:02
`be careful with the LC_ALL setting, as it may introduce some unwanted conversions. For example, I used
setlocale (LC_ALL, "Dutch");
to get my weekdays in dutch on the page. From that moment on (as I found out many hours later) my floating point values from MYSQL where interpreted as integers because the Dutch locale wants a comma (,) instead of a point (.) before the decimals. I tried printf, number_format, floatval.... all to no avail. 1.50 was always printed as 1.00 :(
When I set my locale to :
setlocale (LC_TIME, "Dutch");
my weekdays are good now and my floating point values too.
I hope I can save some people the trouble of figuring this out by themselves.
Rob`
Gabor Deri <gaborDOTderi at fuggetlen dot hu>
06-Aug-2002 09:31
`IMPORTANT notice for DEBIAN linux users:
after the upgrade to the new stable (woody), you may have encountered that setlocale is not working at all, even though you have the files in the /usr/share/locale directory and everything was fine before the upgrade. in this case look at the /etc/locale.gen file, which contains the generated locales. if it is empty, you do not have any useful locales. to generate the needed locales run 'dpkg-reconfigure locales' as root and select the locales you need.`
jorg-spamm at omnimedia dot no
03-Jul-2002 11:23
`I needed to compile and install some extra locales to get this to work on RH7.3. Probably just me not doing a proper installation, but this is what it took to fix it:
localedef -ci no_NO -f ISO_8859-1 no_NO`
elindset at hoved dot net
12-May-2002 02:59
`In FreeBSD I had to use no_NO.ISO8859-1 instead of just no_NO..
<?PHP
setlocale (LC_ALL, 'no_NO.ISO8859-1');
echo strftime ("%A %e %B %Y", time());
?>`
misc dot anders at feder dot dk
19-Jun-2001 06:13
`Under FreeBSD, locale definitions are stored in the /usr/share/locale/ directory. Danish time formats and weekdays, for instance, are stored in /usr/share/locale/da_DK.ISO_8859-1/LC_TIME.`
noog at libero dot it
23-Nov-2000 03:13
`On windows:
Control Panel->International Settings
You can set your locale and customize it
And locale-related PHP functions work perfectly`
Morgan Christiansson &lt;mog at linux dot nu&gt;
29-Mar-2000 12:56
`check /usr/share/locale/ if you want more info about the locale available with your *NIX box
there is also a file called /usr/share/locale/locale.alias with a list of aliases
such as swedish for sv_SE
so on all boxes i have accounts on (rh 6.0 and slack 3.4) you can just use setlocale("LC_ALL","swedish"); or other prefered language in plain english.
However, the weekdays were in all lowercase :(
Note: export LC_ALL=swedish made a lot of programs swedish for me, it's also possible to make them russian or japanese :)`
Lucas Thompson <lucas at slf dot cx>
31-Jan-2000 02:57
`The Open Group has an excellent document available on the setlocale() library function, most of which applies to the PHP function of the same name.
http://www.opengroup.org/onlinepubs/7908799/xbd/locale.html
WARNING: This document might be a little too complex for people who came from HTML to PHP.
If you migrated from the world of C programming you'll be a locale master after reading this document.`
add a note
sha1_file rtrim

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 09:32:46 2007 PST