【问题标题】:setlocale() not working on localhost using MAMP on MacOSsetlocale() 在 MacOS 上使用 MAMP 无法在本地主机上工作
【发布时间】:2021-08-27 19:22:18
【问题描述】:

简而言之,我的问题是:我使用 setlocale(LC_TIME, "de_DE") 以德语显示日期/时间(即月份、工作日)的“口头”部分。这适用于任何公共服务器,但在我的本地主机上,使用 MAMP,它以英语而不是德语显示。


详细说明:

我有以下代码(文件中没有其他内容,我将其减少到重现问题所需的最低限度):

<?php
setlocale(LC_TIME, "de_DE");
date_default_timezone_set('Europe/Berlin');
?>
<!DOCTYPE html>
<html lang='de_DE'>
    <head>
        <title>Datum in Deutsch</title>
        <meta charset="UTF-8"> 
    </head>
    <body>
            <p>
                <?php 
                echo "Heute ist ";
                echo strftime("%A, der %e. %B %Y");
                ?>
            </p>
    </body>
</html>

这个应该显示为

Heute ist Donnerstag,2021 年 6 月 10 日

但在我的 localhost/MAMP 上,它 显示为

2021 年 6 月 10 日,星期四

正如我所提到的:如果我将此文件上传到任何公共服务器并打开它,它会根据需要显示(即使用德语表达方式)


我已经在 SO 和其他网站上搜索了解决方案。我多次发现的一个建议是检查我的系统上是否安装了德语语言环境。

所以我打开终端(我在 MacOS 10.14.6 上)并输入“locale -a”:返回和安装的语言环境列表包括 de_DE (以及许多其他)。

我还找到了将这一行包含在代码中以检查所需语言环境是否可用的建议,我这样做了:

<?php echo setlocale(LC_ALL, 0); ?>

这会输出 "C/C/C/C/de_DE/C " ,所以再次包含de_DE (但不会给我本地化日期显示)。

我的系统:MacOS 10.14.6,MAMP 6.3 作为本地 Apache 服务器,运行 PHP 7.4.12(切换到 PHP 8.0 没有任何改变)

编辑/附加信息:我之前曾在同一系统上使用 AMPPS 作为本地服务器,这在其中工作。所以对我来说,这似乎是一个 MAMP 问题。

我该怎么做才能让它发挥作用?任何建议表示赞赏!

【问题讨论】:

  • 只是确认可能的 MAMP 问题。我在 XAMPP 上得到了预期的字符串 Juni(PHP 7.3.9,Mac OS,de_DE 包含在 locale -a 中)。
  • 您是否尝试将“de_DE.UTF-8”作为区域设置值?这在我的机器上有所不同,“de_DE”呈现英语,“de_DE.UTF-8”呈现德语文本;
  • @TomRegner 我刚刚尝试过,但它没有帮助 - 这里也呈现英语:-(你在 MAMP 上这样做吗?
  • 不,只是过去让我感到痛苦的事情。您有一个解决方法,就是这样,但是应该有一种方法可以为 MAMP 设置的虚拟主机环境生成/激活德语语言环境——或者它应该“正常工作”,这是一个令人沮丧的情况,恕我直言
  • @TobiasK。如果我将它写入终端(使用或不使用 UTF-8),我会收到响应“LC_TIME=de_DE:找不到命令”。但无论如何,正如我在问题中所写,我之前曾使用 AMPPS 作为本地服务器,当时同一个文件按预期工作。 (实际上,我刚刚发现,如果我在 MAMP 中从 Apache 切换到 Nginx,它也可以按预期工作)

标签: php localhost mamp setlocale


【解决方案1】:

尝试安装/重新安装语言包 1st sudo /usr/share/locales/install-language-pack de_DE,然后使用 setlocale() 设置您的语言

【讨论】:

    【解决方案2】:

    你试过IntlDateFormatter吗?这使用unicode date formatting。查看example in action

    $fmt = datefmt_create( "de-DE",
       IntlDateFormatter::FULL, 
       IntlDateFormatter::FULL,
       'Europe/Berlin',
       IntlDateFormatter::GREGORIAN,
       "EEEE, 'der' d. LLLL Y");
    
     echo "Heute ist " . datefmt_format( $fmt ,time());
     //output: Heute ist Freitag, der 18. Juni 2021
    

    上下文

    <?php
    setlocale(LC_TIME, "de_DE");
    date_default_timezone_set('Europe/Berlin');
    ?>
    <!DOCTYPE html>
    <html lang='de_DE'>
        <head>
            <title>Datum in Deutsch</title>
            <meta charset="UTF-8"> 
        </head>
        <body>
                <p>
                  <?php 
                    $fmt = datefmt_create( "de-DE" , IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Europe/Berlin',IntlDateFormatter::GREGORIAN  ,"EEEE, 'der' d. LLLL Y");
                    echo "Heute ist " . datefmt_format( $fmt ,time());
                    ?>
                </p>
        </body>
    </html>
    

    【讨论】:

    • 使用经过测试的(和可测试的)代码更新了答案。 (我没有意识到它使用了不同的日期格式系统。)
    • 是的,这行得通——非常感谢!!我宁愿对 MAMP 无法正确处理 setlocale 进行某种修复,但这是一个足够的替代品。显然,使用此方法时,根本不需要顶部的前两行(setlocaledate_default_timezone_set)。我会在一周的时间段结束时奖励赏金。
    【解决方案3】:

    把它放在第 1 到 4 行的位置:

    <?php setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu'); ?>
    

    【讨论】:

    • 感谢您的回答,但结果输出没有改变,工作日和月份仍以英文显示。唯一改变的是echo setlocale(LC_ALL, 0); 现在只返回“de_DE”而不是之前的“C/C/C/C/de_DE/C”
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2013-06-14
    • 2016-09-12
    • 2013-05-31
    • 2012-12-29
    相关资源
    最近更新 更多