【发布时间】:2015-01-18 19:56:02
【问题描述】:
我正在编写一个支持多种语言的 PHP 应用程序。
在 PHP 中设置语言环境时,我需要根据setlocale documentation 提供我认为是RFC 1766 / ISO 639 中定义的值。
setlocale( LC_ALL, 'en_US' );
var_dump( setlocale( LC_MESSAGES, '0' ) );
// string(5) "en_US"
当使用此语言环境描述 HTML lang 属性时,验证失败,因为它未格式化为 RFC 5646。这种语言的 RFC 5646 值实际上是 en-US(注意使用连字符而不是下划线)。
在 PHP 的 setlocale 函数中使用该值,如上,会产生以下输出:
string(1) "C"
我不知道它为什么返回 C 的值,但我认为这是因为提供的语言环境格式不正确。 C 是原始服务器默认值,这是described as ASCII(感谢@Cheery 提供参考)。
所以,我想知道我应该怎么做。在输出 lang 属性之前,我可以使用 PHP 的 str_replace 函数将- 切换为_,如下所示:
<?php setlocale( 'en_US' ); ?>
<!doctype html>
<html lang="<?= str_replace( '_', '-', setlocale(LC_MESSAGES, '0') ); ?>">
...
但是,我担心这两种语言规范之间可能存在其他差异,这可能会在未来产生意想不到的问题。如果是这样,有没有首选的方法来翻译 PHP 中已经存在的语言代码,或者可以使用的翻译类?
额外的问题,为什么我的服务器默认为区域设置的 C 值?
【问题讨论】:
-
C是系统的语言环境之一。 help.ubuntu.com/community/Locale,例如。C # fall-back, ASCII encoding, same as POSIX