78

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

4

14 回答 14

109

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

locale -a

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

于 2012-06-06T07:34:52.093 回答
35

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

在终端中,如果在运行命令后没有列出您要使用的语言sudo locale -a,那么您必须通过运行以下命令来安装缺少的语言:

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

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

然后,如果您仔细检查,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,您可以通过调用在 php 中使用它setlocale(LC_ALL, 'fr_FR.iso88591');

于 2013-07-15T20:30:19.727 回答
35

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

==注意==

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

改用strftime()

于 2016-11-24T00:10:03.937 回答
13

试试这个:

date_default_timezone_set('Europe/Berlin');
$loc=setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo strftime('%B');
于 2012-06-06T07:38:43.440 回答
13

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

如果您有 shell 访问权限,那么本杰明·塞勒的答案是最好的!

由于我没有任何其他可能性(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;
于 2012-06-06T07:52:18.197 回答
7

'setlocale' sais 的 PHP 手册页

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

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

编辑

/etc/locale.gen

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

locale-gen

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

于 2014-05-12T15:12:30.387 回答
6

就我而言,这不起作用:

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

虽然这确实有效:

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

这确实有效:

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

语言环境程序的输出:

$ locale -a
[...]
C.UTF-8
de_AT.utf-8
de_DE.utf-8
en_AG
[...]
于 2019-05-25T08:54:53.253 回答
5
apt-get install -y locales locales-all
于 2019-07-10T07:41:26.670 回答
5

这太痛苦了。

我想将日期翻译成西班牙语,它在我的本地主机上工作,但不在服务器上(Ubuntu 18)。原来我没有正确的语言环境包。

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

locale -a

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

sudo pkg-reconfigure locales

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

sudo service apache2 restart

我的故事就这样结束了。希望能帮助到你。

于 2020-03-31T20:34:03.910 回答
4

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

在 Windows 下,请参阅此列表:

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

已经提到:

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

locale -a
于 2014-06-26T08:17:51.820 回答
1

setlocale()PHP对不同版本有奇怪的支持。

以下测试在 Windows(同一台机器)、Apache 2.4 x64(同一 Web 服务器)、PHP x64 TS(不同版本)上进行。

setlocale()返回:

返回新的当前语言环境,或者false如果您的平台上没有实现语言环境功能,则指定的语言环境不存在或类别名称无效。

所以,我将在不同版本的 PHP 上使用下面的测试。在 PHP 7.0 - 8.1 上测试。

var_dump(setlocale(LC_ALL, 'en_US'));

PHP 7.0、7.1 返回'en_US'.
PHP 7.2+(或更新版本)返回false.

var_dump(setlocale(LC_ALL, 'en-US'));

PHP 7.0+ 返回'en-US'.

并用于测试多个值以查看哪个值将被setlocale()函数接受。
我使用这个数组。

$locale = ['en_US.UTF-8', 'en-US.UTF-8', 'en.UTF-8', 'en-US', 'en_US', 'en'];
var_dump(setlocale(LC_ALL, $locale));

PHP 7.0、7.1 返回'en_US.UTF-8'.
PHP 7.2+ 返回'en-US.UTF-8'.

如您所见,如果'en_US'旧版本支持 PHP,并不意味着新版本会支持 PHP。

对于 OP 的情况,也许可以尝试使用此数组来查看将接受哪个语言环境。

$locale = ['de_DE.UTF-8', 'de-DE.UTF-8', 'de.UTF-8', 'de_DE', 'de-DE', 'de', 'ge'];
var_dump(setlocale(LC_ALL, $locale));

结果在 Linux 或其他操作系统上可能不同。

于 2021-12-11T05:21:39.153 回答
-1

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

date command: 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);
 } 
}
于 2016-12-04T20:24:54.740 回答
-1

如果您在Red Hat 机器上,您可以运行:

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

然后重新启动您的 Apache 服务器

于 2017-11-17T09:48:17.270 回答
-1

我希望这对 php 7.4 有所帮助

当我尝试用西班牙语打印日期时,它给了我英文版本。

所以我在终端打印我所有的语言包:

# locale -a

它没有给我西班牙语,所以运行:

# sudo /usr/share/locales/install-language-pack es_ES

并将代码中的 te setlocale 更改为:

<?php 
setlocale (LC_TIME, "es_ES", "es_ES.iso88591", "spanish");
?>

之后,使用以下命令重新启动 php 服务:

/etc/init.d/php7.4-fpm restart

就是这样

于 2022-02-17T18:37:50.180 回答