【问题标题】:Convert en_US to to en-US将 en_US 转换为 en-US
【发布时间】: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 值?

【问题讨论】:

标签: php html apache lang


【解决方案1】:

您需要记住 setLocal 接受许多类型的“语言环境”名称,例如名称和混合的东西,例如(来自 php 文档):

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

您的“de_DE@euro”不是有效的 HTML 语言代码。

因此,首先,您需要确保其格式为lang_region,然后再尝试转换。

【讨论】:

  • 好点@PhoneixS。我没有注意到不会映射到 HTML 规范的其他格式。我可能应该只维护不同支持类型的字典并根据需要引用它们。感谢回复!
【解决方案2】:

您可以使用“setlocale”设置本地语言代码。

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'";
?>

【讨论】:

  • 谢谢。我知道我可以使用 PHP 的 setlocale 设置语言环境。我遇到的问题是在 HTML lang 属性中使用它,因为它使用不同的格式。我想知道是否有人知道格式之间的区别以了解简单的字符串替换('_' 到 '-')是否就足够了。
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多