PHP setlocale无效


73

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版


1
因此,您尝试了其他版本的德语语言环境,例如setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
基督教徒

1
您应该通过检查setLocale
velop

Answers:


102

运行脚本的服务器上很可能没有安装德语语言环境-您是否可以通过Shell访问服务器?然后尝试

locale -a

查看安装了哪些语言环境。在这里也可以看看依靠setlocale和依靠所安装的语言环境是否可行?


1
提示的提示,不太可能我没有外壳程序访问。您的链接对我有帮助:
toesslab 2012年

1
对不起,很高兴听到这个消息。那么,您介意将我的答案标记为“答案”吗?:)
本杰明·塞勒

2
如果您没有外壳程序访问权限,则也可以尝试使用PHP:server('locale -a');查找服务器上安装的语言环境的名称。
Lenar Hoyt 2012年

3
因此,要求system('local -a');将有没有在本地的基于Windows的开发环境的影响。因此,在Win上,您将无法使用该解决方案。
kaiser 2014年

本地名称是否唯一?还是在WIn7上是“ de”,在Ubuntu上是“ ger”?
亚当

33

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

==注意事项==

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

使用strftime(),而不是!


终于找到了我来这里寻找的东西。谢谢...尝试了所有sugestions并没有影响:(这是一个有点讨厌这个日期就是这个样子
塞尔吉奥·阿布雷乌

3
使用strftime()
Skippy le Grand Gourou

32

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

在终端中,如果在运行命令后未列出要使用的语言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');


1
install-language-pack fr_FR我需要使用@ sephoy08解决方案之后:setlocale(LC_ALL, 'fr_FR@euro', 'fr_FR', 'fra_fra');它工作正常。谢谢
Meloman '17

很有帮助。感谢您的回答。
Fokwa最佳

在我的情况下,安装相关的语言环境并给出此命令“ sudo / usr / share / locales / install-language-pack de_DE”是唯一对我有用的方法。注意前命令中的空间。
Mycodingproject

12

试试这个:

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

1
谢谢!这对Kirby的本地环境大有帮助!显然,“ de_DE”无效。“ deu_deu”成功了!c::set('locale','deu_deu');
AlexG

11

如果您没有外壳访问服务器,则此解决方案可能会有所帮助。

如果您具有外壳访问权限,那么本杰明·塞勒(Benjamin Seiller)的答案是最好的!

由于没有其他可能性(外壳),因此我使用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;

7

“ setlocale” sais的PHP手册页

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

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

编辑

/etc/locale.gen

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

locale-gen

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


Apache重新启动位至关重要,为此我浪费了一个小时。谢谢。
cdsaenz

5

就我而言,这不起作用:

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
[...]

几个小时我在网络上尝试了许多解决方案,但是..setlocale(LC_ALL, 'de_AT.utf-8');那条线挽救了一条生命。谢谢男人
TeomanTıngır'19


4

真是痛苦。

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

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

locale -a

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

sudo pkg-reconfigure locales

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

sudo service apache2 restart

这就是我故事的结尾。希望能帮助到你。


或现在:sudo apt-get install language-pack-es
zeuf


-1

感谢Rico Neitzel的提示。与其尝试格式化php日期,不如使用strftime。要使用您的语言查看月份名称的前三个字母(例如,Dezmbro用Dez代替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);
 } 
}

-1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.