我正在编写支持多种语言的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 值?
答案 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'";
?>