PHP的setlocale没有效果

setlocale()函数不会设置所需的语言(德语)。


目标是输出月份名称。

这是我迄今为止的testing代码:

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

输出:

六月

代替

六月

有什么build议么?

  • 我没有SSH或其他shell访问。
  • 该脚本正在Linux服务器上运行。

是很有可能的德国语言环境没有安装在服务器上运行的脚本 – 你有shell访问服务器? 然后尝试

 locale -a 

查看安装了哪些语言环境。 也看看这里依靠setlocale是可行的,并依靠安装的语言环境?

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

在terminal中,如果在运行命令sudo locale -a时没有列出您要使用的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.iso88591fr_CA.iso88591 ,你可以通过调用setlocale(LC_ALL, 'fr_FR.iso88591');在php中使用它setlocale(LC_ALL, 'fr_FR.iso88591');

对于那些来这里寻找date()不本地化月份和星期几的名字:

==注意==

date()只能返回英文的月/日名,不能给你其他语言的翻译。

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

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

由于我没有任何其他的可能性(壳),我已经find了一个只有PHP的解决scheme,通过使用IntlDateFormatter类 。

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

“setlocale”的PHP手册页面 :

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

如果你有root权限(debian),这里是解决scheme:

编辑

 /etc/locale.gen 

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

 locale-gen 

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

试试这个:

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

根据底层操作系统"de_DE"和其他可能是错误的string。

在Windows下请参考这个列表:

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

已经提到:

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

 locale -a 

感谢Rico Neitzel的提示。 而不是尝试格式化PHPdate,使用strftime。 要用您的语言查看月份名称的前三个字母(例如Dez,而不是Dezembro的Dec,而不是Dec),请按照上面的语言环境安装说明进行操作,然后:

date命令:date('d M Y') //不可能从英文改变

 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); } }