Я пишу приложение PHP, которое поддерживает несколько языков.
При установке локали в PHP я должен предоставить значение, определенное, как я считаю, RFC 1766 / ISO 639, согласно setlocale документация.
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 является исходным значением по умолчанию для сервера, то есть < href="https://help.ubuntu.com/community/Locale" rel="nofollow">описанный как ASCII (спасибо @Cheery за ссылку).
Вот я и думаю, что мне с этим делать. Я мог бы использовать функцию PHP str_replace для переключения -
на _
перед выводом атрибута lang, например так:
<?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
- person Cheery   schedule 20.11.2014