The setlocale()
function doesn't set the desired language (German).
The goal is to output month names.
This is my test code with trials so far:
<?php
date_default_timezone_set('Europe/Berlin');
setlocale(LC_ALL, 'de_DE.utf8');
// Or
setlocale(LC_ALL, 'de_DE@euro');
// Or
setlocale(LC_ALL, 'de_DE');
// Or
setlocale(LC_ALL, 'de');
// Or
setlocale(LC_ALL, 'ge');
echo strftime('%B');
Output:
June
instead of
Juni
Any suggestions?
- I don't have ssh or other shell access.
- The script is running on a linux server.
PHP version 5.6
Is is quite likely that the German locale is not installed on the server your running the script on - do you have shell access to the server? Then try
locale -a
to see which locales are installed. Also have a look here Is it feasible to rely on setlocale, and rely on locales being installed?
Your code is correct. You probably just have to install the correct language package on the server you are running the script on.
In the terminal, if the language you want to use is not listed after running the command sudo locale -a
, then you'll have to install the missing language by running the following command :
sudo /usr/share/locales/install-language-pack de_DE
(sudo
here is optional if your user has root permissions)
Then if you double check with sudo locale -a
you should see de_DE.utf8
.
If you want to install french language package run
sudo /usr/share/locales/install-language-pack fr_FR
Then you'll be allowed to set your language to these in PHP by using setlocale(...)
exactly like you did it.
Note: If you are in a non utf8 project you'll need to generate other formats from installed packages. Here is how to proceed on ubuntu (this work on debian as well) :
edit /var/lib/locales/supported.d/cs and add the following lines
fr_FR.iso88591 ISO-8859-1
fr_CA.iso88591 ISI-8859-1
and run
sudo dpkg-reconfigure locales
Then by running again sudo locale -a
you should see both fr_FR.iso88591 and fr_CA.iso88591 in the list and you can use it in php by calling setlocale(LC_ALL, 'fr_FR.iso88591');
For those coming here looking for date() doesn't localize month and weekday names:
== Pay Attention ==
date() is only able to return month/day names in English and won't be able to give you translations for other languages.
This solution might help if you don't have shell access to the server.
If you have shell access, then Benjamin Seiller's answer is the best!
As I don't have any other possibilities (shell), I've found a solution with only PHP by using the IntlDateFormatter class.
<?php
// Example vars
$month = '6'; // 1-12
$year = '2014'; // four digit year
$fmt = new IntlDateFormatter('de_DE',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Berlin',
IntlDateFormatter::GREGORIAN);
$lastMonth = mktime(0, 0, 0, $month -1, 1, $year);
$showLastMonth = $fmt->format($lastMonth);
echo $showLastMonth;
Try this one:
date_default_timezone_set('Europe/Berlin');
$loc=setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo strftime('%B');
PHP manual page for 'setlocale' sais:
Note: The return value of setlocale() depends on the system that PHP is running. It returns exactly what the system setlocale function returns.
If you have root access (debian) here is the solution:
edit
/etc/locale.gen
You can add/remove which locales you need to use. After saving the file run:
locale-gen
and you should be fine. On my server I had to restart Apache to see changes.
Depending on the underlying OS "de_DE"
and others maybe the wrong string.
Under Windows refer this lists:
- http://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.90).aspx
- http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.90%29.aspx
Usually it's "DEU" or "GERMAN" under Win.
Already mentioned:
Under Linux you can see all locales with the shell command:
locale -a
In my case this does not work:
setlocale(LC_ALL, 'de_AT'); // false
while this does work:
Locale::setDefault('de_AT'); // true
and this does work:
setlocale(LC_ALL, 'de_AT.utf-8'); // true
Output of locale program:
$ locale -a
[...]
C.UTF-8
de_AT.utf-8
de_DE.utf-8
en_AG
[...]
Thanks to Rico Neitzel for the hint. Instead of trying to format php date, use strftime. To see the first 3 letters of month name in your language (Ex. Dez instead of Dec from Dezembro and not December), follow the locale instalation instructions above, and then:
date command: date('d M Y') // impossible to change from English
setlocale( LC_ALL, "pt_BR"); // Portuguese, replace with your locale
echo strftime('%e %b %G');
result: "4 Dez 2016"
/**
* datelo funcion (date with locale)
* Credits: Sergio Abreu
* http://sites.sitesbr.net
* NOTE: Depend on availability of the locale in server.
*
*/
function datelo( $str, $locale='en_US', $time=null){
if( $time === null){ $time = time(); }
if ( preg_match("/[DlFM]/", $str)){
setlocale(LC_ALL, $locale);
$dict = array( 'd'=>'%d', 'D'=>'%a', 'j'=>'%e', 'l'=>'%A', 'N'=>'%u', 'w'=>'%w', 'F'=>'%B',
'm'=>'%m', 'M'=>'%b', 'Y'=>'%G', 'g'=>'%l', 'G'=>'%k', 'h'=>'%I', 'H'=>'%H', 'i'=>'%M',
's'=>'%S', 'S'=>'', 'z'=>'%j', 'n'=>'%m', ' '=>' ', '-'=>'-', '/'=>'/', ':'=>':', ','=>',');
$chars = preg_split("//", $str);
$nstr = '';
foreach ($chars as $c){
if ($c){ //skip empties
$nc = $dict[$c];
if( $c === 'n'){ // Fixes the extra zero
$nc = preg_replace("/^0+/", '', strftime( $nc));
}
elseif( $c === 'z'){ // Fixes the extra zero and decrease 1
$nc = preg_replace("/^0+/", '', strftime( $nc)); // 023 turns 23
$nc = intval($nc) - 1;
}
$nstr .= $nc;
}
}
return strftime( $nstr);
}else{ // not localized
return date( $str, $time);
}
}
If your are on a Red Hat machine you can run :
localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8
Then restart your Apache server
apt-get install -y locales locales-all
来源:https://stackoverflow.com/questions/10909911/php-setlocale-has-no-effect