PHP setlocale没有任何效果

toe*_*lab 64 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');
Run Code Online (Sandbox Code Playgroud)

输出:

六月

代替

六月

有什么建议?

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

PHP 5.6版

Ben*_*ler 93

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

locale -a
Run Code Online (Sandbox Code Playgroud)

查看已安装的语言环境.另外看看这里依赖setlocale是否可行,并依赖于安装的语言环境?

  • 如果你没有shell访问权限,你也可以尝试使用PHP:`server('locale -a');`来查找服务器上安装的语言环境的名称. (2认同)
  • 对`system('local -a');`的调用在本地基于Windows的开发环境中不会产生**影响.因此,您将无法使用该解决方案 - 在Win上. (2认同)

sva*_*ssr 31

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

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

sudo /usr/share/locales/install-language-pack de_DE 
Run Code Online (Sandbox Code Playgroud)

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

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

如果要安装法语语言包运行

sudo /usr/share/locales/install-language-pack fr_FR
Run Code Online (Sandbox Code Playgroud)

然后,您将被允许使用setlocale(...)与您完全相同的方式在PHP中设置您的语言.


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

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

  fr_FR.iso88591 ISO-8859-1
  fr_CA.iso88591 ISI-8859-1
Run Code Online (Sandbox Code Playgroud)

并运行

 sudo dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

然后再次运行sudo locale -a你应该在列表中看到fr_FR.iso88591fr_CA.iso88591,你可以通过调用在php中使用它setlocale(LC_ALL, 'fr_FR.iso88591');


Ric*_*zel 20

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

==注意==

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

  • 2021 年更新,自 PHP 8.1 起已弃用“strftime()”。 (7认同)
  • 使用`strftime()`。 (3认同)

toe*_*lab 10

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

如果你有shell访问权限,那么Benjamin Seiller的答案是最好的!

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

<?php

// Example vars
$month = '6';
$year = '2014';

$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;
Run Code Online (Sandbox Code Playgroud)


Sal*_*ual 7

这真是太痛苦了。

我想将日期翻译成西班牙语,它可以在我的本地主机上运行,​​但不能在服务器上运行(Ubuntu 18)。事实证明我没有正确的语言环境包。

首先我检查了已安装的软件包以确保它们丢失

locale -a
Run Code Online (Sandbox Code Playgroud)

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

sudo pkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

然后我花了几个小时把头撞在桌子上,直到我意识到你需要重新启动 APACHE!

sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

我的故事到此结束。希望能帮助到你。

  • 或者现在:`sudo apt-get install language-pack-es` (2认同)

sep*_*y08 6

试试这个:

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


tro*_*jan 6

“ setlocale” sais的PHP手册页

注意:setlocale()的返回值取决于PHP正在运行的系统。它完全返回系统setlocale函数返回的内容。

如果您具有root用户访问权限(debian),请采用以下解决方案:

编辑

/etc/locale.gen
Run Code Online (Sandbox Code Playgroud)

您可以添加/删除需要使用的语言环境。保存文件后运行:

locale-gen
Run Code Online (Sandbox Code Playgroud)

你应该没事的 在我的服务器上,我必须重新启动Apache才能查看更改。


Mic*_*fer 6

在我的情况下,这不起作用:

setlocale(LC_ALL, 'de_AT'); // false
Run Code Online (Sandbox Code Playgroud)

虽然这确实有效:

Locale::setDefault('de_AT'); // true
Run Code Online (Sandbox Code Playgroud)

这确实有效:

setlocale(LC_ALL, 'de_AT.utf-8'); // true
Run Code Online (Sandbox Code Playgroud)

语言环境程序的输出:

$ locale -a
[...]
C.UTF-8
de_AT.utf-8
de_DE.utf-8
en_AG
[...]
Run Code Online (Sandbox Code Playgroud)


Lau*_*ovs 6

apt-get install -y locales locales-all
Run Code Online (Sandbox Code Playgroud)


Ber*_*Ott 5

根据底层操作系统"de_DE"和其他操作系统的不同,字符串可能是错误的。

在 Windows 下请参考此列表:

通常在 Win 下是“DEU”或“GERMAN”。

已经提到过:

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

locale -a
Run Code Online (Sandbox Code Playgroud)