PHP setlocale没有任何效果

时间:2012-06-06 07:28:11

标签: php date setlocale

setlocale()功能未设置所需的语言(德语)。


目标是输出月份名称。

到目前为止,这是我的测试代码:

<?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');

输出:

  

六月

而不是

  

六月

有什么建议吗?

  • 我没有ssh或其他shell访问权。
  • 脚本在linux服务器上运行。

PHP 5.6版

11 个答案:

答案 0 :(得分:84)

很可能在您运行脚本的服务器上没有安装德语语言环境 - 您是否具有对服务器的shell访问权限? 然后尝试

locale -a

查看安装了哪些区域设置。另请查看Is it feasible to rely on setlocale, and rely on locales being installed?

答案 1 :(得分:26)

您的代码是正确的。您可能只需要在运行脚本的服务器上安装正确的语言包。

在终端中,如果在运行命令sudo locale -a时未列出您要使用的语言,则必须通过运行以下命令来安装它:

sudo /usr/share/locales/install-language-pack de_DE 

(如果您的用户具有root权限,sudo此处是可选的)

然后,如果您仔细检查sudo locale -a,则应该看到de_DE.utf8

如果要安装法语语言包

sudo /usr/share/locales/install-language-pack fr_FR

然后,您将被允许使用setlocale(...)将您的语言设置为PHP语言。


注意: 如果您在非utf8项目中,则需要从已安装的软件包生成其他格式。 以下是如何继续ubuntu(这也是关于debian的工作):

编辑 /var/lib/locales/supported.d/cs 并添加以下行

  fr_FR.iso88591 ISO-8859-1
  fr_CA.iso88591 ISI-8859-1

并运行

 sudo dpkg-reconfigure locales

然后再次运行sudo locale -a您应该会在列表中看到 fr_FR.iso88591 fr_CA.iso88591 ,您可以通过调用{在php中使用它{1}}

答案 2 :(得分:16)

对于那些来这里寻找日期()的人来说,没有本地化月份和工作日名称:

==注意==

date()只能以英文返回月/日名称,并且无法为您提供其他语言的翻译。

答案 3 :(得分:10)

如果您没有对服务器的shell访问权限,此解决方案可能有所帮助。

如果你有shell访问权限,那么Benjamin Seiller's answer是最好的!

由于我没有任何其他可能性(shell),我通过使用IntlDateFormatter class找到了仅使用PHP的解决方案。

<?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;

答案 4 :(得分:6)

PHP manual page for 'setlocale' sais

  

注意:setlocale()的返回值取决于PHP的系统   在跑。它准确返回系统setlocale   函数返回。

如果你有root访问权限(debian),这里是解决方案:

修改

/etc/locale.gen

您可以添加/删除需要使用的区域设置。保存文件后运行:

locale-gen

你应该没事。在我的服务器上,我不得不重启Apache以查看更改。

答案 5 :(得分:5)

试试这个:

date_default_timezone_set('Europe/Berlin');
$loc=setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo strftime('%B');

答案 6 :(得分:4)

取决于底层操作系统"de_DE",其他可能是错误的字符串。

在Windows下,请参阅此列表:

通常在胜利下是“DEU”或“GERMAN”。

已经提到:

在Linux下,您可以使用shell命令查看所有语言环境:

locale -a

答案 7 :(得分:4)

这太痛苦了。

我想将日期转换为西班牙语,并且它可以在我的本地主机上工作,但不能在服务器上工作(Ubuntu 18)。原来我没有正确的语言环境软件包。

首先,我检查了已安装的软件包以确保它们不存在

locale -a

然后我使用脚本安装了西班牙语UTF

sudo pkg-reconfigure locales

然后我花了好几个小时将头撞到桌子上,直到意识到您需要重新开始付款!

sudo service apache2 restart

这就是我故事的结尾。希望对您有所帮助。

答案 8 :(得分:0)

对于我来说,这是行不通的:

node ("h")

这确实可行:

setlocale(LC_ALL, 'de_AT'); // false

这确实有效:

Locale::setDefault('de_AT'); // true

语言环境程序的输出:

setlocale(LC_ALL, 'de_AT.utf-8'); // true

答案 9 :(得分:-1)

如果您使用的是 Red Hat计算机,则可以运行:

localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8

然后重启Apache服务器

答案 10 :(得分:-1)

apt-get install -y locales locales-all