My problem in short: I am using setlocale(LC_TIME, "de_DE")
in order to display the "verbal" parts of a date/time (i.e. month, weekday) in German. This works on any public server, but doesn't on my localhost, using MAMP, which displays it in English instead of German.
In detail:
I have the following code (nothing else in the file, I reduced it to the minimum necessary to reproduce the issue):
<?php
setlocale(LC_TIME, "de_DE");
date_default_timezone_set('Europe/Berlin');
?>
<!DOCTYPE html>
<html lang='de_DE'>
<head>
<title>Datum in Deutsch</title>
<meta charset="UTF-8">
</head>
<body>
<p>
<?php
echo "Heute ist ";
echo strftime("%A, der %e. %B %Y");
?>
</p>
</body>
</html>
This should be displayed as
Heute ist Donnerstag, der 10. Juni 2021
But on my localhost/MAMP, it is displayed as
Heute ist Thursday, der 10. June 2021
As I mentioned: If I upload this file to any public server and open it, it is displayed as desired (i.e. with the German expressions)
I have searched SO and other websites for a solution. An advice I found several times was to check if the German locale is installed at all on my system.
So I opened the terminal (I am on MacOS 10.14.6) and typed "locale -a": The list of returned and installed locales includes de_DE
(among many others).
I also found the advice to include this line in the code to check whether the desired locale is available, which I did:
<?php echo setlocale(LC_ALL, 0); ?>
This outputs "C/C/C/C/de_DE/C " , so again, de_DE
is included (but won't give me a localized date display).
My system: MacOS 10.14.6, MAMP 6.3 as local Apache server, running PHP 7.4.12 (switching to PHP 8.0 changes nothing)
Edit/additional info: I previously had used AMPPS as a local server on the same system, where this worked. So to me it seems to be a MAMP issue.
What can I do to make it work? Any advice appreciated!
Have you tried IntlDateFormatter? This uses unicode date formatting. View the example in action
$fmt = datefmt_create( "de-DE",
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'Europe/Berlin',
IntlDateFormatter::GREGORIAN,
"EEEE, 'der' d. LLLL Y");
echo "Heute ist " . datefmt_format( $fmt ,time());
//output: Heute ist Freitag, der 18. Juni 2021
In context
<?php
setlocale(LC_TIME, "de_DE");
date_default_timezone_set('Europe/Berlin');
?>
<!DOCTYPE html>
<html lang='de_DE'>
<head>
<title>Datum in Deutsch</title>
<meta charset="UTF-8">
</head>
<body>
<p>
<?php
$fmt = datefmt_create( "de-DE" , IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Europe/Berlin',IntlDateFormatter::GREGORIAN ,"EEEE, 'der' d. LLLL Y");
echo "Heute ist " . datefmt_format( $fmt ,time());
?>
</p>
</body>
</html>