将en_US转换为en-US

时间:2014-11-20 19:55:08

标签: php html apache lang

我正在编写支持多种语言的PHP应用程序。

在PHP中设置语言环境时,我需要根据RFC 1766提供我认为的ISO 639 / setlocale documentation中定义的值。

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

2 个答案:

答案 0 :(得分:1)

您需要记住,setLocal接受许多类型的“区域设置”名称,例如名称和混合内容,例如(来自php文档):

$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');

你有'de_DE @ euro',它不是有效的HTML lang代码。

首先,在尝试转换之前,您需要确保格式为lang_region

答案 1 :(得分:-1)

您可以使用&#34; setlocale &#34;设置本地语言代码。

You can find here it's documentation as well as this and other examples

他们为德语尝试不同的可能语言环境名称的示例:

<?php
/* Set locale to Dutch */
setlocale(LC_ALL, 'nld_nld');

/* Output: vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));

/* try different possible locale names for german as of PHP 4.3.0 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "Preferred locale for german on this system is '$loc_de'";
?>